It looks like you're new here. If you want to get involved, click one of these buttons!
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
Hi Michael,
use tiles:
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:
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:
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:in
instance_eval':/built-in-macros/drc_interpreters.lym:16:in
execute_drc' :/built-in-macros/drc_interpreters.lym:92:in
execute'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:
Regards,
Matthias