前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >tcl三部曲(三)、数组、流控制与函数

tcl三部曲(三)、数组、流控制与函数

作者头像
根究FPGA
发布2020-08-19 10:27:18
1.9K0
发布2020-08-19 10:27:18
举报
文章被收录于专栏:根究FPGA根究FPGA

感谢公众号《IC小迷弟》提供的视频讲解与学习资源,谢谢大哥耐心的讲解!推送内容是对视频讲解的部分整理,关于详细内容,大家可以关注IC小迷弟获取全部学习资料。

正文开启,本次分享的是数组、流控制以及函数部分的笔记与操作实例

Part07Array数组

格式:

操作名为arrayName的数组,option选项决定了执行什么操作。

数组是元素的集合,每一个元素是由自己的名称和值的变量(变量的组成:变量名和变量值)。

数组元素的名称由两部分组成:数组名和数组中的元素名。数组名和元素名都可以是任意类型的字符串。

数组元素使用如month(May)这样的形式,即数组名(此处是month)加上圆括号中的元素名(这里是May)。可以使用简单变量的地方都可以使用数组,例如set命令:

选项option

(1)、array getarrayName ?pattern?

返回索引与pattern匹配的元素对的列表。列表中奇数个元素是匹配的索引,其后的元素是索引对应的值。如果没有指定pattern,则返回所有元素。如果arrayName不是数组变量的名称,或者没有匹配索引,则返回空列表。

(2)、array names arrayName ?mode? ?pattern?

返回一个包含mode模式下与pattern匹配的数组索引的列表。mode可以是-exact、-glob或-regexp,默认为-glob。如果未指定mode与pattern则返回所有索引。如果没有匹配的索引或者arrayName不是数组变量的名称,则返回空字符串。

(3)、array size arrayName

返回数组中元素数量,如果arrayName不是数组的名称,则返回0。

Part08 流控制

格式

if expr1 body1 elseif expr2body2 elseif… ?else? ?bodyN?

举个栗子

代码语言:javascript
复制
if { $x<0 } {
…….
} elseif { $x==0 } {
……
} else if { $x==1 } {
……
} else {
……
}

1、需要注意的点是:{一定要在上一行,否则Tcl解析器就会以后if在换行符处已经结束,下一行会被当做新的命令,从而导致解析器报错。

2、if和{之间要有一个空格,否则Tcl解析器会把他们当做一个整体,从而导致报错。

example1:

流控制之while

格式

while test body

test是一个表达式,body是一个脚本,body是一个脚本,如果表达式非0,则运行脚本,知道表达式等于0才停止循环,此时while命令中断,返回一个空字符串。

example1

计算0~100的和:

example2

读取文件(该函数运行环境为DC)

analysis:

set rfile_handle [open “./rpt/pr.rpt” r]

以只读方式打开“./rpt/pr.rpt”文件,将open返回的句柄(fileId)赋值给rfile_handle。

set wfile_handle [open "./rpt/vio.rpt" w]

同上类似,以只写方式打开,如果文件存在,清空文件。

while {![eof $rfile_handle]}

eof即end of file,eof $rfile_hand表示查询是否到达文件的末尾,在未到达文件末尾的情况下执行循环体语句。

gets $rfile_handle line

get fileID line就是读取fileID文件的下一行,忽略换行符,将该行的内容赋值给line

if {[string match"*VIOLATION*" $line]} {

如果line中含有VIOLATION字符

puts wfile_handle line

将string写到fileId中,此处是将上面读到的行信息给只写文件写入

close $rfile_handle

close $wfile_handle

关闭读写文件

流控制之foreach

格式一:

foreach varname list body

varname是一个变量,list是一个列表,body是循环体

格式二:

foreach varlist1 list1?varlist2 list2…? body

varname是一个变量,list是一个列表,body是循环体

example1:

example2:

第一次把a赋给i,b赋给j,

第二次把c赋给i,d赋给j

第三次把e赋给i,f赋给j

example3:

在下述语句中,分别依次取a列表和b列表中的元素附加在x中,空元素使用{}标识。

同上:

example4

流控制之switch

格式:

代码语言:javascript
复制
switch ?options? stringpattern body ?pattern body …?

options表示匹配的方式,switch支持三种匹配方式:

—exact方式(默认)

—glob方式

—regexp方式

example1

example2

Part09 函数

格式(举例说明)

再举个栗子

函数的三种写法

lappend varname value?Value…?把value作为列表元素添加到varName变量中,如果这个变量不存在,就创建它,需要注意的是此处使用list的话不需要$

第一种
第二种

大括号指定type的缺省值为add,有缺省值的参数后面必须带有缺省值,缺省模式下的参数可以不传递

第三种

参数可变型,输入参数个数可变

tcl系列暂时更完,以后再深入学习的话还会继续和大家分享。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 根究FPGA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • (3)、array size arrayName
  • 流控制之while
    • 格式
      • example1
        • example2
        • 流控制之foreach
        • 流控制之switch
          • 第一种
            • 第二种
              • 第三种
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档