################################################################################################
# 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
when 'A'

  case MIM_CAP
  when '0.85'
    # mim_0p85fF capacitor
    logger.info('Extracting mim_0p85fF device')
    extract_devices(capacitor('mim_0p85fF_m2m3_noshield', 0.85e-15, MIMCap),
                     { 'P1' => mim_virtual, 'P2' => fuse_cap })
    tolerance('mim_0p85fF_m2m3_noshield', 'C', relative: 0.25)

  when '1'
    # mim_1p0fF capacitor
    logger.info('Extracting mim_1p0fF device')
    extract_devices(capacitor('mim_1p0fF_m2m3_noshield', 1.0e-15, MIMCap),
                     { 'P1' => mim_virtual, 'P2' => fuse_cap })
    tolerance('mim_1p0fF_m2m3_noshield', 'C', relative: 0.25)

  when '1.5'
    # mim_1p5fF capacitor
    logger.info('Extracting mim_1p5fF device')
    extract_devices(capacitor('mim_1p5fF_m2m3_noshield', 1.5e-15, MIMCap), 
                     { 'P1' => mim_virtual, 'P2' => fuse_cap })
    tolerance('mim_1p5fF_m2m3_noshield', 'C', relative: 0.25)

  when '2'
    # mim_2p0fF capacitor
    logger.info('Extracting mim_2p0fF device')
    extract_devices(capacitor('mim_2p0fF_m2m3_noshield', 2.0e-15, MIMCap),
                     { 'P1' => mim_virtual, 'P2' => fuse_cap })
    tolerance('mim_2p0fF_m2m3_noshield', 'C', relative: 0.25)
  
  end

when 'B'
  case METAL_LEVEL
  when '6LM'

    case MIM_CAP
    when '0.85'
      # mim_0p85fF_tm capacitor
      logger.info('Extracting mim_0p85fF_tm device')
      extract_devices(capacitor('mim_0p85fF_tm_m5m6_noshield', 0.85e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
      tolerance('mim_0p85fF_tm_m5m6_noshield', 'C', relative: 0.25)

    when '1'
      # mim_1p0fF_tm capacitor
      logger.info('Extracting mim_1p0fF_tm device')
      extract_devices(capacitor('mim_1p0fF_tm_m5m6_noshield', 1.0e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
      tolerance('mim_1p0fF_tm_m5m6_noshield', 'C', relative: 0.25)

    when '1.5'
      # mim_1p5fF_tm capacitor
      logger.info('Extracting mim_1p5fF_tm device')
      extract_devices(capacitor('mim_1p5fF_tm_m5m6_noshield', 1.5e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
      tolerance('mim_1p5fF_tm_m5m6_noshield', 'C', relative: 0.25)

    when '2'
        # mim_2p0fF_tm capacitor
        logger.info('Extracting mim_2p0fF_tm device')
        extract_devices(capacitor('mim_2p0fF_tm_m5m6_noshield', 2.0e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
        tolerance('mim_2p0fF_tm_m5m6_noshield', 'C', relative: 0.25)
    end

  when '5LM'
    case MIM_CAP
    when '0.85'
      # mim_0p85fF_tm capacitor
      logger.info('Extracting mim_0p85fF_tm device')
      extract_devices(capacitor('mim_0p85fF_tm_m4m5_noshield', 0.85e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
      tolerance('mim_0p85fF_tm_m4m5_noshield', 'C', relative: 0.25)

    when '1'
      # mim_1p0fF_tm capacitor
      logger.info('Extracting mim_1p0fF_tm device')
      extract_devices(capacitor('mim_1p0fF_tm_m4m5_noshield', 1.0e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
      tolerance('mim_1p0fF_tm_m4m5_noshield', 'C', relative: 0.25)

    when '1.5'
      # mim_1p5fF_tm capacitor
      logger.info('Extracting mim_1p5fF_tm device')
      extract_devices(capacitor('mim_1p5fF_tm_m4m5_noshield', 1.5e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
      tolerance('mim_1p5fF_tm_m4m5_noshield', 'C', relative: 0.25)

    when '2'
        # mim_2p0fF_tm capacitor
        logger.info('Extracting mim_2p0fF_tm device')
        extract_devices(capacitor('mim_2p0fF_tm_m4m5_noshield', 2.0e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
        tolerance('mim_2p0fF_tm_m4m5_noshield', 'C', relative: 0.25)
    end

  when '4LM'
    case MIM_CAP
    when '0.85'
      # mim_0p85fF_tm capacitor
      logger.info('Extracting mim_0p85fF_tm device')
      extract_devices(capacitor('mim_0p85fF_tm_m3m4_noshield', 0.85e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
      tolerance('mim_0p85fF_tm_m3m4_noshield', 'C', relative: 0.25)

    when '1'
      # mim_1p0fF_tm capacitor
      logger.info('Extracting mim_1p0fF_tm device')
      extract_devices(capacitor('mim_1p0fF_tm_m3m4_noshield', 1.0e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
      tolerance('mim_1p0fF_tm_m3m4_noshield', 'C', relative: 0.25)

    when '1.5'
      # mim_1p5fF_tm capacitor
      logger.info('Extracting mim_1p5fF_tm device')
      extract_devices(capacitor('mim_1p5fF_tm_m3m4_noshield', 1.5e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
      tolerance('mim_1p5fF_tm_m3m4_noshield', 'C', relative: 0.25)

    when '2'
        # mim_2p0fF_tm capacitor
        logger.info('Extracting mim_2p0fF_tm device')
        extract_devices(capacitor('mim_2p0fF_tm_m3m4_noshield', 2.0e-15, MIMCap),
                       { 'P1' => mimtm_virtual, 'P2' => fuse_cap })
        tolerance('mim_2p0fF_tm_m3m4_noshield', 'C', relative: 0.25)
    end
  end
end