赞
踩
本文参考公众号
数字IC与硬件设计的两居室
复杂文本处理
Tcl可以把文本中的每一行变为一个列表,最简单的列表就是包含由任意个空格、制表符、换行符分隔开的任意多个元素的字符串,可以直接根据元素编号来获取字符串内容
Tcl也支持正则表达式
自动化执行flow
对于一些流程化的flow,可以编写Tcl脚本来自动执行,一键得到结果和report
辅助EDA开发
Tcl易上手、使用简便,可以简便地设计图形化界面;也可以针对大型项目设计EDA辅助工具
Tcl脚本简介
Tcl即Tool command language工具控制语言,读作Tickle
Tcl包含了一个脚本语言和一个库包:Tcl脚本主要用于发布命令给交互程序,语法简单、扩展性强;Tcl库可以被嵌入应用程序,它包含了一个分析器、用于执行内建命令的例程和一个可以允许用户扩充的库函数。使用Tcl库,应用程序可以产生Tcl命令并执行,命令可以由用户产生,也可以从用户接口的输入中读取,Tcl库收到命令后将他分解并执行内建的命令。
目前大部分EDA工具都支持Tcl语言,如Design Complier、quartus、Synplify、modesim、finesim等,Tcl在IC设计中非常常用
Tcl程序有两种运行方式,一种是将程序写入脚本中,通常以.tcl命名;另一种是在tcl命令行中直接执行(在windows中通过命令提示符操作,输入tclsh)。
本文通过实际的代码案例介绍TCL的相关语法
#布尔型,非0,yes,true均视为真
if {yes} {
puts "BOOL: true(yes)"
}
# BOOL: true(yes)
if {-1} {
puts "BOOL: true(-1)"
}
# BOOL: true(-1)
#数组
set lib(yh) 1
set lib(xhg) 2
puts $lib(yh)
# 1
array set student {1 yh 2 xhg 3 hsy}
puts $student(1)
# yh
#列表
set student {yh xhg hsy hqd hc cky yq}
puts "$student"
puts "[lindex $student 0]"
puts "[lindex $student 6]"
# yh xhg hsy hqd hc cky yq
# yh
# yq
#字典
dict set food day1 pork
dict set food day2 beef
dict set food day3 lamb
puts "food schedule: $food"
#food schedule: day1 pork day2 beef day3 lamb
dict get $food day2
# beef
#一次性设置多个key和value
set animals [dict create anm1 cat anm2 pig anm3 goat]
set animal_my [dict get $animals anm2]
puts "Her favourite animals is: $animal_my"
# Her favourite animals is: pig
#TCL的数据类型仅有字符串一种,所以变量间进行数学表达式运算时,需要使用命令 expr 加以识别
set a 10
set b [expr $a+10]
puts "results: $b"
# results: 20
#if语句与反斜杠符号用法
set a 10
set b 20
if {$a < $b} {puts "\$a < \$b" } else {puts "\$a > \$b"}; #添加反斜杠符号
# $a < $b
if {$a < $b} {puts "$a < $b" } else {puts "$a > $b"}; #不添加反斜杠符号
# 10 < 20
#switch语法
switch vars {
case1 {
true_statement1
}
case2 {
true_statement2
}
......
caseN {
true_statementN
}
default {
default_statement
}
}
#循环语句
#while循环
set i 0
while {$i <=4} {
incr i
puts $i
}
#"icr i"表示i++, "icr i -1"表示i--
# 1
# 2
# 3
# 4
# 5
#for循环
for {set i 0} {$i<=3} {incr i} {
puts $i
}
#% 0
#% 1
#% 2
#% 3
#foreach循环
set student {yh xhg hsy hqd}
foreach vars $student {puts $vars} #一定要添加vars,否则会报错
# yh
# xhg
# hsy
# hqd
foreach {var1 var2 var3} {a b c d e f} var4 {g h} {
puts "The vars are: $var1, $var2, $var3, $var4"
}
# The vars are: a, b, c, g
# The vars are: d, e, f, h
foreach {var1 var2} {a b c d } {var3 var4} {e f g h} {
puts "The vars are: $var1, $var2, $var3, $var4"
}
#The vars are: a, b, e, f
#The vars are: c, d, g, h
#foreach遍历数组
array set lib {1 yh 2 wtw 3 xhg}
foreach {index value} [array get lib] {
puts "\$lib($index) = $value"}
# $lib(1) = yh
# $lib(2) = wtw
# $lib(3) = xhg
#拼接字符串
set str1 "hello"
set str2 "world"
append str1 $str2 "!"
puts $str1
#helloworld!
set str1 "i'm studying"
append str1 " TCL"
puts $str1
# i'm studying TCL
#string
set str1 wtw
set str2 yh
string compare $str1 $str2
#大于,相等,小于分布返回1,0,-1
# -1
set str wtw
string toupper $str
#换成大写字母
# WTW
# string match
string match -nocase {yh*wtw} "yhlovewtw"
# *表示0到n个字符不比,前后只要相同即可
# nocase表示不区分大小写
# 1
string match -nocase {yh*wtw} "yhlovewtw_"
# 0
string match -nocase {yh?wtw} "yh_wtw"
# ?表示只有一个字符不参与比较
# 1
string match -nocase {yh[a-z]*} "yhwtw"
# []表示字符串中满足[]其内的字符任意一个
# 1
set a {12}
set b {345}
set c {6789}
lappend a $b
lappend a $c
#如何从a中得到6?
set str [lindex $a 2]
string range $str 0 0
# regexp实现正则匹配分析
% set str "foreverrr young."
#匹配任意一个字符,作用于r
% regexp {ever.} $str mat1
#1
#匹配0个或者多个字符,作用于n
% regexp {even*} $str mat1
#1
% regexp {even.} $str mat1
#0
#匹配一个或多个字符
% regexp {ever+} $str mat2
#1
% regexp {even+} $str mat2
#0
#匹配0个或者1个
% regexp {even?} $str mat2
#1
% regexp {ever.*} $str mat1
#1
set str "Foreverrr Young."
# 以下两行会匹配 “ever.” 以及之后所有字符
puts "[regexp {ever.*} $str mat1]"
puts "[regexp {ever.+} $str mat2]"
# 字符串中 “ung.” 之后没有字符,所以第 4 行匹配失败
puts "[regexp {ung.*} $str mat3]"
puts "[regexp {ung.+} $str]"
puts "$mat1-$mat2-$mat3"
#()用于捕获子表达式匹配,可以将连续的复杂的匹配模式分割成多个子表达式,并将匹配到多个子表达式的结果进行缓存,称为捕获,实现更加精准的匹配。
#例如以下示例中,匹配时会按照“Forever You”字符串匹配,并把匹配到的字符串赋值到变量 mat 中。由于括号即捕获子表达式匹配的存在,又会将各个括号内的匹配结果分别赋值到 3 个变量中。
set str "Foreverrr Young."
puts "[regexp {(For?)(ever*)( You?)} \
$str mat mat1 mat2 mat3]"
#1
puts $mat
#Foreverrr You
puts "$mat1-$mat2-$mat3"
#For-everrr- You
#“[]”(中括号) 为区间匹配,用于匹配字符串中的一个字符,即中括号内的多个字符只要有一个能匹配到字符串中存在的字符,便为匹配成功。
#中括号内如果存在以“^”(尖号) 开头的匹配方法,则表示取非的匹配效果。^如果作为匹配符,可用于匹配开头
set str "bbabc112ccd"
# 匹配失败
puts [regexp {bac} $str mat1_char]
# 0
# 下面两行效果一样:只匹配一个字符
regexp {[abc]} $str char_mat1
regexp {[a-c]} $str char_mat2
regexp {[a-c]+} $str char_mat3 ;#bbabc, 匹配[]中的abc,只要任意一个符合即可,然后+,表示匹配一个或多个
regexp {[^a-c]} $str char_mat4
regexp {[0-9]} $str num_mat2
regexp {[0-9]+} $str num_mat3
regexp {[^0-9]} $str num_mat4
puts $char_mat1
# b
puts "$char_mat2-$char_mat3-$char_mat4"
# b-bbabc-1
puts "$num_mat2-$num_mat3-$num_mat4"
# 1-112-b
#“|”(竖号) 为交替匹配,只要匹配到该符号两边的任一个模式,即为匹配成功。
set str "Forever Young."
regexp {Young|ever} $str mat1
puts $mat1
# ever
更多语法有待后续学习。。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。