dbGet命令(一)

作者: 飞奔的大虎 | 来源:发表于2021-07-13 18:12 被阅读0次

    首先,大家应该知道,要真正学好Innovus/Encounter的话,dbGet是必须要掌握的技能。这玩意不仅快,而且炫。设想这样一个场景:当你使用dbGet,连着嵌套好几层,帮某位小白姑娘找到她想要的一个instance名字时,她别提有多崇拜你了(这绝对比你在GUI上使用Find窗口拉轰。。。)而且,当你平时要写一些脚本时,dbGet也是必不可少的东西。

    虽然只是一个简单的命令,但是要想玩得溜,还真不容易。难点在于你得熟悉那么多object的意思,不过相对于它的前任(纯db命令),它还是好学的多了。小编希望通过这几次的介绍,大家能对dbGet有一个最基本的了解,活学活用还得靠平日里的操练积累。

    言归正传,开始介绍dbGet。dbGet是Innovus/Encounter DBTCL命令的一种。除了dbGet,DBTCL的命令还包括以下几种:

    1. dbSet

    2. setDbGetMode/getDbGetMode

    3. dbSchema

    4. dbTransform

    5. dbQuery

    这其中,最常用的就是dbGet和dbSchema

    当我们在Innovus中敲击dbGet以后,然后按<Tab>键,出现的是下面3个初始的object.

    [DEV]innovus 2> dbGet

    head  selected  top

    其实,dbGet是基于一种树状的结构图,如下图所示。head是最原始的parent,然后我们需要寻找的object就藏在这每一个一级一级的分支下。selected和top其实也属于head的一个分支,只不过它们比较常用,所以就单独列出作为一个原始分支。我数了下,现在各种object一共加起来有64个,我们需要做的就是找准路线,一击必中,把“指针”找出来。

    我们首先来看最简单的selected分支,当你选中一个object,然后敲击下面命令:

    [DEV]innovus 4> dbGet selected

    0x2b3753cae120

    出来的这一堆0x开头的是你选中的object的指针,不是乱码。。。

    如果你没选中任何东西,敲击这个命令:

    [DEV]innovus 5> dbGet selected

    0x0

    这个0x0代表返回0,也就是工具找不到结果

    那如何知道选中的这个object有什么属性呢?Innovus/Encounter中通过"."来trace下一级。敲上“.”以后,按<Tab>键

    [DEV]innovus 6> dbGet selected.

    (太长了,我不一一列出来了)

    或者使用下面“.”加一个问号,这两者应该是相同功能,但前者排列的更清楚

    [DEV]innovus 7> dbGet selected.?

    大家可以看到,选中的object下面有很多属性可以得到,每个属性下面又有很多子属性。比如,我们想知道选中的object的名字,可以使用下面命令

    [DEV]innovus 8> dbGet selected.name

    SUB_Sh4Lmi_PH/f4h22Tc3000a_0

    如果我们想知道一次每个属性的值,可以使用下面命令:两个问号

    [DEV]innovus 9> dbGet selected.??

    它会把这个object下面的所有属性值都列出来,但有时候你可能不知道一些属性值代表的意思,比如说box_sizex和box_llx有什么区别呢?我们的Innovus/Encounter提供了解释这些属性的功能,敲击下面命令:问号后面跟一个h

    [DEV]innovus 11> dbGet selected.?h

    这个有的地方写的比较简单,但是基本能对这些属性有一些解释

    当然dbGet也支持同时对多个object操作

    [DEV]innovus 12> dbGet selected.

    0x2b37527dd230 0x2b37575c02d0 0x2b3753cae120

    那我们如何trace到当前object的下层属性呢?

    其实很简单,只要敲“.”加上它的下一层属性即可

    [DEV]innovus 14> dbGet selected.cell.name

    sf230 sf240 f4h22Tc

    那selected是最简单的属性,适合刚开始使用dbGet的新人学习,它的不方便之处在于你必须去选中这个object。而我们很多时候用dbGet,是为了搜索某样东西,我们并不知道怎么去选中它。这时候你就要用到另外两个object——top和head

    top指的是当前design中object

    head指的是整个design database中的object

    [DEV]innovus 15> dbGet top.insts.cell.name

    AND2 OR2 INV1 AND2 …

    上诉dbGet命令会返回design中所有cell的name。其中,

    top代表top cell的指针

    insts代表top cell下面所有insts的指针

    cell代表每个inst对应的master cell的指针

    name代表master cell的名字

    那前面提到的如何在design中去搜索某个object呢?在后面跟你想要的cell名字就行,简单吧,经常用来过滤筛选结果

    [DEV]innovus 16> dbget top.insts.cell.name BFHVTX4

    BFHVTX4 BFHVTX4 BFHVTX4...

    最基本的用法就是如此,一级一级trace下去,关键的难点在于熟悉理解64个object属性的意思,这个内容我会在下一篇中详细介绍。

    dbGet的用法就像Tcl一样,是很灵活多变的,体现在它这个命令本身具有很多option

    dbGet

    -p

    -p是我们经常用到的option。p指point,有时我们使用dbGet筛选得到我们所想要的结果。但更多时候,这些结果会被用来做另一个层级的dbGet指令。这时候就要用到-p,来返回指针。

    [DEV]innovus 42> dbget top.insts.cell.name BFHVTX4 -p

    0x2afa58513390

    -p还可以跟不同的数字-p2,-p3...分别代表着倒数多少个object的属性。

    如下图所示,该命令返回了design中所有在M1上的insts pin layer。

    如果用-p, 返回的就是所有M3 layer的指针:

    [DEV]innovus 56> dbGet -p top.insts.instTerms.layer.name M3

    0x2afa583dc000 0x2afa583dc000 ...

    -p2的话,返回的就是所有在M3上的insts pin的指针;

    [DEV]innovus 57> dbGet -p2 top.nets.instTerms.layer.name M31

    0x2afacc5fa118 0x2afacc48ee38 ...

    -p3的话,返回的就是所有在M3上的insts pin上接的insts的指针;

    [DEV]innovus 58> dbGet -p3 top.nets.instTerms.layer.name M3

    0x2afacc3e6be8 0x2afacc3e6be8...

    如果我们想要知道所有在M3上的insts pin的名字:

    [DEV]innovus 59> dbGet [dbGet -p2 top.insts.instTerms.layer.name M3].name

    SUB_PH/buf_input_datax2x/A REPEATER_datax2x/Z...

    -u

    这个option比较简单,就是对结果进行排序,只取不重复的值,比如:

    [DEV]innovus 60> dbGet top.nets.instTerms.layer.name M1

    M1 M1 M1 M1 M1 M1...

    [DEV]innovus 60> dbGet top.nets.instTerms.layer.name M1 -u

    M1

    -regexp

    dbGet也支持正则表达式匹配,类似tcl那样,

    比如:找到design中所有以d结尾的net名字

    [DEV]innovus 65> dbGet -regexp top.nets.name {d$}

    SUB_Sh/output_crypto_sh4_valid SUB_PH/inst_0/clk_gated

    找到design中所有以数字结尾的net名字

    [DEV]innovus 65> dbGet -regexp top.nets.name {\d$}

    FE_OFN166_tst_all_92 FE_OFN155_bscnet_192

    -d

    dbGet的结果采用db的单位,而不是我们正常的location单位。这个option没什么大用,大概是用来和DEF文件单位匹配吧

    [DEV]innovus 67> dbGet top.nets.box

    {5409.615 8429.245 5409.615 8429.245}

    [DEV]innovus 68> dbGet top.nets.box -d

    {5409615 8429245 5409615 8429245}

    pattern

    dbGet支持通配符的匹配,这会非常方便。比如说我们想在design中寻找中间有clk字样的net,采用如下命令:

    [DEV]innovus 69> dbget top.nets.name *clk*

    FE_OFN5372_rng_clk_mon FE_OFN49_pad_muclk_en...

    expression

    我们也可以通过判断条件来筛选结果,使用{条件}

    比如:找到design library中所有input < 10, PGTerm > 2的cell

    [DEV]innovus 85> dbGet [dbGet head.allCells {.numInputs < 10 && .numPGTerms > 2 }].name

    BD4_2V5_LIN BD2S_2V5_STAG BD2S_2V5_LIN

    -v

    -v就是大家常见的取反

    [DEV]innovus 85>dbGet top.nets.instTerms.layer.name M1 -v

    M2 M3 M4...

    -e

    这个option就是当design中找不到结果时,返回空字符,而不是0x0

    [DEV]innovus 90> dbGet top.nets.instTerms.layer.name M9 -e

    [DEV]innovus 91> dbGet top.nets.instTerms.layer.name M9

    0x0

    -i num

    这个option可以只列出第num个结果,第一个结果以0开头[DEV]innovus 97> dbGet [dbGet head.allCells {.numInputs < 10 && .numPGTerms > 2 }].name

    BD4_2V5_LIN BD2S_2V5_STAG BD2S_2V5_LIN

    [DEV]innovus 97> dbGet [dbGet head.allCells {.numInputs < 10 && .numPGTerms > 2 }].name -i 0

    BD4_2V5_LIN

    ————————————————

    原文链接:https://blog.csdn.net/Tao_ZT/article/details/102426116

    相关文章

      网友评论

        本文标题:dbGet命令(一)

        本文链接:https://www.haomeiwen.com/subject/ghgbyltx.html