################################################################################################
# Copyright 2022 GlobalFoundries PDK Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
################################################################################################

#==================================
# ------ GENERAL DERIVATIONS ------
#==================================

ncomp           = comp.and(nplus)
pcomp           = comp.and(pplus)
tgate           = poly2.and(comp).not(res_mk)

ngate           = nplus.and(tgate)
nsd             = ncomp.outside(nwell).interacting(ngate).not(ngate).not(res_mk)
ptap            = pcomp.outside(nwell).outside(dnwell).not(res_mk)

pgate           = pplus.and(tgate)
psd             = pcomp.inside(nwell).interacting(pgate).not(pgate).not(res_mk)
ntap            = ncomp.inside(nwell).not(res_mk)

ngate_dw        = ngate.and(dnwell)
ptap_dw         = pcomp.inside(dnwell).outside(well_diode_mk).not(res_mk)

pgate_dw        = pgate.inside(dnwell)
ntap_dw         = ncomp.inside(dnwell).not(res_mk)

psd_dw          = pcomp.and(dnwell).interacting(pgate).not(pgate).not(res_mk)
nwell_con       = nwell.not(res_mk)
poly2_con       = poly2.not(res_mk).not(plfuse)


# Splitting vias into cap-vias, ncap-vias

if METAL_LEVEL != '2LM'
  via2_ncap = via2.not(fusetop.or(fusetop2))
  via2_cap  = via2.and(fusetop.or(fusetop2))
  if METAL_LEVEL != '3LM'
    via3_ncap = via3.not(fusetop.or(fusetop2))
    via3_cap  = via3.and(fusetop.or(fusetop2))
    if METAL_LEVEL != '4LM'
      via4_ncap = via4.not(fusetop.or(fusetop2))
      via4_cap  = via4.and(fusetop.or(fusetop2))
      if METAL_LEVEL != '5LM'
        via5_ncap = via5.not(fusetop.or(fusetop2))
        via5_cap  = via5.and(fusetop.or(fusetop2))
      end
    end
  end
end

