xPDK GDS Layer - multi layer operations

Multi-layer derived

Derived layer operations are common in chip design to simplify work for designers and make their work more efficient and less error-prone. This holds for both single-layer and multi-layer operations.

The implementations of these operations vary strongly per software so efficiency (cpu, runtime, memory) will be different per software. In general a tool-specific set of operations can be much (> 10x) faster then a generic / converted deck and (optimal) runtime may easily be hours of wallclock-time, see also
DRC.

Multi-layer derived layers look like the single-layer operations, they mainly differ in the amount of layers that are used.
For the input of the operations there are two flavors - the named layers A, B and sometimes C. And the layer list via a list of layer fields. The first option is used if order of layers is relevant, for example in a layerAnotB. Changing the A & B layers will lead to very different results.

The layer-list is suitable in case many layers can be used and ordering is not important. This option like in layerIsCoveredBy do use a list of layers like in the Cover and In fields, which combine like an “or”.

The output of the operation is (for derived layers) stored in the Tgt layer, which can be a gds layer or an applayer.
full file

<!-- some base layser -->
<layer name="layer1">
 <gds_number>0</gds_number> <gds_datatype>0</gds_datatype>
</layer>

<layer name="layer2">
 <gds_number>1</gds_number> <gds_datatype>0</gds_datatype>
</layer>

<layer name="layer3">
 <gds_number>2</gds_number> <gds_datatype>0</gds_datatype>
</layer>

<layer name="layer4">
 <gds_number>4</gds_number> <gds_datatype>0</gds_datatype>
</layer>

<layer name="layerA0">
 <gds_number>0</gds_number> <gds_datatype>2</gds_datatype>
</layer>

<layer name="layerA1">
 <gds_number>0</gds_number> <gds_datatype>4</gds_datatype>
</layer>

<!-- multi-layer ops -->
<MultiLayerOps>
  <layerAnotB Tgt="layer4" A="layer1" B="layer3"/>

  <layerOr Tgt="layer4" A="layer1" B="layer3"/>

  <layerAnd Tgt="layer4" A="layer1" B="layer3"/>

  <layerXor Tgt="layer4" A="layer1" B="layer3"/>

  <layerOffset Tgt="layerA1">
   <doc>Some combined output</doc>
   <In>
     <layer>layer1</layer> <layer>layer2</layer> <layer>layerA0</layer>
   </In>
   <dist>2.0</dist>
  </layerOffset>

  <layerIsCoveredBy Tgt="layerA1">
   <doc>Some combined output</doc>
   <Cover>
     <layer>layer1</layer> <layer>layer2</layer>
   </Cover>
   <In>
     <layer>layer1</layer> <layer>layer2</layer> <layer>layerA0</layer>
   </In>
   <how>partly_including</how>
  </layerIsCoveredBy>
</MultiLayerOps>

Derived layers (single & multiple) are often needed to be able do define DRC rules more precisely as they tend to have clauses like “if this & that, then the rule is so&so”. This this&that and so&so are both often derived layers.

Multi-layer DRC

That extends these a bit with more layer references and some more values.
full file

<!-- some base layser -->
<layer name="layer1">
 <gds_number>0</gds_number> <gds_datatype>0</gds_datatype>
</layer>

<layer name="layer2">
 <gds_number>1</gds_number> <gds_datatype>0</gds_datatype>
</layer>

<layer name="layer3">
 <gds_number>2</gds_number> <gds_datatype>0</gds_datatype>
</layer>

<!-- multi-layer ops -->
<MultiLayerOps>
  <!-- Define multi-layer operations -->
  <drcNoOverlapA_Exclude_B A="layer1" B="layer3">
   <msg>Just a msg</msg>
  </drcNoOverlapA_Exclude_B>
  <drcA_NoOverlap_B_Exclude_C A="layer1" B="layer3" C="layer2">
  <doc>Do something more exclusive here?</doc>
   <msg>triple</msg>
  </drcA_NoOverlap_B_Exclude_C>

  <drcMinSpacingA_to_B A="layer1" B="layer3">
   <value>5</value><msg>Keep some distance</msg>
  </drcMinSpacingA_to_B>

  <drcOverlapOf_A_by_B A="layer1" B="layer2">
   <value unit="um">5</value><msg>Need some overlap</msg>
  </drcOverlapOf_A_by_B>
</MultiLayerOps>

Derived layers

layerOr