EDA实验课课程笔记(四)——TCL脚本语言的学习2
EDA实验课课程笔记(四)——TCL脚本语言的学习2
- 控制流
- if
- 循环命令
- while
- for
- foreach
- break和continue命令
- switch
- source
- 过程(procedure)
控制流
介绍控制流命令,对之前系列EDA实验课课程笔记(三)——TCL脚本语言的学习1进行补充
if
语法: if test1 body1 ?elseif test2 body2 elseif… ? ?else bodyn?
TCL 先把 test1 当作一个表达式求值,如果值非 0,则把 body1 当作一个脚本执行并返回所得值,否则把 test2 当作一个表达式求值,如果值非 0,则把 body2 当作一个脚本执行并返回所得值……。例:
if { $x<0 } {puts "x is smaller than zero"
} elseif {$x==1} {puts "x is equal 1"
} elseif {$x==2} {puts "x is equal 2"
} else {puts "x is other"
}
这里需要注意的是,
if 和{之间应该有一个空格,否则TCL解释器会把’if{'作为一个整体当作一个命令名,从而导致错误。
'{'一定要写在上一行,因为如果不这样,TCL 解释器会认为if命令在换行符处已结
束,下一行会被当成新的命令,从而导致错误的结果需要将}{
分开写,
否则会报错extra characters after close-brace
循环命令
while
语法为: while test body
参数 test 是一个表达式,body 是一个脚本,如果表达式test 的值非 0,就运行脚本,直到表达式为0 才停止循环,此时 while 命令中断并返回一个空字符串。
例如:
set a {a b c d e}
set b " "
set i [expr [llength $a]-1]
while {$i>=0} {lappend b [lindex $a $i]
incr i -1
}
puts "b=$b"
对代码进行分析
set 变量a为一个list,b为一个空list
然后计算列表里有几个元素,将其减一后的值赋值给i,这里减一的目的是从零开始计数会多一个
开始进行循环,首先i的值是4大于0,表达式为真,开始执行脚本。
脚本为将数组a的第i个位置的元素添加到b list 里,然后给i减一同时进行下一次判断即可。
最后输出b的值
b=e d c b a
for
语法为: for init test reinit body
参数init是一个初始化脚本,第二个参数test是一个表达式,用来决定循环什么时候中断,第三个参数reinit是一个重新初始化的脚本,第四个参数body也是脚本,代表循环体。
for {set p 0} {$p<=10} {incr p} {puts "$p squared is : [expr $p*$p]"
}
执行结果为
0 squared is : 0
1 squared is : 1
2 squared is : 4
3 squared is : 9
4 squared is : 16
5 squared is : 25
6 squared is : 36
7 squared is : 49
8 squared is : 64
9 squared is : 81
10 squared is : 100
foreach
foreach varName list body 第一个参数 varName 是一个变量,第二个参数 list 是一个表(有序集合),第三个参数 body 是循环体。每次取得链表的一个元素,都会执行循环体一次。这里对于复杂的操作不进行解释,参考文章一
set a [list A B C D E F G]
set b ""
foreach i $a {set b [linsert $b 0 $i]
}
puts $b
运行结果为
G F E D C B A
赋值给变量
% foreach {x y} {a b c d } {puts "$x $y"
}
a b
c d
又例如:
% foreach i {a b} {j k} {v W x y z} {puts "i=$i,j=$j,k=$k"
}
i=a,j=v,k=W
i=b,j=x,k=y
i=,j=z,k=
break和continue命令
在循环体中,可以用break和continue命令中断循环。其中break命令结束整个循环过程,并从循环中跳出,continue只是结束本次循环
这里有一个特别好的例子
说明:这里首先进行给一个list,然后使用foreach循环进行写入数据当遇见break时候直接退出了循环,而continue仅仅只是跳出此次循环继续向b里写入数
% set b {}
% set a {1 2 3 4 5}
1 2 3 4 5
% foreach i $a {if {$i == 4} break
set b [linsert $b 0 $i]
}
% puts $b
3 2 1
% set b {}
% set a {1 2 3 4 5}
1 2 3 4 5
% foreach i $a {if {$i == 4} continue
set b [linsert $b 0 $i]
}
% puts $b
5 3 2 1
switch
和 C 语言中 switch 语句一样,TCL 中的 switch 命令也可以由 if 命令实现。只是书写起来较为烦琐。 switch 命令的语法为: switch ? options? string { pattern body ? pattern body …?}
注意这里进行的是字符匹配
set x a;
set t1 0;set t2 0;set t3 0;
switch $x {a -
b {incr t1}
c {incr t2}
default {incr t3}
}
puts "t1=$t1,t2=$t2,t3=$t3"
x=a时执行的是t1加2
其中 a 的后面跟一个’-'表示使用和下一个模式相同的脚本。default 表示匹配任意值。一旦switch 命令 找到一个模式匹配,就执行相应的脚本,并返回脚本的值,作为 switch 命令的返回值。
set grade B;
switch $grade {A {puts "Well done!"}B {puts "Excellent!"}C {puts "You passed!"}F {puts "Better try again"}default {puts "Invalid grade"}
}
puts "Your grade is $grade"
source
source 命令读一个文件并把这个文件的内容作为一个脚本进行求值
以上边的switch第一段代码为例
使用VIM新建一个文件,写入文件后保存退出
vim switch1.tcl
键入wish
然后输入source switch1.tcl
过程(procedure)
TCL 支持过程的定义和调用,在 TCL 中,过程可以看作是用 TCL 脚本实现的命令,效果与 TCL的固有命令相似。我们可以在任何时候使用 proc 命令定义自己的过程,TCL 中的过程类似于 C中的函数。
TCL 中过程是由 proc 命令产生的:
例如:
% proc add {x y } {expr $x+$y}
proc 命令的第一个参数是你要定义的过程的名字,第二个参数是过程的参数列表,参数之间用空格隔开,第三个参数是一个 TCL 脚本,代表过程体。 proc 生成一个新的命令,可以象固有命令一样调用:
% add 1 2
3
此篇暂时这里结束,后又需要会继续记录
EDA实验课课程笔记(四)——TCL脚本语言的学习2相关推荐
- EDA实验课课程笔记(三)——TCL脚本语言的学习1
本文参考资料为<Tcl语言教程>,感谢作者的分享,这里仅仅作为简单常用语法的入门,若有需要后期对本文进行添加补充. EDA实验课课程笔记(三)--TCL脚本语言的学习 前言(TCL综述) ...
- EDA实验课课程笔记(五)——NC-verilog的介绍与使用(一)
EDA实验课课程笔记(五)--NC-verilog的介绍与使用(一) NC简介 NC内部文件结构 NC-verilog的两种启动方式 图形界面方式演示视频 简介:简单介绍NC及其精要的总结,防止以后忘 ...
- EDA实验课课程笔记(六)——NC-verilog的介绍与使用(二)
EDA实验课课程笔记(六)--NC-verilog的介绍与使用(二) 图形界面的基本步骤回顾 命令行界面多步仿真 0,准备文件的建立 首先是新建cds.lib文件 其次是hdl.var文件的建立 1, ...
- EDA实验课课程笔记(一)——linux操作系统及linux下的基本指令
EDA实验课课程笔记(一)--linux操作系统及linux下的基本指令 实验目标 1,了解Linux系统的基本特点 2,掌握Linux的常用命令 3,掌握Linux的命令输入技巧 实验内容 1,基本 ...
- EDA实验课课程笔记(七)——DC(Design Compiler)的简介及其图像化使用(一)
本博文用于记录DC的基本知识及一些相关的最基本概念.然后配合演示视频,对DC有一个最初步的认识.参考学校老师的PPT讲解,以及实验指导书中的内容. Design Compiler的简介及其图像化使用 ...
- EDA实验课课程笔记(八 )——PT(Prime Time)简介(附录静态时序分析)
这里的部图片引用尤老师时序分析公开课,B站可以找到. PT(Prime Time)简介 PT简介 相关概念 时钟偏斜(Clock Skew) 时钟抖动(Clock Jitter) 输入输出延时 建立时 ...
- EDA实验课课程笔记(二)——Vim编辑器
移动光标的方法 指令 解释 h 或 向左箭头键(←) 光标向左移动一个字符 j 或 向下箭头键(↓) 光标向下移动一个字符 k 或 向上箭头键(↑) 光标向上移动一个字符 l 或 向右箭头键(→) 光 ...
- Perl,Python,Ruby,Javascript 四种脚本语言比较
Perl 为了选择一个合适的脚本语言学习,今天查了不少有关Perl,Python,Ruby,Javascript的东西,可是发现各大阵营的人都在吹捧自己喜欢的语言,不过最没有争议的应该是Javascr ...
- tcl计算机语言,Vivado之TCL脚本语言基本语法介绍
TCL脚本语言 Tcl(Tool Command Language)是一种很通用的脚本语言,它几乎在所有的平台上都可以解释运行,而且VIVADO也提供了TCL命令行.最近发现TCL脚本貌似比GUI下操 ...
最新文章
- 同时使用多网卡提升树莓派网络利用率
- poj 1077 Eight(A*)
- 允许网站使用相机和麦克风_手机使用应用时总是需要获取权限,这3个权限不能随意给,望周知...
- 用 Rust 开发 Linux,可行吗?
- 在不推动提交的情况下触发Travis-CI重建?
- Ps 初学者教程,如何使用色阶功能提高照片的对比度和亮度?
- macOS Monterey 12.0.1(21A559) 正式版三分区原版黑苹果镜像
- 基于Labview的小波去噪
- PLSQL 免费下载安装
- c#求长方形的面积周长公式_长方形的面积和周长公式是什么?
- EasyOcr报错 --- [WinError 10054] An existing connection was forcibly closed by the remote host
- Kettle连接mysql错误 org.pentaho.ui.xul.XulException: java.lang.reflect.InvocationTargetException
- 网络型PLC可编程控制器实验装置(立式、挂箱积木式)
- java 数独游戏_java数独游戏完整版分享
- 叶笑嘴角露出来一个不知是什么意味的笑容
- tableau可视化图表及仪表板设计
- G. I love Codeforces
- 程序员专不专业,这些词汇拼写一看便知!
- 宇视录像机多种协议添加摄像机(只介绍常用的宇视、onvif、GB28181三种协议)
- VScode创建第一个C++项目
热门文章
- 安装cuda时 提示toolkit installation failed using unsupported compiler解决方法
- 关于使用stanfordcorenlp一直运行不报错的解决方法
- 【问题解决方案】anaconda-python在cmd-pip安装requests后依然提示No module named requests
- webpack4.0.1安装问题及解决方法
- 如何获取Java用户输入?
- Android ADB设备离线,无法发出命令
- Java中“最终类”的意义是什么?
- 字符串标志“ u”和“ r”到底是做什么的,什么是原始字符串文字?
- linux内核zfs,Linus Torvalds 不建议使用 ZFS On Linux
- mysql 与c_mysql基础:mysql与C结合实例