TCL脚本语言学习

首先在开始学习之前需要对innovus Tcl有一个大体的认识。如下图所示,将脚本分成了三个大类:

首先通过innovus进行数据获取:

dbGet/get_property/get_cells/get_pins/get_libs/get_ports 等。

然后通过tcl对数据进行处理:

控制语句命令/字符操作命令/列表操作命令/集合操作命令。

还有一些其他的很常用的命令:

读写文件命令/调用linux命令/程序块定义命令等。

图中总结可能不是那么全面,但是可以通过这个图对innnovus Tcl有一个整体的认识,接下来就开始分步学习Tcl。

innovus 中对绝大多数命令都有介绍,包括tcl控制命令和tcl数据处理命令。如果本文介绍不够详细可以在innovus里尝试 help 或者 man 获取详细的介绍。

一、innovus Tcl 之 数据获取

dbGet

dbGet是Innovus DB TCL命令的一种,所得到数据是作为列表形式传递的。

除了dbGet,DBTCL的命令还包括以下几种,有兴趣可以拓展了解一下:

dbShape/dbSet/dbSchema/dbQuery/setDbGetMode/getDbGetMode

dbGet是基于一种树状的结构,通过这样的结构去获取设计中的 数据。并使用这些 数据进行脚本处理。

主要需要用到的功能:

pattern筛选/expression筛选/反向筛选(-v)去重(-u)/分级指针(-p) 等。

get_* 获取数据集合

help get_*可以获取所有能获取数据集合的命令。常用的命令有以下几种

get_cells/get_nets/get_libs/get_lib_cells/get_ports

实际应用中往往需要用到更复杂的匹配方式去获取想要的结果。

以get_cells为例(其他的 -help都有详细介绍),有以下几个option:

option

说明

-hierarchical

能够匹配到低阶层的cell

-filter

在匹配结果里继续筛选,*可以根据list_property中的属性进行筛选

-of_objects

将关联cell创建为集合

-nocase

指定模式为不分大小写匹配模式, *需要和-regexp一起使用

-regexp

指定模式为正则表达式匹配模式

-leaf

只返回 leaf cell(即过滤trunk cell),*需要和-of_objects一起使用

使用例,根据list_property中的属性筛选出所有的clock pin:

get_pins -hierarchical -filter {is_clock==“true”}

使用例,获取chip内pin名以PAD结尾的net:

get_object_name [get_nets -of_object [get_pins -filter “full_name =~ **/PAD”]]

get_property

使用get_property的方法:

property name的获取方法:list_property

这里的例子选择了列举出cell类型的所有属性,这些property name都可以使用get_property去获取。

其他类型还有:clock design lib lib_cell lib_pg_pin lib_pin lib_timing_arc net path_group pg_net pg_pin pin port timing_arc timing_path timing_point

二、innovus Tcl 之 数据处理

控制语句

Tcl的控制语句只有如下几种。而经常用的只有if/else/foreach。根据如下图示的语法掌握即可。

Tips:foreach经常用于dbGet获取的列表。set list [dbGet top.insts.name]foreach n $list { puts $n}

字符操作

tcl中的字符操作命令都是以string为开头,下面列举部分比较常用且基础的命令供参考。记住各个命令的功能,在实际要用到命令的时候再查找命令的具体用法。

使用方法可以参考资料:https://blog.csdn.net/asty9000/article/details/90681912

命令

使用方法

说明

string trim

string trim str? chars?

从 str 两端删除 chars 中指定的字符。chars 默认为空字符。

string trimleft

string trimleft str? chars?

从 str 开头删除 chars 中指定的字符。chars 默认为空字符。

string trimright

string trimright str ?chars?

从 str 结尾删除 chars 中指定的字符。chars 默认为空字符。

string tolower

string tolower str ?first? ?last?

将指定范围的字符转化为小写格式。

string toupper

string toupper string? first? ?last?

将指定范围的字符转化为大写形式。

string compare

string compare ?-nocase? ?-lengthlen? str1 str2

根据词典顺序比较字符串。-nocase 选项表示大小写无关。-length 选项表示只比较指定长度的开头部分字符。如果字符串相同就返回0(str1=str2),如果 str1 的顺序比 str2 靠前就返回-1(str1<str2),其他情况返回 1(str1>str2)。

string equal

string equal ?-nocase?str1 str2

比较字符串,相同返回 1,否则返回 0。

string index

string index str index

返回指定位置的字符。index 号从 0 开始。如果 index 为 end 则返回最后一个字符。

string is

string is class ?-strict? ?-failindexvarname?str

判断字符串的类型,如果是指定类型就返回 1。

string match

string match pattern str

如果 str 匹配 pattern 就返回 1,否则返回 0。使用的是通配风格的匹配。参见本节的“字符串的匹配”部分。

string replace

string replace str first last ?newstr?

将从 first 开始到 last 结束的一段字符串替换为 newstr 字符串。如果 newstr 没有,则这部分字符串内容会被删除。

string last

string last str1 str2

返回 str2 在 str1 最后一次出现的位置索引。没有搜索到就返回-1。

string length

string length str

返回 str 中的字符个数

string range

string range str index1 index2

返回 str 中从 index1 到 index2 之间的字符串

列表操作

列表命令比较少,且因为处理列表很常用,所以列表的命令都需要很熟悉才能在写脚本的时候得心应手。下面总结了列表命令及各命令的功能。具体用法不赘述,可以网上搜索tcl的教程文档。

命令

说明

list

将字符生成为列表。

concat

把多个list合成一个list。

lindex

返回 list 的第 index 个(0-based)元素。

llength

返回 list 的元素个数。

linsert

在列表指定位置插入字符串或列表,返回新的列表。

lreplace

替换列表中的值,返回新的列表。

lrange

指定列表中的始末位置,返回对应的列表值。

lappend

向列表中添加新的字符串。

lsearch

搜索列表中的字符串。

lsort

将列表进行指定顺序的排序,默认ASCII顺序排序。

split

把字符串按指定分隔符分成一个个单词,返回新的列表。

join

将列表按指定字符重新组合成字符串。

集合操作

innovus中通过get_*命令获取的都是数据集合,这些集合都需要用集合操作来处理。

在innovus命令栏中输入help *collection就可以查找所有的集合命令,man 也可以获取各个命令的使用说明。

命令

说明

foreach_in_collection

循环集合中的元素

add_to_collection

添加元素进入集合

append_to_collection

添加元素进入集合/合并集合

copy_collection

复制集合

filter_collection

筛选集合中的元素

index_collection

返回集合中指定位置的元素

range_collection

指定始末位置,返回集合中的切片

remove_from_collection

从集合中删除元素

sizeof_collection

返回集合中元素的个数

sort_collection

将集合进行排序

三、innovus Tcl 之 参考用例

dbGet 参考用例

dbGet top.insts.cell.name *ram*

dbGet [dbGet -p top.insts.pStatus fixed].name

dbGet [dbGet -p top.insts.instTerms.isTieLo 1].name

dbGet [dbGet top.insts.cell.name *ram* -p -u].terms.name A[*]

dbget [dbget top.insts.instTerms.name Pad -p].net.name

dbGet [dbGet -p top.insts.cell.subClass pad].name

set cellPtrList [dbGet -p head.allCells.name *BUF*]

foreach cellPtr $cellPtrList {puts "[dbGet $cellPtr.name] [dbFTermMaxCap [dbGet -p $cellPtr.terms.name termName] 1]"}

get_* 参考用例

get_cells -hierarchical -filter is_memory_cell

get_object_name [get_nets -of_object [get_pins -filter "full_name =~ **/PAD"]]

get_property [get_lib -of_objects [get_lib_cell *ram*]] source_file_name

get_property [get_cells -hierarchical -filter {is_memory_cell == true} ] ref_lib_cell_name

以上就是对innovus Tcl的学习笔记,希望对你有帮助。

附赠:部分例子

1、写一个tcl程序,计算半径为12.5的圆的面积并打印出来

2、写一个tcl程序,统计列表“bad ok ng miss valid good ok done ok back ok”中单词“ok”出现的次数并打印

3、写一个程序,根据执行脚本时给的数字参数,打印出对应数字的星期英文(比如参数是1,则程序打印Monday;参数是7,则打印Sunday;如给出1-7以外的任何字符,则提示参数无效。

4.对用户输入的参数,判断是不是一个实数数值,是则打印“YEs”,否则打印“No”(正负、小数都要识别,不要求支持科学计数法)。

所有数字都是实数。如果a为数字则a是实数,无论是整数还是小数无论是正整数还是负整数等

  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stefen_hou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值