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

#=======================================================================================================================
#----------------------------------------- GF 0.18 um BCDLite DRC RULE DECK ------------------------------------------------
#=======================================================================================================================
require 'time'
require 'logger'
require 'etc'

exec_start_time = Time.now

logger = Logger.new($stdout)

logger.formatter = proc do |_severity, datetime, _progname, msg|
  "#{datetime}: Memory Usage (" + `pmap #{Process.pid} | tail -1`[10, 40].strip + ") : #{msg}
"
end

#================================================
#----------------- FILE SETUP -------------------
#================================================
logger.info("Starting running GF180BCDLite Klayout DRC runset on #{$input}")
logger.info("Ruby Version for klayout: #{RUBY_VERSION}")

if $input
  if $topcell
    source($input, $topcell)
  else
    source($input)
  end
end

logger.info('Loading database to memory is complete.')

if $report
  logger.info("GF180BCDLite Klayout density DRC runset output at: #{$report}")
  report('GF180 DENSITY DRC Run Report at', $report)
else
  layout_dir = Pathname.new(RBA::CellView.active.filename).parent.realpath
  report_path = layout_dir.join('gf180_drc.lyrdb').to_s
  logger.info("GF180BCDLite Klayout density DRC runset output at default location: #{report_path}")
  report('GF180 DENSITY DRC Run Report at', report_path)
end

#=======================================================================================
#------------------------------------- SWITCHES ----------------------------------------
#=======================================================================================

logger.info('Evaluate switches.')

# threads
if $thr
  threads($thr)
else
  thr ||= Etc.nprocessors
  threads(thr)
end

logger.info("Number of threads to use #{$thr}")

#=== PRINT DETAILS ===
logger.info("Verbose mode: #{$verbose}")
if $verbose == 'true'
  verbose(true)
else
  verbose(false)
end

# === TILING MODE ===
case $run_mode
when 'tiling'
  tiles(500.um)
  tile_borders(10.um)
  logger.info('Tiling  mode is enabled.')

when 'deep'
  #=== HIER MODE ===
  deep
  logger.info('deep  mode is enabled.')
else
  #=== FLAT MODE ===
  flat
  logger.info('flat  mode is enabled.')
end

# METAL_TOP
METAL_TOP = $metal_top || '9K'

logger.info("METAL_TOP Selected is #{METAL_TOP}")

# METAL_LEVEL
METAL_LEVEL = $metal_level || '5LM'

logger.info("METAL_STACK Selected is #{METAL_LEVEL}")

#======================================================================================================
#--------------------------------------- LAYER DEFINITIONS --------------------------------------------
#======================================================================================================

polygons_count = 0
logger.info('Read in polygons from layers.')

def get_polygons(layer, data_type)
  ps = polygons(layer, data_type)
  $run_mode == 'deep' ? ps : ps.merged
end

poly2 = get_polygons(30, 0)
count = poly2.count
logger.info("poly2 has #{count} polygons")
polygons_count += count

metal1_drawn = get_polygons(34, 0)
count = metal1_drawn.count
logger.info("metal1_drawn has #{count} polygons")
polygons_count += count

metal1_dummy = get_polygons(34, 4)
count = metal1_dummy.count
logger.info("metal1_dummy has #{count} polygons")
polygons_count += count

metal1         = metal1_drawn + metal1_dummy

via1 = get_polygons(35, 0)
count = via1.count
logger.info("via1 has #{count} polygons")
polygons_count += count

metal2_drawn = get_polygons(36, 0)
count = metal2_drawn.count
logger.info("metal2_drawn has #{count} polygons")
polygons_count += count

metal2_dummy = get_polygons(36, 4)
count = metal2_dummy.count
logger.info("metal2_dummy has #{count} polygons")
polygons_count += count

metal2 = metal2_drawn + metal2_dummy

if METAL_LEVEL == '2LM'

  top_via       = via1
  topmin1_via   = contact
  top_metal     = metal2
  topmin1_metal = metal1

else

  via2 = get_polygons(38, 0)
  count = via2.count
  logger.info("via2 has #{count} polygons")
  polygons_count += count

  metal3_drawn = get_polygons(42, 0)
  count = metal3_drawn.count
  logger.info("metal3_drawn has #{count} polygons")
  polygons_count += count

  metal3_dummy = get_polygons(42, 4)
  count = metal3_dummy.count
  logger.info("metal3_dummy has #{count} polygons")
  polygons_count += count

  metal3 = metal3_drawn + metal3_dummy

  if METAL_LEVEL == '3LM'

    top_via       = via2
    topmin1_via   = via1
    top_metal     = metal3
    topmin1_metal = metal2
  else

    via3 = get_polygons(40, 0)
    count = via3.count
    logger.info("via3 has #{count} polygons")
    polygons_count += count

    metal4_drawn = get_polygons(46, 0)
    count = metal4_drawn.count
    logger.info("metal4_drawn has #{count} polygons")
    polygons_count += count

    metal4_dummy = get_polygons(46, 4)
    count = metal4_dummy.count
    logger.info("metal4_dummy has #{count} polygons")
    polygons_count += count

    metal4 = metal4_drawn + metal4_dummy

    if METAL_LEVEL == '4LM'

      top_via       = via3
      topmin1_via   = via2
      top_metal     = metal4
      topmin1_metal = metal3
    else

      via4 = get_polygons(41, 0)
      count = via4.count
      logger.info("via4 has #{count} polygons")
      polygons_count += count

      case METAL_LEVEL
      when '5LM'
        metal5_drawn = get_polygons(81, 0)
        count = metal5_drawn.count
        logger.info("metal5_drawn has #{count} polygons")
        polygons_count += count

        metal5_dummy = get_polygons(81, 4)
        count = metal5_dummy.count
        logger.info("metal5_dummy has #{count} polygons")
        polygons_count += count

        metal5 = metal5_drawn + metal5_dummy

        top_via       = via4
        topmin1_via   = via3
        top_metal     = metal5
        topmin1_metal = metal4
      when '6LM'
        metal5_drawn = get_polygons(81, 0)
        count = metal5_drawn.count
        logger.info("metal5_drawn has #{count} polygons")
        polygons_count += count

        metal5_dummy = get_polygons(81, 4)
        count = metal5_dummy.count
        logger.info("metal5_dummy has #{count} polygons")
        polygons_count += count

        metal5         = metal5_drawn + metal5_dummy

        via5 = get_polygons(82, 0)
        count = via5.count
        logger.info("via5 has #{count} polygons")
        polygons_count += count

        metaltop_drawn = get_polygons(53, 0)
        count = metaltop_drawn.count
        logger.info("metaltop_drawn has #{count} polygons")
        polygons_count += count

        metaltop_dummy = get_polygons(53, 4)
        count = metaltop_dummy.count
        logger.info("metaltop_dummy has #{count} polygons")
        polygons_count += count

        metaltop       = metaltop_drawn + metaltop_dummy

        top_via       = via5
        topmin1_via   = via4
        top_metal     = metaltop
        topmin1_metal = metal5
      else
        logger.error("Unknown metal stack #{METAL_LEVEL}")
        raise
      end
    end
  end
end

metal_shield_drawn  = polygons(35 , 28).merged
count = metal_shield_drawn.count()
logger.info("metal_shield_drawn has %d polygons" % [count])
polygons_count  += count

metal_shield_dummy     = polygons(79 , 39).merged
count = metal_shield_dummy.count()
logger.info("metal_shield_dummy has %d polygons" % [count])
polygons_count  += count

metal_shield         = metal_shield_drawn + metal_shield_dummy

#======================================================================================================
#--------------------------------------- LAYER DERIVATIONS --------------------------------------------
#======================================================================================================

logger.info('Starting GF180BCDLite DENSITY layer derivations.')

# === LAYOUT EXTENT ===
CHIP = extent.sized(0.0)

#=====================================================================================================================
#-------------------------------------------------- MAIN RUNSET ------------------------------------------------------
#=====================================================================================================================

logger.info('Starting GF180BCDLite DENSITY DRC rules.')

# Rule PL.8: Poly2 coverage over the entire die shall be 14%.
## Dummy poly2 lines must be added to meet the minimum poly2 density requirement.
logger.info('Executing rule PL.8')
if (poly2.area / CHIP.area) * 100 < 14
  poly2.output('PL.8',
               'PL.8 : Poly2 coverage over the entire die shall be 14%.
                Dummy poly2 lines must be added to meet the minimum poly2 density requirement. : 14%')
end

# Rule M1.4: Metal1 coverage over the entire die shall be >30%
## (Refer to section 13.0 for Dummy Metal fill guidelines.
## Customer needs to ensure enough dummy metal to satisfy Metal1 coverage)
logger.info('Executing rule M1.4')
if (metal1.area / CHIP.area) * 100 < 30
  metal1.output('M1.4',
                'M1.4 : Metal1 coverage over the entire die shall be >30%
                (Refer to section 13.0 for Dummy Metal fill guidelines.
                 Customer needs to ensure enough dummy metal to satisfy Metal1 coverage) : 30%')
end

# Rule M2.4: Metal2 coverage over the entire die shall be >30%
## (Refer to section 13.0 for Dummy Metal fill guidelines.
## Customer needs to ensure enough dummy metal to satisfy Metal2 coverage)
logger.info('Executing rule M2.4')
if (metal2.area / CHIP.area) * 100 < 30
  metal2.output('M2.4',
                'M2.4 : Metal2 coverage over the entire die shall be >30%
                (Refer to section 13.0 for Dummy Metal fill guidelines.
                 Customer needs to ensure enough dummy metal to satisfy Metal2 coverage) : 30%')
end

if METAL_LEVEL == '3LM' || METAL_LEVEL == '4LM' || METAL_LEVEL == '5LM' || METAL_LEVEL == '6LM'
  # Rule M3.4: metal3 coverage over the entire die shall be >30%
  ## (Refer to section 13.0 for Dummy Metal fill guidelines.
  ## Customer needs to ensure enough dummy metal to satisfy metal3 coverage)
  logger.info('Executing rule M3.4')
  if (metal3.area / CHIP.area) * 100 < 30
    metal3.output('M3.4',
                  'M3.4 : metal3 coverage over the entire die shall be >30%
                    (Refer to section 13.0 for Dummy Metal fill guidelines.
                    Customer needs to ensure enough dummy metal to satisfy metal3 coverage) : 30%')
  end
end

if METAL_LEVEL == '4LM' || METAL_LEVEL == '5LM' || METAL_LEVEL == '6LM'
  # Rule M4.4: metal4 coverage over the entire die shall be >30%
  ## (Refer to section 13.0 for Dummy Metal fill guidelines.
  ## Customer needs to ensure enough dummy metal to satisfy metal4 coverage)
  logger.info('Executing rule M4.4')
  if (metal4.area / CHIP.area) * 100 < 30
    metal4.output('M4.4',
                  'M4.4 : metal4 coverage over the entire die shall be >30%
                    (Refer to section 13.0 for Dummy Metal fill guidelines.
                    Customer needs to ensure enough dummy metal to satisfy metal4 coverage) : 30%')
  end
end

if METAL_LEVEL == '5LM' || METAL_LEVEL == '6LM'
  # Rule M5.4: metal5 coverage over the entire die shall be >30%
  ## (Refer to section 13.0 for Dummy Metal fill guidelines.
  ## Customer needs to ensure enough dummy metal to satisfy metal5 coverage)
  logger.info('Executing rule M5.4')
  if (metal5.area / CHIP.area) * 100 < 30
    metal5.output('M5.4',
                  'M5.4 : metal5 coverage over the entire die shall be >30%
                    (Refer to section 13.0 for Dummy Metal fill guidelines.
                    Customer needs to ensure enough dummy metal to satisfy metal5 coverage) : 30%')
  end
end

if METAL_TOP == '30K'
  # Rule MT30.7: Thick MetalTop coverage over the entire die shall be >30%
  ## (Refer to section 13.0 for Dummy Metal-fill guidelines.
  ## Customer needs to ensure enough dummy metal to satisfy Metaln coverage).
  logger.info('Executing rule MT30.7')
  if (top_metal.area / CHIP.area) * 100 < 30
    top_metal.output('MT30.7',
                     'MT30.7 : Thick MetalTop coverage over the entire die shall be >30%
                                (Refer to section 13.0 for Dummy Metal-fill guidelines.
                                Customer needs to ensure enough dummy metal to satisfy Metaln coverage). : 30%')
  end
  # Rule MS.3: METAL_SHIELD coverage over the entire die shall be >30%
  ## (Refer to section 10.3 for Dummy Metal-fill guidelines.
  ## Customer needs to ensure enough dummy metal to satisfy METAL_SHIELD coverage)
  logger.info('Executing rule MS30.7')
  if (metal_shield.area / CHIP.area) * 100 < 30
    metal_shield.output('MS30.7',
                     'MS30.7 : METAL_SHIELD coverage over the entire die shall be >30%
                                (Refer to section 10.3 for Dummy Metal-fill guidelines.
                                Customer needs to ensure enough dummy metal to satisfy METAL_SHIELD coverage) : 30%')
  end    
else
  # Rule MT.3: MetalTop coverage over the entire die shall be >30%
  ## (Refer to section 10.3 for Dummy Metal-fill guidelines.
  ## Customer needs to ensure enough dummy metal to satisfy Metaln coverage)
  logger.info('Executing rule MT.3')
  if (top_metal.area / CHIP.area) * 100 < 30
    top_metal.output('MT.3',
                     'MT.3 : MetalTop coverage over the entire die shall be >30%
                                (Refer to section 10.3 for Dummy Metal-fill guidelines.
                                Customer needs to ensure enough dummy metal to satisfy Metaln coverage) : 30%')
  end
  # Rule MS.3: METAL_SHIELD coverage over the entire die shall be >30%
  ## (Refer to section 10.3 for Dummy Metal-fill guidelines.
  ## Customer needs to ensure enough dummy metal to satisfy METAL_SHIELD coverage)
  logger.info('Executing rule MS.3')
  if (metal_shield.area / CHIP.area) * 100 < 30
    metal_shield.output('MS.3',
                     'MS.3 : METAL_SHIELD coverage over the entire die shall be >30%
                                (Refer to section 10.3 for Dummy Metal-fill guidelines.
                                Customer needs to ensure enough dummy metal to satisfy METAL_SHIELD coverage) : 30%')
  end  
end

exec_end_time = Time.now
run_time = exec_end_time - exec_start_time
logger.info(format('DRC Total Run time %f seconds', run_time))

#===================================
#--------------- END ---------------
#===================================
