Boolean operators

Reading the tutorial "More Operations" (FSiC 2019 pg 23/62) I am a bit unclear about the notation

"a-b" (NOT)

I expect that this would be used like

c = a-b

I think this form's result might be "ANDNOT"? (a and not(b))

What if I wanted to make an actual "NOT" of a layer - is there a unary operator (like, say, !layer)?
Such that if I wanted to, I could make the ANDNOT operation by

c = a & !b

Just hoping for a little clarification


  • Specifically I have one derived layer that is not-a & not-b & not-c - how can I ANDNOT them all when there's no "positive logic" item to subtract (ANDNOT) from?

  • Hi Jim,

    For "not" you always need a background layer (which is the chip's dimension). There needs to be a outer bound somewhere (no infinite space, sorry). You can take the layout's extension, but the cases I know always have some drawn boundary layer.

    So "not a" can be implemented as "boundary - a".

    And "not-a & not-b & not-c" is logically equivalent to "boundary - (a + b + c)". Which is also faster.


  • Thanks, Matthias,

    My technology does not have a "boundary" / "bulk" layer but maybe I can fake it.

    Am I correct that the "NOT" logic is really "ANDNOT"?

  • Hi Jim,

    yes, "NOT" is basically always "AND NOT". But I have not seen a layout so far without a boundary - every chip finally needs to have a physical size.

    If you know the size, you can generate this layout inside your DRC:

    boundary = polygons
    # produces a rectangle on this layer with corners 0,0 and 2000,1000 (µm)
    boundary.insert(box(0.0, 0.0, 2000.0, 1000.0))

    If you want you can also make this layer "infinitely large" (like 20x20mm). There is a limitation by the database unit - you should not exceed a range of roughly -1e9 .. 1e9 database units.


Sign In or Register to comment.