Tcl脚本学习

2023-11-17

包的创建和调用

在tcl脚本中,我们可以通过创建和调用包来增强代码的可复用性。
创建包的步骤:
1.在包脚本文件中,首先声明“package provide”,标识当前文件提供了一个包。之后在该文件中完成包的内容
2.通过pkg_mkIndex命令创建pkgIndex.tcl文件,在包所在路径中声明所包含包的名字和版本。
3.通过在auto_path 变量增加包路径,告诉tcl编译器哪里可以找到包。

调用包的步骤:
1.通过package require声明当前脚本需要哪些包。类似于c语言调用头文件。

# 创建一个包
# Register the package
package provide tutstack 1.0
package require Tcl      8.5

# Create the namespace
namespace eval ::tutstack {
    # Export commands
    namespace export create destroy push pop peek empty

    # Set up state
    variable stack
    variable id 0
}

# Create a new stack
proc ::tutstack::create {} {
    variable stack
    variable id

    set token "stack[incr id]"
    set stack($token) [list]
    return $token
}

# Destroy a stack
proc ::tutstack::destroy {token} {
    variable stack

    unset stack($token)
}

# Push an element onto a stack
proc ::tutstack::push {token elem} {
    variable stack

    lappend stack($token) $elem
}

# Check if stack is empty
proc ::tutstack::empty {token} {
    variable stack

    set num [llength $stack($token)]
    return [expr {$num == 0}]
}

# See what is on top of the stack without removing it
proc ::tutstack::peek {token} {
    variable stack

    if {[empty $token]} {
	error "stack empty"
    }

    return [lindex $stack($token) end]
}

# Remove an element from the top of the stack
proc ::tutstack::pop {token} {
    variable stack

    set ret [peek $token]
    set stack($token) [lrange $stack($token) 0 end-1]
    return $ret
}


# 在编译器中通过pkg_mkIndex命令创建pkgIndex.tcl文件
# 首先切换到包所在路径
% cd /Users/rajkumar/Desktop/helloworld 			
#通过pkg_mkIndex创建
% pkg_mkIndex . *.tcl


# 包的调用
package require tutstack 1.0

set stack [tutstack::create]
foreach num {1 2 3 4 5} { tutstack::push $stack $num }

while { ![tutstack::empty $stack] } {
    puts "[tutstack::pop $stack]"
}

tutstack::destroy $stack

命名空间

命名空间是为了在不同pocedure中避免变量名或者函数名冲突,命名空间常与包一起使用,即一个包提供一个命名空间,包和命名空间名字最好一致。
通过 命名空间名字::变量名/函数名 来调用命名空间中的变量或函数。
若想完全体现命名空间相比全局空间的绝对位置,例如命名空间foo是全局空间的子命名空间,则可通过 ::foo:var调用其中的变量。
注意:再命名空间中申明变量时,不建议用set,否则,如果该变量与global空间变量名字相同时,会导致错误。

01  namespace eval foo {
02    variable stack [list]
03    variable count 0
04    variable params
05    array set params [list var1 value1 var2 value2 var3 value3]
06    
07    namespace export push pop
08    
09    proc push { args } {
10      variable stack
11      variable count
12      lappend stack $args
13      incr count
14    }
15  
16    proc pop {} {
17      variable stack
18      variable count
19      if {[llength $stack] > 0} {
20        set value [lindex $stack end]
21        set stack [lrange $stack 0 end-1]
22        incr count -1
23        return $value
24      } else {
25        error " no more element in the stack"
26      }
27    }
28    
29  }
30  
31  proc foo::dump {} {
32    variable stack
33    variable count
34    if {[llength $stack] > 0} {
35      puts " There are $count element(s) in the stack:"
36      foreach element $stack {
37        puts "    $element"
38      }
39      return 0
40    } else {
41      error " no element in the stack"
42    }
43  }
44  
45  namespace import foo::*
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tcl脚本学习 的相关文章

  • [FPGA系列] 扩展知识 --- 时钟小结

    一 基本概念 时钟域 由同一个时钟信号控制的区域 时钟抖动 Jitter 相对于理想时钟信号 实际时钟信号存在时而超前 时而之后的偏移 时钟偏斜 Skew 时钟信号到达数字电路各个部分所用时间的差异 时钟漂移 Wander 工程上解释 抖动
  • Xilinx ISE系列教程(9):LabTools下载、安装、使用教程(独立的下载工具)

    文章目录 1 ISE Vivado LabTools简介 2 ISE 14 7 Lab Tools下载 安装 3 Vivado 2018 3 LabTools下载 安装 1 ISE Vivado LabTools简介 Xilinx LabT
  • Xilinx 7系列芯片选型手册的资源量怎么看

    推荐阅读AMD官方文档 该文档介绍了各种资源的具体含义 链接 7 Series FPGAs Configurable Logic Block User Guide UG474 以XC7A35T为例 Logic Cells 逻辑单元 对于7系
  • FPGA(3)验证数字逻辑(与门、与非门、二选一数据选择器、2-4译码器、半加器、全加器)

    目录 一 验证与门 二 验证与非门 三 验证二选一数据选择器 四 验证2 4译码器 五 验证半加器 六 验证全加器 0 初始化定义 1 第一个半加器 2 第二个半加器 3 得到最终进位Co 代码 0决定与 1决定或 一 验证与门 只要有一个
  • Verilog之assign

    Verilog中的关键词assign主要用于如下两个地方 数据流建模 用于数据流建模的显示连续赋值语句语法格式如下
  • 输入延时(Input Delay)与输出延时(Output Delay)

    一 设置输入延时 Input Delay 1 不同的路径需要使用不同的约束 2 输入延时的定义 由下图可以看出Input Delay是以上游芯片的时钟发送沿为参考 上游的输出数据到达FPGA的外部输入端口之间的延迟 输入延迟 input d
  • FPGA Xilinx 7系列高速收发器GTX通信

    Xilinx 7系列高速收发器GTX 说明 FPGA TX端 zynq 7z035 RX端 zynq 7z100 两个FPGA通过SFP 光纤 接口相连进行GTX的通信 环境 Vivado2018 2 IP核 7 Series FPGAs
  • verilog 基本语法 {}大括号的使用

    的基本使用是两个 一个是拼接 一个是复制 下面列举了几种常见用法 基本用法 表示拼接 第一位 第二位 表示复制 4 a 等同于 a a a a 所以 13 1 b1 就表示将13个1拼接起来 即13 b1111111111111 拼接语法详
  • libero-soc许可证申请和环境配置

    环境 64位机 在哪台电脑上安装libero soc 就用哪台电脑申请许可证 1 注册 https www microsemi co 在官网注册 之后申请的许可证会发到注册时填写的邮箱 2 申请许可证 https www microsemi
  • [HDLBits] Exams/ece241 2014 q7a

    Design a 1 12 counter with the following inputs and outputs Reset Synchronous active high reset that forces the counter
  • 基于FPGA的简易BPSK和QPSK

    1 框图 2 顶层 3 m generator M序列的生成 输出速率为500Kbps 4 S2P是串并转换模块 将1bit的m序列转换到50M时钟下的2bit M序列数据 就有4个象限 5 my pll是生成256M的时钟作为载波 因为s
  • VHDL门控时钟如何避免

    我收到了避免使用门控时钟的建议 因为它可能会导致松弛和时序限制问题 但我想问一下我可以认为什么是门控时钟 例如 此代码对时钟进行门控 因为 StopCount 对它进行门控 process ModuleCLK begin if rising
  • 使用双寄存器方法解决亚稳态问题

    为了解决Verilog中不同时钟域引起的亚稳态 采用双寄存器方法 但据我所知 亚稳态的最终输出尚未确定 输出独立于输入 那么 我的问题是如何保证使用双寄存器方法输出的正确性 Thanks 您不能完全确定您避免了亚稳态 正如您所提到的 亚稳态
  • 您可以使用类 C 语言对 FPGA 进行编程吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在大学里 我用类似 C 的语言编写了 FPGA 不过 我也知道人们通常使用 Verilog 或 VHD
  • 如何在Altera Quartus中生成.rbf文件?

    什么是 rbf 文件以及如何在 Windows 上从 Quartus 输出文件 sof 生成它们 An RBF is a 原始二进制文件例如 它代表原始数据 这些数据将被加载到闪存中 以便在上电时初始化 FPGA A SOF is an S
  • VHDL 中的 BRAM_INIT

    我正在模拟基于处理器的设计 其中程序存储器内容保存在 BRAM 中 我正在使用 VHDL 推断 BRAM 实现程序存储器 我试图避免使用 CoreGen 因为我想保持设计的可移植性 最终该设计将进入 FPGA 我想看看是否有一种方法可以使用
  • FPGA 有哪些实际应用?

    我对我的程序为一个小型七段显示器提供动力感到非常兴奋 但是当我向不在现场的人展示它时 他们总是说 那么你能用它做什么 我永远无法给他们一个简洁的答案 谁能帮我吗 第一 它们不需要具有易失性存储器 事实上 大厂商 Xilinx Altera
  • verilog $readmemh 对于 50x50 像素 RGB 图像花费太多时间

    我正在尝试编译用于 FPGA 编程的 verilog 代码 我将在其中实现 VGA 应用程序 我使用 QuartusII 和 Altera 我正在尝试正确使用 readmemh 来逐像素获取图片 现在 我已经使用 matlab 将图片转换为
  • 学习 Verilog 的资源 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 Verilog 新手 有人可以推荐学习资源 书籍 视频 博客或任何他们有良好个人经验并帮助他们更
  • 无符号和 std_logic_vector 之间的区别

    谁能告诉我以下书面陈述之间的区别 signal A unsigned 3 downto 0 signal B std logic vector 3 downto 0 Both std logic vector and unsigned ar

随机推荐

  • 【Unity】UI的MVP框架理解,浅谈框架

    Unity UI的MVP框架理解 浅谈框架 引入框架 简单谈谈MVP框架 框架结构 框架流程 最后的碎碎念 引入框架 什么是框架 很多课程都会提到所谓的框架 进入实习前 总觉得那是很大的 可能需要有某些组件或者其他不一样的东西来作为基础进行
  • Self -Attention、Multi-Head Attention、Cross-Attention

    Self Attention Transformer结构图 上图是论文中 Transformer 的内部结构图 左侧为 Encoder block 右侧为 Decoder block 红色圈中的部分为 Multi Head Attentio
  • 测试基础技能五:判定表法项目实战,售货机购买橙汁和啤酒案例分享

    测试基础技能五 判定表法项目实战 有一个处理单价为5角钱的饮料的自动售货机软件测试用例的设计 其规格说明如下 若投入5角钱或1元钱的硬币 押下 橙汁 或 啤酒 的按钮 则相应的饮料就送出来 若售货机没有零钱找 则一个显示 零钱找完 的红灯亮
  • 第一章-信息收集

    第一章 信息收集 第一节 收集域名信息 1 1 域名介绍 域名 Domain Name 是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称 用于在数据传输时标识计算机的电子方位 例如 学院域名 51cto com 对
  • python如何在xpath中传递2个参数或变量,定位下拉框列表值为新增值,li标签下拉列表值定位方法

    最近在写自动化脚本中遇到一种场景 需要定位下拉框数据的某个值 要先自动生成这个值 然后在下拉框中找到这个值 如下场景 我需要先用脚本自动生成一组手机号 用户名 然后再在这个下拉框中找到自动生成新添加的这组数据并选择它 思路 1 先定位一组固
  • os_mutex.c(全)

    无等待地获取互斥型信号量 OSMutexAccept OS EVENT pevent INT8U perr 创建互斥型信号量OS EVENT OSMutexCreate INT8U prio INT8U perr 删除信号量OS EVENT
  • 树莓派 mqtt

    Mosquitto是一款实现了消息推送协议 MQTT v3 1 的开源消息代理软件 sudo yum y install epel release sudo yum y install mosquitto 运行 sudo systemctl
  • mklink让网盘同步不同文件夹

    mklink简介 Linux 下有一个叫符号链接的东东 是 ln 这个链接命令 mklink 和 ln 的功能几乎一样 在xp系统下 junction命令要用微软开发的小程序 junction exe实现 从http live sysint
  • Chrome插件之CSDN浏览器助手,工欲善其事必先利其器

    1 下载与安装 第一步 官方下载地址 https plugin csdn net utm source chajian contest 1210 顾名思义 在Chrome浏览器上使用 所以 第二步 下载插件打开Chrome浏览器 第三步 输
  • 读取指定文件每行并运行cmd命令

    package com company import java io import java util ArrayList import java util List public class Main public static void
  • DevExpress网格控件(GridView)中增加下拉框和复选框

    本文主要介绍如何在GridControl网格中的每一行增加复选框 下拉框和多选下拉框 最终效果如下图所示 其中 测试模块 模块类型 从属 测试人 测试要求 备注等是数据库查询到的数据 操作步骤 一 添加控件 1 Winform窗口放置一个G
  • html移动端适配最优方法

    使用js来设置font size的方法最好 目前大部分成熟网站都采用这种方法 媒体查询可能会漏掉一些设备型号 并且比较繁琐 通过vw设置也比较方便 但是兼容性不好 js设置html的font size大小 document document
  • OpenSSL SSL_read: Connection was aborted, , errno 10053

    git遇到fatal unable to access https github com xxx xxx OpenSSL SSL read Connection was aborted errno 10053的问题 原因 Git默认限制推送
  • the desired address is beyond limit for this PLC

    问题描述 通过 Java连接西门子PLC S7 1200 学习中 出现错误 the desired address is beyond limit for this PLC 下面是测试代码 S7Connector connector S7C
  • zookeeper基本架构

    要全面了解zookeeper 首先我们得知道什么是zookeeper 能做什么 zookeeper是一个开源的分布式协调服务 主要用于数据订阅 发布 集群管理 配置管理 分布式锁 基本架构 zookeeper基本架构如下 zookeeper
  • angular input_可视化的 Angular 响应式编程

    现代化UI开发中 客户端 前端 一般会进行分层设计 实际用户可感知的 UI 作为顶层 称为视图 View 底层中独立于展示方式的数据结构称为模型 Model 而将两者进行关联的中间层部分 根据划分方式则有很多种定义 例如控制器 Contro
  • thinkPHP6.0入门笔记(五)——数据表字段排序

    thinkPHP6 0实现数据表字段排序 1 利用order方法简单实现 2 URL优化排序 1 利用order方法简单实现 一般情况下排序是交给前端来实现的 后端一般主要是实现数据库的增删查改 但是PHP中经常出现order字段 由于后端
  • cuBLAS【CUDA专门用来解决线性代数运算的库】

    cuBLAS是CUDA专门用来解决线性代数运算的库 分为三个级别 Lev1向量乘向量 Lev2矩阵乘向量 Lev3矩阵乘矩阵 此外 cuBLAS库还包含一些功能和状态结构函数 学习网站为 参考资料 四 cuBLAS与cuDNN
  • mysql 快照和binlog_mysql binlog二进制日志详解

    mysql binlog二进制日志详解 更新时间 2011年10月31日 23 13 00 作者 二进制日志包含了所有更新了数据或者已经潜在更新了数据 例如 没有匹配任何行的一个DELETE 的所有语句 基本概念 定义 二进制日志包含了所有
  • Tcl脚本学习

    包的创建和调用 在tcl脚本中 我们可以通过创建和调用包来增强代码的可复用性 创建包的步骤 1 在包脚本文件中 首先声明 package provide 标识当前文件提供了一个包 之后在该文件中完成包的内容 2 通过pkg mkIndex命