blob: 8e27e221405d7b1369433d88cae6c79cc6b6705e [file] [log] [blame]
# 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 MCU DRC RULE DECK --------------------------------------------------
#===========================================================================================================================
require 'time'
require "logger"
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 -----------------
#=========================================
# optionnal for a batch launch : klayout -b -r gf_018mcu_antenna.drc -rd input=design.gds -rd report=gf180_ant_drc.txt
logger.info("Starting running GF180MCU Klayout antenna checks DRC runset on %s" % [$input])
if $input
source($input, $topcell)
end
logger.info("Loading database to memory is complete.")
if $report
logger.info("GF180MCU Klayout antenna checks DRC runset output at: %s" % [$report])
report("GF180 ANTENNA DRC runset", $report)
else
logger.info("GF180MCU Klayout antenna checks DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180mcu_antenna.lyrdb").path])
report("GF180 DRC runset", File.join(File.dirname(RBA::CellView::active.filename), "gf180mcu_antenna.lyrdb"))
end
if $thr
threads($thr)
else
threads(16)
end
# === TILING MODE ===
if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
logger.info("flat mode is enabled.")
else
#=== HIER MODE ===
deep
logger.info("flat mode is enabled.")
end # run_mode
#======================================================================================================
#--------------------------------------- LAYER DEFINITIONS --------------------------------------------
#======================================================================================================
comp = polygons(22, 0)
dualgate = polygons(55, 0)
poly2 = polygons(30, 0)
nplus = polygons(32, 0)
pplus = polygons(31, 0)
contact = polygons(33, 0)
metal1 = polygons(34, 0)
via1 = polygons(35, 0)
metal2 = polygons(36, 0)
via2 = polygons(38, 0)
metal3 = polygons(42, 0)
via3 = polygons(40, 0)
metal4 = polygons(46, 0)
via4 = polygons(41, 0)
metal5 = polygons(81, 0)
via5 = polygons(82, 0)
metaltop = polygons(53, 0)
fusetop = polygons(75, 0)
#======================================================================================================
#--------------------------------------- LAYER DERIVATIONS --------------------------------------------
#======================================================================================================
tgate = poly2 & comp
thin_gate = tgate.not(dualgate)
thick_gate = tgate.and(dualgate)
diode = nplus & comp
# === LAYOUT EXTENT ===
CHIP = extent.sized(0.0)
#=======================================================================================
#------------------------------------- SWITCHES ----------------------------------------
#=======================================================================================
logger.info("Evaluate switches.")
if $mim_option
MIM_OPTION = $mim_option
else
MIM_OPTION = false
end
logger.info("MIM Option selected %s" % [MIM_OPTION])
# METAL_TOP
if $metal_top
METAL_TOP = $metal_top
else
METAL_TOP = "9K"
end
logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
if METAL_TOP == "6K"
met_top_thick = 0.69.um
elsif METAL_TOP == "9K"
met_top_thick = 0.99.um
elsif METAL_TOP == "11K"
met_top_thick = 1.19.um
elsif METAL_TOP == "30K"
met_top_thick = 3.035.um
end #METAL_TOP
if $metal_level
METAL_LEVEL = $metal_level
else
METAL_LEVEL = "6LM"
end
logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
if METAL_LEVEL == "6LM"
top_via = via5
topmin1_via = via4
top_metal = metaltop
topmin1_metal = metal5
elsif METAL_LEVEL == "5LM"
top_via = via4
topmin1_via = via3
top_metal = metal5
topmin1_metal = metal4
elsif METAL_LEVEL == "4LM"
top_via = via3
topmin1_via = via2
top_metal = metal4
topmin1_metal = metal3
elsif METAL_LEVEL == "3LM"
top_via = via2
topmin1_via = via1
top_metal = metal3
topmin1_metal = metal2
elsif METAL_LEVEL == "2LM"
top_via = via1
topmin1_via = via1
top_metal = metal2
topmin1_metal = metal1
end #METAL_LEVEL
#=========================================================================================================================
#---------------------------------------------------- MAIN RUNSET --------------------------------------------------------
#=========================================================================================================================
logger.info("Starting GF180MCU ANTENNA DRC rules.")
#========================================
#----------------- POLY -----------------
#========================================
connect(poly2,tgate )
connect(poly2,thin_gate )
connect(poly2,thick_gate)
# Rule ANT.1: Maximum ratio of Poly2 perimeter area to related gate oxide area is 200
logger.info("Executing rule ANT.1")
antenna_check(tgate,perimeter_only(poly2,0.2.um), 200).output("ANT.1","ANT.1: Maximum ratio of Poly2 perimeter area to related gate oxide area is 200")
#========================================
#--------------- CONTACT ----------------
#========================================
connect(poly2,contact)
connect(diode,contact)
# Rule ANT.8: Maximum ratio of contact area to related gate oxide area is 10
logger.info("Executing rule ANT.8")
antenna_check(tgate, contact, 10).output("ANT.8","ANT.8: Maximum ratio of contact area to related gate oxide area is 10")
#========================================
#---------------- METAL1 ----------------
#========================================
connect(contact,metal1)
# Case (a): Connection to COMP is not present: Flag error (No diode) [Default]
# Rule ANT.2: Maximum ratio of Metal1 perimeter area to related gate oxide area is 400
# antenna_check(tgate,perimeter_only(metal1,0.54.um), 400).#output("ANT.2","ANT.2: Maximum ratio of Metal1 perimeter area to related gate oxide area is 400")
# Case (b) Connection to COMP is present: [Thin gate , Thick gate]
# Rule ANT.16_i_ANT.2: Diode filtering for ANT.2 [thin gate] , MF = 2
logger.info("Executing rule ANT.16_i_ANT.2")
antenna_check(thin_gate,perimeter_only(metal1,0.54.um), 400,[diode,800]).output("ANT.16_i_ANT.2","ANT.16_i_ANT.2: Maximum ratio of Metal1 perimeter area to related thin gate oxide area is 400")
# Rule ANT.16_ii_ANT.2: Diode filtering for ANT.2 [thick gate] , MF = 15
logger.info("Executing rule ANT.16_ii_ANT.2")
antenna_check(thick_gate,perimeter_only(metal1,0.54.um), 400,[diode,6000]).output("ANT.16_ii_ANT.2","ANT.16_ii_ANT.2: Maximum ratio of Metal1 perimeter area to related thick gate oxide area is 400")
#========================================
#----------------- VIA1 -----------------
#========================================
connect(metal1, via1 )
# Case (a): Connection to COMP is not present: Flag error (No diode) [Default]
# Rule ANT.9: Maximum ratio of Via1 area to related gate oxide area is 20
# antenna_check(tgate, via1, 20).#output("ANT.9","ANT.9: Maximum ratio of Via1 area to related gate oxide area is 20")
# Case (b) Connection to COMP is present: [Thin gate , Thick gate]
# Rule ANT.16_i_ANT.9: Diode filtering for ANT.9 [thin gate]
logger.info("Executing rule ANT.16_i_ANT.9")
antenna_check(thin_gate,via1, 20,[diode,40]).output("ANT.16_i_ANT.9","ANT.16_i_ANT.9: Maximum ratio of Via1 area to related thin gate oxide area is 20")
# Rule ANT.16_ii_ANT.9: Diode filtering for ANT.9 [thick gate]
logger.info("Executing rule ANT.16_ii_ANT.9")
antenna_check(thick_gate,via1, 20,[diode,300]).output("ANT.16_ii_ANT.9","ANT.16_ii_ANT.9: Maximum ratio of Via1 area to related thick gate oxide area is 20")
#========================================
#---------------- METAL2 ----------------
#========================================
connect(via1, metal2 )
# Case (a): Connection to COMP is not present: Flag error (No diode) [Default]
# Rule ANT.3: Maximum ratio of Metal2 perimeter area to related gate oxide area is 400
# antenna_check(tgate,perimeter_only(metal2,0.54.um), 400).#output("ANT.3","ANT.3: Maximum ratio of Metal2 perimeter area to related gate oxide area is 400")
# Case (b) Connection to COMP is present: [Thin gate , Thick gate]
# Rule ANT.16_i_ANT.3: Diode filtering for ANT.3 [thin gate]
logger.info("Executing rule ANT.16_i_ANT.3")
antenna_check(thin_gate,perimeter_only(metal2,0.54.um), 400,[diode,800]).output("ANT.16_i_ANT.3","ANT.16_i_ANT.3: Maximum ratio of Metal2 perimeter area to related gate oxide area is 400")
# Rule ANT.16_i_ANT.3: Diode filtering for ANT.3 [thick gate]
logger.info("Executing rule ANT.16_ii_ANT.3")
antenna_check(thick_gate,perimeter_only(metal2,0.54.um), 400,[diode,6000]).output("ANT.16_ii_ANT.3","ANT.16_ii_ANT.3: Maximum ratio of Metal2 perimeter area to related gate oxide area is 400")
#========================================
#----------------- VIA2 -----------------
#========================================
connect(metal2, via2 )
# Case (a): Connection to COMP is not present: Flag error (No diode) [Default]
# Rule ANT.10: Maximum ratio of Via2 area to related gate oxide area is 20
# antenna_check(tgate, via2, 20).#output("ANT.10","ANT.10: Maximum ratio of Via2 area to related gate oxide area is 20")
# Case (b) Connection to COMP is present: [Thin gate , Thick gate]
# Rule ANT.16_i_ANT.10: Diode filtering for ANT.10 [thin gate]
logger.info("Executing rule ANT.16_i_ANT.10")
antenna_check(thin_gate,via2, 20,[diode,40]).output("ANT.16_i_ANT.10","ANT.16_i_ANT.10: Maximum ratio of Via2 area to related thin gate oxide area is 20")
# Rule ANT.16_ii_ANT.10: Diode filtering for ANT.10 [thick gate]
logger.info("Executing rule ANT.16_ii_ANT.10")
antenna_check(thick_gate,via2, 20,[diode,300]).output("ANT.16_ii_ANT.10","ANT.16_ii_ANT.10: Maximum ratio of Via2 area to related thick gate oxide area is 20")
#========================================
#---------------- METAL3 ----------------
#========================================
connect(via2, metal3 )
# Case (a): Connection to COMP is not present: Flag error (No diode) [Default]
# Rule ANT.4: Maximum ratio of Metal3 perimeter area to related gate oxide area is 400
# antenna_check(tgate,perimeter_only(metal3,0.54.um), 400).#output("ANT.4","ANT.4: Maximum ratio of Metal3 perimeter area to related gate oxide area is 400")
# Case (b) Connection to COMP is present: [Thin gate , Thick gate]
# Rule ANT.16_i_ANT.4: Diode filtering for ANT.4 [thin gate]
logger.info("Executing rule ANT.16_i_ANT.4")
antenna_check(thin_gate,perimeter_only(metal3,0.54.um), 400,[diode,800]).output("ANT.16_i_ANT.4","ANT.16_i_ANT.4: Maximum ratio of Metal3 perimeter area to related gate oxide area is 400")
# Rule ANT.16_i_ANT.4: Diode filtering for ANT.4 [thick gate]
logger.info("Executing rule ANT.16_ii_ANT.4")
antenna_check(thick_gate,perimeter_only(metal3,0.54.um), 400,[diode,6000]).output("ANT.16_ii_ANT.4","ANT.16_ii_ANT.4: Maximum ratio of Metal3 perimeter area to related gate oxide area is 400")
#========================
#----- MIM OPTION A -----
#========================
if MIM_OPTION == "A"
connect(metal3, fusetop )
# Rule ANT.14: Maximum ratio of each of the metal3 layer perimeter area to related MIM area is 400
# antenna_check(fusetop,perimeter_only(metal3,0.54.um), 400).#output("ANT.14","ANT.14: Maximum ratio of each of the metal3 layer perimeter area to related MIM area is 400")
# Rule ANT.16_iii_ANT.14_M3_MIMA: Maximum ratio of each of the metal3 layer perimeter area to related MIM area is 400
logger.info("Executing rule ANT.16_iii_ANT.14_M3_MIMA")
antenna_check(fusetop,perimeter_only(metal3,0.54.um), 400,[diode,6000]).output("ANT.16_iii_ANT.14_M3_MIMA","ANT.16_iii_ANT.14_M3_MIMA: Maximum ratio of each of the metal3 layer perimeter area to related MIM area is 400")
# Rule ANT.15: Maximum ratio of each of Via2 area to related MIM area is 20
# antenna_check(fusetop, via2, 20).#output("ANT.15","ANT.15: Maximum ratio of each of Via2 area to related MIM area is 20")
# Rule ANT.16_iii_ANT.15_V2_MIMA: Maximum ratio of each of Via2 area to related MIM area is 20
logger.info("Executing rule ANT.16_iii_ANT.15_V2_MIMA")
antenna_check(fusetop, via2, 20,[diode,300]).output("ANT.16_iii_ANT.15_V2_MIMA","ANT.16_iii_ANT.15_V2_MIMA: Maximum ratio of each of Via2 area to related MIM area is 20")
end
#========================================
#----------------- VIA3 -----------------
#========================================
connect(metal3, via3 )
# Case (a): Connection to COMP is not present: Flag error (No diode) [Default]
# Rule ANT.11: Maximum ratio of Via3 area to related gate oxide area is 20
# antenna_check(tgate, via3, 20).#output("ANT.11","ANT.11: Maximum ratio of Via3 area to related gate oxide area is 20")
# Case (b) Connection to COMP is present: [Thin gate , Thick gate]
# Rule ANT.16_i_ANT.11: Diode filtering for ANT.11 [thin gate]
logger.info("Executing rule ANT.16_i_ANT.11")
antenna_check(thin_gate,via3, 20,[diode,40]).output("ANT.16_i_ANT.11","ANT.16_i_ANT.11: Maximum ratio of Via3 area to related thin gate oxide area is 20")
# Rule ANT.16_ii_ANT.11: Diode filtering for ANT.11 [thick gate]
logger.info("Executing rule ANT.16_ii_ANT.11")
antenna_check(thick_gate,via3, 20,[diode,300]).output("ANT.16_ii_ANT.11","ANT.16_ii_ANT.11: Maximum ratio of Via3 area to related thick gate oxide area is 20")
#========================
#----- MIM OPTION A -----
#========================
if MIM_OPTION == "A"
# Rule ANT.15: Maximum ratio of each of Via3 area to related MIM area is 20
# antenna_check(fusetop, via3, 20).#output("ANT.15","ANT.15: Maximum ratio of each of Via3 area to related MIM area is 20")
# Rule ANT.16_iii_ANT.15_V3_MIMA: Maximum ratio of each of Via2 area to related MIM area is 20
logger.info("Executing rule ANT.16_iii_ANT.15_V3_MIMA")
antenna_check(fusetop, via3, 20,[diode,300]).output("ANT.16_iii_ANT.15_V3_MIMA","ANT.16_iii_ANT.15_V3_MIMA: Maximum ratio of each of Via3 area to related MIM area is 20")
end
#========================================
#---------------- METAL4 ----------------
#========================================
connect(via3, metal4 )
# Rule ANT.5: Maximum ratio of Metal4 perimeter area to related gate oxide area is 400
# antenna_check(tgate,perimeter_only(metal4,0.54.um), 400).#output("ANT.5","ANT.5: Maximum ratio of Metal4 perimeter area to related gate oxide area is 400")
# Rule ANT.16_i_ANT.5: Diode filtering for ANT.5 [thin gate]
logger.info("Executing rule ANT.16_i_ANT.5")
antenna_check(thin_gate,perimeter_only(metal4,0.54.um), 400,[diode,800]).output("ANT.16_i_ANT.5","ANT.16_i_ANT.5: Maximum ratio of Metal4 perimeter area to related gate oxide area is 400")
# Rule ANT.16_i_ANT.5: Diode filtering for ANT.5 [thick gate]
logger.info("Executing rule ANT.16_ii_ANT.5")
antenna_check(thick_gate,perimeter_only(metal4,0.54.um), 400,[diode,6000]).output("ANT.16_ii_ANT.5","ANT.16_ii_ANT.5: Maximum ratio of Metal4 perimeter area to related gate oxide area is 400")
#========================
#----- MIM OPTION A -----
#========================
if MIM_OPTION == "A"
# Rule ANT.14: Maximum ratio of each of the metal4 layer perimeter area to related MIM area is 400
# antenna_check(fusetop,perimeter_only(metal4,0.54.um), 400).#output("ANT.14","ANT.14: Maximum ratio of each of the metal4 layer perimeter area to related MIM area is 400")
# Rule ANT.16_iii_ANT.14_M4_MIMA: Maximum ratio of each of the metal3 layer perimeter area to related MIM area is 400
logger.info("Executing rule ANT.16_iii_ANT.15_V3_MIMA")
antenna_check(fusetop,perimeter_only(metal4,0.54.um), 400,[diode,6000]).output("ANT.16_iii_ANT.14_M4_MIMA","ANT.16_iii_ANT.14_M4_MIMA: Maximum ratio of each of the metal4 layer perimeter area to related MIM area is 400")
end
#========================================
#----------------- VIA4 -----------------
#========================================
connect(metal4, via4 )
# Case (a): Connection to COMP is not present: Flag error (No diode) [Default]
# Rule ANT.12: Maximum ratio of Via4 area to related gate oxide area is 20
# antenna_check(tgate, via4, 20).#output("ANT.12","ANT.12: Maximum ratio of Via4 area to related gate oxide area is 20")
# Case (b) Connection to COMP is present: [Thin gate , Thick gate]
# Rule ANT.16_i_ANT.12: Diode filtering for ANT.12 [thin gate]
logger.info("Executing rule ANT.16_i_ANT.12")
antenna_check(thin_gate,via4, 20,[diode,40]).output("ANT.16_i_ANT.12","ANT.16_i_ANT.12: Maximum ratio of Via4 area to related thin gate oxide area is 20")
# Rule ANT.16_ii_ANT.12: Diode filtering for ANT.12 [thick gate]
logger.info("Executing rule ANT.16_ii_ANT.12")
antenna_check(thick_gate,via4, 20,[diode,300]).output("ANT.16_ii_ANT.12","ANT.16_ii_ANT.12: Maximum ratio of Via4 area to related thick gate oxide area is 20")
#========================
#----- MIM OPTION A -----
#========================
if MIM_OPTION == "A"
# Rule ANT.15: Maximum ratio of each of Via4 area to related MIM area is 20
# antenna_check(fusetop, via4, 20).#output("ANT.15","ANT.15: Maximum ratio of each of Via4 area to related MIM area is 20")
# Rule ANT.16_iii_ANT.15_V4_MIMA: Maximum ratio of each of Via2 area to related MIM area is 20
logger.info("Executing rule ANT.16_iii_ANT.15_V4_MIMA")
antenna_check(fusetop, via4, 20,[diode,300]).output("ANT.16_iii_ANT.15_V4_MIMA","ANT.16_iii_ANT.15_V4_MIMA: Maximum ratio of each of Via4 area to related MIM area is 20")
end
#========================================
#---------------- METAL5 ----------------
#========================================
connect(via4, metal5 )
# Rule ANT.6: Maximum ratio of Metal5 perimeter area to related gate oxide area is 400
#antenna_check(tgate,perimeter_only(metal5,0.54.um), 400).#output("ANT.6","ANT.6: Maximum ratio of Metal5 perimeter area to related gate oxide area is 400")
# Rule ANT.16_i_ANT.6: Diode filtering for ANT.6 [thin gate]
logger.info("Executing rule ANT.16_i_ANT.6")
antenna_check(thin_gate,perimeter_only(metal5,0.54.um), 400,[diode,800]).output("ANT.16_i_ANT.6","ANT.16_i_ANT.6: Maximum ratio of Metal5 perimeter area to related gate oxide area is 400")
# Rule ANT.16_i_ANT.6: Diode filtering for ANT.6 [thick gate]
logger.info("Executing rule ANT.16_ii_ANT.6")
antenna_check(thick_gate,perimeter_only(metal5,0.54.um), 400,[diode,6000]).output("ANT.16_ii_ANT.6","ANT.16_ii_ANT.6: Maximum ratio of Metal5 perimeter area to related gate oxide area is 400")
#========================
#----- MIM OPTION A -----
#========================
if MIM_OPTION == "A"
# Rule ANT.14: Maximum ratio of each of the metal5 layer perimeter area to related MIM area is 400
# antenna_check(fusetop,perimeter_only(metal5,0.54.um), 400).#output("ANT.14","ANT.14: Maximum ratio of each of the metal5 layer perimeter area to related MIM area is 400")
# Rule ANT.16_iii_ANT.14_M5_MIMA: Maximum ratio of each of the metal3 layer perimeter area to related MIM area is 400
logger.info("Executing rule ANT.16_iii_ANT.14_M5_MIMA")
antenna_check(fusetop,perimeter_only(metal5,0.54.um), 400,[diode,6000]).output("ANT.16_iii_ANT.14_M5_MIMA","ANT.16_iii_ANT.14_M5_MIMA: Maximum ratio of each of the metal5 layer perimeter area to related MIM area is 400")
end
#========================================
#----------------- VIA5 -----------------
#========================================
connect(metal5, via5 )
# Case (a): Connection to COMP is not present: Flag error (No diode) [Default]
# Rule ANT.13: Maximum ratio of Via5 area to related gate oxide area is 20
# antenna_check(tgate, via5, 20).#output("ANT.13","ANT.13: Maximum ratio of Via5 area to related gate oxide area is 20")
# Case (b) Connection to COMP is present: [Thin gate , Thick gate]
# Rule ANT.16_i_ANT.13: Diode filtering for ANT.13 [thin gate]
logger.info("Executing rule ANT.16_i_ANT.13")
antenna_check(thin_gate,via5, 20,[diode,40]).output("ANT.16_i_ANT.13","ANT.16_i_ANT.13: Maximum ratio of Via5 area to related thin gate oxide area is 20")
# Rule ANT.16_ii_ANT.13: Diode filtering for ANT.13 [thick gate]
logger.info("Executing rule ANT.16_ii_ANT.13")
antenna_check(thick_gate,via5, 20,[diode,300]).output("ANT.16_ii_ANT.13","ANT.16_ii_ANT.13: Maximum ratio of Via5 area to related thick gate oxide area is 20")
#========================
#----- MIM OPTION A -----
#========================
if MIM_OPTION == "A"
# Rule ANT.15: Maximum ratio of each of Via5 area to related MIM area is 20
# antenna_check(fusetop, via5, 20).#output("ANT.15","ANT.15: Maximum ratio of each of Via5 area to related MIM area is 20")
# Rule ANT.16_iii_ANT.15_V5_MIMA: Maximum ratio of each of Via2 area to related MIM area is 20
logger.info("Executing rule ANT.16_iii_ANT.15_V5_MIMA")
antenna_check(fusetop, via5, 20,[diode,300]).output("ANT.16_iii_ANT.15_V5_MIMA","ANT.16_iii_ANT.15_V5_MIMA: Maximum ratio of each of Via5 area to related MIM area is 20")
end
#========================================
#--------------- METALTOP ---------------
#========================================
connect(via5, metaltop)
# Rule ANT.7: Maximum ratio of MetalTop perimeter area to related gate oxide area is 400
# antenna_check(tgate,perimeter_only(metaltop,met_top_thick), 400).#output("ANT.7","ANT.7: Maximum ratio of MetalTop perimeter area to related gate oxide area is 400")
# Rule ANT.16_i_ANT.7: Diode filtering for ANT.7 [thin gate]
logger.info("Executing rule ANT.16_i_ANT.7")
antenna_check(thin_gate,perimeter_only(metaltop,met_top_thick), 400,[diode,800]).output("ANT.16_i_ANT.7","ANT.16_i_ANT.7: Maximum ratio of Metaltop perimeter area to related gate oxide area is 400")
# Rule ANT.16_ii_ANT.7: Diode filtering for ANT.7 [thick gate]
logger.info("Executing rule ANT.16_ii_ANT.7")
antenna_check(thick_gate,perimeter_only(metaltop,met_top_thick), 400,[diode,6000]).output("ANT.16_ii_ANT.7","ANT.16_ii_ANT.7: Maximum ratio of Metaltop perimeter area to related gate oxide area is 400")
#========================
#----- MIM OPTION A -----
#========================
if MIM_OPTION == "A"
# Rule ANT.14: Maximum ratio of each of the metaltop layer perimeter area to related MIM area is 400
# antenna_check(fusetop,perimeter_only(metaltop,met_top_thick), 400).#output("ANT.14","ANT.14: Maximum ratio of each of the top metal layer perimeter area to related MIM area is 400")
# Rule ANT.16_iii_ANT.14_MT_MIMA: Maximum ratio of each of the metal3 layer perimeter area to related MIM area is 400
logger.info("Executing rule ANT.16_iii_ANT.14_MT_MIMA")
antenna_check(fusetop,perimeter_only(metaltop,met_top_thick), 400,[diode,6000]).output("ANT.16_iii_ANT.14_MT_MIMA","ANT.16_iii_ANT.14_MT_MIMA: Maximum ratio of each of the Metaltop layer perimeter area to related MIM area is 400")
end
#========================
#----- MIM OPTION B -----
#========================
if MIM_OPTION == "B"
connect(metaltop, fusetop )
# Rule ANT.14: Maximum ratio of each of the metaltop layer perimeter area to related MIM area is 400
# antenna_check(fusetop,perimeter_only(metaltop,met_top_thick), 400).#output("ANT.14","ANT.14: Maximum ratio of each of the top metal layer perimeter area to related MIM area is 400")
# Rule ANT.16_iii_ANT.14_MT_MIMB: Maximum ratio of each of the metal3 layer perimeter area to related MIM area is 400
logger.info("Executing rule ANT.16_iii_ANT.14_MT_MIMB")
antenna_check(fusetop,perimeter_only(metaltop,met_top_thick), 400,[diode,6000]).output("ANT.16_iii_ANT.14_MT_MIMB","ANT.16_iii_ANT.14_MT_MIMB: Maximum ratio of each of the metaltop layer perimeter area to related MIM area is 400")
end
exec_end_time = Time.now
run_time = exec_end_time - exec_start_time
logger.info("DRC Total Run time %f seconds" % [run_time])
#===================================
#--------------- END ---------------
#===================================