抽取PAD中心坐标与Label
procedure(pad_center()
let((cv cvsel out shp shape padarea padcenter textName layerName xtext ytext xpad ypad)
cv=geGetEditCellView()
filename=strcat(cv~>cellName ".txt")
out=outfile(filename)
all_pad_layer = setof( tmp cv~>shapes tmp~>lpp==list("CB" "drawing")
all_pad_label = setof( tmp cv~>shapes tmp~>lpp==list("CB" "label"&&tmp~>objType=="label")
foreach(shp all_pad
padarea = shp~>bBox
padcenter = hiBoxCenter(shp~>bBox)
xpad = car(padcenter)
ypad = cadr(padcenter)
padarea_x1 = xCoord(xCoord(padarea))
padarea_y1 = yCoord(xCoord(padarea))
padarea_x2 = xCoord(yCoord(padarea))
padarea_y2 = yCoord(yCoord(padarea))
i=1
foreach(label all_pad_label
xtext = xCoord(label~>xy)
ytext = yCoord(label~>xy)
when(xtext>padarea_x1&&
xtext<padarea_x2&&
ytext>padarea_y1&&
ytext<padarea_y2
textName = shape~>theLabel
xpad=float(xpad)
ypad=float(ypad)
fprintf(out "%d\t%s\t%f\t%f\t\n" i textName xpad ypad)
i++
)
); foreach
);foreach
close(out)
);
);
hiSetBindkey("Layout" "j" "pad_center()")
基本思想是:首先要flatten layout, 让CB,labe浮在顶层
将所有的PAD做成一个CELL,Label也全加上,打散全部,从PAD的某个相关层,抽取其中心坐标,如“CB”之类,首先取当前CELL所有的shapes,进行判断,是否是"CB"且是"drawing",如果是则进行取其bBOX的值,这是一个区域,不管是什么形状的,其bBox都是一个表示矩形的左下、右上坐标的一个list。然后这个值可以通过hiBoxCenter来计算中心,然后输出其X与Y的值.然后利用padarea 这个list,用geSelectArea,去选择这个区域内的所有东西,这样进行所选形状遍历就可以选到Label,若是你的Label标的出了这个框就选不到了,选不到的当然是不规范的Label了。接下来就可取到Label的名字、层次、层次类型、X坐标、Y坐标,然后就可以输出了。
这也有许多可改进的地方,如:某个PAD没有Label或者是用其它不合适的层打的Label,可以进行输出警告(这个在检查BUMP的时候比较有用)。还有应用就是比较Label的XY是否与PAD的中心是一样的,这个要求有点变态,但对出LEF有好处。还有就是做一个图形界面。去选识别层,就不用修改程序了,变得更通用些吧!
大家可以发挥一下,其实可以不做CELL,也不用打散,直接在原来的总图cellview里,去遍历所有的CELL,一层一层往下找(当然限定一下找的范围会快很多,比如:Ins == ”PAD“),然后将取得的list传给geSelectArea,去选当前的Label,然后一起输出。
呵呵,我仅在这里抛砖欢迎大家拍玉~~~~~~~~~