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