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

#==================================
# ------- MIMCAP EXTRACTION -------
#==================================

logger.info('Starting MIMCAP EXTRACTION')

case MIM_OPTION

#==================
# --- MIM-A CAP ---
#==================    
when 'A'

  case MIM_CAP
  when '0.85'
    # cap_mim_0f85 capacitor: 0.85fF/um2 MIM capacitor (usable for Volts <= 32V across capacitor) [mim_0p85fF]    
    logger.info('Extracting cap_mim_0f85 capacitor')
    extract_devices(capacitor('cap_mim_0f85_m2m3_noshield', 0.85e-15, MIMCap),
                     { 'P1' => mim_virtual, 'P2' => fuse_cap })
    tolerance('cap_mim_0f85_m2m3_noshield', 'C', relative: 0.25)

  when '1'
    # cap_mim_1f0 capacitor: 1fF/um2 MIM capacitor (usable for Volts <= 20V across capacitor) [mim_1p0fF]
    logger.info('Extracting cap_mim_1f0 capacitor')
    extract_devices(capacitor('cap_mim_1f0_m2m3_noshield', 1.0e-15, MIMCap),
                     { 'P1' => mim_virtual, 'P2' => fuse_cap })
    tolerance('cap_mim_1f0_m2m3_noshield', 'C', relative: 0.25)

  when '1.5'
    # cap_mim_1f5 capacitor: 1.5fF/um2 MIM capacitor (usable for Volts <= 6V across capacitor) [mim_1p5fF]
    logger.info('Extracting cap_mim_1f5 capacitor')
    extract_devices(capacitor('cap_mim_1f5_m2m3_noshield', 1.5e-15, MIMCap), 
                     { 'P1' => mim_virtual, 'P2' => fuse_cap })
    tolerance('cap_mim_1f5_m2m3_noshield', 'C', relative: 0.25)
  end

#==================
# --- MIM-B CAP ---
#==================  
when 'B'
  case METAL_LEVEL
  when '6LM'

    case MIM_CAP
    when '0.85'
    # cap_mim_0f85_tm capacitor: 0.85fF/um2 MIM capacitor (usable for Volts <= 32V across capacitor) (For MIM option-B case) [mim_0p85fF_tm]    
      logger.info('Extracting cap_mim_0f85 capacitor')
      extract_devices(capacitor('cap_mim_0f85_m5m6_noshield', 0.85e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
      tolerance('cap_mim_0f85_m5m6_noshield', 'C', relative: 0.25)

    when '1'
    # cap_mim_1f0 capacitor: 1fF/um2 MIM capacitor (usable for Volts <= 20V across capacitor) (For MIM option-B case) [mim_1p0fF_tm]
      logger.info('Extracting cap_mim_1f0 capacitor')
      extract_devices(capacitor('cap_mim_1f0_m5m6_noshield', 1.0e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
      tolerance('cap_mim_1f0_m5m6_noshield', 'C', relative: 0.25)

    when '1.5'
    # cap_mim_1f5 capacitor: 1.5fF/um2 MIM capacitor (usable for Volts <= 6V across capacitor) (For MIM option-B case) [mim_1p5fF_tm]
      logger.info('Extracting cap_mim_1f5 capacitor')
      extract_devices(capacitor('cap_mim_1f5_m5m6_noshield', 1.5e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
      tolerance('cap_mim_1f5_m5m6_noshield', 'C', relative: 0.25)
    end

  when '5LM'
    case MIM_CAP
    when '0.85'
    # cap_mim_0f85 capacitor: 0.85fF/um2 MIM capacitor (usable for Volts <= 32V across capacitor) (For MIM option-B case) [mim_0p85fF_tm]    
      logger.info('Extracting cap_mim_0f85 capacitor')
      extract_devices(capacitor('cap_mim_0f85_m4m5_noshield', 0.85e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
      tolerance('cap_mim_0f85_m4m5_noshield', 'C', relative: 0.25)

    when '1'
    # cap_mim_1f0 capacitor: 1fF/um2 MIM capacitor (usable for Volts <= 20V across capacitor) (For MIM option-B case) [mim_1p0fF_tm]
      logger.info('Extracting cap_mim_1f0 capacitor')
      extract_devices(capacitor('cap_mim_1f0_m4m5_noshield', 1.0e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
      tolerance('cap_mim_1f0_m4m5_noshield', 'C', relative: 0.25)

    when '1.5'
    # cap_mim_1f5 capacitor: 1.5fF/um2 MIM capacitor (usable for Volts <= 6V across capacitor) (For MIM option-B case) [mim_1p5fF_tm]
      logger.info('Extracting cap_mim_1f5 capacitor')
      extract_devices(capacitor('cap_mim_1f5_m4m5_noshield', 1.5e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
      tolerance('cap_mim_1f5_m4m5_noshield', 'C', relative: 0.25)
    end

  when '4LM'
    case MIM_CAP
    when '0.85'
    # cap_mim_0f85 capacitor: 0.85fF/um2 MIM capacitor (usable for Volts <= 32V across capacitor) (For MIM option-B case) [mim_0p85fF_tm]    
      logger.info('Extracting cap_mim_0f85 capacitor')
      extract_devices(capacitor('cap_mim_0f85_m3m4_noshield', 0.85e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
      tolerance('cap_mim_0f85_m3m4_noshield', 'C', relative: 0.25)

    when '1'
    # cap_mim_1f0 capacitor: 1fF/um2 MIM capacitor (usable for Volts <= 20V across capacitor) (For MIM option-B case) [mim_1p0fF_tm]
      logger.info('Extracting cap_mim_1f0 capacitor')
      extract_devices(capacitor('cap_mim_1f0_m3m4_noshield', 1.0e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
      tolerance('cap_mim_1f0_m3m4_noshield', 'C', relative: 0.25)

    when '1.5'
    # cap_mim_1f5 capacitor: 1.5fF/um2 MIM capacitor (usable for Volts <= 6V across capacitor) (For MIM option-B case) [mim_1p5fF_tm]
      logger.info('Extracting cap_mim_1f5 capacitor')
      extract_devices(capacitor('cap_mim_1f5_m3m4_noshield', 1.5e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
      tolerance('cap_mim_1f5_m3m4_noshield', 'C', relative: 0.25)
    end
  end
end
