数字IC设计学习笔记
TCL脚本
1. TCL置换分类
2. 变量,数组,列表
3. 数学运算
4. 逻辑运算
5. 控制流
6. 过程函数
7. 正则匹配
8. 锚位
9. Regexp
10. 文本处理
1. TCL置换分类
- 变量置换$: $ 后面为变量名。将置换成它的值。
- 命令置换[]:[]内是一个独立的tcl语句
- 反斜杠置换\:换行符,空格;[、$等被TCL解释器当作特殊符号对待的字符,加上反斜杠后变成普通字符。
- 用\t表示TAB
- 用\n表示换行符
- “#” 表示注释。
注意:
- TCL解释器对双引号中$和 [] 符号会进行变量置换和命令置换。 {} 而在花括号中,所有特殊字符都将成为普通字符,TCL解释器不会对其作特殊处理。
2. 变量,数组,列表
变量
就是某个容器的名称,可以存储一个值。变量的名称在程序运行期间保持不变,但是变量的值通常会不断改变。
- 定义:set 变量名 变量值
- 取值:$变量名
注意:
- 与C语言不通,TCL脚本语言可以存字符串
数组
TCL中数组可以存储很多值,通过元素名来进行检索。类似于某件事物(数组名)几种不同属性(元素名),每一种属性 有其独立的值。
- 定义:set 数组名(元素名) 值
- 取值:$数组名(元素名)
使用array指令获取数组信息
列表
列表是标量的有序集合。
- 定义 set 列表名 {元素1 元素2 元素3……}
- 取值 $列表名
TCL中有一系列十分方便的列表操作命令:
-
concat 合并两个列表
-
lindex 选取列表中的某个元素,返回列表中第n个元素(从0开始计数)
如何得到列表list1 {a b c d e f}的最后一个元素?
-
llength 列表长度:返回列表中的元素个数
-
lappend :在列表末端追加元素
-
lsort :列表排序,将列表按照一定规则排序
开关: 缺省时默认按照ASCII码进行排序。 -
–real :按照浮点数值大小排序
-
-unique:唯一化,删除重复元素
3. 数学运算
-
a + b
-
a – b
-
a * b
-
a / b
4. 逻辑运算
- a <= b
- a >= b
- a == b
- a != b
- 语法格式 : expr 运算表达式
- 功能: 将运算表达式求值
5. 控制流
If
if {判断条件} {
脚本语句
} elseif {判断条件} {
脚本语句
} else {
脚本语句
}
注意:
- 上例中脚本语句的’{'一定要写在上一行,因为如果不这样,TCL 解释器会认为if命令在换行符处已结束,下一行会被当成新的命令,从而导致错误
foreach
-
语法格式 :foreach 变量 列表 循环主体
-
功能:从第0个元素开始,每次按顺序取得列表的一个 元素,将其赋值给变量,然后执行循环主体一次,直 到列表最后一个元素
Break
- 语法格式 :break
- 功能: 结束整个循环过程,并从循环中跳出
Continue
- 语法格式 :continue
- 功能: 仅结束本次循环
While
- 语法格式 : while 判断语句 循环主体
- 功能: 如果判断语句成立(返回值非0),就运行脚本,直到不满足判断条件停止循环,此时while命令中断并返回一个空字符串。
for
- 语法格式 :for 参数初始化 判断语句 重新初始化参数 循环主体
- 功能: 如果判断语句返回值非0就进入循环,执行循环主体后,再重新初始化参数。然后再次进行判断,直到判断语句返回值为0,循环结束。
6. 过程函数
proc
- 语法格式 :proc 函数名 参数列表 函数主体
- 功能: 类似于C语言中的函数。即用户自定义的功能,方便多次调用。
- 全局变量:在所有过程之外定义的变量。
- 局部变量:对于在过程中定义的变量,因为它们只能在过程中被访问,并且当过程退出时会被自动删除。
- 指令global:可以在过程内部引用全部变量
7. 正则匹配
定义
-
正则表达式是一种特殊的字符串模式,用来去匹配符合规则的字符串。
-
正则表达式的\w,用来匹配一个字母、数字、下划线
-
正则表达式的\d ,用来匹配一个数字
-
\w\w\w\d\d\d这种写法过于繁琐,我们可以用代替重复的量词进行表示。
-
在TCL中常用一下三种量词:
*:零次或多次匹配
+:一次或者多次匹配
? 零次或者一次匹配
*和+的区别:*可以是零次,+一个至少是一次
8. 锚位
- 锚位,用来指示字符串当中的开头和结尾的位置,使我们能够匹配 到正确的字符
- ^ 字符串开头
- $ 字符串结尾
- 常用的其他字符还有\s和.
- \s表示空格
字符串 123 abc 123:正则表达式 \d+\s\w+\s\d+ - . 表示任意一个字符
我们不确定具体是什么字符是就可以用.表示。
例如已知字符串为”xxx空格xxx空格xxx”(x为未知字符)。用.+\s.+\s.+就可以匹配
9. Regexp
- 语法格式 :regexp? switches? exp string? matchVar? ?subMatchVar subMatchVar …?
- 功能: 在字符串中使用正则表达式匹配。
- switches:-nocase将字符串中的大写都当成小写看待。
- exp 正则表达式
- string 用来进行匹配的字符串
- matchstring表示用正则表示式匹配的所有字符串
- sub1表示正则表达式中的第一个子表达式匹配的字符串
- sub2表示正则表达式中的第二个子表达式匹配的字符串
- 通过()可以捕获字符串
例如如何将字符串“Snow is 30 years old”中30捕获出来?
一次捕获多个字符串 例如如何将字符串“Snow is 30 years old”中Snow 和30一次捕获?
10. 文本处理
主要掌握以下三个指令。
open
- 语法格式 open 文件 打开方式(打开方式 r表示读模式,w表示写模式。)
- 功能 打开文件
gets
-
语法格式 gets fileId 变量名
-
功能 gets读fileId标识的文件的下一行,并把该行赋给变量,并返 回该行的字符数(文件尾返回-1)
-
语法格式 close fileid
-
功能 关闭文件
[参考资料]
- 邸志雄老师的课件
- 集成电路静态时序分析与建模
【注】:个人学习笔记,如有错误,望不吝赐教,这厢有礼了~~~