抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#置换变量
set a 'snow'
puts $a
#打印a的值

#命令置换
#[]内部是一个独立tcl语句
set a [expr 3+4]
puts $a
#结果为7

#转义字符
puts 'a\tb'
puts 'a\nb'

#添加后缀
puts ${a}_1
#打印7_1

符号

1
2
3
4
5
6
7
8
9
#置换
set x 1
set Y 2
puts "\t[expr $x + $Y]"
#打印3,""中会置换命令和变量

puts {\t[expr $x + $Y]}
#打印\t[expr $x + $Y],{}中的内容当做普通字符

数组

1
2
3
4
5
6
7
8
9
10
11
#定义
set cell_1(a_name) "array_1"
set cell_1(b_name) "array_2"
set cell_1(c_name) "array_3"
#取值
puts $cell_1(a_name)

array size cell_1
#打印 3,数组长度为3
array names cell_1
#打印a_name,b_name,c_name

列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
set ive_list{liv1,liv2,liv3}
puts $ive_list

#合并列表
set list1{l1,l2,l3}
set list2{s1,s2,s3}
concat $list1 $list2

#查看长度
llength $list1
llength [concat $list1 $list1]

#返回index的元素,下标从0开始
lindex $list1 1
#打印l2

#得到list1{a,b,c,d,e}的最后一个元素
set list1 {a,b,c,d,e}
lindex $list1 [expr [llength list1] -1]

#末尾追加新元素
set list1 {a,b,c}
lappend list1 d

#排序,默认按照ASICC码排列
set list1 {c,d,e,a,b}
lsort $list1

set list1 {1.0,1.2,0.3,0.1,0}
lsort -real $list1
#按照浮点数排列

set list1 {a,a,e,e,c,c,b,b,d}
lsort -unique $list1
#排序并唯一化元素

运算表达式

1
2
3
4
5
6
7
#求运算表达式的值
expr 1 + 2
expr 1 * 2
expr 5/2.0
#打印浮点数,2.5
expr 5/2
#打印整数,2

‍流程控制**

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#if else
set a 3
set b 2
if {$a > $b} {
puts $a
} else {
puts $b
}
#打印2

#foreach
set list1 {1,2,3}
foreach i $list1{
puts $i
}
#打印1,2,3

#break,continue
set list1 {3,2,1}
foreach i $list1{
if {$i==2} {
break/continue
}
puts $i
}

#while
set i 3
while {$i>0} {
puts $i
incr i-1; #等效于 set i [expr $i-1]
}

#for
for {set i 3} {$i>0} {incr i-1} {
puts $i
}

proc函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#过程函数proc
proc add {a b} {
set sum [expr $a + $b]
return $sum
}
add 3 4
#打印7

#过程中使用global引用全局变量
set a 1
proc sample {x} {
global a
set a [expr $a + 1]
return [expr $a + $x]
}
sample 3
#打印5

正则表达式

符号 功能
* 零次或多次
+ 一次或多次
零次或一次
^ 匹配字符串开头
$ 匹配字符串结尾
\s 表示空格
. 匹配任意一个字符
\w 匹配一个字符
\d 匹配一个数字

文本处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#open,gets,close
#只读模式
#第一行开始逐行读取
#关闭文件
set inputFiles [open file.text r]
while {[gets $inputFiles line] >=0} {
puts "$line"
}
close $inputsFiles

#写入模式
set outputFiles [open file.text w]
puts $outputFiles "hello world"
close $outputFiles

文本file.txt,读取内容求所有Slack的值之和

Slack = -0.0051

Slack = -0.0021

Slack = -0.0012

1
2
3
4
5
6
7
8
9
10
set num 0
set $inputFiles [open file.txt r]
while {[gets $inputFiles line] >=0} {
if {[regexp {^Slack\s+=\s+(-?\d+.?\d+)}
$line total slack]} {
set num [expr $sum + $slack]
}
}
close $inputFiles
puts $sum

‍Synopsys TCL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#查看design中的port
get_ports portsName
#通配符查看
get_ports *
#查看以C开头的port
get_ports C*

#查看design中对应的cell的instance
get_cells cellsName

#查看design中对应的net
get_nets netsName

#查看nets的个数
llength [get_object_name[get_nets *]]
#或者
sizeof_collection[get_nets *]

#查看pins,以Z开头
get_pins */Z