innovus Tcl 学习索引:快速上手innovus Tcl

  • Post author:
  • Post category:其他


首先在开始学习之前需要对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的学习笔记,希望对你有帮助。



版权声明:本文为kobayashiyou原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。