概述
赋值语句set
set a 1
set b 1
变量置换$
% set a "snow"
snow
% puts $a
snow
% puts a
a
命令置换[]
set a [expr 3 + 4]
puts $a
7
set y [expr $x + 100; set b 300]
反斜杠置换\
TCL语言中的反斜杠置换类似于C语言中反斜杠的用法,主要用于在单词符号中插入注入换行符,空格,[,$等被TCL解释器当作特殊符号对待的字符。
% puts "\[expr \$X + $Y\]"
[expr $X + $Y]
双引号和花括号
TCL解释器对双引号中的各种分隔符将不作处理,但对换行符及$和[]两种置换符会照常处理
%set x 100
100
%set y "$x ddd"
100 ddd
而在花括号中,所有特殊字符都将成为普通字符,失去其特殊意义,TCL解释器不会对其作特殊处理。
set y {/n$x [expr 10+100]}
/n$x [expr 10+100]
注释
TCL中的指示符是#,#前若有命令,则命令结尾需要加分号
%#This is a comment
%set a 100;#This is a commet
变量、数组、列表
变量
一个TCL的简单变量包含两个部分:名字和值。名字和值都可以是任何字符串。
定义:set 变量名 变量值
取值:$变量名
%set a 2
2
%puts ${a}_1
2_1
数组
数组是一些元素的集合。TCL的数组和普通计算机语言中的数组有很大区别。在TCL中,不能单独声明一个数组,数组只能和数组元素一起声明。数组中,数组元素的名字包含两部分:数组名和数组中元素的名字,每一种元素名都有其独立的值。
定义:set 数组名(元素名) 值
取值:$数组名(元素名)
% set cell_1(ref_name) "bufx2"
bufx2
% set cell_1(full_name) "top/cell_1"
top/cell_1
% set cell_1(pins) "A B C"
A B C
% puts $cell_1(ref_name)
bufx2
使用array指令获取数组信息
% array size cell_1
3
% array names cell_1
ref_name pins full_name
列表
列表是标量的有序集合。
定义:set 列表名 {元素1 元素2 元素3......}或者list ? value value
取值:$列表名
%set ivt_list {ivtx2 ivtx3 ivtx8}
ivtx2 ivtx3 ivtx8
% puts $ivt_list
ivtx2 ivtx3 ivtx8
% list 1 2 {3 4}
1 2 {3 4}
列表常用操作命令
1.concat
功能:合并两个列表
格式:concat 列表1 列表2
% set list1 {bufx1 bufx2 bufx4}
bufx1 bufx2 bufx4
% set list2 {ivtx1 ivtx2 ivtx4}
ivtx1 ivtx2 ivtx4
% concat $list1 $list2
bufx1 bufx2 bufx4 ivtx1 ivtx2 ivtx4
2.llength
功能:选取列表中的元素个数
格式:llength 列表
% set list1 {bufx1 bufx2 bufx4}
bufx1 bufx2 bufx4
% llength $list1
3
3.lindex
功能:返回列表中第n个元素(从0开始计数) 格式:lindex 列表n
% set list1 {bufx1 bufx2 bufx4}
bufx1 bufx2 bufx4
% lindex $list1 1
bufx2
4.lappend
功能:在列表末端追加元素 格式: lappend 列表 新元素
% set a {1 2 3}
1 2 3
% set b {4 5}
4 5
% lappend a $b
1 2 3 {4 5}
5.lsort
功能:列表排序
格式:lsort 开关 列表
开关:缺省时默认按照ASCII码进行排序
- -real 按照浮点数值大小排序
- -unique 唯一化,删除重复元素
% set list2 {-2 3.1 5 0}
-2 3.1 5 0
% lsort -real $list2
-2 0 3.1 5
例题:如何得到列表list1{0 1.2 -4 3 5}中的最小值?
% set list1 {0 1.2 -4 3 5}
0 1.2 -4 3 5
% lsort -real $list1
-4 0 1.2 3 5
% lindex [lsort -real $list1] 0
-4
数学运算指令
格式:expr 运算表达式
功能:将运算表达式求值
%expr 1 + 2*3
7
控制流
if
格式:
if{判断条件}{
脚本语句
}elseif{判断条件}{
脚本语句
}else{
脚本语句
}
注意,脚本语句中的'{'一定要卸载上一行,因为如果不这样,TCL解释器会认为if命令在换行符处已经结束,下一行会被当成新的命令,从而导致错误
例题:我们如何判断一个列表{0 1 2 3 4}的长度是大于3,还是等于3,还是小于3
% set list1 {0 1 2 3 4}
0 1 2 3 4
% set length [llength $list1]
5
% if {$length > 3}{
puts "The length of list1 is larger than 3"
} elseif {$length == 3}{
puts "The length of list1 is equal to 3"
} else {
puts "The length of list1 is less than 3"
}
The length of list1 is larger than 3
foreach
功能:从第0个元素开始,每次按顺序取得列表的一个元素,将其赋值给变量,然后执行循环主体一次,直到列表的最后一个元素。
格式:foreach 变量 列表 循环主体
% set list1 {3 2 1}
3 2 1
% foreach i $list1{
puts $i
}
3
2
1
break
格式:break
功能:结束整个循环过程,并从循环中跳出
% set list1 {3 2 1}
3 2 1
% foreach i $list1 {
if {$i == 2}{
break
}
puts $i
}
3
continue
格式:continue
功能: 仅结束本次循环
% set list1 {3 2 1}
3 2 1
% foreach i $list1 {
if {$i == 2} {
continue
}
puts $i
}
3
1
while
格式:while 判断语句 循环主体
功能:如果半段语句成立(返回值非0),就运行脚本,直到不满足判断条件停止循环,此时while命令中断并返回一个空字符串。
% set i 3
3
5 while {$i>0}{
puts $i
incr i -1; #set i [expr $i -1]
}
3
2
1
for
格式:for 参数初始化 判断语句 重新初始化参数 循环主体
功能:如果判断语句返回值非0就进入循环,执行循环主体后,再重新初始化参数。然后再次进行判断,直到判断语句返回值为0,循环结束。
% for {set i 3} {$i > 0} {incr i - 1} {
puts $i
}
3
2
1
过程函数
proc
格式:proc 函数名 参数列表 函数主体
功能:类似于C语言中的函数。即用户自定义的功能,方便多次调用。
% proc add {a b} {
set sum [expr $a + $b]
return $sum
}
% add 3 4
7
全局变量与局部变量
全局变量:在所有过程之外定义的变量。
局部变量:对于在过程中定义的变量,因为它们只能在过程中被访问,并且当过程退出时会被自动删除。
指令global,可以在过程内部引用全局变量
% set a 1
1
% proc sample {x} {
global a
set a [expr $a + 1]
return [expr $a + $x]
}
% sample 3
5
% set a 1
1
% proc sample {x} {
set a [expr $a + 1]
return [expr $a + $x]
}
% sample 3
can't read "a":nu such variable
正则匹配
正则匹配
定义:正表达式是一种特殊的字符串模式,用来去匹配符合规则的字符串。
\w 用来匹配一个字母、数字、下划线
\d 用来匹配一个数字
字符串 abc123
正则表达式 \w\w\w\d\d\d
正则匹配-量词
* 零次或多次匹配
+ 一次或多次匹配
? 零次或一次匹配
字符串 abc123
正则表达式 \w+\d+或者\w*\d*
正则表达式 \w?\w?\d\d\w\w\d\d
字符串 12ab34
字符串 ab12ab34
正则匹配-锚位
锚位:用来指示字符串当中的开头和结尾的位置,使我们能够匹配到正确的字符
^ 字符串开头
$ 字符串结尾
字符串 123abc123
匹配开头的数字 ^\d\d\d
匹配结尾的数字 \d\d\d$
正则匹配-其他字符
\s表示空格
\.表示任意一个字符
字符串 xxx空格xxx空格xxx //x为未知字符
正则表达式 .+\s.+\s.+
正则匹配指令-regexp
格式:regexp? switches? exp string? matchVar? ?subMatchVar subMatchVar ...?
功能:在字符串中使用正则表达式匹配。
switches: -nocase将字符串中的大写都当成小写看待。
exp:正则表达式
string:用来进行匹配的字符串
matchstring:表示用正则表达式匹配的所有字符串
sub1:表示正则表达式中的第一个子表达式匹配的字符串
sub2:表示正则表达式中的第二个子表达式匹配的字符串
例题:如何匹配字符串"abc456"
regexp {\w+\d+} "abc456"
例题:如何匹配一个以数字开头并且以数字结尾的字符串
regexp {^\d.*d$} "1 dfsal 1"
捕获变量
通过()可以捕获字符串
例如如何将字符串"Snow is 30 years old"中的30捕获出来
% regexp {\s(\d+).*} "Snow is 30 years old" total age
1
% puts $total
30 years old
% puts $age
30
例如如何将字符串"Snow is 30 years old"中的Snow和30一次捕获
% regexp {^(\w+)\s\w+\s(\d+).*} "Snow is 30 years old" total name age
1
% puts $total
Snow is 30 years old
% puts $name
Snow
% puts $age
30
文件操作
open
格式:open 文件 打开方式 (打开方式 r表示读模式,w表示写模式)
功能:打开文件
gets
格式:gets fileID 变量名
功能:gets读fileID标识的文件的下一行,并把该行赋给变量,并返回该行的字符数(文件尾返回-1)
close
格式:close fileID
功能: 关闭文件
实例讲解
整个读入文件过程
% set INPUTFILE [open file.txt r]
file354b580
% while {[gets $INPUTFILE line] >= 0}{;#从第一行开始逐行读取文件
puts "$line"
}
a
b
c
% close $INPUTFILE
现有file.txt其内容如下。请写一TCL脚本求出所有Slack值之和
Slack = -0.051
Slack = -0.234
Slack = -0.311
Slack = -0.056
Slack = -0.434
Slack = -0.316
Slack = -0.151
Slack = -0.524
set sum 0
set INFILE [open file.txt r]
while {[gets $INFLIE line] >= 0}{
if {[regexp {^Slack\s+=\s+(-?\d+\.?\d+)} $line total slack]} {
set sum [expr $sum + $slack]
}
}
close $INFILE
puts $sum
Synopsys TCL
综合软件当中TCL的常见命令
get_ports
格式:get_ports portsName
功能:返回design中对应的ports object
例:如何查看design当中有没有一个port叫做CLK
Shell>get_ports CLK
{CLK}
*例:我们想查看design当中的所有的port(可以通配任何字符)
Shell>get_ports *
{A B C D CLK OUT[0] OUT[1]}
例:我们想得到所有C开头的port
Shell>get_ports C*
{CLKA CLKB}
get_cells
格式:get_cells cellName
功能:返回design中对应的cell的instance name object
例:我们想查看design当中有没有一个cell叫做U4
Shell>get_cells U4
{U4}
例:我们想查看design当中以3为结尾的cells
Shell>get_cells *3
{U3}
get_nets
格式:get_nets netsName
功能:返回design中net的biject
例:查看design中有没有一个net以INV开头
Shell>get_nets INV*
{INV0 INV1}
get_pins
格式:get_pins pinsName
功能:返回design中pin的object
查看design当中有哪些pin的名字叫做Z
Shell>get_pins */Z
{INV0/Z INV1/Z}
数据类型:object(对象)与其属性
object是对于TCL脚本的一个重要的扩展,常见的对象有四种cell,net,port,pin,每一种object都有它的属性,任何一种属性都可以用get_attribute得到。
Cell object
属性ref_name:用来保存其map到reference cell名称
Pin object
属性owner_net:用来保存与之相连的net的名称
Port object
属性direction:用来保存port的方向(是in还是out)
Net object
属性full_name:用来保存net的名称
get_* -f
-f这个option可以用来过滤属性,以得到我们想要的object
例:想得到所有方向是input的port
Shell>get_ports * -f "direction == in"
{A B C D CLK}
get_* -of
-of这个option可以用来得到与你指定的object相连接的object
Shell>get_nets -of [get_port A]
A
Comments | NOTHING