innovus Tcl 学习索引:快速上手innovus 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 <cmd>
或者
man <cmd>
获取详细的介绍。
一、innovus Tcl 之 数据获取
dbGet
dbGet是Innovus DBTCL命令的一种,所得到数据是作为
列表
形式传递的。
除了dbGet,DBTCL的命令还包括以下几种,有兴趣可以拓展了解一下:
dbShape/dbSet/dbSchema/dbQuery/setDbGetMode/getDbGetMode
dbGet是基于一种树状的结构,通过这样的结构去获取设计中的 数据。并使用这些 数据进行脚本处理。
主要需要用到的功能:
pattern筛选/expression筛选/反向筛选(-v)去重(-u)/分级指针(-p) 等。
更深入且完整的学习dbGet参考下面的文档:
https://mp.weixin.qq.com/s/RmW_4gj_IX7BcCBpK5FfA
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 <cmd>
也可以获取各个命令的使用说明。
命令 | 说明 |
---|---|
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 之 Others
读写文件:open/close
open:打开文件,通过设置不同的access来定义打开文件的形式。
(r、r+、w、w+、a、a+)
close:关闭文件,打开了文件都要配合关闭文件。
open命令的access定义:
使用例:打开文件并写入文本
set file_path /home/target_file.tcl
set file [open $file_path w+]
puts $file “hello.”
close $file
使用例:打开文本并逐行读取
set file_path /home/target_file.tcl
set file [open $file_path r]
while {[gets $file line] >=0} {puts $line}
close $file
调用Linux命令:exec
简单来讲在Linux命令前面加上
exec
就可以调用这个Linux命令。所有的linux命令都是适用的,这里举几个例子作为参考:
exec mkdir -p file
set date [exec date +%m%d]
...
程序块:proc
proc [proc name] {args} {}
设置程序块名为[proc name],souce了此脚本后。就可以通过程序块名来调用完整的程序块。
传递变量,设置默认值和可option
parse_proc_arguments -args $args results
创建results的数组,来获取传入的变量。
define_proc_arguments [proc name] -info “” -define_args {}
定于指定程序块的介绍,可选option的信息等。
附上一个使用的例子,在实际编写脚本过程中只需要套用即可:
拓展
Tcl中还有一些好用的功能,这里列举一下。需要拓展可以查找相应的使用方法。
文件操作命令 file *
catch
regsub
regexp
…
四、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的学习笔记,希望对你有帮助。