lc_shell_command
lc_shell_command
source /cad/synopsys/lc/cur/admin/setup//.synopsys_lc.setup
#@ # -- Starting source /cad/synopsys/lc/cur/admin/setup//.synopsys_lc.setup
#@ #
#@ #
#@ # ".synopsys_lc.setup" Initialization File for
#@ #
#@ # Lc_Shell and Library_compiler
#@ #
#@ # The variables in this file define the behavior of many parts
#@ # of the Synopsys Synthesis Tools. Upon installation, they should
#@ # be reviewed and modified to fit your site's needs. Each engineer
#@ # can have a .synopsys file in his/her home directory or current
#@ # directory to override variable settings in this file.
#@ #
#@
#@ # System variables
#@ # system default value for sh_continue_on_error is "false"
#@ set sh_continue_on_error "true"
#@ # system default value for sh_source_uses_search_path is "false"
#@ set sh_source_uses_search_path "true"
#@
#@ # Enable customer support banner on fatal
#@ if { $sh_arch == "linux" || $sh_arch == "amd64" || $sh_arch == "linux64"
|| \
#@ $sh_arch == "sparcOS5" || $sh_arch == "sparc64" || \
#@ $sh_arch == "x86sol32" || $sh_arch == "x86sol64" || \
#@ $sh_arch == "rs6000" || $sh_arch == "aix64" } {
#@ setenv SYNOPSYS_TRACE ""
#@ }
#@
#@ #
#@ # Load the procedures which make up part of the user interface.
#@ #
#@ source $synopsys_root/auxx/syn/.lc_procs.tcl
#@ # -- Starting source /cad/synopsys/lc/cur/auxx/syn/.lc_procs.tcl
#@ ##############################################################################
#@ #
#@ #
#@ # FILE: auxx/syn/.lc_procs.tcl
#@ #
#@ # ABSTRACT: These procedures are part of the lc_shell
#@ # user interface.
#@ # They are loaded by .synopsys_lc.setup.
#@ #
#@ ##############################################################################
#@ #
#@ #
#@
#@ ##############################################################################
#@ #
#@ #
#@ # PROCEDURE: add_model
#@ #
#@ # ABSTRACT: dummy call
#@ #
#@ ##############################################################################
#@ #
#@
#@ proc add_model { args } {
#@ return [uplevel #0 $cmd]
#@ }
#@
#@ ##############################################################################
#@ #
#@ # PROCEDURE: remove_design
#@ #
#@ # ABSTRACT: map remove_design to remove_lib
#@ #
#@ # HISTORY : 2014/05/09, Synopsys, initial
#@ #
#@ ##############################################################################
#@
#@ proc remove_design { args } {
#@ parse_proc_arguments -args $args ra
#@
#@ if {[info exists ra(-library)]} {
#@ set cmd [format {remove_lib %s} $ra(-library)]
#@ } elseif {[info exists ra(-all)]} {
#@ set cmd {remove_lib -all}
#@ } else {
#@ set cmd [format {remove_lib [list %s]} $args]
#@ }
#@
#@ return [uplevel #0 $cmd]
#@ }
#@
#@ define_proc_attributes remove_design -hide_body \
#@ -info " alias of remove_lib " \
#@ -define_args {\
#@ {file_names "" file_names list {optional hidden}}\
#@ }
#@ # -- End source /cad/synopsys/lc/cur/auxx/syn/.lc_procs.tcl
#@ source $synopsys_root/auxx/lc/.lc_scripts.tcl
#@ # -- Starting source /cad/synopsys/lc/cur/auxx/lc/.lc_scripts.tcl
#@ ##############################################################################
#@ #
#@ #
#@ # FILE: lc_scripts.tcl
#@ #
#@ # ABSTRACT: These procedures are part of the lc_shell
#@ # user interface.
#@ # They are loaded by .synopsys_lc.setup.
#@ #
#@ ##############################################################################
#@
#@ ##############################################################################
#@ # Proc: read in the csv file to list of list
#@ # Author: Synopsys
#@ # Date: 2015/11/01
#@ # -channel: the input csv file
#@ # -header: == 1: use first line as index; header == 0: use row number as index
#@ # -symbol: delimiter, default is ","
#@ ##############################################################################
#@ proc read_csv { channel { header 1 } { symbol , }} {
#@ set quote 0
#@ set data [ split [ read $channel nonewline ] "\n" ]
#@ foreach line $data {
#@ set quote [ expr { $quote + [ regexp -all \" $line ]}]
#@ if { [ expr { $quote % 2 }] == "0" } {
#@ set quote 0
#@ append row_temp $line
#@ set row_temp [ split $row_temp , ]
#@ foreach section $row_temp {
#@ set quote [ expr { $quote + [ regexp -all \" $section ]}]
#@ if { [ expr { $quote % 2 }] == "0" } {
#@ append cell_temp $section
#@ set cell_temp [ regsub {^\s*(.*\S)\s*$} $cell_temp {\
1} ]
#@ set cell_temp [ regsub {^\s*$} $cell_temp {\1} ]
#@ set cell_temp [ regsub {"(.*)"} $cell_temp {\1} ]
#@ lappend cell $cell_temp
#@ unset cell_temp
#@ set quote 0
#@ } else {
#@ append cell_temp $section$symbol
#@ }
#@ }
#@ lappend final [ regsub -all {""} $cell \" ]
#@ unset cell
#@ unset row_temp
#@ } else {
#@ append row_temp $line\n
#@ }
#@ }
#@ # return list of list
#@ return $final
#@ }
#@
#@ # This proc is hidden
#@ define_proc_attributes read_csv -hidden
#@
#@ ##############################################################################
#@ # Proc: sort the db_filename
#@ # Author: Synopsys
#@ # Date: 2015/11/01
#@ # Return array: key is db name, value is a list of colomn number
#@ ##############################################################################
#@ proc sort_array_by_db_filename { final id } {
#@ set row [ llength $final ]
#@
#@ for { set i 1 } { $i < $row } { incr i } {
#@ set db_name [lindex [lindex $final $i] $id]
#@ set db_ids [array names db_map $db_name]
#@ if { [string length $db_ids] > 0} {
#@ set db_map($db_name) [concat $db_map($db_name) $i]
#@ } else {
#@ set db_map($db_name) $i
#@ }
#@ }
#@
#@ return [ array get db_map ]
#@ }
#@
#@ # This proc is hidden
#@ define_proc_attributes sort_array_by_db_filename -hidden
#@
#@ ##############################################################################
#@ # Proc: get nldm delay point index/value
#@ # Author: Synopsys
#@ # Date: 2015/11/01
#@ # Args: -matching_point: 1: fit; others: bucket;
#@ # Return: for fit mode, return 1 grid point
#@ # for bucket mode, return a list of grid points
#@ #
#@ # Support NLDM NLPM query
#@ #
#@ # For different dimension lookup table
#@ # fit bucket
#@ # 2-D: 1 (idx1,idx2,val) 4 * 3 (idx1,idx2,val)
#@ # 1-D: 1 (idx1,val) 2 * 2 (idx1,val)
#@ # 0-D: 1 (val) 1 (val)
#@ #
#@ # The return array always contain 3 items (fit mode) or 12 items (bucket mode)
#@ # The unused ones are left empty for 1-D/0-D lookup table
#@ # If find any error, return array contains same number itmes with empty value
#@ ##############################################################################
#@ proc get_nldm_delay_point { line header idx {matching_point 1} } {
#@
#@ set column [llength $header]
#@ for { set j 0 } { $j < $column } { incr j } {
#@ set rec([ lindex $header $j ],$idx) [ lindex $line $j ]
#@ }
#@
#@ # initial return array
#@ if { $matching_point ==1 } {
#@ set tb(idx1,$idx) ""
#@ set tb(idx2,$idx) ""
#@ set tb(value,$idx) ""
#@ } else {
#@ set tb(idx1_a,$idx) ""
#@ set tb(idx2_a,$idx) ""
#@ set tb(value_a,$idx) ""
#@ set tb(idx1_b,$idx) ""
#@ set tb(idx2_b,$idx) ""
#@ set tb(value_b,$idx) ""
#@ set tb(idx1_c,$idx) ""
#@ set tb(idx2_c,$idx) ""
#@ set tb(value_c,$idx) ""
#@ set tb(idx1_d,$idx) ""
#@ set tb(idx2_d,$idx) ""
#@ set tb(value_d,$idx) ""
#@ }
#@
#@ # check library
#@ if { [string length [array names rec library,$idx]] ==0 ||
#@ [string length $rec(library,$idx)] ==0} {
#@ echo "line [expr $idx+1]: Error! Must specify field 'library' for query."
#@ return [ array get tb ]
#@ }
#@ # check cell
#@ if { [string length [array names rec cell,$idx]] ==0 ||
#@ [string length $rec(cell,$idx)] ==0} {
#@ echo "line [expr $idx+1]: Error! Must specify field 'cell' for query."
#@ return [ array get tb ]
#@ }
#@
#@ # get the cell, save the collection into global array for fast access next
time.
#@ global lc_cells
#@ set lib_cell_name [array names lc_cells $rec(library,$idx)/$rec(cell,$idx)]
#@ if { [string length $lib_cell_name] > 0} {
#@ set pcell $lc_cells($lib_cell_name)
#@ } else {
#@ set pcell [get_lib_cells $rec(library,$idx)/$rec(cell,$idx)]
#@ if { [sizeof_collection $pcell] == 1 } {
#@ set lc_cells($rec(library,$idx)/$rec(cell,$idx)) $pcell
#@ } else {
#@ echo "line [expr $idx+1]: Error! Can't find this cell group."
#@ return [array get tb ]
#@ }
#@ }
#@
#@ # check group
#@ if { [string length [array names rec group,$idx]] ==0 ||
#@ [string length $rec(group,$idx)] ==0} {
#@ echo "line [expr $idx+1]: Error! Must specify field 'group' for query."
#@ return [ array get tb ]
#@ }
#@
#@ # get value NOT from lookup table
#@ if { [string equal $rec(group,$idx) leakage_power] } {
#@ # leakage power
#@
#@ # set filter
#@ if { [string length [array names rec when_cond,$idx]] >0 &&
#@ [string length $rec(when_cond,$idx)] >0 } {
#@ set ft \(when==\"$rec(when_cond,$idx)\"\)
#@ }
#@ if { [string length [array names rec related_pg_pin,$idx]] >0 &&
#@ [string length $rec(related_pg_pin,$idx)] >0 } {
#@ if {[info exists ft]} {
#@ set ft $ft&&\(related_pg_pin==$rec(related_pg_pin,$idx)\)
#@ } else {
#@ set ft \(related_pg_pin==$rec(related_pg_pin,$idx)\)
#@ }
#@ }
#@
#@ # set options: of_object, class_type, filter
#@ lappend opts -of_objects $pcell -class_type leakage_power
#@ if {[info exists ft]} {
#@ lappend opts -filter $ft
#@ }
#@
#@ # get leakage power
#@ set arc [eval get_lib_objects $opts]
#@
#@ if {[sizeof_collection $arc] == 0} {
#@ echo "line [expr $idx+1]: Error! Can't find this timing/power group."
#@ return [array get tb ]
#@ } elseif {[sizeof_collection $arc] > 1} {
#@ # using the first one !!!
#@ echo "line [expr $idx+1]: Warning! Find multiple timing/power groups, use
the first one!"
#@ set arc [index_collection $arc 0]
#@ }
#@
#@ set value [format %g [get_lib_attribute $arc value]]
#@
#@ if { $matching_point ==1 } {
#@ if {[info exists value]} {
#@ set tb(value,$idx) $value
#@ }
#@ } else {
#@ if {[info exists value]} {
#@ set tb(value_a,$idx) $value
#@ }
#@ }
#@
#@ return [ array get tb ]
#@ }
#@
#@ # get value from lookup table
#@ if { [string equal $rec(group,$idx) cell_rise] ||
#@ [string equal $rec(group,$idx) cell_fall] ||
#@ [string equal $rec(group,$idx) rise_constraint] ||
#@ [string equal $rec(group,$idx) fall_constraint] ||
#@ [string equal $rec(group,$idx) rise_propagation] ||
#@ [string equal $rec(group,$idx) fall_propagation] ||
#@ [string equal $rec(group,$idx) rise_transition] ||
#@ [string equal $rec(group,$idx) fall_transition] ||
#@ [string equal $rec(group,$idx) ocv_sigma_cell_rise] ||
#@ [string equal $rec(group,$idx) ocv_sigma_cell_fall] ||
#@ [string equal $rec(group,$idx) ocv_sigma_rise_constraint] ||
#@ [string equal $rec(group,$idx) ocv_sigma_fall_constraint] ||
#@ [string equal $rec(group,$idx) ocv_sigma_rise_transition] ||
#@ [string equal $rec(group,$idx) ocv_sigma_fall_transition] } {
#@ # NLDM timing
#@
#@ # set filter
#@ if { [string length [array names rec timing_type,$idx]] >0 &&
#@ [string length $rec(timing_type,$idx)] >0 } {
#@ set ft \(timing_type==$rec(timing_type,$idx)\)
#@ }
#@ if { [string length [array names rec timing_sense,$idx]] >0 &&
#@ [string length $rec(timing_sense,$idx)] >0 } {
#@ if {[info exists ft]} {
#@ set ft $ft&&\(timing_sense==$rec(timing_sense,$idx)\)
#@ } else {
#@ set ft \(timing_sense==$rec(timing_sense,$idx)\)
#@ }
#@ }
#@ if { [string length [array names rec when_cond,$idx]] >0 &&
#@ [string length $rec(when_cond,$idx)] >0 } {
#@ if {[info exists ft]} {
#@ set ft $ft&&\(when==\"$rec(when_cond,$idx)\"\)
#@ } else {
#@ set ft \(when==\"$rec(when_cond,$idx)\"\)
#@ }
#@ }
#@
#@ # set options: of_object, from pin, to pin, filter
#@ lappend opts -of_objects $pcell
#@ if { [string length [array names rec pin,$idx]] >0 &&
#@ [string length $rec(pin,$idx)] >0 } {
#@ lappend opts -to $rec(pin,$idx)
#@ }
#@ if { [string length [array names rec related_pin,$idx]] >0 &&
#@ [string length $rec(related_pin,$idx)] >0 } {
#@ lappend opts -from $rec(related_pin,$idx)
#@ }
#@ if {[info exists ft]} {
#@ lappend opts -filter $ft
#@ }
#@
#@ # get timing arc
#@ set arc [eval get_lib_timing_arcs $opts]
#@
#@ } elseif { [string equal $rec(group,$idx) rise_power] ||
#@ [string equal $rec(group,$idx) fall_power] } {
#@ # NLPM internal power
#@
#@ # set filter
#@ if { [string length [array names rec when_cond,$idx]] >0 &&
#@ [string length $rec(when_cond,$idx)] >0 } {
#@ set ft \(when==\"$rec(when_cond,$idx)\"\)
#@ }
#@ if { [string length [array names rec related_pg_pin,$idx]] >0 &&
#@ [string length $rec(related_pg_pin,$idx)] >0 } {
#@ if {[info exists ft]} {
#@ set ft $ft&&\(related_pg_pin==$rec(related_pg_pin,$idx)\)
#@ } else {
#@ set ft \(related_pg_pin==$rec(related_pg_pin,$idx)\)
#@ }
#@ }
#@ if { [string length [array names rec related_pin,$idx]] >0 &&
#@ [string length $rec(related_pin,$idx)] >0 } {
#@ if {[info exists ft]} {
#@ set ft $ft&&\(related_pin==$rec(related_pin,$idx)\)
#@ } else {
#@ set ft \(related_pin==$rec(related_pin,$idx)\)
#@ }
#@ }
#@
#@ # get pin
#@ if { [string length [array names rec pin,$idx]] >0 &&
#@ [string length $rec(pin,$idx)] >0 } {
#@ set pin [get_lib_objects -of_objects $pcell -class_type pin -filter
name==$rec(pin,$idx)]
#@ if {[sizeof_collection $pin] != 1} {
#@ echo "line [expr $idx+1]: Error! Can't find this pin group."
#@ return [array get tb ]
#@ }
#@
#@ # set options: of_object, -class_type, filter
#@ lappend opts -of_objects $pin -class_type internal_power
#@ if {[info exists ft]} {
#@ lappend opts -filter $ft
#@ }
#@
#@ # get internal power
#@ set arc [eval get_lib_objects $opts]
#@ }
#@ }
#@
#@ if {[sizeof_collection $arc] == 0} {
#@ echo "line [expr $idx+1]: Error! Can't find this timing/power group."
#@ return [array get tb ]
#@ } elseif {[sizeof_collection $arc] > 1} {
#@ # using the first one !!!
#@ echo "line [expr $idx+1]: Warning! Find multiple timing/power groups, use
the first one!"
#@ set arc [index_collection $arc 0]
#@ }
#@
#@ # get the lookup table
#@ set lt [get_lookup_table -of_object $arc $rec(group,$idx)]
#@
#@ if {[sizeof_collection $lt] == 0} {
#@ echo "line [expr $idx+1]: Error! Can't find this lookup table."
#@ return [array get tb ]
#@ } elseif {[sizeof_collection $lt] > 1} {
#@ # using the first one !!!
#@ echo "line [expr $idx+1]: Warning! Find multiple lookup table, use the first
one!"
#@ set lt [index_collection $lt 0]
#@ }
#@
#@ # won't consider index pairing for now
#@ # input_slew == input_net_transition/input_transition_time
#@ # output_load == total_output_net_capacitance
#@ set index1 input_net_transition
#@ set index2 total_output_net_capacitance
#@
#@ set ids [lookup_table variables $lt]
#@
#@ if { [llength $ids] == 1} {
#@ set index1 [lindex $ids 0]
#@ } elseif { [llength $ids] == 2} {
#@ set index1 [lindex $ids 0]
#@ set index2 [lindex $ids 1]
#@ }
#@
#@ # constraint template could have issue here
#@ # constraint variable related_pin_transition/constrained_pin_transition
#@ # doesn't follow the input csv table index name input_slew/output_load
#@ # then we don't know how to pair them
#@ if { $index1=="total_output_net_capacitance" } {
#@ set tmp_index $index1
#@ set index1 $index2
#@ set index2 $tmp_index
#@ }
#@
#@ if { [string length [array names rec input_slew,$idx]] >0 &&
#@ [string length $rec(input_slew,$idx)] >0 } {
#@ lappend pointl $index1 $rec(input_slew,$idx)
#@ }
#@ if { [string length [array names rec output_load,$idx]] >0 &&
#@ [string length $rec(output_load,$idx)] >0 } {
#@ lappend pointl $index2 $rec(output_load,$idx)
#@ }
#@
#@ # lookup_table fit/bucket …
#@ if { $matching_point ==1 } {
#@ if {[info exists pointl]} {
#@ redirect -variable msg {echo [set m_list [lookup_table fit $lt -index
$pointl]]}
#@ } else {
#@ redirect -variable msg {echo [set m_list [lookup_table fit $lt]]}
#@ }
#@ if {[info exists m_list]} {
#@ if {[llength $m_list] == 3} {
#@ set tb(idx1,$idx) [format %g [lindex $m_list 0] ]
#@ set tb(idx2,$idx) [format %g [lindex $m_list 1] ]
#@ set tb(value,$idx) [format %g [lindex $m_list 2] ]
#@ } elseif {[llength $m_list] == 2} {
#@ set tb(idx1,$idx) [format %g [lindex $m_list 0] ]
#@ set tb(value,$idx) [format %g [lindex $m_list 1] ]
#@ } elseif {[llength $m_list] == 1} {
#@ set tb(value,$idx) [format %g [lindex $m_list 0] ]
#@ }
#@ }
#@ } else {
#@ if {[info exists pointl]} {
#@ redirect -variable msg {echo [set m_list [lookup_table bucket $lt -index
$pointl]]}
#@ } else {
#@ redirect -variable msg {echo [set m_list [lookup_table bucket $lt]]}
#@ }
#@ if {[info exists m_list]} {
#@ if {[llength $m_list] == 4} {
#@ set tb(idx1_a,$idx) [format %g [lindex [lindex $m_list 0] 0] ]
#@ set tb(idx2_a,$idx) [format %g [lindex [lindex $m_list 0] 1] ]
#@ set tb(value_a,$idx) [format %g [lindex [lindex $m_list 0] 2] ]
#@ set tb(idx1_b,$idx) [format %g [lindex [lindex $m_list 1] 0] ]
#@ set tb(idx2_b,$idx) [format %g [lindex [lindex $m_list 1] 1] ]
#@ set tb(value_b,$idx) [format %g [lindex [lindex $m_list 1] 2] ]
#@ set tb(idx1_c,$idx) [format %g [lindex [lindex $m_list 2] 0] ]
#@ set tb(idx2_c,$idx) [format %g [lindex [lindex $m_list 2] 1] ]
#@ set tb(value_c,$idx) [format %g [lindex [lindex $m_list 2] 2] ]
#@ set tb(idx1_d,$idx) [format %g [lindex [lindex $m_list 3] 0] ]
#@ set tb(idx2_d,$idx) [format %g [lindex [lindex $m_list 3] 1] ]
#@ set tb(value_d,$idx) [format %g [lindex [lindex $m_list 3] 2] ]
#@ } elseif {[llength $m_list] == 2} {
#@ set tb(idx1_a,$idx) [format %g [lindex [lindex $m_list 0] 0] ]
#@ set tb(value_a,$idx) [format %g [lindex [lindex $m_list 0] 1] ]
#@ set tb(idx1_b,$idx) [format %g [lindex [lindex $m_list 1] 0] ]
#@ set tb(value_b,$idx) [format %g [lindex [lindex $m_list 1] 1] ]
#@ } elseif {[llength $m_list] == 1} {
#@ set tb(value_a,$idx) [format %g [lindex $m_list 0] ]
#@ }
#@ }
#@ }
#@ if {[string match {[a-zA-Z]*} $msg]} {
#@ echo Line [expr $idx+1]: Error! [string trim $msg \n]
#@ }
#@
#@ return [ array get tb ]
#@ }
#@
#@ # This proc is hidden
#@ define_proc_attributes get_nldm_delay_point -hidden
#@
#@ ##############################################################################
#@ # Proc: get_lib_grid_points
#@ # Author: Synopsys
#@ # Date: 2015/11/01
#@ # -matching_point: 1 fit; 2 bucket
#@ # -input_csv_file: the input csv file contains the querry condition
#@ # -output_csv_file: the input csv file contains the querry condition and query
result
#@ #
#@ # Modified: Synopsys 2015/12/10
#@ # change proc name from "check_qualified_data_point" to "get_lib_lookup_data"
#@ # Modified: Synopsys 2016/01/05
#@ # change proc name from "get_lib_lookup_data" to "get_lib_grid_points"
#@ ##############################################################################
#@ proc get_lib_grid_points {args} {
#@
#@ # get the args
#@ parse_proc_arguments -args $args ra
#@ set input_csv_file $ra(input_csv_file)
#@ set output_csv_file $ra(output_csv_file)
#@
#@ if { [string length [array names ra matching_point]] ==0 } {
#@ set matching_point 1
#@ } else {
#@ set matching_point $ra(matching_point)
#@ }
#@
#@ # get the input csv data, put in 2-D table (list of list)
#@ set in [open $input_csv_file r]
#@ set table [ read_csv $in ]
#@ close $in
#@
#@ # get row/column/header
#@ set row [ llength $table ]
#@ set header [ lindex $table 0 ]
#@ set column [ llength $header ]
#@
#@ # check each header index name is correct
#@ set all_header {db_filename instance library cell pin group related_pin
timing_type timing_sense when_cond related_pg_pin input_slew output_load}
#@ foreach item $header {
#@ if {[lsearch -exact $all_header $item] <0 } {
#@ echo "Error: Can't use '$item' as index."
#@ echo "The allowed index names are 'db_filename instance library cell pin
group related_pin timing_type timing_sense when_cond related_pg_pin input_slew
output_load'."
#@ return;
#@ }
#@ }
#@
#@ # db_id is the colomn for "db_filename"
#@ set db_id [lsearch -exact $header db_filename]
#@ if { $db_id <0 } {
#@ echo "Error: User must specify 'db_filename' index in the input_csv_file."
#@ return
#@ }
#@ set lib_id [lsearch -exact $header library]
#@ if { $lib_id <0 } {
#@ echo "Error: User must specify 'library' index in the input_csv_file."
#@ return
#@ }
#@
#@ # db_map is the mapping from db_filename to "row number" list
#@ array set db_map [sort_array_by_db_filename $table $db_id]
#@ set db_names [array names db_map]
#@ global lc_cells
#@
#@ # set process meter
#@ incr row -1
#@ set count 1
#@ if { $row > 10000 } {
#@ set pct_instance [expr $row/100]
#@ } else {
#@ set pct_instance 100
#@ }
#@
#@ # check each db at a time for saving memory
#@ foreach db $db_names {
#@ redirect -variable msg {echo [read_db $db]}
#@ set idx_list $db_map($db)
#@ array set lc_cells {0 0}
#@ foreach idx $idx_list {
#@
#@ # echo process meter
#@ if { $count % $pct_instance == 0 } {
#@ echo "Processing Cell Instance $count : out of $row"
#@ #echo [eval date]
#@ }
#@
#@ # get the querry data
#@ set line [lindex $table $idx]
#@ array set result [get_nldm_delay_point $line $header $idx $matching_point]
#@
#@ # save the querry result
#@ if { $matching_point ==1 } {
#@ lappend line $result(idx1,$idx)
#@ lappend line $result(idx2,$idx)
#@ lappend line $result(value,$idx)
#@ } else {
#@ lappend line $result(idx1_a,$idx)
#@ lappend line $result(idx2_a,$idx)
#@ lappend line $result(value_a,$idx)
#@ lappend line $result(idx1_b,$idx)
#@ lappend line $result(idx2_b,$idx)
#@ lappend line $result(value_b,$idx)
#@ lappend line $result(idx1_c,$idx)
#@ lappend line $result(idx2_c,$idx)
#@ lappend line $result(value_c,$idx)
#@ lappend line $result(idx1_d,$idx)
#@ lappend line $result(idx2_d,$idx)
#@ lappend line $result(value_d,$idx)
#@ }
#@ set table [lreplace $table $idx $idx $line]
#@
#@ incr count
#@ }
#@ unset lc_cells
#@ set lib_name [lindex [lindex $table $idx] $lib_id]
#@ redirect -variable msg {echo [remove_lib $db:$lib_name]}
#@
#@ }
#@
#@ # write to output csv file
#@ set out [open $output_csv_file w+]
#@
#@ if { $matching_point ==1 } {
#@ lappend header idx1 idx2 value
#@ } else {
#@ lappend header idx1_a idx2_a value_a idx1_b idx2_b value_b idx1_c idx2_c
value_c idx1_d idx2_d value_d
#@ }
#@ set table [lreplace $table 0 0 $header]
#@ set row [ llength $table ]
#@ set column [ llength $header ]
#@
#@ set symbol ,
#@ for { set i 0 } { $i < $row } { incr i } {
#@ puts -nonewline $out [lindex [lindex $table $i] 0]
#@ for { set j 1 } { $j < $column } { incr j } {
#@ puts -nonewline $out $symbol
#@ puts -nonewline $out [lindex [lindex $table $i] $j]
#@ }
#@ puts $out ""
#@ }
#@ close $out
#@
#@ }
#@
#@ define_proc_attributes get_lib_grid_points \
#@ -info " Get the qualified grid points based on query parameter" \
#@ -define_args {
#@ {input_csv_file "The input file name contains query parameter"
input_csv_file string required}
#@ {output_csv_file "The output file name for query result" output_csv_file
string required}
#@ {matching_point "Query method: '1' for 1-closest grid point (default), '4'
for 4 bucket grid points" matching_point one_of_string {optional value_help {values
{1 4}}}}
#@ }
#@
#@ ##############################################################################
#@ # proc: write_records_in_csv
#@ # Output the data extracted from SQL database to $out_file csv file
#@ # file_id: fild id from csv filenam $out_file
#@ # arr: collection from SQL query commands
#@ # num_col: number of columns in $out_file
#@ ##############################################################################
#@ proc write_records_in_csv {file_id arr num_col} {
#@ global out_file
#@ set sz [expr [llength $arr]/$num_col]
#@ for {set i 0} {$i < $sz} {incr i} {
#@ set val ""
#@ for {set j 0} {$j < $num_col} {incr j} {
#@ set val1 [lindex $arr [expr $i*$num_col+$j]]
#@ if {$j == 0} {
#@ set val $val1
#@ } else {
#@ set val [concat $val,$val1]
#@ }
#@ #puts stdout j=$j
#@ }
#@ puts $file_id $val
#@ #puts stdout i=$i
#@ }
#@ #puts stdout "$sz records written to $out_file"
#@ }
#@
#@ define_proc_attributes write_records_in_csv -hidden
#@
#@ # -- End source /cad/synopsys/lc/cur/auxx/lc/.lc_scripts.tcl
#@ source $synopsys_root/auxx/lc/analyze_trend.tcl
#@ # -- Starting source /cad/synopsys/lc/cur/auxx/lc/analyze_trend.tcl
#@ ##############################################################################
#@ # Proc: analyze_trend Author: Synopsys Date: 2015/12/09
#@ # analyze the input float array monotonicity trend
#@ # return a char like "-, /, \, V, ^, N, u, M, W, X"
#@ # float_list: input float list, must be at least 2 members
#@ # -relative_tolerance: relative tolerance, default is 0.01
#@ # -absolute_tolerance: absolute tolerance, default is 0.000001
#@ ##############################################################################
#@ proc analyze_trend { args } {
#@
#@ # get the args
#@ parse_proc_arguments -args $args ra
#@ set float_list $ra(float_list)
#@
#@ if { [string length [array names ra -relative_tolerance]] ==0 } {
#@ set rel_tol 0.01
#@ } else {
#@ set rel_tol $ra(-relative_tolerance)
#@ }
#@ if { [string length [array names ra -absolute_tolerance]] ==0 } {
#@ set abs_tol 0.000001
#@ } else {
#@ set abs_tol $ra(-absolute_tolerance)
#@ }
#@
#@ set count [llength $float_list]
#@ if {$count <= 1} {
#@ echo "Can't analysis: list must have at least 2 members."
#@ }
#@
#@ set trend 0
#@
#@ for { set i 0 } { $i < $count - 1 } { incr i } {
#@ set fa [lindex $float_list $i]
#@ set fb [lindex $float_list $i+1]
#@
#@ set gap [expr abs($fa-$fb)]
#@ set rel_gap [expr ($fa+$fb)*0.5*$rel_tol]
#@
#@ if {$gap <= $abs_tol || $gap <= $rel_gap} {
#@ switch -exact -- $trend {
#@ "0" { set trend "-" }
#@ "-" { set trend "-" }
#@ "\\" { set trend "\\" }
#@ "/" { set trend "/" }
#@ "V" { set trend "V" }
#@ "^" { set trend "^" }
#@ "N" { set trend "N" }
#@ "u" { set trend "u" }
#@ "M" { set trend "M" }
#@ "W" { set trend "W" }
#@ default { set trend "X" }
#@ }
#@ } elseif {$fa > $fb} {
#@ switch -exact -- $trend {
#@ "0" { set trend "\\" }
#@ "-" { set trend "\\" }
#@ "\\" { set trend "\\" }
#@ "/" { set trend "^" }
#@ "V" { set trend "u" }
#@ "^" { set trend "^" }
#@ "u" { set trend "u" }
#@ "N" { set trend "M" }
#@ "M" { set trend "M" }
#@ "W" { set trend "X" }
#@ default { set trend "X" }
#@ }
#@ } elseif {$fa < $fb} {
#@ switch -exact -- $trend {
#@ "0" { set trend "/" }
#@ "-" { set trend "/" }
#@ "\\" { set trend "V" }
#@ "/" { set trend "/" }
#@ "V" { set trend "V" }
#@ "^" { set trend "N" }
#@ "N" { set trend "N" }
#@ "u" { set trend "W" }
#@ "M" { set trend "X" }
#@ "W" { set trend "W" }
#@ default { set trend "X" }
#@ }
#@ }
#@ if {$trend == "X"} {break}
#@ }
#@
#@ return $trend
#@ }
#@
#@ define_proc_attributes analyze_trend \
#@ -info " Analyze the trend of a float list" \
#@ -define_args {
#@ {float_list "The list contains float array for analysis" float_list list
required}
#@ {-relative_tolerance "The relative tolerance for the float equal
comparing, default is 0.01." relative_tolerance float optional}
#@ {-absolute_tolerance "The absolute tolerance for the float equal
comparing, default is 1e-6." absolute_tolerance float optional}
#@ }
#@
#@ # -- End source /cad/synopsys/lc/cur/auxx/lc/analyze_trend.tcl
#@ source $synopsys_root/auxx/lc/get_scale.tcl
#@ # -- Starting source /cad/synopsys/lc/cur/auxx/lc/get_scale.tcl
#@ ##############################################################################
#@ # Proc: get_time_scale Author: Synopsys Date: 2015/12/09
#@ # unified time unit is 1ns
#@ # return the scale value from the unit to the unified unit.
#@ ##############################################################################
#@ proc get_time_scale { unit } {
#@
#@ set val 0
#@
#@ scan $unit %f%s digit class
#@
#@ switch -exact -- $class {
#@ "fs" { set val 1e-6 }
#@ "ps" { set val 1e-3 }
#@ "ns" { set val 1 }
#@ "us" { set val 1e3 }
#@ "ms" { set val 1e6 }
#@ "s" { set val 1e9 }
#@ "ks" { set val 1e12 }
#@ default { echo "Error! The unit '$unit' is not a 'time' unit" }
#@ }
#@
#@ set val [expr $val * $digit]
#@
#@ return $val
#@ }
#@ # This proc is hidden
#@ define_proc_attributes get_time_scale -hidden
#@
#@ ##############################################################################
#@ # Proc: get_voltage_scale Author: Synopsys Date: 2015/12/09
#@ # unified voltage unit is 1v
#@ # return the scale value from the unit to the unified unit.
#@ ##############################################################################
#@ proc get_voltage_scale { unit } {
#@
#@ set val 0
#@
#@ scan $unit %f%s digit class
#@
#@ switch -exact -- $class {
#@ "fv" { set val 1e-15 }
#@ "pv" { set val 1e-12 }
#@ "nv" { set val 1e-9 }
#@ "uv" { set val 1e-6 }
#@ "mv" { set val 1e-3 }
#@ "v" { set val 1 }
#@ "kv" { set val 1e3 }
#@ default { echo "Error! The unit '$unit' is not a 'voltage' unit" }
#@ }
#@
#@ set val [expr $val * $digit]
#@
#@ return $val
#@ }
#@ # This proc is hidden
#@ define_proc_attributes get_voltage_scale -hidden
#@
#@ ##############################################################################
#@ # Proc: get_current_scale Author: Synopsys Date: 2015/12/09
#@ # unified current unit is 1a
#@ # return the scale value from the unit to the unified unit.
#@ ##############################################################################
#@ proc get_current_scale { unit } {
#@
#@ set val 0
#@
#@ scan $unit %f%s digit class
#@
#@ switch -exact -- $class {
#@ "fa" { set val 1e-15 }
#@ "pa" { set val 1e-12 }
#@ "na" { set val 1e-9 }
#@ "ua" { set val 1e-6 }
#@ "ma" { set val 1e-3 }
#@ "a" { set val 1 }
#@ "ka" { set val 1e3 }
#@ default { echo "Error! The unit '$unit' is not a 'current' unit" }
#@ }
#@
#@ set val [expr $val * $digit]
#@
#@ return $val
#@ }
#@ # This proc is hidden
#@ define_proc_attributes get_current_scale -hidden
#@
#@ ##############################################################################
#@ # Proc: get_power_scale Author: Synopsys Date: 2015/12/09
#@ # unified power unit is 1w
#@ # return the scale value from the unit to the unified unit.
#@ ##############################################################################
#@ proc get_power_scale { unit } {
#@
#@ set val 0
#@
#@ scan $unit %f%s digit class
#@
#@ switch -exact -- $class {
#@ "fw" { set val 1e-15 }
#@ "pw" { set val 1e-12 }
#@ "nw" { set val 1e-9 }
#@ "uw" { set val 1e-6 }
#@ "mw" { set val 1e-3 }
#@ "w" { set val 1 }
#@ "kw" { set val 1e3 }
#@ default { echo "Error! The unit '$unit' is not a 'power' unit" }
#@ }
#@
#@ set val [expr $val * $digit]
#@
#@ return $val
#@ }
#@ # This proc is hidden
#@ define_proc_attributes get_power_scale -hidden
#@
#@ ##############################################################################
#@ # Proc: get_resistance_scale Author: Synopsys Date: 2015/12/09
#@ # unified resistance unit is 1ohm
#@ # return the scale value from the unit to the unified unit.
#@ ##############################################################################
#@ proc get_resistance_scale { unit } {
#@
#@ set val 0
#@
#@ scan $unit %f%s digit class
#@
#@ switch -exact -- $class {
#@ "fohm" { set val 1e-15 }
#@ "pohm" { set val 1e-12 }
#@ "nohm" { set val 1e-9 }
#@ "uohm" { set val 1e-6 }
#@ "mohm" { set val 1e-3 }
#@ "ohm" { set val 1 }
#@ "kohm" { set val 1e3 }
#@ default { echo "Error! The unit '$unit' is not a 'resistance' unit" }
#@ }
#@
#@ set val [expr $val * $digit]
#@
#@ return $val
#@ }
#@ # This proc is hidden
#@ define_proc_attributes get_resistance_scale -hidden
#@
#@ ##############################################################################
#@ # Proc: get_capacitance_scale Author: Synopsys Date: 2015/12/09
#@ # unified capacitance unit is 1f
#@ # return the scale value from the unit to the unified unit.
#@ ##############################################################################
#@ proc get_capacitance_scale { unit } {
#@
#@ set val 0
#@
#@ scan $unit %f%s digit class
#@
#@ switch -exact -- $class {
#@ "ff" { set val 1e-15 }
#@ "pf" { set val 1e-12 }
#@ "nf" { set val 1e-9 }
#@ "uf" { set val 1e-6 }
#@ "mf" { set val 1e-3 }
#@ "f" { set val 1 }
#@ "kf" { set val 1e3 }
#@ default { echo "Error! The unit '$unit' is not a 'capacitance' unit" }
#@ }
#@
#@ set val [expr $val * $digit]
#@
#@ return $val
#@ }
#@ # This proc is hidden
#@ define_proc_attributes get_capacitance_scale -hidden
#@
#@ ##############################################################################
#@ # Proc: get_energy_scale Author: Synopsys Date: 2015/12/09
#@ # unified energy unit is 1j
#@ # return the scale value from the unit to the unified unit.
#@ ##############################################################################
#@ proc get_energy_scale { unit } {
#@
#@ set val 0
#@
#@ scan $unit %f%s digit class
#@
#@ switch -exact -- $class {
#@ "fj" { set val 1e-15 }
#@ "pj" { set val 1e-12 }
#@ "nj" { set val 1e-9 }
#@ "uj" { set val 1e-6 }
#@ "mj" { set val 1e-3 }
#@ "j" { set val 1 }
#@ "kj" { set val 1e3 }
#@ default { echo "Error! The unit '$unit' is not a 'energy' unit" }
#@ }
#@
#@ set val [expr $val * $digit]
#@
#@ return $val
#@ }
#@ # This proc is hidden
#@ define_proc_attributes get_energy_scale -hidden
#@
#@ ##############################################################################
#@ # Proc: get_scale Author: Synopsys Date: 2015/12/09
#@ # This command will analyze the unit in the source library, and return
#@ # the scale value from the library unit to the target unit.
#@ # If any error happens, return 0.
#@ # -type: Unit type (time| voltage| current | power| capacitance | resistance|
energy)
#@ # -target_unit: The target unit for sacle
#@ # [float][magnitude][unit]
#@ # -library: The source library.
#@ # For example: get_scale time 10.0ps $lib
#@ # Recommand unit type:
#@ # For time: 1ps| 1ns
#@ # For voltage: 1mv| 1v
#@ # For current: 1ua| 1ma| 1a
#@ # For power: 1pw| 1nw| 1uw| 1mw
#@ # For capacitance: 1ff| 1pf
#@ # For resistance: 1ohm| 1kohm
#@ # For energy: 1fj| 1pj| 1nj| 1uj
#@ ##############################################################################
#@ proc get_scale { args } {
#@
#@ set val 0
#@
#@ # get the args
#@ parse_proc_arguments -args $args ra
#@ set type $ra(type)
#@ set target_unit $ra(target_unit)
#@ set library $ra(library)
#@
#@ # time
#@ if { $type=="time" } {
#@ set t_unit_scale [get_time_scale $target_unit]
#@ set unit [get_lib_attribute $library time_unit]
#@ set s_unit_scale [get_time_scale $unit]
#@ if {$t_unit_scale>0 && $s_unit_scale>0} {
#@ set val [expr $s_unit_scale/$t_unit_scale]
#@ }
#@
#@ # voltage
#@ } elseif { $type=="voltage" } {
#@ set t_unit_scale [get_voltage_scale $target_unit]
#@ set unit [get_lib_attribute $library voltage_unit]
#@ set s_unit_scale [get_voltage_scale $unit]
#@ if {$t_unit_scale>0 && $s_unit_scale>0} {
#@ set val [expr $s_unit_scale/$t_unit_scale]
#@ }
#@
#@ # current
#@ } elseif { $type=="current" } {
#@ set t_unit_scale [get_current_scale $target_unit]
#@ set unit [get_lib_attribute $library current_unit]
#@ set s_unit_scale [get_current_scale $unit]
#@ if {$t_unit_scale>0 && $s_unit_scale>0} {
#@ set val [expr $s_unit_scale/$t_unit_scale]
#@ }
#@
#@ # power
#@ } elseif { $type=="power" } {
#@ set t_unit_scale [get_power_scale $target_unit]
#@ set unit [get_lib_attribute $library leakage_power_unit]
#@ set s_unit_scale [get_power_scale $unit]
#@ if {$t_unit_scale>0 && $s_unit_scale>0} {
#@ set val [expr $s_unit_scale/$t_unit_scale]
#@ }
#@
#@ # capacitance
#@ } elseif { $type=="capacitance" } {
#@ set t_unit_scale [get_capacitance_scale $target_unit]
#@ # unit is string like "xxxpf" or "xxxff" returned by get_lib_attribute
#@ set unit [get_lib_attribute $library capacitive_load_unit]
#@ set s_unit_scale [get_capacitance_scale $unit]
#@ if {$t_unit_scale>0 && $s_unit_scale>0} {
#@ set val [expr $s_unit_scale/$t_unit_scale]
#@ }
#@
#@ # resistance
#@ } elseif { $type=="resistance" } {
#@ set t_unit_scale [get_resistance_scale $target_unit]
#@ set unit [get_lib_attribute $library pulling_resistance_unit]
#@ set s_unit_scale [get_resistance_scale $unit]
#@ if {$t_unit_scale>0 && $s_unit_scale>0} {
#@ set val [expr $s_unit_scale/$t_unit_scale]
#@ }
#@
#@ # energy
#@ } elseif { $type=="energy" } {
#@ set t_unit_scale [get_energy_scale $target_unit]
#@ # c_unit is string like "xxxpf" or "xxxff" returned by get_lib_attribute
#@ set c_unit [get_lib_attribute $library capacitive_load_unit]
#@ set c_unit [get_capacitance_scale $c_unit]
#@ set v_unit [get_lib_attribute $library voltage_unit]
#@ set v_unit_scale [get_voltage_scale $v_unit]
#@ set s_unit_scale [expr $c_unit * $v_unit_scale * $v_unit_scale]
#@ if {$t_unit_scale>0 && $s_unit_scale>0} {
#@ set val [expr $s_unit_scale/$t_unit_scale]
#@ }
#@ }
#@
#@ return $val
#@
#@ }
#@
#@ define_proc_attributes get_scale \
#@ -info " Get the scaling value from source library to target unit." \
#@ -define_args {
#@ {type "Unit type" type one_of_string {required value_help {values {time
voltage current power capacitance resistance energy}}}}
#@ {target_unit "The target unit for scaling" target_unit string required }
#@ {library "The source library object" library list required}
#@ }
#@
#@ # -- End source /cad/synopsys/lc/cur/auxx/lc/get_scale.tcl
#@ source $synopsys_root/auxx/lc/plot_table.tcl
#@ # -- Starting source /cad/synopsys/lc/cur/auxx/lc/plot_table.tcl
#@ ##############################################################################
#@ # 'global' parameters Author: Synopsys Date: 2016/9/18
#@ ##############################################################################
#@
#@ # temp path to accommodate plot data and script
#@ set lc_plot_table_base_dir "/tmp/lc_plot_table_"
#@ set lc_plot_table_list_dirs "" ;# a list for tmp dirs
#@
#@ # to accommodate PIDs & COMMANDs of xterm being executed
#@ set lc_plot_table_pids ""
#@ set lc_plot_table_cmds ""
#@
#@ ##############################################################################
#@ # Proc: createUniqueDir Author: Synopsys Date: 2016/9/18
#@ # create one unique folder (without tailing backslash) under temp path
#@ # Return:
#@ # path of the created folder
#@ ##############################################################################
#@ proc createUniqueDir {} {
#@ set sDir [pid]
#@ append sDir "_" [clock microseconds]
#@ file mkdir $::lc_plot_table_base_dir$sDir
#@ lappend ::lc_plot_table_list_dirs $sDir
#@ return $::lc_plot_table_base_dir$sDir
#@ }
#@ # This proc is hidden
#@ define_proc_attributes createUniqueDir -hidden
#@
#@ ##############################################################################
#@ # Proc: clearSpot Author: Synopsys Date: 2016/9/18
#@ # delete the previous intermediate gnuplot data and script
#@ ##############################################################################
#@ proc clearSpot {} {
#@ # close the previous opened terminals
#@ set i 0
#@ foreach sPid $::lc_plot_table_pids {
#@ # check if pid existed
#@ if { [catch {exec kill -0 $sPid}]==0 } {
#@ set sCmd [lindex $::lc_plot_table_cmds $i]
#@ # check if the COMMAND of the pid is exactly the "xterm ..." which was
forked by 'me' (plot_table)
#@ if { [catch {exec ps u | awk {{for(ii=11;ii<=NF;ii++)printf $ii" ";printf
"\n"}} | grep -e ^$sCmd}]==0 } {
#@ # kill the process
#@ catch {exec kill $sPid} msg
#@ }
#@ }
#@
#@ incr i
#@ }
#@ set ::lc_plot_table_pids ""
#@ set ::lc_plot_table_cmds ""
#@
#@ # delete the previous intermediate gnuplot data and script
#@ foreach sDir $::lc_plot_table_list_dirs {
#@ file delete -force $::lc_plot_table_base_dir$sDir
#@ }
#@ set ::lc_plot_table_list_dirs ""
#@ }
#@ # This proc is hidden
#@ define_proc_attributes clearSpot -hidden
#@
#@ ##############################################################################
#@ # Proc: genPlotData Author: Synopsys Date: 2016/10/28
#@ # generate plot data
#@ # Arguments:
#@ # lut lookup_table object
#@ # sDat path of plot data file
#@ # vSlice slice info. e.g. "" (no slice specified); "output_voltage 0.0920645"
#@ # vTol tolerance curves or surfaces
#@ # Return:
#@ # 1 proc succeeded, 0 otherwise
#@ ##############################################################################
#@ proc genPlotData { lut sDat vSlice vTol } {
#@ if [catch {open $sDat w} pDat] {
#@ puts "error, failed to open $sDat for write:$pDat"
#@ return 0
#@ }
#@
#@ set nDim [lookup_table dimension $lut]
#@ set vIdx [lookup_table index $lut]
#@ set k 0
#@
#@ if { [llength $vSlice] == 0 } {
#@ set vVal [lookup_table slice -all $lut]
#@ set vIdx0 [lindex $vIdx 0]
#@ if { $nDim==2 } {
#@ set vIdx1 [lindex $vIdx 1]
#@ foreach i $vIdx0 {
#@ foreach j $vIdx1 {
#@ set v [lindex $vVal $k]
#@ puts -nonewline $pDat "$i $j $v"
#@ foreach sTol $vTol {
#@ regsub -all "V" $sTol $v sTol
#@ puts -nonewline $pDat " [expr $sTol]"
#@ }
#@ puts $pDat ""
#@ incr k
#@ }
#@ puts $pDat ""
#@ }
#@ } else {
#@ foreach i $vIdx0 {
#@ set v [lindex $vVal $k]
#@ puts -nonewline $pDat "$i $v"
#@ foreach sTol $vTol {
#@ regsub -all "V" $sTol $v sTol
#@ puts -nonewline $pDat " [expr $sTol]"
#@ }
#@ puts $pDat ""
#@ incr k
#@ }
#@ }
#@ } else {
#@ set vVal [lookup_table slice $lut -index $vSlice]
#@ if { [string equal [lindex $vSlice 0] [lindex [lookup_table variables $lut]
0]] } {
#@ set vIdxAnother [lindex $vIdx 1]
#@ } else {
#@ set vIdxAnother [lindex $vIdx 0]
#@ }
#@ foreach i $vIdxAnother {
#@ set v [lindex $vVal $k]
#@ puts -nonewline $pDat "$i $v"
#@ foreach sTol $vTol {
#@ regsub -all "V" $sTol $v sTol
#@ puts -nonewline $pDat " [expr $sTol]"
#@ }
#@ puts $pDat ""
#@ incr k
#@ }
#@ }
#@
#@ close $pDat
#@ return 1
#@ }
#@ # This proc is hidden
#@ define_proc_attributes genPlotData -hidden
#@
#@ ##############################################################################
#@ # Proc: genPlotDataForCcs Author: Synopsys Date: 2016/10/21
#@ # generate plot data file for CCS object
#@ # Arguments:
#@ # lut lookup_table CCS object
#@ # sDat path of plot data file
#@ # vVarIdx grid points of the object e.g. {var1 index1 var2 index2}
#@ # fInitV1 Vss(Vdd) as initial V1 for derived voltage
#@ # vTol tolerance curves
#@ # sOvExpr(up-level) customized equation to derive voltage, it will be set to
#@ # empty if invalid expression. This makes
#@ # genPlotDataForCcsPlotAll() comfortable
#@ # Return:
#@ # 1 proc succeeded, 0 otherwise
#@ ##############################################################################
#@ proc genPlotDataForCcs { lut sDat vVarIdx fInitV1 vTol } {
#@ upvar sOvExpr sOvExprRef
#@
#@ if [catch {open $sDat w} pDat] {
#@ puts "error, failed to open $sDat for write:$pDat"
#@ return 0
#@ }
#@
#@ set fLoad -1.0
#@ if { [string equal [lindex $vVarIdx 0] "total_output_net_capacitance"]} {
#@ set fLoad [lindex $vVarIdx 1]
#@ } elseif { [string equal [lindex $vVarIdx 2] "total_output_net_capacitance"]}
{
#@ set fLoad [lindex $vVarIdx 3]
#@ }
#@
#@ set fVpre $fInitV1
#@ set fI 0.0
#@ set fIpre 0.0
#@ set fT 0.0
#@ set fTpre 0.0
#@ set fV 0.0
#@
#@ set fTRef [lookup_table slice $lut -data ref -index $vVarIdx]
#@ if { [string length $fTRef]==0 } {
#@ set fTRef 0.0
#@ }
#@ if { [string equal $fTRef "0.0"] } {
#@ set fLoad -1.0
#@ }
#@ set vT [lookup_table slice $lut -data time -index $vVarIdx]
#@ set vI [lookup_table slice $lut -data values -index $vVarIdx]
#@ set nT [llength $vT]
#@ set nI [llength $vI]
#@ if { $nT!=$nI } {
#@ puts "error, size of time ($nT) != size of values ($nI)"
#@ close $pDat
#@ return 0
#@ }
#@
#@ for { set i 0 } { $i<$nT } { incr i } {
#@ set fT [expr [lindex $vT $i]-$fTRef]
#@ set fI [lindex $vI $i]
#@ if { $fLoad > 0 } {
#@ if { [string length $sOvExprRef]!=0 } {
#@ set sOvExprTmp $sOvExprRef
#@ regsub -all "V1" $sOvExprTmp $fVpre sOvExprTmp
#@ regsub -all "I2" $sOvExprTmp $fI sOvExprTmp
#@ regsub -all "I1" $sOvExprTmp $fIpre sOvExprTmp
#@ regsub -all "T2" $sOvExprTmp $fT sOvExprTmp
#@ regsub -all "T1" $sOvExprTmp $fTpre sOvExprTmp
#@ regsub -all "C" $sOvExprTmp $fLoad sOvExprTmp
#@ if { [string length $sOvExprTmp]==0 } {
#@ set fExpr ""
#@ } else {
#@ set fExpr [expr $sOvExprTmp]
#@ }
#@ if { [string length $fExpr]==0 } {
#@ echo "warning, failed to get result of the process($sOvExprRef) from
predefined variables: V1($fVpre), I2($fI), I1($fIpre), T2($fT), T1($fTpre),
C($fLoad).\nTurn to use built-in default process(V1+0.5/C*(I2+I1)*(T2-T1))."
#@ set sOvExprRef "" ;# make genPlotDataForCcsPlotAll() comfortable
#@ set fV [expr $fVpre+0.5*($fI+$fIpre)*($fT-$fTpre)/$fLoad]
#@ } else {
#@ set fV $fExpr
#@ }
#@ } else {
#@ set fV [expr $fVpre+0.5*($fI+$fIpre)*($fT-$fTpre)/$fLoad]
#@ }
#@ set fVpre $fV
#@ set fIpre $fI
#@ set fTpre $fT
#@ } else {
#@ # "total_output_net_capacitance" is not there?
#@ # or no calculated voltage at all
#@ set fV 0.0
#@ }
#@ puts -nonewline $pDat "$fT $fI $fV"
#@ foreach sTol $vTol {
#@ regsub -all "V" $sTol $fI sTol
#@ puts -nonewline $pDat " [expr $sTol]"
#@ }
#@ puts $pDat ""
#@ }
#@
#@ close $pDat
#@ return 1
#@ }
#@ # This proc is hidden
#@ define_proc_attributes genPlotDataForCcs -hidden
#@
#@ ##############################################################################
#@ # Proc: genPlotDataForCcsPlotAll Author: Synopsys Date: 2016/10/21
#@ # generate plot data files for all grid points of the CCS object
#@ # Arguments:
#@ # lut lookup_table CCS object
#@ # sFnPrefix folder (with tailing backslash) to accommodate data file
#@ # sOvExpr customized equation to derive voltage
#@ # fInitV1 Vss(Vdd) as initial V1 for derived voltage
#@ # vTol tolerance curves
#@ # vDat(up-level) paths of plot data files
#@ # Return:
#@ # 1 proc succeeded, 0 otherwise
#@ ##############################################################################
#@ proc genPlotDataForCcsPlotAll { lut sFnPrefix sOvExpr fInitV1 vTol } {
#@ # set an alias of up-level parameter, which will point to the same memory of
#@ # the parameter in up-level proc. (I think this is most like using reference
#@ # as function parameter in C++)
#@ upvar vDat vDatRef
#@ set vDatRef ""
#@
#@ set vVar [lookup_table variables $lut] ;# e.g. "input_net_transition
total_output_net_capacitance"
#@ set vIdx [lookup_table index $lut] ;# e.g. "{0.00114139996003
0.00220229988918 ...} {......}"
#@
#@ # 1d and 2d lookup tables supported by now, sanity check already done in main
#@ # procedure
#@ set nDim [llength $vVar]
#@ ## if { $nDim < 1 || $nDim > 2 } {
#@ ## return -code error "...\n"
#@ ## }
#@
#@ set sVar0 [lindex $vVar 0]
#@ set nIdx0Size [llength [lindex $vIdx 0]]
#@
#@ if { $nDim > 1 } {
#@ set sVar1 [lindex $vVar 1]
#@ set nIdx1Size [llength [lindex $vIdx 1]]
#@ }
#@
#@ for { set i 0 } { $i<$nIdx0Size } { incr i } {
#@ set fIdx0 [lindex [lindex $vIdx 0] $i]
#@ if { $nDim==1 } {
#@ set sDat $sFnPrefix
#@ append sDat "lut" [expr $i+1] ".dat"
#@ set vVarIdx [ list $sVar0 $fIdx0 ]
#@ set ret [genPlotDataForCcs $lut $sDat $vVarIdx $fInitV1 $vTol]
#@ if { $ret==0 } {
#@ return 0
#@ }
#@ lappend vDatRef $sDat
#@ } elseif { $nDim==2 } {
#@ for { set j 0 } { $j<$nIdx1Size } { incr j } {
#@ set fIdx1 [lindex [lindex $vIdx 1] $j]
#@ set sDat $sFnPrefix
#@ append sDat "lut" [expr $i*$nIdx1Size+$j+1] ".dat"
#@ set vVarIdx [ list $sVar0 $fIdx0 $sVar1 $fIdx1 ]
#@ set ret [genPlotDataForCcs $lut $sDat $vVarIdx $fInitV1 $vTol]
#@ if { $ret==0 } {
#@ return 0
#@ }
#@ lappend vDatRef $sDat
#@ }
#@ } ;# else 3d ...
#@ }
#@
#@ return 1
#@ }
#@ # This proc is hidden
#@ define_proc_attributes genPlotDataForCcsPlotAll -hidden
#@
#@ ##############################################################################
#@ # Proc: getInfoString Author: Synopsys Date: 2016/10/27
#@ # get information of lookup_table object
#@ # Arguments:
#@ # lut lookup_table object
#@ # Return:
#@ # information string of the object
#@ ##############################################################################
#@ proc getInfoString { lut } {
#@ set sInfo ""
#@
#@ set sTmpl [lookup_table template_name $lut]
#@ if { [string length $sTmpl]!=0 } {
#@ append sInfo " template(" $sTmpl ")"
#@ }
#@
#@ set nDim [lookup_table dimension $lut]
#@ set vSize [lookup_table sizes $lut]
#@ if { $nDim>0 } {
#@ append sInfo " size(" [lindex $vSize 0]
#@ }
#@ if { $nDim>1 } {
#@ append sInfo "x" [lindex $vSize 1]
#@ }
#@ if { $nDim>2 } {
#@ append sInfo "x" [lindex $vSize 2]
#@ }
#@ if { $nDim>0 } {
#@ append sInfo ")"
#@ }
#@
#@ return $sInfo
#@ }
#@ # This proc is hidden
#@ define_proc_attributes getInfoString -hidden
#@
#@ ##############################################################################
#@ # Proc: printFile Author: Synopsys Date: 2016/11/25
#@ # print out file content
#@ # Arguments:
#@ # sDat file path
#@ # Return:
#@ # 1 proc succeeded, 0 otherwise
#@ ##############################################################################
#@ proc printFile { sDat } {
#@ set sDelimit
"################################################################################"
#@
#@ puts ""
#@ if [catch {open $sDat r} pDat] {
#@ puts "error, failed to open $sDat for read:$pDat"
#@ return 0
#@ }
#@ puts -nonewline "# "
#@ puts [file tail $sDat]
#@ puts $sDelimit
#@ puts [read $pDat]
#@ puts $sDelimit
#@ close $pDat
#@
#@ return 1
#@ }
#@ # This proc is hidden
#@ define_proc_attributes printFile -hidden
#@
#@ ##############################################################################
#@ # Proc: plot_table Author: Synopsys Date: 2016/9/18
#@ # plot lookup table(s) in lc_shell, using 'gnuplot'.
#@ # Arguments:
#@ # see define_proc_attributes section
#@ # Return:
#@ # 1 proc succeeded, 0 or error code otherwise
#@ # Examples:
#@ # moved to man page: plot_table.3
#@ ##############################################################################
#@ proc plot_table {args} {
#@ # supported after set lc_enable_plot_table true
#@ if { [info exists ::lc_enable_plot_table]!=1 || [string equal -nocase
$::lc_enable_plot_table "true"]!=1 } {
#@ return -code error "UIL-100 (error) The command is not enabled. You need to
set lc_enable_plot_table beforehand."
#@ ## return "" ;# well, dummy returned here if not set the enable_variable...
#@ }
#@ # supported in lc_advanced_tcl_mode
#@ if { [info exists ::lc_advanced_tcl_mode]!=1 || [string equal -nocase
$::lc_advanced_tcl_mode "true"]!=1 } {
#@ return -code error "UIL-100 (error) The command is not enabled, it's support
in advanced tcl mode only."
#@ }
#@ set i 0
#@
#@ # get the args
#@ parse_proc_arguments -args $args ra
#@
#@ # -clear, which is an individual arg
#@ if { [string length [array names ra -clear]] != 0 } {
#@ clearSpot
#@ return "1"
#@ }
#@
#@ # create one more unique dir for data/script
#@ set sFnPrefix [createUniqueDir]
#@ append sFnPrefix "/"
#@
#@ # luts: list of lookup tables, which is the main arg
#@ set vLut ""
#@ if { [string length [array names ra luts]] != 0 } {
#@ set vLut $ra(luts)
#@ }
#@ set nObjSize [llength $vLut]
#@ if {$nObjSize < 1} {
#@ return -code error "No lookup table is specified.\n"
#@ }
#@
#@ #
#@ # sanity check and preparation
#@ #
#@ set bIsCCS 0
#@ set bIsCCSPlotAll 0
#@ set vSlice ""
#@ set nDim 0
#@ set sDat ""
#@ set vDat "" ;# filenames of data
#@ foreach lut $vLut {
#@ set vSize [lookup_table sizes $lut] ;# e.g. "8" (1d), "8 7" (2d)
#@ if {[llength $vSize] < 1} {
#@ return -code error "Specified object ($lut) is NOT a lookup table.\n"
#@ }
#@
#@ set nDimTmp [lookup_table dimension $lut]
#@ if { $nDimTmp < 1 || $nDimTmp > 2 } {
#@ # 1d and 2d lookup tables supported by now
#@ return -code error "Not supported for $nDimTmp dimension(s).\n"
#@ }
#@ if {[llength [lookup_table slice $lut -all]] < 1} {
#@ # this is a CCS object
#@ set nDim $nDimTmp
#@ if {$nObjSize > 1} {
#@ return -code error "Multiple lookup tables are not supported for CCS
object\n"
#@ }
#@ set bIsCCS 1
#@ # -index, used to specify one slice of CCS object
#@ set vVarIdx ""
#@ if { [string length [array names ra -index]] != 0 } {
#@ set vVarIdx $ra(-index)
#@ }
#@ set nVarIdxSize [llength $vVarIdx]
#@ if { $nVarIdxSize==0 } {
#@ set bIsCCSPlotAll 1
#@ } elseif { $nVarIdxSize==1 } {
#@ # e.g. "0:0" --> "input_net_transition 0.00726140011102
total_output_net_capacitance 0.000390200002585"
#@ # e.g. "0" --> "input_net_transition 0.00726140011102"
#@ set vId [split $vVarIdx ":"]
#@ if {[llength $vId] != $nDim} {
#@ return -code error "Specified index ($vVarIdx) is unmatched with the
object of $nDim dimension(s).\n"
#@ }
#@ set vVar [lookup_table variables $lut]
#@ set vIdx [lookup_table index $lut]
#@ if { $nDim==1 } {
#@ set vVarIdx [ list [lindex $vVar 0] \
#@ [lindex [lindex $vIdx 0] [expr [lindex $vId 0]]] ]
#@ } elseif { $nDim==2 } {
#@ set vVarIdx [ list [lindex $vVar 0] \
#@ [lindex [lindex $vIdx 0] [expr [lindex $vId 0]]] \
#@ [lindex $vVar 1] \
#@ [lindex [lindex $vIdx 1] [expr [lindex $vId 1]]] ]
#@ } ;# else 3d ...
#@ } ;# else more than 1 elements in $vVarIdx, leave check to lookup_table.
e.g. "input_net_transition 0.00726140011102"
#@ } else {
#@ # this is NOT a CCS object
#@ if { $i > 0 } {
#@ if { $nDimTmp != $nDim } {
#@ return -code error "Different dimension(s) of multiple lookup tables
can't be plotted at once.\n"
#@ }
#@ if { [llength $vSlice] != 0 } {
#@ # we assume user uses -slice for multi objects with exactly same index
#@ if { [llength [lookup_table slice $lut -index $vSlice]] == 0 } {
#@ return -code error "Invalid -slice($vSlice), abort.\n"
#@ }
#@ }
#@ } else { ;# $i==0
#@ set nDim $nDimTmp
#@ # -slice, used to specify one slice for (non-CCS) 2D lookup tables
#@ if { [string length [array names ra -slice]] != 0 } {
#@ set vSlice $ra(-slice)
#@ if { $nDim!=2 } {
#@ return -code error "-slice($vSlice) is not supported for ($nDim)
dimension(s) lookup table, abort.\n"
#@ }
#@ set nSliceSize [llength $vSlice]
#@ if { $nSliceSize==1 } {
#@ # e.g. "0:0" --> "input_voltage 0.0" (for dc_current)
#@ # e.g. "1:2" --> "output_voltage 0.0920645"
#@ set vId [split $vSlice ":"]
#@ if {[llength $vId] != 2} {
#@ return -code error "Exactly 2 parts(variable_id:index_id) is
needed for -slice($vSlice), abort.\n"
#@ }
#@ set nVarId [expr [lindex $vId 0]]
#@ set nIdxId [expr [lindex $vId 1]]
#@ if { $nVarId<0 || $nVarId>1 } {
#@ return -code error "Only 0 or 1 can be specified for the
variable_id(the part before ':') in -slice($vSlice), abort.\n"
#@ }
#@ set vVar [lookup_table variables $lut] ;# e.g. input_voltage
output_voltage
#@ set vIdxN [lindex [lookup_table index $lut] $nVarId] ;# e.g. {0.0
0.0434696 ... 0.95}
#@ if { $nIdxId<0 || $nIdxId>=[llength $vIdxN] } {
#@ return -code error "Invalid index_id(the part after ':') in -
slice($vSlice), abort.\n"
#@ }
#@ set vSlice [ list [lindex $vVar $nVarId] [lindex $vIdxN $nIdxId] ]
#@ } elseif { $nSliceSize==2 } {
#@ if { [llength [lookup_table slice $lut -index $vSlice]] == 0 } {
#@ return -code error "Invalid -slice($vSlice), abort.\n"
#@ }
#@ } else {
#@ return -code error "Invalid -slice($vSlice), abort.\n"
#@ }
#@ }
#@ }
#@ }
#@ if { $bIsCCSPlotAll==0 } {
#@ # prepare filename(s) for data
#@ # this job will be done in genPlotDataForCcsPlotAll for 'ccs-plot-all'
#@ set sDat $sFnPrefix
#@ append sDat "lut" [expr $i+1] ".dat"
#@ lappend vDat $sDat
#@ }
#@ incr i
#@ }
#@ # -dump sanity check
#@ set bDumpDat 0
#@ set bDumpDem 0
#@ if { [string length [array names ra -dump]] != 0 } {
#@ set sDumpOption $ra(-dump)
#@ if { [string equal $sDumpOption "data"] } {
#@ set bDumpDat 1
#@ } elseif { [string equal $sDumpOption "script"] } {
#@ set bDumpDem 1
#@ } elseif { [string equal $sDumpOption "all"] } {
#@ set bDumpDat 1
#@ set bDumpDem 1
#@ } else {
#@ return -code error "-dump $sDumpOption does not match [ data | script |
all ].\n"
#@ }
#@ }
#@
#@ # -derive_output_voltage, enable voltage curve for CCS object
#@ set bOmitExpr 1
#@ if { [string length [array names ra -derive_output_voltage]] != 0 } {
#@ set bOmitExpr 0
#@ }
#@ if { $bOmitExpr==0 && $bIsCCS==0 } {
#@ echo "warning, -derive_output_voltage option won't work for non-CCS objects,
ommitted.\n"
#@ set bOmitExpr 1
#@ }
#@
#@ # -derive_output_voltage_equation
#@ set sOvExpr "" ;# customized expression, empty if N/A or invalid
#@ if { $bOmitExpr==0 && [string length [array names ra -
derive_output_voltage_equation]] != 0 } {
#@ set sOvExpr $ra(-derive_output_voltage_equation)
#@ }
#@
#@ # -legend, to customize legends
#@ set itLegend ""
#@ if { [string length [array names ra -legend]] != 0 } {
#@ set itLegend $ra(-legend) ;# it* is actually list_*
#@ }
#@ set vLegend "" ;# v* is also list_*
#@ set sLegend ""
#@
#@ # -initv1, Vss(Vdd) as initial V1 for derived voltage
#@ set fInitV1 0.0
#@ if { [string length [array names ra -initv1]] != 0 } {
#@ set fInitV1 $ra(-initv1)
#@ }
#@
#@ # -tol, to add tolerance curves or surfaces, currently +-*/ supported
#@ set vTol ""
#@ if { [string length [array names ra -tol]] != 0 } {
#@ set itEq $ra(-tol)
#@ set i 0
#@ foreach sEq $itEq {
#@ set sEqTmp $sEq
#@ regsub -all "V" $sEqTmp -1.67345 sEqTmp
#@ if { [string length $sEqTmp]==0 } {
#@ set fExpr ""
#@ } else {
#@ set fExpr [expr $sEqTmp]
#@ }
#@ if { [string length $fExpr]!=0 } {
#@ lappend vTol $sEq
#@ } else {
#@ echo "warning, no.[expr $i+1] -tol equation($sEq) is invalid and
omitted. Currently, arithmetic operations(+-*/) are supported. The variable name V
is used as the default independent variables.\n"
#@ }
#@ incr i
#@ }
#@ }
#@
#@ #
#@ # generate data, prepare legends for plotting
#@ #
#@ set i 0
#@ foreach lut $vLut {
#@ if { $bIsCCSPlotAll==1 } {
#@ set ret [genPlotDataForCcsPlotAll $lut $sFnPrefix $sOvExpr $fInitV1 $vTol]
#@ } elseif { $bIsCCS==1 } {
#@ set ret [genPlotDataForCcs $lut [lindex $vDat 0] $vVarIdx $fInitV1 $vTol]
#@ } else {
#@ set ret [genPlotData $lut [lindex $vDat $i] $vSlice $vTol]
#@ }
#@ if { $ret==0 } {
#@ return 0
#@ }
#@
#@ # initialize legend for non-CCS object(s)
#@ if { $bIsCCS==0 } {
#@ if { [string length [lindex $itLegend $i]]!=0 } {
#@ set sLegend [lindex $itLegend $i]
#@ # speical characters needs to be converted
#@ regsub -all {\\} $sLegend {\\\\} sLegend
#@ regsub -all "\"" $sLegend "\\\"" sLegend
#@ } else {
#@ set sLegend "lut"
#@ append sLegend [expr $i+1]
#@ }
#@ append sLegend [getInfoString $lut]
#@ if { [llength $vSlice]!=0 } {
#@ append sLegend " slice"
#@ }
#@ lappend vLegend $sLegend
#@ }
#@ incr i
#@ }
#@ # initialize legends for CCS object
#@ if { $bIsCCS==1 } {
#@ for { set i 0 } { $i<2 } { incr i } {
#@ if { [string length [lindex $itLegend $i]]!=0 } {
#@ set sLegend [lindex $itLegend $i]
#@ # speical characters needs to be converted
#@ regsub -all {\\} $sLegend {\\\\} sLegend
#@ regsub -all "\"" $sLegend "\\\"" sLegend
#@ } else {
#@ if { $i==0 } {
#@ set sLegend "y= current"
#@ } elseif { [string length $sOvExpr]==0 } {
#@ set sLegend "y2= V1+0.5/C*(I2+I1)*(T2-T1)"
#@ } else {
#@ set sLegend "y2= $sOvExpr"
#@ }
#@ }
#@ lappend vLegend $sLegend
#@ }
#@ }
#@
#@ # -aux, to add auxiliary curves or surfaces, currently +-*/ supported
#@ set sAuxAppend ""
#@ if { [string length [array names ra -aux]] != 0 } {
#@ set itEq $ra(-aux)
#@ set i 0
#@ foreach sEq $itEq {
#@ set sEqTmp $sEq
#@ regsub -all "X" $sEqTmp -1.67345 sEqTmp
#@ if { $nDim==2 && [llength $vSlice]==0 } {
#@ regsub -all "Y" $sEqTmp 864.195 sEqTmp
#@ }
#@ if { [string length $sEqTmp]==0 } {
#@ set fExpr ""
#@ } else {
#@ set fExpr [expr $sEqTmp]
#@ }
#@ if { [string length $fExpr]!=0 } {
#@ append sAuxAppend "," $sEq
#@ if { $bIsCCS==1 } {
#@ append sAuxAppend " title \"y= $sEq\" axes x1y1" ;# plot auxiliaries
to 1st Y-Axis for CCS
#@ }
#@ } else {
#@ echo "warning, no.[expr $i+1] -aux equation($sEq) is invalid and
omitted. Currently, arithmetic operations(+-*/) are supported. The variable names X
and Y are used as the default independent variables. Additionally, Y is only
supported for 2 dimension tables.\n"
#@ }
#@ incr i
#@ }
#@ }
#@ # -aux2, to add auxiliary curves to 2nd Y-Axis for CCS only, currently +-*/
supported
#@ if { [string length [array names ra -aux2]] != 0 } {
#@ set itEq $ra(-aux2)
#@ set i 0
#@ foreach sEq $itEq {
#@ set sEqTmp $sEq
#@ regsub -all "X" $sEqTmp -1.67345 sEqTmp
#@ if { $nDim==2 && [llength $vSlice]==0 } {
#@ regsub -all "Y" $sEqTmp 864.195 sEqTmp
#@ }
#@ if { [string length $sEqTmp]==0 } {
#@ set fExpr ""
#@ } else {
#@ set fExpr [expr $sEqTmp]
#@ }
#@ if { [string length $fExpr]!=0 } {
#@ if { $bIsCCS==1 } {
#@ append sAuxAppend "," $sEq
#@ append sAuxAppend " title \"y2= $sEq\" axes x1y2" ;# plot auxiliaries
to 2nd Y-Axis for CCS only
#@ }
#@ } else {
#@ echo "warning, no.[expr $i+1] -aux2 equation($sEq) is invalid and
omitted. Currently, arithmetic operations(+-*/) are supported. The variable names X
and Y are used as the default independent variables. Additionally, Y is only
supported for 2 dimension tables.\n"
#@ }
#@ incr i
#@ }
#@ }
#@
#@ # -title, -xlabel, -ylabel, -y2label, several simple 'string' arguments
#@ set sTitle ""
#@ if { [string length [array names ra -title]] != 0 } {
#@ set sTitle $ra(-title)
#@ }
#@ set sXlabel ""
#@ if { [string length [array names ra -xlabel]] != 0 } {
#@ set sXlabel $ra(-xlabel)
#@ }
#@ set sYlabel ""
#@ if { [string length [array names ra -ylabel]] != 0 } {
#@ set sYlabel $ra(-ylabel)
#@ }
#@ set sY2label ""
#@ if { [string length [array names ra -y2label]] != 0 } {
#@ set sY2label $ra(-y2label)
#@ }
#@
#@ #
#@ # generate main script 'lut.dem'
#@ #
#@ set sDem $sFnPrefix
#@ append sDem "lut.dem"
#@ if [catch {open $sDem w} pDem] {
#@ puts "error, failed to open $sDem for write:$pDem"
#@ return 0
#@ }
#@ puts $pDem "reset" ;# reset graph-related options to default
#@ if { [string length $sAuxAppend]!=0 } {
#@ if { $bIsCCS==0 && $nDim==2 && [llength $vSlice]==0 } {
#@ puts $pDem "set dummy X,Y"
#@ } else {
#@ puts $pDem "set dummy X"
#@ }
#@ }
#@ if { $bIsCCSPlotAll==1 } {
#@ if { [string length $sTitle]!=0 } {
#@ append sTitle "\\n"
#@ }
#@ append sTitle [lindex $vLegend 0]
#@ if { $bOmitExpr==0 } {
#@ append sTitle " vs. " [lindex $vLegend 1]
#@ }
#@ append sTitle [getInfoString $lut]
#@ puts -nonewline $pDem "set multiplot title \"$sTitle\" layout [lindex $vSize
0],"
#@ if { $nDim==1 } {
#@ puts $pDem "1"
#@ } elseif { $nDim==2 } {
#@ puts $pDem "[lindex $vSize 1]"
#@ } ;# else 3d ... (e.g. 5*8*7, maybe 5 windows popped-up?)
#@ puts $pDem "unset border\nunset tics\nunset key"
#@ foreach sDat $vDat {
#@ puts -nonewline $pDem "plot \'$sDat\' u 1:2 with lines"
#@ if { $bOmitExpr==0 } {
#@ puts -nonewline $pDem ", \'$sDat\' u 1:3 with lines axes x1y2"
#@ }
#@ set nTolId 4 ;# tolerance data begin at 4th column for CCS object
#@ foreach sTol $vTol {
#@ puts -nonewline $pDem ", \'$sDat\' u 1:$nTolId with lines"
#@ incr nTolId
#@ }
#@ puts $pDem " $sAuxAppend"
#@ }
#@ puts $pDem "unset multiplot"
#@ } elseif { $bIsCCS==1 } {
#@ puts $pDem "set ytics nomirror"
#@ puts $pDem "set y2tics"
#@ if { [string length $sTitle]!=0 } {
#@ append sTitle "\\n"
#@ }
#@ foreach vectorVarIndex_i $vVarIdx {
#@ append sTitle $vectorVarIndex_i " "
#@ }
#@ puts $pDem "set title \"$sTitle\""
#@ if { [string length $sXlabel]==0 } {
#@ set sXlabel "time_adjust(T=time-reference_time)"
#@ }
#@ puts $pDem "set xlabel \'$sXlabel\'"
#@ if { [string length $sYlabel]==0 } {
#@ set sYlabel "current(I=vVal)"
#@ }
#@ puts $pDem "set ylabel \'$sYlabel\'"
#@ if { $bOmitExpr==0 } {
#@ if { [string length $sY2label]==0 } {
#@ set sY2label "Vout"
#@ }
#@ puts $pDem "set y2label \'$sY2label\'"
#@ }
#@ puts -nonewline $pDem "plot \'[lindex $vDat 0]\' using 1:2 with linespoints
title \"[lindex $vLegend 0]\""
#@ if { $bOmitExpr==0 } {
#@ puts -nonewline $pDem ", \'[lindex $vDat 0]\' using 1:3 with linespoints
title \"[lindex $vLegend 1]\" axes x1y2"
#@ }
#@ set nTolId 4 ;# tolerance data begin at 4th column for CCS object
#@ foreach sTol $vTol {
#@ puts -nonewline $pDem ", \'[lindex $vDat 0]\' u 1:$nTolId with linespoints
title \"[lindex $vLegend 0] $sTol\""
#@ incr nTolId
#@ }
#@ puts $pDem " $sAuxAppend"
#@ } else {
#@ if { [llength $vSlice]!=0 } {
#@ if { [string length $sTitle]!=0 } {
#@ append sTitle "\\n"
#@ }
#@ append sTitle "slice(" $vSlice ")"
#@ }
#@ if { [string length $sTitle]!=0 } {
#@ puts $pDem "set title \"$sTitle\""
#@ }
#@ if { $nDim==2 && [llength $vSlice]==0 } {
#@ # Synopsys 18:29 2016/10/28
#@ # !!!LOOK OUT!!! in next line the letter before 'nonewline' is a '–' which
#@ # is NOT A CORRECT dash symbol '-':
#@ ## puts –nonewline $pDem "set hidden3d\n"
#@ puts $pDem "set hidden3d"
#@ # removed -nogrid, raw data is shown as default, jizhan, Sep 13 2017
#@ ## if { [string length [array names ra -nogrid]] == 0 } {
#@ ## puts $pDem "set dgrid3d 50,50,4"
#@ ## }
#@ # the following line may 'hide' xyplane at start-up of plot, so comment it
out
#@ ## puts $pDem "set xyplane at 0.0"
#@ }
#@ if { $nDim==2 } {
#@ if { [string length $sYlabel]==0 } {
#@ set vVar [lookup_table variables $lut]
#@ set sYlabel [lindex $vVar 1]
#@ }
#@ }
#@ if { [string length $sXlabel]==0 } {
#@ set vVar [lookup_table variables $lut]
#@ set sXlabel [lindex $vVar 0]
#@ }
#@ if { [llength $vSlice]!=0 } {
#@ if { [string equal [lindex $vSlice 0] [lindex [lookup_table variables
$lut] 0]] } {
#@ puts $pDem "set xlabel \'$sYlabel\'"
#@ } else {
#@ puts $pDem "set xlabel \'$sXlabel\'"
#@ }
#@ } else {
#@ puts $pDem "set xlabel \'$sXlabel\'"
#@ if { [string length $sYlabel]!=0 } {
#@ puts $pDem "set ylabel \'$sYlabel\'"
#@ }
#@ }
#@ if { $nDim==2 && [llength $vSlice]==0 } {
#@ puts -nonewline $pDem "splot "
#@ set nTolBgnId 4 ;# tolerance data begin at 4th column for 3D plot
#@ } else {
#@ puts -nonewline $pDem "plot "
#@ set nTolBgnId 3 ;# tolerance data begin at 3rd column for 2D plot
#@ }
#@ for { set i 0 } { $i<$nObjSize } { incr i } {
#@ if { $i>0 } {
#@ puts -nonewline $pDem ", "
#@ }
#@ puts -nonewline $pDem "\'[lindex $vDat $i]\' with linespoints
title \"[lindex $vLegend $i]\""
#@ set nTolId $nTolBgnId
#@ foreach sTol $vTol {
#@ if { $nTolBgnId==4 } {
#@ puts -nonewline $pDem ", \'[lindex $vDat $i]\' using 1:2:$nTolId with
linespoints title \"[lindex $vLegend $i] $sTol\""
#@ } else {
#@ puts -nonewline $pDem ", \'[lindex $vDat $i]\' using 1:$nTolId with
linespoints title \"[lindex $vLegend $i] $sTol\""
#@ }
#@ incr nTolId
#@ }
#@ }
#@ puts $pDem "$sAuxAppend"
#@ }
#@ close $pDem
#@
#@ #
#@ # generate a wrapper script 'lut.demw', which sets env. and loads 'lut.dem'
#@ #
#@ set sDemw $sFnPrefix
#@ append sDemw "lut.demw"
#@ if [catch {open $sDemw w} pDemw] {
#@ puts "error, failed to open $sDemw for write:$pDemw"
#@ return 0
#@ }
#@ # save to image file (you need to plot-to-file before plot-to-X11, only
#@ # the last one being plotted is interactivable!)
#@ set sImgFile ""
#@ if { [string length [array names ra -save]] != 0 } {
#@ set sImgFile $ra(-save)
#@ }
#@ set sCurDir [pwd]
#@ if { [string length $sImgFile]!=0 } {
#@ puts $pDemw "set term png small"
#@ if { [string equal [file pathtype $sImgFile] "absolute"] } {
#@ puts $pDemw "set output \'$sImgFile\'"
#@ } else {
#@ puts $pDemw "set output \'$sCurDir/$sImgFile\'"
#@ }
#@ puts $pDemw "load \'$sDem\'"
#@ }
#@ puts $pDemw "set term X11" ;# to plot to X11
#@ puts $pDemw "load \'$sDem\'"
#@
#@ close $pDemw
#@
#@ #
#@ # execute 'gnuplot' or dump data/script
#@ #
#@ if { $bDumpDat==0 && $bDumpDem==0 } {
#@ cd $sFnPrefix
#@ lappend ::lc_plot_table_pids [exec xterm -e "gnuplot $sDemw -" &]
#@ lappend ::lc_plot_table_cmds "xterm -e gnuplot $sDemw - "
#@ cd $sCurDir
#@ } else {
#@ if { $bDumpDat==1 } {
#@ foreach sDat $vDat {
#@ printFile $sDat
#@ }
#@ }
#@ if { $bDumpDem==1 } {
#@ printFile $sDem
#@ printFile $sDemw
#@ }
#@ }
#@
#@ return 1
#@ }
#@ # This proc is hidden by now
#@ define_proc_attributes plot_table -hidden \
#@ -info "plot lookup table(s) by gnuplot." \
#@ -define_args {
#@ {luts "lookup table object variables" "object_list" list optional}
#@ {-aux "add auxiliary curves or surfaces by equations" "equation_list" list
optional}
#@ {-aux2 "add auxiliary curves aligning to 2nd Y-Axis for CCS only"
"equation_list" list optional}
#@ {-derive_output_voltage "add output voltage curve which is derived upon
default equation: V1+0.5*(I2+I1)*(T2-T1)/C" "" boolean optional}
#@ {-derive_output_voltage_equation "customize the equation to derive output
voltage curve" "equation" string optional}
#@ {-initv1 "provide Vss(Vdd) as initial V1 for derived voltage" "Vss(Vdd)"
string optional}
#@ {-index "define grid points for CCS only" "{variable1 index1 variables2
index2}|index1_id:index2_id" string optional}
#@ {-title "title for the plot chart" "title" string optional}
#@ {-xlabel "label of x-axis for the plot chart" "xlabel" string optional}
#@ {-ylabel "label of y-axis for the plot chart" "ylabel" string optional}
#@ {-y2label "label of y2-axis for the plot chart" "y2label" string optional}
#@ {-legend "legends for lookup table" "legend_list" list optional}
#@ {-save "save to image file in png format" "png_file_path" string optional}
#@ {-clear "close all opened terminals and remove all intermediate data" ""
boolean optional}
#@ {-dump "print out data and/or scripts generated, instead of plot them"
"data|script|all" string optional}
#@ {-slice "plot one slice for (non-CCS) 2D lookup tables" "{variable index}|
variable_id:index_id" string optional}
#@ {-tol "add tolerance curves or surfaces by equations" "equation_list" list
optional}
#@ }
#@ ## {-nogrid "disable grid data mapping (to 50x50) for 3D data, show original
data instead" "" boolean optional}
#@ # -- End source /cad/synopsys/lc/cur/auxx/lc/plot_table.tcl
#@ source $synopsys_root/auxx/lc/report_check_library_records.tcl
#@ # -- Starting source
/cad/synopsys/lc/cur/auxx/lc/report_check_library_records.tcl
#@ source $synopsys_root/auxx/lc/set_attribute.tcl
#@ # -- Starting source /cad/synopsys/lc/cur/auxx/lc/set_attribute.tcl
#@
#@ #for read_lib -html
#@ source ${synopsys_root}/auxx/lc/read_lib_html_msg_list.tcl
#@ # -- Starting source /cad/synopsys/lc/cur/auxx/lc/read_lib_html_msg_list.tcl
#@ ##############################################################################
#@ # message ID and descriptions for read_lib -html
#@ # Rev01. changed LBDB-715 to LBDB-262, STAR 9001225503, jizhan, Aug 17
#@ # Rev02. removed LBDB-825, STAR 9001541784, jizhan, Aug 19
#@ ##############################################################################
#@ set read_lib_ccs_noise_msg {
#@ LBDB-262
#@ LBDB-660
#@ LBDB-706
#@ LBDB-708
#@ LBDB-709
#@ LBDB-710
#@ LBDB-711
#@ LBDB-712
#@ LBDB-713
#@ LBDB-714
#@ LBDB-716
#@ LBDB-717
#@ LBDB-718
#@ LBDB-733
#@ LBDB-734
#@ LBDB-784
#@ LBDB-824
#@ LBDB-858
#@ LBDB-898
#@ LBDB-899
#@ LBDB-908
#@ LBDB-920
#@ LBDB-935
#@ LBDB-936
#@ LBDB-937
#@ LBDB-938
#@ LBDB-939
#@ }
#@ # -- End source /cad/synopsys/lc/cur/auxx/lc/read_lib_html_msg_list.tcl
#@ ##############################################################################
#@ # Author : Yun Zhang
#@ # History: 2020/6/22 created
#@ # Description: This is the source tcl file of check_lib_common_lc.tbc.
#@ # The procs are all for run common library compiler under the hood.
#@ ##############################################################################
#@ # TclPro::Compiler::Include
#@
#@ if {[catch {package require tbcload 1.6} err] == 1} {
#@ return -code error "[info script]: The TclPro ByteCode Loader is not
available or does not support the correct version -- $err"
#@ }
#@ tbcload::bceval {
#@ TclPro ByteCode 2 0 1.7 8.5
#@ 20 0 200 30 0 0 156 0 4 20 20 -1 -1
#@ 200
#@ A2F<!(H&s!/HW<!(3E<!2`8s!F_#pv2/YQ#/HW<!-Qr<!2`8s!I%ul#/2:3w/HW<!0c8=!2`
#@ 8s!K7VNw1Dpiw/HW<!2oJ=!2`8s!MI70%@.mf%/HW<!4&|=!2`8s!Pd3-&6qMH&/HW<!78#>
#@ !2`8s!R!jc&JjJE'/HW<!9D5>!2`8s!U<f`';I+'(/HW<!<VP>!2`8s!WNGB(TQ(w)/HW<!>
#@ bb>!2`8s!ZiC?)Zuw!*/HW<!At(?!/E<!!
#@ 20
#@ @1IOwI1IOwI1IOwI1IOwI1IOw
#@ 20
#@ I%%n#I%%n#I%%n#I%%n#Hq^R#
#@ 30
#@ x
#@ 4
#@ ,CHr@
#@ x
#@ 27
#@ lj|Z?w3F/Du'VgC&>m#H8&Z)F5mNaEt-E-
#@ x
#@ 1
#@ A!
#@ p
#@ 5 0 29 3 0 0 20 0 9 5 5 -1 -1
#@ 29
#@ w0E<!w0E<!w0E<!w0E<!6P1qv3&5pv-E<!!z
#@ 5
#@ )|y9v%!
#@ 5
#@ 'wwi%*!
#@ 3
#@ x
#@ 4
#@ m'cSA
#@ x
#@ 7
#@ %H9KDUvg+
#@ x
#@ 23
#@ hgtdD/BsJDZnmX?#O`aEg9m*E_I-,
#@ 0
#@ 0
#@ 0 0
#@ x
#@ 22
#@ epCkBo0m*EpvnX?3DccE,&MEFO(%
#@ x
#@ 7
#@ /^,8AY@c,
#@ x
#@ 25
#@ lj|Z?w3F/Du'VgCg3MTAk'cOBq,BCF4v
#@ x
#@ 2
#@ a,v
#@ p
#@ 26 0 375 16 2 0 144 1 7 26 38 -1 -1
#@ 375
#@ 32fv!8^w!!.H!!!w3E<!JAe`B#1NW<#3WW!(H&s!>SN?!,Ki<!6h)g%0#>6#@Yw4w1/GpvQk
#@ s<!QSa<!2l+dB<jTZ)v*<<!(H&s!8Qr<!=>YQ#5l+UvVL_w!AqXaB:Xs#)v*<<!:>T=!;eQj
#@ w4u&v!>SGY!8^w!!c?)!!'NA9v3DUNw5Qr<!=>YQ#5l+Uv<b7U-CV%Qb5v!!!kv!!!laykBy
#@ 6fr3v*<<!3Jpiw4S60%6fSs!9YQK%AIuaB+&13wv*<<!Xg_bB4v&*'v*<<!4S60%6fSs!KDe
#@ `BKGBK.v*<<!,`yTv6fSs!TIuaB+&13wv*<<!P1caB+&13wv*<<!wO2,!DI_w!gA*07v*<<!
#@ 4S60%6fSs!R0n<vujZRI#3WW!yLDI/F*W8sREPt!5v!!!F!!!!(E`<!8,,pvFaKL&5v!!!.!
#@ !!!?:WH&ISa<!WSa<!GN2,!-i8v!,,:3wv!!!
#@ 26
#@ =+@n#-.^B)XX%n#I=.n#L@!kwc|9p#Bc!
#@ 38
#@ 4N3<!)^k|vlg)urcv7il5w*!!aBpQ%NORS#g%74wwaKU#:E!
#@ 16
#@ x
#@ 17
#@ w3F/D'gi'FrZ!iCnc%UA/v
#@ x
#@ 7
#@ &OQ<@xe|+
#@ x
#@ 5
#@ ijkIDBv
#@ x
#@ 17
#@ k%PJ:qw!d;&MC0:qkXJ:u!
#@ x
#@ 4
#@ m'cSA
#@ x
#@ 6
#@ 1lo(F^(%
#@ x
#@ 1
#@ P!
#@ x
#@ 9
#@ q3HQBb!cr@4v
#@ x
#@ 9
#@ V:wLD5Q<JDP!
#@ x
#@ 1
#@ R!
#@ i
#@ 0
#@ x
#@ 15
#@ -#l#H8&Z)F5mNaEt-E-
#@ x
#@ 8
#@ %xRQB:p2TA
#@ x
#@ 8
#@ i%97A&jmMC
#@ x
#@ 8
#@ qLK;@0dhTA
#@ x
#@ 0
#@
#@ 2
#@ L 0 171 102 317 274 -1
#@ C 0 288 14 -1 -1 300
#@ 0
#@ 0 3
#@ 8
#@ rmBq@NjkSA
#@ 0 0 0
#@ 9
#@ rmBq@q,BCF4v
#@ 1 0 0
#@ 4
#@ %xRQB
#@ 2 0 0
#@ x
#@ 18
#@ #k|Z?w3F/Du'VgCf!Q<@y(%
#@ p
#@ 25 0 255 17 0 0 104 0 3 25 25 -1 -1
#@ 255
#@ w0E<!KN2,!EOhw!#0E<!+BE<!41fg&5v!!!/!!!!w-<<!^Kn<v>Me`BJ>'0.#3WW!0#>6#3#
#@ Ts!TG;I/m&3,!/uJv!#0E<!Ga++'M`yTv8^w!!JGv!!*cvpv5JUNw'qrD!:1fg&5v!!!/!!!
#@ !/oJ=!fKn<v>Me`BLP|f.#3WW!0#>6#82Ts!TG;I/o,3,!1,|v!#0E<!CYCqvxKn<v>Me`BJ
#@ >'0.#3WW!0#>6#:8Ts!TG;I/m&3,!/uJv!#0E<!H=J*'M`yTv8^w!!JGv!!*cvpv:v3-&'qr
#@ D!:1fg&5v!!!/!!!!48#>!_Kn<v'0!!
#@ 25
#@ 9egm#KeHK%KeHK%KeHK%?ur!!K;s!!/!
#@ 25
#@ ^'nK%j@<L%j@<L%nRr-&`sMR#ipMR#/!
#@ 17
#@ x
#@ 17
#@ hgtdD/BsJDZnmX?1lo(F@v
#@ x
#@ 4
#@ 8w`TA
#@ x
#@ 25
#@ lj|Z?w3F/Du'VgCg3MTAk'cOBq,BCF4v
#@ x
#@ 7
#@ &OQ<@xe|+
#@ x
#@ 5
#@ s85)F1v
#@ x
#@ 0
#@
#@ x
#@ 4
#@ wm<eD
#@ x
#@ 3
#@ kL2-
#@ x
#@ 23
#@ hgtdD/BsJDZnmX?7,V`F'^m*E_I-,
#@ i
#@ 0
#@ x
#@ 4
#@ MyB,E
#@ x
#@ 27
#@ hgtdD/BsJDZnmX?+sEiC%<0CFa@|mAytf+
#@ x
#@ 27
#@ w3F/Du'VgCjNIQBiOjY?w3F/D.jAn/e.Q,
#@ x
#@ 23
#@ hgtdD/BsJDZnmX?#O`aEg9m*E_I-,
#@ x
#@ 25
#@ lj|Z?w3F/Du'VgCg3MTAk'cOBq,BCF4v
#@ x
#@ 27
#@ hgtdD/BsJDZnmX?rTN+ErfR.Dk^CkBf^;-
#@ x
#@ 20
#@ hgtdD/BsJDZnmX?n:=Y?%xRQB
#@ 0
#@ 0
#@ 0 0
#@ x
#@ 20
#@ 3aMTAr-!eD/BsJDZnmX?4|k)F
#@ p
#@ 24 0 195 12 0 0 96 0 3 24 24 -1 -1
#@ 195
#@ w0E<!-fSs!O,uc/ViA9v,|8X!M`yTv8^w!!B/v!!w-*!!*`vpv'qrD!-A77w.r=6#Omm<v>M
#@ e`BBKMT+#3WW!w0E<!3#Ts!O,uc/ViA9v2o8X!M`yTv8^w!!B/v!!w-*!!-&tl#'qrD!-A77
#@ w0/tl#Omm<v>Me`BBKMT+#3WW!w0E<!5)Ts!O,uc/ViA9v4u8X!M`yTv8^w!!B/v!!w-*!!/
#@ 8UNw'qrD!-A77w2AUNwOmm<v'0!!
#@ 24
#@ /JHK%CeHK%CeHK%CeHK%CeHK%CeHK%
#@ 24
#@ QMbpvZMbpvZMbpvZMbpvZMbpvYMbpv
#@ 12
#@ x
#@ 4
#@ wm<eD
#@ x
#@ 3
#@ kL2-
#@ x
#@ 17
#@ hgtdD/BsJDZnmX?1lo(F@v
#@ i
#@ 0
#@ x
#@ 5
#@ 3aMTA@v
#@ x
#@ 0
#@
#@ x
#@ 23
#@ hgtdD/BsJDZnmX?7,V`F'^m*E_I-,
#@ x
#@ 21
#@ w3F/Du'VgCf-DTA@)QDFq,BCF4v
#@ x
#@ 27
#@ hgtdD/BsJDZnmX?+sEiC%<0CFa@|mAytf+
#@ x
#@ 23
#@ hgtdD/BsJDZnmX?#O`aEg9m*E_I-,
#@ x
#@ 27
#@ hgtdD/BsJDZnmX?rTN+ErfR.Dk^CkBf^;-
#@ x
#@ 20
#@ hgtdD/BsJDZnmX?n:=Y?%xRQB
#@ 0
#@ 0
#@ 0 0
#@ x
#@ 8
#@ k^YSAqP(yG
#@ x
#@ 1
#@ ?v
#@ p
#@ 2 0 26 4 0 0 8 0 5 2 2 -1 -1
#@ 26
#@ w0E<!.9`W!0&5Uv8^w!!-E!!!-iA=!z
#@ 2
#@ .H!
#@ 2
#@ :E!
#@ 4
#@ x
#@ 6
#@ gd|;@b:%
#@ x
#@ 4
#@ rwIID
#@ x
#@ 2
#@ >Kv
#@ x
#@ 3
#@ g'i-
#@ 0
#@ 0
#@ 1 2
#@ 1
#@ ?v
#@ 0 0 256
#@ 3
#@ g'i-
#@ 1 0 0
#@ x
#@ 24
#@ #k|Z?w3F/Du'VgCd?<eDtc/bEu,aaE
#@ p
#@ 9 0 92 15 0 0 36 0 6 9 9 -1 -1
#@ 92
#@ )Nr<!I>e`BQ(;E0#3WW!+I*%;v9o7-S^w!!;o!!!w3E<!*TA9v.lvpv1l8X!`(kq+1oes!6G
#@ :3w:_piw<&|=!6)Ks!/HW<!:,f=!Gk60%4DkUv-E<!!
#@ 9
#@ 1GUm#I:*L%4!
#@ 9
#@ a#L>vbpy*'1!
#@ 15
#@ x
#@ 3
#@ _e|+
#@ x
#@ 20
#@ hgtdD/BsJDZnmX?n:=Y?%xRQB
#@ i
#@ 0
#@ x
#@ 6
#@ sT2TAIPw
#@ x
#@ 8
#@ m'cSANjkSA
#@ x
#@ 1
#@ +v
#@ x
#@ 5
#@ n0Hr@7v
#@ x
#@ 12
#@ #graEv_Bq@,0B(F
#@ x
#@ 0
#@
#@ x
#@ 4
#@ m'cSA
#@ x
#@ 6
#@ gpbSAPSw
#@ x
#@ 6
#@ AP5cE?Sw
#@ x
#@ 23
#@ hgtdD/BsJDZnmX?7,V`F'^m*E_I-,
#@ x
#@ 1
#@ P!
#@ x
#@ 5
#@ r!2kB>v
#@ 0
#@ 0
#@ 0 1
#@ 8
#@ m'cSANjkSA
#@ 0 0 0
#@ x
#@ 14
#@ 4rBfD1-0CFq&fwGJ%%
#@ x
#@ 10
#@ (KxhCN1-.DQ-v
#@ p
#@ 17 0 213 23 2 1 84 2 10 17 21 -1 -1
#@ 213
#@ w0E<!(H&s!*N&s!+Q&s!,T&s!CY,>!8^w!!2V'!!*i=6#4;tl#=MGY!g@#!!ee6(!H,FN-gE
#@ EfR8SUNw<P>:v8P60%.EW<!--<<!BJ:3w0T`<!Q.taBLP|f.v*<<!f!!!!6^w!!/K!!!12>:
#@ vI,s<!Hv(g7.CI.!4qVH&7P60%DPe`Bbl^l5#3WW!@A#>!T,PU,=;'v!Bb>:vJjJE'5v!!!-
#@ !!!!@=N-&?@e`'4oSs!eFNH&>thc&FO+'(2iSs!G;O8sBA6-&z
#@ 17
#@ C^No#L2#Y!_cpw)>2|X!7!
#@ 21
#@ Pf3<!:'Le#-kv:wIT%m5`NOkw/!
#@ 23
#@ x
#@ 4
#@ q#TCF
#@ x
#@ 6
#@ hIa:@PSw
#@ x
#@ 11
#@ m9.bEi`JT8eIl,
#@ x
#@ 1
#@ R!
#@ x
#@ 22
#@ q3HQBl#sJD8o(`FnlrJDu_PcEX%%
#@ x
#@ 21
#@ q3HQBkoW/DmgY8AnT_5BgKxhC1v
#@ x
#@ 18
#@ hgtdD!CIIDkcreDb^CkBHSw
#@ x
#@ 4
#@ wm<eD
#@ x
#@ 4
#@ 4|k)F
#@ x
#@ 3
#@ j#L%
#@ x
#@ 2
#@ FVw
#@ x
#@ 5
#@ sB-<@Ev
#@ x
#@ 6
#@ 1lo(F^(%
#@ x
#@ 21
#@ 6dV<+:mui@26nlBPPW(46dV<+A!
#@ x
#@ 6
#@ !xMTAFVw
#@ i
#@ 0
#@ x
#@ 0
#@
#@ x
#@ 4
#@ DP)*F
#@ x
#@ 12
#@ h-ur@E5>F+91VE+
#@ x
#@ 25
#@ ruwlB/wJ9>gd|;@>AufA'%U;@(y(S.A!
#@ x
#@ 8
#@ k^YSAqP(yG
#@ x
#@ 4
#@ wg;3I
#@ x
#@ 5
#@ P!i<+Iv
#@ 2
#@ L 0 60 144 210 50 -1
#@ C 1 105 20 -1 -1 123
#@ 1
#@ F
#@ 1 2 3
#@ 1
#@ 4
#@ 1 7
#@ 8
#@ m'cSANjkSA
#@ 0 0 256
#@ 12
#@ 'ZPDFd%+:@EAl)F
#@ 1 0 0
#@ 0
#@
#@ 2 0 512
#@ 0
#@
#@ 3 0 512
#@ 3
#@ kL2-
#@ 4 0 0
#@ 6
#@ 7,V`FW+%
#@ 5 0 0
#@ 4
#@ .0B,E
#@ 6 0 0
#@ x
#@ 21
#@ ^_`p@hp^LCcXKV@`jbSAp#K^F<v
#@ p
#@ 3 0 36 10 0 0 12 0 6 3 3 -1 -1
#@ 36
#@ /rS=!6U(+((H&s!,`yTv5Qr<!<)Ks!Qsm<v.TW<!19*!!
#@ 3
#@ @nG#
#@ 3
#@ VoE!
#@ 10
#@ x
#@ 27
#@ hgtdD/BsJDZnmX?rTN+ErfR.Dk^CkBf^;-
#@ x
#@ 5
#@ s85)F1v
#@ x
#@ 4
#@ m'cSA
#@ x
#@ 6
#@ gpbSAPSw
#@ x
#@ 6
#@ AP5cE?Sw
#@ x
#@ 23
#@ hgtdD/BsJDZnmX?7,V`F'^m*E_I-,
#@ x
#@ 1
#@ P!
#@ x
#@ 20
#@ hgtdD/BsJDZnmX?n:=Y?%xRQB
#@ x
#@ 0
#@
#@ x
#@ 20
#@ 3aMTAr-!eD/BsJDZnmX?4|k)F
#@ 0
#@ 0
#@ 0 0
#@ x
#@ 23
#@ ,v(Z?w3F/Du'VgCoo3mBm+BRAyOl,
#@ x
#@ 8
#@ o4jY?m'cSA
#@ p
#@ 30 0 407 32 2 0 144 1 8 30 34 -1 -1
#@ 407
#@ w0E<!1#T=!/r=pv2G^3w-u4Uv6/Ypv9u&s!5v!!!Q!!!!7kZjwgfvdB>'6<*v*<<!,#tl#9i
#@ A=!Ebpiw8S60%=MGY!VyQK%8^w!!.H!!!2ylf%LGe`B.A-0%v*<<!G1);v8^w!!x')!!EL_w
#@ !T>puB<jTZ)v*<<!!oxR5e:NH&<;YUvPpm<vGhe`B^HGT4v*<<!H^/*'L!f`'GR+'(>bq9-X
#@ ^w!!5|!!!;RFB(Gk#t!COAI&;N2,!+|&v!d&.36VyQK%8^w!!IDv!!5vic&JjJE'J+ZUvHtP
#@ pvTIuaB+&13wv*<<!4Ta<!FN2,!aMg'!,,:3wg6#+15v!!!O!!!!pDhQ5vE3,!.oAv!#0E<!
#@ T2Bs!5v!!!+!!!!9S2U#BhYUvOmm<v4fW<!INE<!HNW<!2E9!sSWXA!FN2,!O6n%!hG307v*
#@ <<!KkB=!9_lf%,eN48;I%!!:n^qvbs7e/mQur*VyQK%8^w!!:l!!!+rXQ#Hv87wLt|X!Omm<
#@ v0K!!
#@ 30
#@ =Xv+'`Q,N%Yp`1%PLdjwY*Th%Wa<kwMhPUvQN!
#@ 34
#@ 6@&a0l*sL%!w!!!i.Wp4WF.4wMuIR5mhtpv#-|rv@3!
#@ 32
#@ x
#@ 4
#@ *dmID
#@ x
#@ 1
#@ Hv
#@ x
#@ 23
#@ hgtdD/BsJDZnmX?#O`aEg9m*E_I-,
#@ x
#@ 20
#@ JaGQB*kbD+nEi'FrZ!iCV%BE+
#@ x
#@ 27
#@ lj|Z?w3F/Du'VgC&>m#H8&Z)F5mNaEt-E-
#@ x
#@ 4
#@ J2*D+
#@ x
#@ 12
#@ vAE-0;oU6036viC
#@ x
#@ 1
#@ >v
#@ x
#@ 27
#@ hgtdD/BsJDZnmX?rTN+ErfR.Dk^CkBf^;-
#@ x
#@ 23
#@ hgtdD/BsJDZnmX?7,V`F'^m*E_I-,
#@ x
#@ 1
#@ P!
#@ x
#@ 20
#@ hgtdD/BsJDZnmX?n:=Y?%xRQB
#@ x
#@ 14
#@ ;oW/D!e'Z?64BbCMYw
#@ x
#@ 1
#@ Cv
#@ x
#@ 0
#@
#@ i
#@ 0
#@ x
#@ 4
#@ 8w`TA
#@ x
#@ 4
#@ DP)*F
#@ x
#@ 6
#@ :<ylBLYw
#@ x
#@ 5
#@ wRH<@8v
#@ x
#@ 7
#@ 9WmIDeI-,
#@ x
#@ 1
#@ X!
#@ x
#@ 7
#@ =P6X5R^`w
#@ x
#@ 1
#@ B!
#@ x
#@ 1
#@ A!
#@ x
#@ 2
#@ 2fv
#@ x
#@ 34
#@ Yl<eD,wBCFMk8c3Q@=nA&!=JD'WrSA;cN<@ktWU@HSw
#@ x
#@ 5
#@ s85)F1v
#@ x
#@ 4
#@ +u(*F
#@ x
#@ 4
#@ u3uSA
#@ x
#@ 5
#@ )lP)F1v
#@ x
#@ 0
#@
#@ 2
#@ L 0 119 195 331 315 -1
#@ C 0 348 12 -1 -1 358
#@ 0
#@ 1 7
#@ 8
#@ o4jY?m'cSA
#@ 0 0 256
#@ 4
#@ g3IID
#@ 1 0 0
#@ 3
#@ d4w,
#@ 2 0 0
#@ 4
#@ lWNeD
#@ 3 0 0
#@ 9
#@ ,uk)Fdd;JD1v
#@ 4 0 0
#@ 4
#@ u3uSA
#@ 5 0 0
#@ 5
#@ bT/bE>v
#@ 6 0 0
#@ x
#@ 23
#@ w3F/Du'VgCZCbOB_.aY?!aiaEnTr-
#@ x
#@ 11
#@ 0Q%hCgKxhC,tEw
#@ p
#@ 10 0 95 14 0 0 40 0 5 10 10 -1 -1
#@ 95
#@ /rS=!1Gwjw'E&s!H=rH&9N2,!4>##!#0E<!1NE<!@4`H&-fvpv5|8X!6Sp3w25bpv/o=6#7)
#@ tl#2Q/X!.EW<!5TN<!7`8s!9;|X!-BW<!>&#pv4P60%(w!!
#@ 10
#@ GFIOwG17n#/6!
#@ 10
#@ Vv)7#Gh17#,-!
#@ 14
#@ x
#@ 23
#@ hgtdD/BsJDZnmX?7,V`F'^m*E_I-,
#@ x
#@ 1
#@ P!
#@ x
#@ 20
#@ hgtdD/BsJDZnmX?n:=Y?%xRQB
#@ x
#@ 27
#@ hgtdD/BsJDZnmX?+sEiC%<0CFa@|mAytf+
#@ x
#@ 4
#@ *dmID
#@ x
#@ 1
#@ -v
#@ x
#@ 14
#@ 4rBfD1-0CFq&fwGJ%%
#@ x
#@ 4
#@ DP)*F
#@ x
#@ 41
#@ =P6X5r*r<+fF'Z?w3F/Du'VgCZCbOB_.aY?c_dX?,CHr@(okcE1v
#@ x
#@ 7
#@ A;lcE_iGw
#@ x
#@ 7
#@ =P6X5R^`w
#@ x
#@ 5
#@ )lP)F1v
#@ x
#@ 23
#@ ,v(Z?w3F/Du'VgCoo3mBm+BRAyOl,
#@ x
#@ 21
#@ ^_`p@hp^LCcXKV@`jbSAp#K^F<v
#@ 0
#@ 0
#@ 1 3
#@ 9
#@ o4jY?m'cSAQ!
#@ 0 0 256
#@ 8
#@ o4jY?m'cSA
#@ 1 0 0
#@ 4
#@ g3IID
#@ 2 0 0
#@ x
#@ 15
#@ rpwhC;Z2b3<?<+EfqT+
#@ 0
#@ 0
#@ }
#@ # -- End source /cad/synopsys/lc/cur/auxx/LC2/check_lib_common_lc.tbc