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

if FEOL

    #================================================
    #--------------------LVPWELL---------------------
    #================================================

    # Rule LPW.1_LV: Min. LVPWELL Width. is 0.6µm
    logger.info('Executing rule LPW.1_LV')
    lpw1_l1  = lvpwell.width(0.6.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate2_d)
    lpw1_l1.output('LPW.1_LV', 'LPW.1_LV : Min. LVPWELL Width. : 0.6µm')
    lpw1_l1.forget

    # Rule LPW.1_MV: Min. LVPWELL Width. is 0.74µm
    logger.info('Executing rule LPW.1_MV')
    lpw1_l1  = lvpwell.width(0.74.um, euclidian).polygons(0.001).overlapping(dualgate2_d)
    lpw1_l1.output('LPW.1_MV', 'LPW.1_MV : Min. LVPWELL Width. : 0.74µm')
    lpw1_l1.forget

    if CONNECTIVITY_RULES
        logger.info('CONNECTIVITY_RULES section')

        connected_lvpwell_LV, unconnected_lvpwell_LV = conn_space(lvpwell_dn, 0.86, 1.4, euclidian)

        connected_lvpwell_MV, unconnected_lvpwell_MV = conn_space(lvpwell_dn, 0.86, 1.7, euclidian)

        # Rule LPW.2a_LV: Min. LVPWELL to LVWELL Space (Inside DNWELL) [Different potential]. is 1.4µm
        logger.info('Executing rule LPW.2a_LV')
        lpw2a_l1  = unconnected_lvpwell_LV.not_interacting(v5_xtor).not_interacting(dualgate2_d)
        lpw2a_l1.output('LPW.2a_LV', 'LPW.2a_LV : Min. LVPWELL to LVWELL Space (Inside DNWELL) [Different potential]. : 1.4µm')
        lpw2a_l1.forget

        # Rule LPW.2a_MV: Min. LVPWELL to LVPWELL Space (Inside DNWELL) [Different potential]. is 1.7µm
        logger.info('Executing rule LPW.2a_MV')
        lpw2a_l1  = unconnected_lvpwell_MV.overlapping(dualgate2_d)
        lpw2a_l1.output('LPW.2a_MV', 'LPW.2a_MV : Min. LVPWELL to LVPWELL Space (Inside DNWELL) [Different potential]. : 1.7µm')
        lpw2a_l1.forget

        # Rule LPW.2b_LV: Min. LVPWELL to LVPWELL Space [Same potential]. is 0.86µm
        logger.info('Executing rule LPW.2b_LV')
        lpw2b_l1  = connected_lvpwell_LV.not_interacting(v5_xtor).not_interacting(dualgate2_d)
        lpw2b_l1.output('LPW.2b_LV', 'LPW.2b_LV : Min. LVPWELL to LVPWELL Space [Same potential]. : 0.86µm')
        lpw2b_l1.forget

        # Rule LPW.2b_MV: Min. LVPWELL to LVPWELL Space [Same potential]. is 0.86µm
        logger.info('Executing rule LPW.2b_MV')
        lpw2b_l1  = connected_lvpwell_MV.overlapping(dualgate2_d)
        lpw2b_l1.output('LPW.2b_MV', 'LPW.2b_MV : Min. LVPWELL to LVPWELL Space [Same potential]. : 0.86µm')
        lpw2b_l1.forget

    else
        logger.info('CONNECTIVITY_RULES disabled section')

        # Rule LPW.2a_LV: Min. LVPWELL to LVWELL Space (Inside DNWELL) [Different potential]. is 1.4µm
        logger.info('Executing rule LPW.2a_LV')
        lpw2a_l1  = lvpwell.isolated(1.4.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate2_d)
        lpw2a_l1.output('LPW.2a_LV', 'LPW.2a_LV : Min. LVPWELL to LVWELL Space (Inside DNWELL) [Different potential]. : 1.4µm')
        lpw2a_l1.forget

        # Rule LPW.2a_MV: Min. LVPWELL to LVPWELL Space (Inside DNWELL) [Different potential]. is 1.7µm
        logger.info('Executing rule LPW.2a_MV')
        lpw2a_l1  = lvpwell.isolated(1.7.um, euclidian).polygons(0.001).overlapping(dualgate2_d)
        lpw2a_l1.output('LPW.2a_MV', 'LPW.2a_MV : Min. LVPWELL to LVPWELL Space (Inside DNWELL) [Different potential]. : 1.7µm')
        lpw2a_l1.forget

    end #CONNECTIVITY_RULES

    # Rule LPW.3_LV: Min. DNWELL enclose LVPWELL. is 2.5µm
    logger.info('Executing rule LPW.3_LV')
    lpw3_l1 = dnwell.enclosing(lvpwell, 2.5.um, euclidian).polygons(0.001)
    lpw3_l2 = lvpwell.not_outside(dnwell).not(dnwell)
    lpw3_l  = lpw3_l1.or(lpw3_l2).not_interacting(v5_xtor).not_interacting(dualgate2_d)
    lpw3_l.output('LPW.3_LV', 'LPW.3_LV : Min. DNWELL enclose LVPWELL. : 2.5µm')
    lpw3_l1.forget
    lpw3_l2.forget
    lpw3_l.forget

    # Rule LPW.3_MV: Min. DNWELL enclose LVPWELL. is 2.5µm
    logger.info('Executing rule LPW.3_MV')
    lpw3_l1 = dnwell.enclosing(lvpwell, 2.5.um, euclidian).polygons(0.001)
    lpw3_l2 = lvpwell.not_outside(dnwell).not(dnwell)
    lpw3_l  = lpw3_l1.or(lpw3_l2).overlapping(dualgate2_d)
    lpw3_l.output('LPW.3_MV', 'LPW.3_MV : Min. DNWELL enclose LVPWELL. : 2.5µm')
    lpw3_l1.forget
    lpw3_l2.forget
    lpw3_l.forget

    # rule LPW.4_LV is not a DRC check

    # rule LPW.4_MV is not a DRC check

    # Rule LPW.5_LV: LVPWELL resistors must be enclosed by DNWELL.
    logger.info('Executing rule LPW.5_LV')
    lpw5_l1 = lvpwell.inside(res_mk).not_inside(dnwell).not_interacting(v5_xtor).not_interacting(dualgate2_d)
    lpw5_l1.output('LPW.5_LV', 'LPW.5_LV : LVPWELL resistors must be enclosed by DNWELL.')
    lpw5_l1.forget

    # Rule LPW.5_MV: LVPWELL resistors must be enclosed by DNWELL.
    logger.info('Executing rule LPW.5_MV')
    lpw5_l1 = lvpwell.inside(res_mk).not_inside(dnwell).overlapping(dualgate2_d)
    lpw5_l1.output('LPW.5_MV', 'LPW.5_MV : LVPWELL resistors must be enclosed by DNWELL.')
    lpw5_l1.forget

    # Rule LPW.11: Min. (LVPWELL outside DNWELL) space to DNWELL. is 1.5µm
    logger.info('Executing rule LPW.11')
    lpw11_l1  = lvpwell.outside(dnwell).separation(dnwell, 1.5.um, euclidian).polygons(0.001)
    lpw11_l1.output('LPW.11', 'LPW.11 : Min. (LVPWELL outside DNWELL) space to DNWELL. : 1.5µm')
    lpw11_l1.forget

    # Rule LPW.12: LVPWELL cannot overlap with Nwell.
    logger.info('Executing rule LPW.12')
    lpw12_l1 = lvpwell.not_outside(nwell)
    lpw12_l1.output('LPW.12', 'LPW.12 : LVPWELL cannot overlap with Nwell.')
    lpw12_l1.forget
        
end #FEOL
