2008年12月25日星期四

tcl在DC中的使用-----part1

1.计算target library中mux单元的个数(mux单元都是mx开头的形式)

proc mux_cnt{{lib_name typical.db}} {
redirect -variable libdata {report_lib $lib_name}
set mx_number [regexp -all mx $libdata]
echo "the count of mux in $lib_name is \t $mx_number\n"
}

说明:
redirect不仅可以将命令的输出送到文件中,也可以送到某个变量中,如果送到文件中,也可以用unix下glob -c mx $file来计算mx_number。
regexp不仅可以返回是否匹配的标志,也可以使用-all来返回匹配的个数。

2.计算一个timing group中TNS

proc rpt_TNV {} {
redirect -variable rptstring {report_constraint -all_violators -nosplit}
foreach line [split $rptstring \n] {
if {[string match *VIOLATED* $line]} {
incr TNV } else {
echo $line set TNV 0 }
}
}; # End proc

说明:
split函数可以用来将string分成list,然后使用foreach来遍历每个元素。

3.lsearch和string match的使用
lsearch有三个option,-exact,-glob,-regexp 后面紧跟这list,最后是patten。注意list和pattern的先后顺序,与glob命令和regexp是不一样的。返回的值是最先匹配到元素的indice值。可以结合lindex来使用,查看匹配的元素。
string match后面先跟着pattern,最后才是string。返回是否匹配的布尔值。

4.完善自定义proc的help功能。
使用define_proc_attribute来实现。
define_proc_attributes clean_log \
-info "Removing duplicating timing report" \
-command_group my_goup \
-define_args { {infile "log file to be cleaned" infile} {outfile "cleaned file" outfile}}

proc clean_log{infile outfile}{
set in_file_hd [open $infile r]
set out_file_hd [open $outfile w]
while {[gets $in_file_hd each_line] != -1} {
puts $out_file_hd $each_line}
close $in_file_hd
close $out_file_hd
}

说明:上面定义的proc有一个不足,就是infile和outfile位置都是固定的,不能颠倒,处于robust的考虑,可以采用clean_log -infile file_name -outfile file_name的方式就好了。可以使用parse_proc_arguments -args $args results,这样程序可以写成如下的形式:
proc clean_log {args} {
parse_proc_arguments -args $args results
set in_file_hd [open $results(-infile) r]
set out_file_hd [open $results(-outfile) w]
……
}
注意在使用这种不需要位置的参数,需要在defien_proc_attribute中来define_args。

5.关于collection的使用。
如果将collection赋给某个变量,比如下面的命令set allclock [all_clocks],然后试图在终端查看它,使用echo,你会得到一个_selxx的值,很郁闷把,DC在查看collection的时候,使用了两条专有的命令,一个是query_objects,一个是get_object_name,从名字上就可以看出来,query_objects可以看多具有多个对象的collection内容,而get_object_name只可以查看具有一个对象的collection内容。

没有评论: