目录
- 引言
- 概述
- 其他
- 变量、数组和列表
- 变量
- 数组
- 列表
- 控制流
- 过程函数
- 正则匹配
- 文本处理
引言
TCL(Tool Command Language)脚本语言是对EDA兼容性最好的语言,非常适合做EDA流程控制。如下图所示:
IC设计中另一种常用语言是Perl,它的高级用法和扩展功能比较方便,这个后面有机会再谈。这篇文章来整理一下TCL语言的相关知识。
概述
TCL 解释器运用规则把命令分成一个个独立的单词,同时进行必要的置换。TCL置换分为以下三类:
- 变量置换 $:TCL解释器会认为$后面为变量名,将变量置换成它的值。
将会输出set a "pin" puts $a
pin
。 - 命令置换[]:[]内是一个独立的TCL语句。
将会输出set a [expr 2+4] puts $a
6
。expr是数学运算指令。 - 反斜杠置换\:换行符、空格、[、$等被TCL解释器当作特殊符号对待的字符,加上反斜杠后变成普通字符。
将会输出puts “\[ expr \$X + \$Y\]”
[expr $X + $Y]
。另外用\t表示TAB,用\n表示换行符。
其他
- “” TCL解释器对双引号中$和[]符号会进行变量置换和命令置换。
- {} 在花括号中,所有特殊字符都将成为普通字符,TCL解释器不会对其作特殊处理。
- # 表示注释
变量、数组和列表
变量
定义:set 变量名 变量值
取值:$变量名
数组
数组:TCL中数组可以存储很多值,通过元素名来进行检索。类似于某件事物(数组名)几种不同属性(元素名),每一种属性有其独立的值。
定义:set 数组名(元素名) 值
取值:$数组名(元素名)
set cell_1(ref_name) "bufx2"
set cell_1(full_name) "top/cell_1"
set cell_1(pins) "A B C"
puts $cell_1(ref_name)
将会输出bufx2
。
array指令:获取数组信息
array size cell_1
array names cell_1
将会输出3
和ref_name full_name pins
。
列表
列表是标量的有序集合。
定义:set 列表名 {元素1 元素2 元素3……}
取值:$列表名
另外TCL中有一系列十分方便的列表操作命令:
命令 | 功能 |
---|---|
concat | 合并两个列表 |
lindex | 选取列表中的某个元素 |
llength | 列表长度 |
lappend | 在列表末端追加元素 |
lsort | 列表排序 |
set list1 {bufx1 bufx2 bufx4}
set list2 {ivtx1 ivtx2 ivtx4}
#将列表1和列表2合并
concat $list1 $list2
#返回列表1元素个数
llength $list1
#下条指令将输出6
llength [concat $list1 $list1]
# 返回列表中第1个元素(从0开始计数)
lindex $list1 1
#得到列表最后一个元素
lindex $list1 [expr [llength $list1] - 1]
# 列表末尾加入新元素
set a {1 2 3}
lappend a 4
set b {4 5}
# 下条指令输出1 2 3 {4 5}
lappend a $b
语法格式 : lsort 开关 列表
功能: 将列表按照一定规则排序
开关: 缺省时默认按照ASCII码进行排序。
–real 按照浮点数值大小排序
-unique 唯一化,删除重复元素
控制流
- 控制流-if
语法格式 :
if {判断条件} {
脚本语句
} elseif {判断条件} {
脚本语句
} else {
脚本语句
}
注意,上例中脚本语句的’{'一定要写在上一行,因为如果不这样,TCL 解释器会认为if命令在换行符处已结束,下一行会被当成新的命令,从而导致错误。 - 循环指令-foreach
语法格式 :foreach 变量 列表 循环主体
功能:从第0个元素开始,每次按顺序取得列表的一个元素,将其赋值给变量,然后执行循环主体一次,直到列表最后一个元素。set list1 {3 2 1} foreach i $list1 { puts $i }
- 循环控制指令
break:结束整个循环过程,并从循环中跳出
continue:仅结束本次循环 - 循环控制指令-while
语法格式 : while 判断语句 循环主体
功能: 如果判断语句成立(返回值非0),就运行脚本,直到不满足判断条件停止循环,此时while
命令中断并返回一个空字符串。set i 3 while {$i > 0} { puts $i incr i -1 }
- 循环控制指令-for
语法格式 :for 参数初始化 判断语句 重新初始化参数 循环主体
功能: 如果判断语句返回值非0就进入循环,执行循环主体后,再重新初始化参数。然后再次进行判断,直到判断语句返回值为0,循环结束。for {set i3} {$i > 0} {incr i-1} { puts $i }
过程函数
语法格式 :proc 函数名 参数列表 函数主体
功能: 类似于C语言中的函数。即用户自定义的功能,方便多次调用。
proc add {a b} {
set sum [expr $a + $b]
return $sum
}
# 输出7
add 3 4
全局变量:在所有过程之外定义的变量。
局部变量:对于在过程中定义的变量,因为它们只能在过程中被访问,并且当过程退出时会被自动删除。
指令global,可以在过程内部引用全部变量
正则匹配
语法格式 :regexp switches exp string matchVar subMatchVar1 subMatchVar2 …
功能: 在字符串中使用正则表达式匹配。
switches:
-nocase将字符串中的大写都当成小写看待。
exp 正则表达式
string 用来进行匹配的字符串
matchVar表示用正则表示式匹配的所有字符串
subMatchVar1表示正则表达式中的第一个子表达式匹配的字符串
subMatchVar2表示正则表达式中的第二个子表达式匹配的字符串
# 下条指令输出1
regexp {^\d.*\d$} "1 dfsal 1"
regexp {^(\w+)\s\w+\s(\d+).*} "snow is 30 years old" total name age
puts $total
puts $name
putd $age
文本处理
open
• 语法格式 open 文件 打开方式(打开方式 r表示读模式,w表示写模式。)
• 功能 打开文件
gets
• 语法格式 gets fileid 变量名
• 功能 gets读fileid标识的文件的下一行,并把该行赋给变量,并返回该行的字符数(文件尾返回-1)
close
• 语法格式 close fileid
• 功能 关闭文件
# 读文件
set INPUTFILE [open file.txt r]
while {[gets $INPUTFILE line] > =0} {
puts "$line"
}
close $INPUTFILE#写文件
set OUTPUTFILE [open file.txt w]
puts $OUTPUTFILE "Hello World"
close $OUTPUTFILE
注:本篇文章参考了西南交通大学邸志雄老师的课件,特别感谢。