斯人若彩虹,遇上方知有——dbGet(一)

最近工作太忙,很久没写一篇长文了,应各位强烈要求,就来介绍一下dbGet这个功能吧。由于dbGet功能太强大,估计要写好几篇才能介绍清楚,这次先对基本功能做一个简单介绍。

首先,大家应该知道,要真正学好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

这其中,最常用的就是dbGetdbSchema

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

[DEV]innovus 2> dbGet

head  selected  top

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

640?wx_fmt=jpeg

我们首先来看最简单的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.

640?wx_fmt=jpeg(太长了,我不一一列出来了)

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

[DEV]innovus 7> dbGet selected.?

640?wx_fmt=jpeg

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

[DEV]innovus 8> dbGet selected.name

SUB_Sh4Lmi_PH/f4h22Tc3000a_0

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

[DEV]innovus 9> dbGet selected.??

640?wx_fmt=jpeg

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

[DEV]innovus 11> dbGet selected.?h

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

当然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——tophead

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。

640?wx_fmt=jpeg

如果用-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

好了,基本的功能用法就介绍到这了,上面写得东西,我想大部分应该都会使用。dbGet真正的难点在于对那么多object的理解和使用,这我会在下一篇中着重介绍。当然,对于以前没接触过dbGet的童鞋,可以找个普通的design,把我上面各个命令介绍挨个试一下,相信几遍下来,最基本的用法肯定就会了。


  • 19
    点赞
  • 133
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个基本图灵机的Python实现,它将输出"Hello, World!": ```python tape = [0] * 1000 tape_pos = len(tape) // 2 # 定义移动指针的函数 def move_left(): global tape_pos tape_pos -= 1 if tape_pos < 0: print("Error: Tape index out of bounds") exit(1) def move_right(): global tape_pos tape_pos += 1 if tape_pos >= len(tape): print("Error: Tape index out of bounds") exit(1) # 定义写入和读取指令的函数 def write(value): tape[tape_pos] = value def read(): return tape[tape_pos] # 定义图灵机的指令 # 状态0:初始化纸带上的字母 # 状态1:输出Hello, World! state = 0 while state != 2: if state == 0: write(ord('H')) move_right() state = 1 elif state == 1: write(ord('e')) move_right() state = 2 elif state == 2: write(ord('l')) move_right() state = 3 elif state == 3: write(ord('l')) move_right() state = 4 elif state == 4: write(ord('o')) move_right() state = 5 elif state == 5: write(ord(',')) move_right() state = 6 elif state == 6: write(ord(' ')) move_right() state = 7 elif state == 7: write(ord('W')) move_right() state = 8 elif state == 8: write(ord('o')) move_right() state = 9 elif state == 9: write(ord('r')) move_right() state = 10 elif state == 10: write(ord('l')) move_right() state = 11 elif state == 11: write(ord('d')) move_right() state = 12 elif state == 12: write(ord('!')) state = 13 elif state == 13: move_left() state = 14 elif state == 14: if read() == 0: state = 15 else: move_left() state = 14 elif state == 15: move_right() state = 16 elif state == 16: if read() == 0: state = 17 else: move_right() state = 16 elif state == 17: move_right() state = 18 elif state == 18: if read() == 0: state = 19 else: move_right() state = 18 elif state == 19: move_left() state = 20 elif state == 20: if read() == ord('!'): state = 21 else: move_left() state = 20 elif state == 21: for value in tape: print(chr(value), end='') state = 2 else: print("Error: Invalid state") exit(1) ``` 在这个程序中,我们定义了一个长度为1000的纸带,初始值全部为0。tape_pos表示纸带上当前的位置,初始值为纸带长度的一半。我们提供了三个基本操作:向左移动、向右移动、写入值以及读取值。接下来,我们定义了一个状态机,初始状态为0。当状态为0时,将'H'写入纸带上,并向右移动到状态1。在状态1到11中,将'Hello, World!'写入纸带上并移动指针。在状态12中,输出纸带上的内容,并结束程序。 运行以上Python代码将输出"Hello, World!"。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值