489315174的个人空间 https://blog.eetop.cn/carlliu [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

calibre query 和 yeild server在 layout design上的其他应用

热度 15已有 1800 次阅读| 2023-10-15 18:34 |系统分类:芯片设计

最近一直在研究两件事,目前都有了一些成果。

第一件事:不同版图EDA工具间数据的转换问题,除了基于OAdatabasepcell 还是存在一些各家工具自己封闭的内容,这部分内容如何能够不同tool上做对应。

因为目前主流foundry都会提高两套PDK,所以这部分foundry提供ipdk的一般问题都不大。这里不展开说。

第二件事:如果使用验证工具来完善版图上的设计流程。

这里举个例子:如果版图没有完全使用SDL 这样的设计Flow来做,后期导致net device 没法和电路上一一对应。这个问题有没有办法解决。Virtuoso 配合pvs 可以重塑SDL对应关系 Custom compiler 配合ICV同样可以实现SDL的关系。CC中对于的command是:

lx::establishCorrespondenceFromLVS -path <lvs run path> -layout <dmcellview> -schematic <dmschematic>

如果使用第三方工具做的PV 是否也能够实现这样的功能。看过我文章的应该看到过前面提到的calibrepercperc确实可以实现从lvs passsvdb dfmdb结果中提取出device信息,net信息。但是我感觉还不够方便。今天介绍的calibrequeryServer YieldServer 能够更快的提取出这些信息。DRC LVS可能大家比较熟悉对queryyield 比较陌生,这两个server在某些场景下也是非常好用,也很方便。

image.pngimage.png

对应的命令是calibre -qs calibre -ys

calibre svdb结果到Custom compiler重建SDL也是基于queryYield 来实现的。

下面列举个case演示qs ys 部分功能,

这个case是使用YieldServer 的脚本来实现Hierarchy的报告

calibre -qs -svdb svdb  -exec qs.tcl

set cells [dfm::get_cells];
while {$cells != ""} {
 set cellName [dfm::get_data $cells -cell_name];
 lappend cellList $cellName;
 dfm::inc cells;
}
# get the total cell count
set cellCount [llength $cellList];
# test for hierarchy and exit if there is none
if { $cellCount < "2" } {
 puts "\n NOTE: Layout has no hierarchy. Nothing to do. \n";
 exit 0;
} 
# put any debug diagnostics here
if { [info exists DEBUG] == 1 } { 
 puts "\n---$cellCount layout cells: \n\n[regsub -all { } \
[lsort $cellList] "\n"] \n";
};
proc hier_count { cells level } { 
# if this proc is called, there is an additional level of hierarchy
 incr level; 
 set currentCells $cells;
 set newCells "";
# track cells at a given level
 foreach child $currentCells { 
 append newCells "[dfm::list_children $child] ";
 } 
 if { [lindex $newCells 0] != "" } {
 hier_count $newCells $level;
 } else {
 return $level;
 }
} 
puts "\n\n CELL HIERARCHY LEVELS AND INSTANTIATIONS"
puts "---------------------------------------------------------------\n";
# iterate over all cells.
set hierList "";
foreach cell $cellList {
 set plCount [dfm::get_placement_count $cell]
 set childCells [dfm::list_children $cell]
# if there are child cells, process to find the number of hierarchy 
# levels, otherwise add to the list with hierarchy as <0>
 if { [llength $childCells] > 0 } {
 lappend hierList [list $cell "levels: [hier_count "$childCells" 0]"\
"instantiations: $plCount"];
 } else {
 lappend hierList [list $cell "levels: 0" "instantiations: $plCount"];
 }
}
# output the cell list in ascii order
# create a 3-column matrix for printing
struct::matrix m0;
m0 add columns 3;
set sortList [lsort $hierList];
set sortListLength [llength $sortList];
for {set i 0} {$i < $sortListLength} {incr i} {
# if struct::matrix is not available, use next line for output instead
# puts "---[lindex $sortList $i]";
 m0 add row "---[lindex $sortList $i]";
}
# output the table
m0 format 2chan;
puts "\n";
proc write_tree { level {cell ""} {indent ""} } { 
 if { $cell == 0 } {
 puts "\n ERROR: Cannot determine top cell.";
 exit 1;
 }
# get placements in a cell
 set pl [dfm::get_placements $cell]
# write the cell placement in the tree
 puts "$indent <$level> $cell"; 
# adjust the indent level of the tree
 append indent " ";
# increment the level
 incr level; 
# recursively call this proc to descend all branches of the hierarchy
 while {$pl != ""} {
 set plName [dfm::get_data $pl -cell_name];
 write_tree $level $plName $indent;
 dfm::inc pl;
 } 
} 
# OUTPUT FROM THIS PART IS VERBOSE! UNCOMMENT TO CALL IT.
# puts "\n\n HIERARCHY TREE"
# puts "-------------------------------------------------------------\n";
# call the write_tree proc. hierarchy level is 0 beginning with top cell
# write_tree 0 [dfm::get_top_cell]; # UNCOMMENT TO WRITE TREE;
puts "\n\n---Done.\n"
exit -force
}

打印出的效果:

CELL HIERARCHY LEVELS AND INSTANTIATIONS
---------------------------------------------------------------
Loading hierarchy and connectivity
---CellA levels: 1 instantiations: 2
---CellB levels: 1 instantiations: 1
---TOPCELL levels: 2 instantiations: 0
---inv levels: 0 instantiations: 1
---nand levels: 0 instantiations: 2

HIERARCHY TREE
---------------------------------------------------------------
 <0> TOPCELL
 <1> CellA
 <2> nand
 <1> CellA
 <2> nand
 <1> CellB
 <2> inv


5

点赞

刚表态过的朋友 (5 人)

发表评论 评论 (3 个评论)

回复 莫名晴天 2023-10-19 11:39
发现需要dfm数据,这个数据在相对新的工艺跑lvs的时候就会存在svdb里面,但是在老工艺,比如tsmc180就没有,这个时候上面的dfm这个命令就用不了了。现在不知道老工艺怎么把dfm数据也存出来。
回复 489315174 2023-10-19 13:48
query 不需要dfmdb,只需要svdb。yield 的确是需要dfmdb。怎么生成dfmdb应该是xform那部分定义的
回复 莫名晴天 2023-10-19 17:02
489315174: query 不需要dfmdb,只需要svdb。yield 的确是需要dfmdb。怎么生成dfmdb应该是xform那部分定义的
好的,感谢

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 14

    周排名
  • 0

    月排名
  • 0

    总排名
  • 4

    关注
  • 116

    粉丝
  • 59

    好友
  • 116

    获赞
  • 49

    评论
  • 1122

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-23 12:14 , Processed in 0.028005 second(s), 16 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部