It looks like you're new here. If you want to get involved, click one of these buttons!
I need to extract multiple clip regions from a target Region
, just like the function Layout#multi_clip()
does, except that the execution object is replaced with Region
. But it seems that there is no direct function to achieve this process, so I try to achieve it through the AND operation of two region:
# method 1
clip_region_list = []
for polygon in clip_area_polygon_list: #clip_area_polygon_list is a list of clip areas defined by polygon
clip_boundary= db.Region(polygon)
clip_region_list.append(clip_boundary & target_region) # target_region is the region to be clipped
However, the AND operation of clip_boundary
and target_region
in cycle will take a lot of time, because the target_region
is usually very large. So I used method 2 to reduce the runtime.
# method 2
clip_region_list = []
clips_region = target_region & db.Region(clip_area_polygon_list)
for polygon in clip_area_polygon_list:
clip_boundary= db.Region(polygon)
clip_region_list.append(clip_boundary & clips_region)
My question is whether there is a faster way, or whether this function can be added to the new version of klayout if it is easy to do. Because the clip operation on a single-layer region is a very common operation.
Comments
@garry The clip function is fundamentally different from anything the Region can offer. It will perform a clip hierarchically - i.e. generate clip variants of cells and use those if a cell is partially cut. It will maintain sub-hierarchies unless a variant needs to be created. This makes the clip feature much more efficient than the AND approach.
In contrast, the Region object is a flat representation and this will degrade performance significantly. So for top performance you should really think about your design - the Region isn't the best choice here.
Apart from that, the Region already uses the clip approach for AND if:
So this code (disclaimer: not tested):
should actually deliver the multi-clip feature already. An integrated solution would not be much different.
Matthias
Thank you very much @Matthias , I will test the operation with the code you provided