AreaDensity.il

AreaDensity,用来测密度的。40nm以下对poly,AA,via,metal都有密度要求。在最初plan时,poly密度的问题尤为重要,很多人在plan时没考虑density问题,最后拉线完成了才发现poly density超了,此时再改对layout的影响就太大了。并且由于calibre drc的check规则,是从(0:0)开始画框check密度,很多时候底层drc没有报出density error,但上层整合时却出现了,此时再回头改底层,撑开空间,难如登天。
这个问题不止新人会犯,老人也会犯,有经验者会在plan时进行大致的计算,算出大致密度,拉开足够空间,但计算时总是会有误差。
使用这个脚本,可以精确算出框选的部分,你想要知道的任何layer的密度(可以是多个layer,比如poly和dummy poly总和)。
脚本使用方法:
LSW中将你要测的layer打开显示,其他层都不显示。鼠标在layout窗口按下快捷键F5,会出现框选的拉框,再点左键,确认拉框范围。
密度的结果在CIW窗口看,就是virtuoso软件的主体窗口。这里需要先打开返回信息的选项:
options -- LogFilter ,里面的选项全选。
刚刚操作完成之后,在CIW中会出现一行字符,其中最后一位的数字就是,比如0.4298031,这就是密度是42.98%

这个脚本最初是写成专用测poly density的,里面的list就只写了两个layer的lpp(poly和dummy poly),
但是后面做IO时,via的密度总是超,又没办法知道自己画的via的最大密度是多少,所以将脚本修改了一下,
变成可以测任意多个layer密度。

有一定动手能力的,又不测via和metal密度的,可以自行修改回去。那样其实使用起来更方便。

procedure(AreaDensity()
let((cv tech BOX Density layers layerList)
cv=geGetEditCellView()
tech=techGetTechFile(cv)
layerList = leGetValidLayerList(tech)
layers=nil
foreach(layer layerList
if(leIsLayerVisible(layer) == t
then
layers=append1(layers layer)
);if
);foreach
BOX=enterBox()
Box=list(geWindowToEditPoint(hiGetCurrentWindow() xCoord(Box))
geWindowToEditPoint(hiGetCurrentWindow() yCoord(Box)))
BOX=list(car(BOX) xCoord(car(BOX)):yCoord(cadr(BOX)) cadr(BOX) xCoord(cadr(BOX)):yCoord(car(BOX)))
Density=leComputeAreaDensity(
hiGetCurrentWindow()
list(layers)
?depth 31
?region BOX
)
println(Density)
);let
);proc

hiSetBindKey("Layout" "F5" "AreaDensity()")

posted @ 2026-01-06 14:17  sdadad1  阅读(19)  评论(0)    收藏  举报