TCL语言

news/2024/10/30 11:18:19/

目录

      • 引言
      • 概述
        • 其他
      • 变量、数组和列表
        • 变量
        • 数组
        • 列表
      • 控制流
      • 过程函数
      • 正则匹配
      • 文本处理

引言

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

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


http://www.ppmy.cn/news/149516.html

相关文章

TCL: tcl小结

 lindex - 从列表中获得一个元素 语法 lindex list ?index...? 描述 lindex命令接受一个参数列表 list,可以接受0个或者多个 index参数,在多个参数的情况下,参数可以是单独的一次排列,也可以是在…

智能晾衣架(一)--设计

本文素材来源于红河学院 工学院 作者:赵德森 张艺锦 潘志慧 曹紫康 指导老师:江洁 张龙超 一、简介 本作品设计的晾衣系统从人们日常生活研究设计,体积小,收纳方便,不占空间可以在日常生活中极大的便利用户。我们…

Tcl 简介及特性

【简介|特性】 l 简介 Tcl是一门产生于80年代末的语言,和Python一样,她是用c开发出来的,如果说C/Java/C/C#为编译型语言的话,那么Python、Perl和Tcl就是一门解释性语言,也就是说程序不需要先编译为机器能识别的二进…

TCL 的安装

TCL 的安装 ActiveTcl的下载安装ActiveTcl交互式解释器tclsh的启动wish 解释器Lets do it! ActiveTcl的下载 ActiveTcl 是一款免费的Tcl 预编译器,可以在ActiveState网站ActiveState下载所需要的版本,也可以在作者的博客中免费下载ActiveTcl…

TCL脚本语言学习

文章目录 前言一、安装二、变量列表1、置换subtitution2、变量3、数组4、列表5、一些命令 三、控制流1、if语句2、foreach3、break:直接结束循环4、continue:结束本次循环5、while6、for循环7、switch 四、过程函数1、proc自定义函数2、全局变量和局部变…

TCL的列表操作

concat concat 列表A 列表B lrepeat lrepeat 重复次数 列表A lindex lindex 列表A 元素索引 lrange lrange 列表A 元素索引a 元素索引b llength length 列表A lassign lassign 列表A 元素索引a 元素索引b lappend lappend 列表A 增加的元素 lins…

Sentinel怎么使用和控制台讲解

Sentinel 基础 官网 1 Github: https://github.com/alibaba/Sentinel 2 快速开始: https://sentinelguard.io/zh-cn/docs/quick-start.html 3 中文: https://github.com/alibaba/Sentinel/wiki/介绍 4 使用手册: https://spring-cloud-alibaba-group.github.io/github-pag…

Tcl -- lappend

1)lappend - Append list elements onto a list. 在列表(变量)后添加列表元素。 2)语法: lappend varName ?value value value ...? 注意:是varname变量名(列表名),不是list。追加的元素之间用空格隔开…