赞
踩
首先在开始学习之前需要对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是实数,无论是整数还是小数无论是正整数还是负整数等
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。