ICC2中,操作好多边形计算,就会加倍提高效率,写出效果显著的脚本,尤其在floorplan & pv阶段。例如修DRC,针对某种类型的DRC计算出多边形进行金属填充。或者在floorplan阶段,对于一些边边角角添加blockage。
那么在ICC2中,需要深入理解两个概念。
poly_rect: 单个多边形,是坐标点组成的集合
geo_mask: poly_rect组成的集合
对于这两个概念,都是抽象化的geometry object,有坐标点,也可以进行逻辑运算,但是你在图形界面里是看不到的。如果想看到它们,你必须把它们转化为实际的图形对象( real geometry object)。
另外,对于图形处理命令,除了create_poly_rect, 会产生poly_rect之外,象其他的polygon操作命令,所产生的objec都属于geo_mask。
那么实际的图形对象,都有哪些呢?shape, cell, voltage area, blockage,bound ... 一般来说,能看到的有boundary的对象, 都算是实际的图形对象(real geometry object)。
象这些对象,无需转化,直接就可当geo_mask来进行图形运算。
set geo [resize_plygons [get_cells $macro] -size 1]; #直接用cell进行图形运算,产生一个geo_mask
create_routing_blockage -boundary $geo -layer M4; # 转化为M4的blockage
关于多边形的操作命令以及转化关系,见下图:
因为geo_mask为collection, 所以有可能内部有多个ploy_rect, 那么,就需要用foreach_in_collection。
polygon 操作命令:
比如我们想获得stdcell区域的面积 (core_area - hard_macro_area - placement_blockage_area)。
set non_std [create_geo _mask [add_to_collection [get_cells -physical_context -filter is_hard_macro] [get_placement_ blockages]]]
set std [compute _polygons -objects1 [create_geo_mask [get_attribute [get_core_area] boundary]] -objects2 $non_std -operation not]
compute_area $std
然后通过前面的文章,计算stdcell的面积,就可以很方便的计算出stdcell区域的utilization。