[ Skill ] cellView 边界被撑大了,如何清除看不见的东西?

https://www.cnblogs.com/yeungchie/

有时候会发现某个单元的边界被撑大了,上层调用时占用很大的范围,总结一下遇到过的案例。

1. 多余的 steiners

由于 XL 的使用引入了一些 steiners ,且多余的没有被删除,导致 bBox 被撑大( 祖传 BUG 了 )。

解决方法:删除 steiners

mapcar('dbDeleteObject geGetEditCellView()~>steiners)

清除 LogicalConn

但有时候会出现并不是由 steiners 引起的,说明还有别的连接信息在搞事。
可以用下面这个函数来解决。

lceClearLogicalConn(geGetEditCellView())

这个函数的解释是:

Removes the logical connectivity on the specified cellview, such as nets that are not attached to terminals, and the nets and lxStickyNet property on all routes, shapes, and vias. In addition, the function clears all connectivity on instTerms and removes the markers created by the extractor.

所有连接关系会被清除,重建连接关系可以通过 Layout 菜单 Connectivity --> Extract Layout

2. 处于边界外的 markers

不知道为什么会有 markers 在边界外面,估计又是什么 bug 吧。。。
通过 Layout 菜单 Verify --> Markers --> Delete All Markers 解决即可。

3. 工艺未定义的 lpp 的图形

版图数据中存在图形使用了 techfile 未定义的 lpp,处于不可显示不可编辑的状态。
常出现在 PDK 有较大的更新,某些 lpp 改名或被删除。
例如 techfile 更新后 text:drawing 被修改为 text:txt,原有版图中使用 text:drawing 所标的 label 就会处于这种状态。

注意:drawing 属于预设的特殊 purpose,即使 techfile 中未定义这层 layer 对应的 drawing,在 virtuoso 也是可以被创建的。类似的 purpose 还有 blockage、pin 等。

下面例程的功能是将这些图形删除。

let((cvId tech map)
    cvId = getGetEditCellView()
    tech = techGetTechFile(cvId)
    map = makeTable("" nil)

    ; 获取工艺中定义的 lpp
    foreach(lp tech~>lps
        map[list(lp~>layer~>name lp~>purpose)] = t
    )

    ; 将工艺未定义的 lpp 的图形删除
    foreach(x cvId~>shapes
        unless(map[list(x~>layerName x~>purpose)]
            dbDeleteObject(x)
        )
    )
)

4. 工艺未定义层次的 blockages

情况与上面的 lpp 类似,无效层次的 blockages。
例如某个工艺金属层只达到 M11,但版图中存在 M13 的 routing blockage,它将处于不可显示不可编辑的状态。

Q:哪些图形可以作为 blockage objects 的层次呢?
A:方式很粗暴,所有存在 purpose 为 blockage 的 layer 都可以作为 blockage objects 层次。

思路和筛选 lpp 一样,下面例程的功能是将这些 blockages 删除。

let((cvId tech map)
    cvId = getGetEditCellView()
    tech = techGetTechFile(cvId)
    map = makeTable("" nil)

    ; 记录下工艺中存在 purpose 为 blockage 的 layer
    foreach(lp tech~>lps
        when(x~>purpose == "blockage"
            map[lp~>layer~>name] = t
        )
    )

    ; 将工艺未定义层次的 blockage 删除
    foreach(x cvId~>blockages
        unless(map[x~>layer]
            dbDeleteObject(x)
        )
    )
)
posted @ 2020-05-29 21:14  YEUNGCHIE  阅读(3028)  评论(2编辑  收藏  举报