TCL语言

TCL是一种适合EDA流程控制的脚本语言,拥有良好的兼容性。本文介绍了TCL的基础知识,包括变量、数组、列表的定义与取值,控制流结构,如if、foreach、while、for循环,以及过程函数、正则匹配和文本处理操作。此外,还讲解了TCL中的数组和列表操作,如lsort命令以及文件的打开、读取和关闭方法。

引言

TCL(Tool Command Language)脚本语言是对EDA兼容性最好的语言,非常适合做EDA流程控制。如下图所示:
EDA工具支持的语言
IC设计中另一种常用语言是Perl,它的高级用法和扩展功能比较方便,这个后面有机会再谈。这篇文章来整理一下TCL语言的相关知识。

概述

TCL 解释器运用规则把命令分成一个个独立的单词,同时进行必要的置换。TCL置换分为以下三类:

  1. 变量置换 $:TCL解释器会认为$后面为变量名,将变量置换成它的值。
    set a "pin" 
    puts $a
    
    将会输出pin
  2. 命令置换[]:[]内是一个独立的TCL语句。
    set a [expr 2+4] 
    puts $a
    
    将会输出6。expr是数学运算指令。
  3. 反斜杠置换\:换行符、空格、[、$等被TCL解释器当作特殊符号对待的字符,加上反斜杠后变成普通字符。
    puts “\[ expr \$X + \$Y\]”
    
    将会输出[expr $X + $Y]。另外用\t表示TAB,用\n表示换行符。
其他
  1. “” TCL解释器对双引号中$和[]符号会进行变量置换和命令置换。
  2. {} 在花括号中,所有特殊字符都将成为普通字符,TCL解释器不会对其作特殊处理。
  3. # 表示注释

变量、数组和列表

变量

定义: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

将会输出3ref_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 唯一化,删除重复元素

控制流

  1. 控制流-if
    语法格式 :
    if {判断条件} {
    脚本语句
    } elseif {判断条件} {
    脚本语句
    } else {
    脚本语句
    }

    注意,上例中脚本语句的’{'一定要写在上一行,因为如果不这样,TCL 解释器会认为if命令在换行符处已结束,下一行会被当成新的命令,从而导致错误。
  2. 循环指令-foreach
    语法格式 :foreach 变量 列表 循环主体
    功能:从第0个元素开始,每次按顺序取得列表的一个元素,将其赋值给变量,然后执行循环主体一次,直到列表最后一个元素。
    set list1 {3 2 1}
    foreach i $list1 {
    puts $i
    }
    
  3. 循环控制指令
    break:结束整个循环过程,并从循环中跳出
    continue:仅结束本次循环
  4. 循环控制指令-while
    语法格式 : while 判断语句 循环主体
    功能: 如果判断语句成立(返回值非0),就运行脚本,直到不满足判断条件停止循环,此时while
    命令中断并返回一个空字符串。
    set i 3
    while {$i > 0} {
    puts $i
    incr i -1
    }
    
  5. 循环控制指令-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

注:本篇文章参考了西南交通大学邸志雄老师的课件,特别感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值