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
ox開頭的是選中objectt的指針 不是亂碼
如果你沒選中任何東西,敲擊這個命令:
[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
這兩個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 num ]
[-u]
[-regexp]
[-d]
{ obj | objList | head | top | selected}
[. objType ]…[. attrName | .? | .?? | .?h]
[ pattern ]
[expression]
[-v]
[-e]
[-i]
-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 M3
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