################################################################################################
# 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.
################################################################################################

#================================
# ----- DIODE DERIVATIONS -------
#================================

logger.info('Starting DIODE DERIVATIONS')

# diode_np_1p8 
diode_np_1p8_terminal_n = ncomp.not(poly2).not(dualgate).outside(dnwell)
                            .not(res_mk).not(sab).not(lvs_bjt).interacting(diode_mk)

# diode_pn_1p8 
diode_pn_1p8_terminal_p = pcomp.inside(nwell).not(poly2).not(dualgate).outside(dnwell)
                                .not(res_mk).not(sab).not(lvs_bjt).interacting(diode_mk)

# diode_np_3p3  
diode_np_3p3_terminal_n = ncomp.not(poly2).and(dualgate).outside(dnwell)
                                .not(res_mk).not(sab).not(lvs_bjt).interacting(diode_mk)

# diode_pn_3p3  
diode_pn_3p3_terminal_p = pcomp.inside(nwell).not(poly2).and(dualgate)
                                .outside(dnwell).not(res_mk).not(sab).not(lvs_bjt).interacting(diode_mk)

# diode_nwp 
diode_nwp_terminal_p = pcomp.interacting(well_diode_mk).not(lvs_bjt).inside(diode_mk)
                            .not(nat).not(res_mk).not(res_mk_type1)

diode_nwp_terminal_n = well_diode_mk.covering(nwell).and(diode_mk)

# diode_np_1p8_nat
diode_np_1p8_nat_terminal_n = ncomp.not(poly2).and(nat).not(dualgate).outside(dnwell)
                                    .not(res_mk).not(sab).not(lvs_bjt).interacting(diode_mk)

# diode_np_3p3_nat
diode_np_3p3_nat_terminal_n = ncomp.not(poly2).and(nat).and(dualgate).outside(dnwell)
                                    .not(res_mk).not(sab).not(lvs_bjt).interacting(diode_mk)

# diode_dnwpw
diode_dnwpw_terminal_p = sub.and(well_diode_mk).and(diode_mk).inside(dnwell).and(pplus)
                                    .not(lvs_bjt).not(nat).not(res_mk_type1).not_covering(nwell)

# diode_dnwps
diode_dnwps_terminal_p = ptap.extents.not_covering(nat).interacting(diode_mk).interacting(well_diode_mk)
                            .not_covering(dualgate).not_interacting(res_mk_type1)


