| # A general XOR script | |
| # (https://www.klayout.de/forum/discussion/100/xor-vs-diff-tool) | |
| # This script uses KLayout's DRC language to implement a generic | |
| # XOR between two layouts. The name of the layouts is given | |
| # in $a and $b. | |
| # For layout-to-layout XOR with multiple cores, run this script with | |
| # ./klayout -r xor.drc -rd thr=NUM_CORES -rd top_cell=TOP_CELL_NAME -rd a=a.gds -rd b=b.gds -rd ol=xor.gds -zz | |
| # (replace NUM_CORES by the desired number of cores to utilize | |
| # enable timing output | |
| verbose | |
| # set up input a | |
| a = source($a, $top_cell) | |
| # set up input b | |
| b = source($b, $top_cell) | |
| $o && report("XOR #{$a} vs. #{$b}", $o) | |
| $ol && target($ol, $co || "XOR") | |
| $thr && threads($thr) || threads(2) | |
| # collect all common layers | |
| layers = {} | |
| [ a.layout, b.layout ].each do |ly| | |
| ly.layer_indices.each do |li| | |
| i = ly.get_info(li) | |
| layers[i.to_s] = i | |
| end | |
| end | |
| # perform the XOR's | |
| layers.keys.sort.each do |l| | |
| i = layers[l] | |
| info("--- Running XOR for #{l} ---") | |
| x = a.input(l) ^ b.input(l) | |
| info("XOR differences: #{x.data.size}") | |
| $o && x.output(l, "XOR results for layer #{l}") | |
| $ol && x.output(i.layer, i.datatype, i.name) | |
| end |