# 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 -rd xor_total_file_path=xor_total_file_path.txt -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 && $ext != "gds" && report("XOR #{$a} vs. #{$b}", $o)
$ol && $ext == "gds" && 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
total_differences = 0
layers.keys.sort.each do |l|
  i = layers[l]
  info("--- Running XOR for #{l} ---")
  x = a.input(l) ^ b.input(l)
  total_differences += x.data.size
  info("XOR differences: #{x.data.size}")
  $o && $ext != "gds" && x.output(l, "XOR results for layer #{l} #{i.name}")
  $ol && $ext == "gds" && x.output(i.layer, i.datatype, i.name)
end
File.write($xor_total_file_path, total_differences)
