Clipping or selecting polygons from a layer using cover shapes from another layer

Hi,

I have a very large high-density EUV layout that I'm trying to process. I need to select out polygons on layers that are touched by a cover shape layer. What is the most memory efficient way to do this? I've gotten memory allocation failure on the runs I've tried so far. Is AND the most efficient method? I've been trying "interacting."

Here is the script I am trying currently:

source("k1.oas")
target("k2.oas")

s0 = input(1,0)
t0 = input(10,0)
t3 = input(10,3)

t0i = t0.interacting(s0)
t3i = t3.interacting(s0)

t0i.output(10,0)
t3i.output(10,3)

Regards,
Michael

Comments

  • Sorry, forgot to mention I'm running on a Linux machine with 250GB of memory.
    command line is:
    $ klayout -b -r k.drc

  • edited July 2020

    Hi Michael,

    use tiles:

    tiles(1000, 1000)
    

    This will split your layout into tiles of 1000x1000µm and run the operations on these tiles only. That takes only as much memory as a single tile needs. Plus you can utilize multiple cores:

    threads(16)
    

    to use 16 cores in parallel on the tiles.

    However, there is a problem: "interact" needs to join features because it wants to select bigger clusters. If your clusters are of a limited size (for example smaller than 10µm), add a border to capture all parts of the cluster from neighboring tiles:

    tile_border(10, 10)
    

    If your clusters are basically infinite, I'm afraid tiles aren't a solution or you will just receive partial clusters (as much as fits into a tile plus border).

    Play with the tile size if you still need too much memory. Don't make it tool small so the overhead for managing the tiles won't be too big. Don't make is much smaller than the ~ 100 times the border. 1000µm is my tile size for classic chrome on glass masks.

    Matthias

  • Thanks Matthias,

    I tried tiles(1000,1000), threads(16) and tile_borders(2,2) and it's running. top shows much less memory being used.

    Just curious, would I have the same issue of trying to select bigger clusters if I used AND instead?

    Regards,
    Michael

  • Hi Matthias,

    I've tried 1000, 500, 250 and 125 for tiles(x,x). I have gotten these errors for all cases:
    .....
    ERROR: Worker thread: std::bad_alloc
    ERROR: Worker thread: std::bad_alloc
    ERROR: Worker thread: std::bad_alloc
    ERROR: In kriekand.drc: Errors occured during processing. First error message says:
    std::bad_alloc in TilingProcessor::execute
    ERROR: Errors occured during processing. First error message says:
    std::bad_alloc in TilingProcessor::execute in MacroInterpreter::execute
    kriekand.drc:12:in execute_drc' :/built-in-macros/drc_interpreters.lym:16:ininstance_eval'
    :/built-in-macros/drc_interpreters.lym:16:in execute_drc' :/built-in-macros/drc_interpreters.lym:92:inexecute'

    Regards,
    Michael

  • Hi Michael,

    "bad_alloc" means there isn't enough memory available. If you're using 32bit, the available 2G are easily exhausted. On 64bit, you should see the memory peaking in top.

    I wonder what's wrong with the smaller tiles. Memory consumption should be much smaller when the tile size in reduced.

    If this is not the case, there can be two reasons:

    • Either 125µm is still too big (if your features are very small this may be the case).
    • There are very big polygons - in this case, tiling does not help as the tile will always pull these huge polygons.

    Regards,

    Matthias

Sign In or Register to comment.