update repo
diff --git a/signoff/cdrc.log b/signoff/cdrc.log
new file mode 100644
index 0000000..d07ac82
--- /dev/null
+++ b/signoff/cdrc.log
@@ -0,0 +1,2 @@
+caldrc-put: caravel_18000abd.oas 2b2307ad510ee4cd3f8652040b20f0a41eed2ebd 2022-12-13.08:15:11.UTC md5=f6344099ee7a25bdb62e8c21ad88b408 /mnt/shuttles/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas [no-git-push]
+caldrc-post: caravel_18000abd.gds put=2b2307ad 2022-12-13.08:28:24.UTC md5=(no-gds-file) output3341_pdk100-ga2322ad13_drc3241-g2b2307ad_prj3241-g2b2307ad_caravel_18000abd
diff --git a/signoff/drc.log b/signoff/drc.log
new file mode 100644
index 0000000..c857526
--- /dev/null
+++ b/signoff/drc.log
@@ -0,0 +1,5377 @@
+13-Dec-2022 07:38:20 | INFO    | Your Klayout version is: KLayout 0.28
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['comp.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['contact.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['dnwell.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['drc_bjt.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['dualgate.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['dummy_exclude.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['efuse.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['esd.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['geom.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['hres.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['lres.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['lvpwell.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['lvs_bjt.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['main.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['mcell.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['metal1.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['metal2.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['metal3.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['metal4.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['metal5.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['metaltop.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['mim.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['nat.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['nplus.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['otp_mk.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['poly2.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['pplus.drc']
+13-Dec-2022 07:38:23 | INFO    | ## Generating template with for the following rule tables: ['pres.drc']
+13-Dec-2022 07:38:23 | INFO    | ## Generating template with for the following rule tables: ['sab.drc']
+13-Dec-2022 07:38:23 | INFO    | ## Generating template with for the following rule tables: ['sram.drc']
+13-Dec-2022 07:38:23 | INFO    | ## Generating template with for the following rule tables: ['tail.drc']
+13-Dec-2022 07:38:23 | INFO    | ## Generating template with for the following rule tables: ['via1.drc']
+13-Dec-2022 07:38:23 | INFO    | ## Generating template with for the following rule tables: ['via2.drc']
+13-Dec-2022 07:38:23 | INFO    | ## Generating template with for the following rule tables: ['via3.drc']
+13-Dec-2022 07:38:23 | INFO    | ## Generating template with for the following rule tables: ['via4.drc']
+13-Dec-2022 07:38:23 | INFO    | ## Generating template with for the following rule tables: ['via5.drc']
+13-Dec-2022 07:38:23 | INFO    | ## Generating template with for the following rule tables: ['ymtp_mk.drc']
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design comp on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design contact on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design dnwell on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design drc_bjt on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design dualgate on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design dummy_exclude on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design efuse on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design esd on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design geom on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design hres on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design lres on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design lvpwell on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design lvs_bjt on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design main on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design mcell on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design metal1 on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design metal2 on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design metal3 on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design metal4 on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design metal5 on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design metaltop on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design mim on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design nat on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design nplus on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design otp_mk on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design poly2 on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design pplus on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design pres on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design sab on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design sram on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design tail on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design via1 on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design via2 on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design via3 on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design via4 on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design via5 on cell caravel_18000abd:
+2022-12-13 07:38:24 +0000: Memory Usage (557316K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557312K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557348K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557332K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557388K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557296K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557340K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557384K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557160K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557284K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557344K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557300K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557156K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557504K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557344K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557324K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557348K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557300K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557332K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557332K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557300K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557320K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557160K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557152K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557344K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557348K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557336K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557348K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557328K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557308K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557320K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557320K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557320K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557320K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557320K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557320K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:38:24 +0000: Memory Usage (557348K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:24 +0000: Memory Usage (557332K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750692K) : Loading database to memory is complete.
+2022-12-13 07:38:24 +0000: Memory Usage (557388K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:24 +0000: Memory Usage (557312K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:24 +0000: Memory Usage (557316K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750692K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_dualgate.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750872K) : Loading database to memory is complete.
+2022-12-13 07:38:24 +0000: Memory Usage (557340K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750692K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_dnwell.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750872K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_comp.lyrdb
+2022-12-13 07:38:24 +0000: Memory Usage (557296K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Loading database to memory is complete.
+2022-12-13 07:38:24 +0000: Memory Usage (557384K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_contact.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_esd.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750692K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750872K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750672K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_hres.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750924K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750692K) : Wedge enabled  true
+2022-12-13 07:38:24 +0000: Memory Usage (557344K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750872K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750672K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_drc_bjt.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : Wedge enabled  true
+2022-12-13 07:38:24 +0000: Memory Usage (557284K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750692K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750924K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_geom.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750872K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : connectivity rules are disabled.
+2022-12-13 07:38:24 +0000: Memory Usage (557156K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750672K) : Evaluate switches.
+2022-12-13 07:38:24 +0000: Memory Usage (557300K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Wedge enabled  true
+2022-12-13 07:38:24 +0000: Memory Usage (557504K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750692K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : Loading database to memory is complete.
+2022-12-13 07:38:24 +0000: Memory Usage (557160K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750924K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_lvpwell.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750872K) : Ball enabled  true
+2022-12-13 07:38:24 +0000: Memory Usage (557324K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750672K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (751104K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750692K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750608K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_lres.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750924K) : connectivity rules are disabled.
+2022-12-13 07:38:24 +0000: Memory Usage (557300K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:24 +0000: Memory Usage (557300K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750756K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750672K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750872K) : Gold enabled  true
+2022-12-13 07:38:24 +0000: Memory Usage (557348K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_mcell.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750924K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750692K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (751104K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_main.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : MIM Option selected B
+2022-12-13 07:38:24 +0000: Memory Usage (557332K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:24 +0000: Memory Usage (557344K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_dummy_exclude.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750672K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750608K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_lvs_bjt.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750756K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_mim.lyrdb
+2022-12-13 07:38:24 +0000: Memory Usage (557332K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750872K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Evaluate switches.
+2022-12-13 07:38:24 +0000: Memory Usage (557152K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Loading database to memory is complete.
+2022-12-13 07:38:24 +0000: Memory Usage (557320K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : MIM Option selected B
+2022-12-13 07:38:24 +0000: Memory Usage (557348K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750924K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750736K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750692K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (751104K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750608K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750672K) : Gold enabled  true
+2022-12-13 07:38:24 +0000: Memory Usage (557320K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750740K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750756K) : Evaluate switches.
+2022-12-13 07:38:24 +0000: Memory Usage (557348K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:24 +0000: Memory Usage (557344K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750872K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_metal2.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_metal1.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_metaltop.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (751104K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : Number of threads to use 4
+2022-12-13 07:38:24 +0000: Memory Usage (557336K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750692K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : connectivity rules are disabled.
+2022-12-13 07:38:24 +0000: Memory Usage (557160K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:24 +0000: Memory Usage (557320K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750608K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_metal5.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750924K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750672K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750756K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750740K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_efuse.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750872K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Evaluate switches.
+2022-12-13 07:38:24 +0000: Memory Usage (557320K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750736K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_poly2.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Wedge enabled  true
+2022-12-13 07:38:24 +0000: Memory Usage (557308K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : Ball enabled  true
+2022-12-13 07:38:24 +0000: Memory Usage (557320K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_nat.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (751104K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750692K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750604K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_metal3.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_otp_mk.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750924K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750672K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750608K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750756K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Loading database to memory is complete.
+2022-12-13 07:38:24 +0000: Memory Usage (557320K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750736K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_via5.lyrdb
+2022-12-13 07:38:24 +0000: Memory Usage (557320K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750740K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_nplus.lyrdb
+2022-12-13 07:38:24 +0000: Memory Usage (557328K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750872K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750724K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750692K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750924K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750672K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (751104K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750608K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750604K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_tail.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_metal4.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750756K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750736K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_pplus.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750740K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_via2.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750732K) : Loading database to memory is complete.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750872K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750724K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_sab.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750924K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_via3.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750672K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750692K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_pres.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750756K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (751104K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750604K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750736K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750608K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750740K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_via1.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750872K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750724K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750924K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_via4.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750732K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_sram.lyrdb
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750756K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750736K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750604K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750608K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750672K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (751104K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750692K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750740K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750872K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750732K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Evaluate switches.
+2022-12-13 07:38:27 +0000: Memory Usage (750724K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750924K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750736K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750756K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750604K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750672K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (751104K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750608K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750692K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750740K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750872K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750732K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : connectivity rules are disabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750756K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750736K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750724K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750924K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750604K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750672K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (751104K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750608K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750740K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750872K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750756K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750924K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750732K) : Wedge enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750604K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750724K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750672K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750736K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750608K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750740K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (751104K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750756K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750924K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750732K) : Ball enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750604K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750724K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750672K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750736K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750608K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (751104K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750740K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750756K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750924K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750732K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750604K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750724K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Gold enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750736K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (751104K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750740K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750608K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750732K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750604K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : MIM Option selected B
+2022-12-13 07:38:27 +0000: Memory Usage (750724K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750736K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750756K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750740K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (751104K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750608K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750732K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750604K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750724K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750736K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (751104K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750756K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Offgrid enabled  true
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750608K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750740K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750732K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750604K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750724K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (751104K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750756K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750736K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Number of threads to use 4
+2022-12-13 07:38:27 +0000: Memory Usage (750608K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750740K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750604K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750724K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750732K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750740K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750736K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750724K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Verbose mode: false
+2022-12-13 07:38:27 +0000: Memory Usage (750732K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750604K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750740K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750736K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750732K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : deep  mode is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750724K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750604K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750732K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750724K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : METAL_TOP Selected is 9K
+2022-12-13 07:38:27 +0000: Memory Usage (750604K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750732K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : METAL_STACK Selected is 5LM
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750724K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750732K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : FEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : BEOL is enabled.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : Read in polygons from layers.
+2022-12-13 07:38:27 +0000: Memory Usage (750692K) : Read in polygons from layers.
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Read in polygons from layers.
+2022-12-13 07:38:28 +0000: Memory Usage (760836K) : comp has 675304 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760848K) : comp has 675304 polygons
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Read in polygons from layers.
+2022-12-13 07:38:27 +0000: Memory Usage (750872K) : Read in polygons from layers.
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : comp has 675304 polygons
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Read in polygons from layers.
+2022-12-13 07:38:28 +0000: Memory Usage (760856K) : comp has 675304 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (761028K) : comp has 675304 polygons
+2022-12-13 07:38:27 +0000: Memory Usage (750672K) : Read in polygons from layers.
+2022-12-13 07:38:28 +0000: Memory Usage (760872K) : comp has 675304 polygons
+2022-12-13 07:38:27 +0000: Memory Usage (750924K) : Read in polygons from layers.
+2022-12-13 07:38:28 +0000: Memory Usage (760828K) : comp has 675304 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (761080K) : comp has 675304 polygons
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Read in polygons from layers.
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : Read in polygons from layers.
+2022-12-13 07:38:28 +0000: Memory Usage (760860K) : comp has 675304 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760856K) : comp has 675304 polygons
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Read in polygons from layers.
+2022-12-13 07:38:27 +0000: Memory Usage (750756K) : Read in polygons from layers.
+2022-12-13 07:38:27 +0000: Memory Usage (750608K) : Read in polygons from layers.
+2022-12-13 07:38:27 +0000: Memory Usage (751104K) : Read in polygons from layers.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Read in polygons from layers.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Read in polygons from layers.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Read in polygons from layers.
+2022-12-13 07:38:28 +0000: Memory Usage (760832K) : comp has 675304 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760912K) : comp has 675304 polygons
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Read in polygons from layers.
+2022-12-13 07:38:28 +0000: Memory Usage (760764K) : comp has 675304 polygons
+2022-12-13 07:38:27 +0000: Memory Usage (750736K) : Read in polygons from layers.
+2022-12-13 07:38:28 +0000: Memory Usage (760832K) : comp has 675304 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (761260K) : comp has 675304 polygons
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Read in polygons from layers.
+2022-12-13 07:38:28 +0000: Memory Usage (760836K) : comp has 675304 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760832K) : comp has 675304 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760872K) : comp has 675304 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760896K) : comp has 675304 polygons
+2022-12-13 07:38:27 +0000: Memory Usage (750604K) : Read in polygons from layers.
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : comp has 675304 polygons
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Read in polygons from layers.
+2022-12-13 07:38:27 +0000: Memory Usage (750680K) : Read in polygons from layers.
+2022-12-13 07:38:27 +0000: Memory Usage (750740K) : Read in polygons from layers.
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : Read in polygons from layers.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Read in polygons from layers.
+2022-12-13 07:38:27 +0000: Memory Usage (750700K) : Read in polygons from layers.
+2022-12-13 07:38:28 +0000: Memory Usage (760760K) : comp has 675304 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760872K) : comp has 675304 polygons
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Read in polygons from layers.
+2022-12-13 07:38:28 +0000: Memory Usage (760836K) : comp has 675304 polygons
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Read in polygons from layers.
+2022-12-13 07:38:28 +0000: Memory Usage (760924K) : comp has 675304 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760896K) : comp has 675304 polygons
+2022-12-13 07:38:27 +0000: Memory Usage (750724K) : Read in polygons from layers.
+2022-12-13 07:38:27 +0000: Memory Usage (750696K) : Read in polygons from layers.
+2022-12-13 07:38:28 +0000: Memory Usage (760836K) : comp has 675304 polygons
+2022-12-13 07:38:27 +0000: Memory Usage (750720K) : Read in polygons from layers.
+2022-12-13 07:38:28 +0000: Memory Usage (760856K) : comp has 675304 polygons
+2022-12-13 07:38:27 +0000: Memory Usage (750732K) : Read in polygons from layers.
+2022-12-13 07:38:27 +0000: Memory Usage (750676K) : Read in polygons from layers.
+2022-12-13 07:38:28 +0000: Memory Usage (760836K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : comp has 675304 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760880K) : comp has 675304 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760848K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : comp has 675304 polygons
+2022-12-13 07:38:27 +0000: Memory Usage (750716K) : Read in polygons from layers.
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760852K) : comp has 675304 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : comp has 675304 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760832K) : comp has 675304 polygons
+2022-12-13 07:38:27 +0000: Memory Usage (750764K) : Read in polygons from layers.
+2022-12-13 07:38:28 +0000: Memory Usage (760888K) : comp has 675304 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760872K) : comp has 675304 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760872K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760920K) : comp has 675304 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760856K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (761028K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760828K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (761080K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760860K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760856K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760832K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760764K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (761260K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760912K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760836K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760832K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760832K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760896K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760872K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760836K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760924K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760836K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760896K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760856K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760872K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760760K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760848K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760880K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760852K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760836K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760832K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760888K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760872K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760872K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760856K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (761028K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (761080K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760920K) : dnwell has 0 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760828K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760860K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760856K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760832K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (761260K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760764K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760912K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760836K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760832K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760832K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760896K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760872K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760836K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760872K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760924K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760836K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760856K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760836K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760848K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760760K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760832K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760896K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760880K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760872K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760852K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760888K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760872K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (761080K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (761028K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760920K) : nwell has 221165 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760828K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760856K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760860K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760856K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760832K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (761260K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760912K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760764K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760836K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760832K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760832K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760872K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760896K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760836K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760872K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760760K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760924K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760836K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760880K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760888K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760896K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760872K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760832K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760852K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760856K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760848K) : dualgate has 251510 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760836K) : dualgate has 251510 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760920K) : lvpwell has 245301 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760872K) : dualgate has 251510 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760876K) : dualgate has 251510 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (761080K) : dualgate has 251510 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (761028K) : dualgate has 251510 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760828K) : dualgate has 251510 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760856K) : dualgate has 251510 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760856K) : dualgate has 251510 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760860K) : dualgate has 251510 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760832K) : dualgate has 251510 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760912K) : dualgate has 251510 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (761260K) : dualgate has 251510 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760764K) : dualgate has 251510 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760836K) : dualgate has 251510 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760832K) : dualgate has 251510 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760896K) : dualgate has 251510 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760832K) : dualgate has 251510 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : dualgate has 251510 polygons
+2022-12-13 07:38:28 +0000: Memory Usage (760872K) : dualgate has 251510 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760836K) : dualgate has 251510 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760872K) : dualgate has 251510 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760924K) : dualgate has 251510 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760760K) : dualgate has 251510 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760836K) : dualgate has 251510 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760888K) : dualgate has 251510 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : dualgate has 251510 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760880K) : dualgate has 251510 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760852K) : dualgate has 251510 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : dualgate has 251510 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760896K) : dualgate has 251510 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : dualgate has 251510 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760856K) : dualgate has 251510 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760836K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760832K) : dualgate has 251510 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760848K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760872K) : dualgate has 251510 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760872K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760920K) : dualgate has 251510 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (761080K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (761028K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760828K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760856K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760856K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760860K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760912K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (761260K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760832K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760764K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760832K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760836K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760896K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760832K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760836K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760872K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760924K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760872K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760836K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760880K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760760K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760888K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760852K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760896K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760856K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760848K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760836K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760872K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760920K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760832K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : poly2 has 928772 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760872K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (761080K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760856K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760828K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (761028K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760856K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760860K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760912K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760832K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (761260K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760764K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760832K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760836K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760896K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760832K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760872K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760836K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760836K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760872K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760848K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760924K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760872K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760836K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760920K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (761080K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760880K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (761028K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760828K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760856K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760760K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760836K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760888K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760832K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760856K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760852K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760896K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760856K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760848K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760872K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760872K) : nplus has 257767 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (761080K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760856K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760828K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (761028K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760856K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760912K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760832K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760860K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (761260K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760764K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760912K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760832K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760860K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (761260K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760832K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760764K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760836K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760896K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760832K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760832K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760836K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760896K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760872K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760836K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760832K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760924K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760836K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760872K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760872K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760836K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760880K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760920K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760832K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760856K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760888K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : pplus has 269125 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760924K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760852K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760896K) : pplus has 269125 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760760K) : pplus has 269125 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760836K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : sab has 1921 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760880K) : sab has 1921 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760920K) : sab has 1921 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : sab has 1921 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760876K) : esd has 0 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760848K) : esd has 0 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760872K) : pplus has 269125 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760760K) : sab has 1921 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : sab has 1921 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : sab has 1921 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760888K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760872K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (761080K) : esd has 0 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760828K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760852K) : sab has 1921 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : sab has 1921 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760856K) : esd has 0 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (761028K) : esd has 0 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760856K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760848K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760828K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761080K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : sab has 1921 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761028K) : resistor has 1 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760912K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : resistor has 1 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760832K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760912K) : resistor has 1 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (761260K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : resistor has 1 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760764K) : esd has 0 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760860K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761260K) : resistor has 1 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760832K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760764K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760860K) : resistor has 1 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760836K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : resistor has 1 polygons
+2022-12-13 07:38:29 +0000: Memory Usage (760896K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760924K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760924K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760880K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760920K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760760K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760880K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760852K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760888K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760760K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760920K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : esd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760888K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760852K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : resistor has 1 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760848K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761080K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760828K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761028K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760848K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760912K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761080K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760828K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760848K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761028K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761080K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760828K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761260K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760912K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760848K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761028K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761080K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760828K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760764K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760912K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760848K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760860K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761028K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760828K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761260K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761080K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760912K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760848K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761080K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761260K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760828K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760912K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761028K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760764K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760860K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760848K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761080K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761028K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761260K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760828K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760764K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760912K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760848K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760860K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761028K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761260K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761080K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760764K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760828K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760912K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760848K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760860K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761260K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761080K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761028K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760828K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760924K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760764K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760848K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760912K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760860K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761080K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761260K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761028K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760828K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760764K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760912K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760880K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760860K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760924K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761260K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761028K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760764K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760920K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760912K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760860K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760924K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760760K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760852K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761260K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760764K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760888K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760880K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760860K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760924K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : fhres has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760920K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761260K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760880K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760860K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760852K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760764K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760924K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760760K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760920K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760764K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760860K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760880K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760888K) : fusetop has 9 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760924K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760852K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760760K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760920K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760880K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760888K) : fusewindow_d has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760852K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760924K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760760K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760920K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760880K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760888K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : polyfuse has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760924K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760852K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760760K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760920K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760880K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760924K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760852K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760888K) : mvsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760920K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760760K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760848K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760880K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760888K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : mvpsd has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760924K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760852K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760920K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760760K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760848K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760880K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761080K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760888K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760852K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760828K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760760K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760920K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : nat has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760880K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761080K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761028K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760888K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760760K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760828K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760920K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : comp_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760852K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760912K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761028K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760888K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760760K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : poly2_dummy has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760852K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760912K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760888K) : schottky_diode has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761260K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760764K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761260K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760860K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760764K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760860K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : opc_drc has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760848K) : opc_drc has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : opc_drc has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760924K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : opc_drc has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761080K) : opc_drc has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760924K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : opc_drc has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760828K) : opc_drc has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : opc_drc has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760880K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761028K) : opc_drc has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760912K) : opc_drc has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : zener has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760848K) : ndmy has 8 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760920K) : zener has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760880K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : opc_drc has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : zener has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : res_mk has 945 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760852K) : zener has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761080K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760920K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760876K) : zener has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (761260K) : opc_drc has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760888K) : zener has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760872K) : zener has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760856K) : zener has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : res_mk has 945 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760852K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760764K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760828K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : res_mk has 945 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : ndmy has 8 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760760K) : zener has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760896K) : res_mk has 945 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760888K) : res_mk has 945 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760860K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761028K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : res_mk has 945 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : res_mk has 945 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760912K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760760K) : res_mk has 945 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : ndmy has 8 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760836K) : opc_drc has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : opc_drc has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760832K) : opc_drc has 0 polygons
+2022-12-13 07:38:30 +0000: Memory Usage (760896K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761260K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760764K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760860K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760924K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760896K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760880K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760920K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760924K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760852K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760888K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760848K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760896K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760760K) : opc_drc has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761080K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760880K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760920K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760828K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760888K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760852K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760896K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760912K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760760K) : ndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761028K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760764K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761260K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760860K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760896K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760924K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760848K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761080K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760880K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760920K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760828K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760888K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760852K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760896K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760848K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760912K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760760K) : pmndmy has 8 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761260K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761080K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760848K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761028K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760764K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760860K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761080K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760828K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760828K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761260K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760764K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760896K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760912K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760860K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761028K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760912K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761028K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761260K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760764K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760924K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760860K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760896K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760880K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760896K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760924K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760920K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760888K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760924K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760852K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : diode_mk has 2669 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760896K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760880K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760760K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : drc_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760888K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : v5_xtor has 205372 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760920K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760880K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760848K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : diode_mk has 2669 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760848K) : diode_mk has 2669 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760920K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760852K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : diode_mk has 2669 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761080K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760888K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760896K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : drc_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760852K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : diode_mk has 2669 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760848K) : drc_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761080K) : diode_mk has 2669 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : drc_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760828K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760760K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760896K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : diode_mk has 2669 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : drc_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761080K) : drc_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760848K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760760K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760828K) : diode_mk has 2669 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : cap_mk has 9 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : drc_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : latchup_mk has 90 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761080K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760912K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761260K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760828K) : drc_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761028K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760764K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : diode_mk has 2669 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760912K) : diode_mk has 2669 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761260K) : diode_mk has 2669 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761028K) : diode_mk has 2669 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760860K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760764K) : diode_mk has 2669 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760828K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : otp_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760848K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : drc_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760912K) : drc_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761260K) : drc_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760860K) : diode_mk has 2669 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760764K) : drc_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761028K) : drc_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : mtpmark has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761080K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : latchup_mk has 90 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : latchup_mk has 90 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760848K) : latchup_mk has 90 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760912K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : diode_mk has 2669 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : diode_mk has 2669 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760896K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (761260K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : diode_mk has 2669 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : diode_mk has 2669 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760828K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : diode_mk has 2669 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : drc_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760924K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : diode_mk has 2669 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : diode_mk has 2669 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : diode_mk has 2669 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760880K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : diode_mk has 2669 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760836K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760888K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760872K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : diode_mk has 2669 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760920K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : otp_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : diode_mk has 2669 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : diode_mk has 2669 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760852K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : diode_mk has 2669 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : diode_mk has 2669 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : latchup_mk has 90 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760896K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : diode_mk has 2669 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : diode_mk has 2669 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : diode_mk has 2669 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760760K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : otp_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760876K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : diode_mk has 2669 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760760K) : diode_mk has 2669 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760832K) : ind_mk has 0 polygons
+2022-12-13 07:38:31 +0000: Memory Usage (760856K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : diode_mk has 2669 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760760K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : diode_mk has 2669 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : diode_mk has 2669 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760760K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : drc_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : lvs_bjt has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760760K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760760K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : mim_l_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760760K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : latchup_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760760K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : guard_ring_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760760K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : otp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : mtpmark has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760760K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : neo_ee_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760760K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : sramcore has 20840 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760760K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : lvs_rf has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760760K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : lvs_drain has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760760K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : ind_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760760K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : hvpolyrs has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760760K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : lvs_io has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760760K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : probe_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760760K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : esd_mk has 90 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760760K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : plfuse has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : lvs_source has 900 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760920K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760880K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760888K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760852K) : efuse_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760760K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760920K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760880K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760888K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760836K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760896K) : plfuse has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760832K) : well_diode_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760852K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760836K) : poly2_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760856K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760760K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760872K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760872K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760888K) : comp_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760836K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : plfuse has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760880K) : comp_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760920K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760832K) : ldmos_xtor has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760896K) : efuse_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760852K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760760K) : plfuse has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760856K) : plfuse has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760872K) : comp_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : plfuse has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760872K) : comp_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760836K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760832K) : plfuse has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760888K) : poly2_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : efuse_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760896K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760852K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : comp_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760760K) : efuse_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760920K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760856K) : efuse_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760872K) : poly2_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : efuse_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760872K) : poly2_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760836K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : mdiode has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760880K) : poly2_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760832K) : efuse_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760896K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760760K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760852K) : comp_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760920K) : comp_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760836K) : poly2_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : poly2_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760856K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760832K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760852K) : poly2_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760896K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760760K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760920K) : poly2_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760856K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760832K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760896K) : comp_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : ymtp_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760760K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : comp_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760856K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760896K) : poly2_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760760K) : comp_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760832K) : dev_wf_mk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : poly2_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760856K) : comp_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760760K) : poly2_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : comp_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760832K) : comp_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760848K) : mdiode has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760856K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : mdiode has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : poly2_label has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760832K) : poly2_label has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760872K) : mdiode has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761080K) : mdiode has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760856K) : mdiode has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : mdiode has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761260K) : mdiode has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : mdiode has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760828K) : mdiode has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760860K) : mdiode has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (761028K) : mdiode has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : mdiode has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760912K) : mdiode has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760836K) : mdiode has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760876K) : mdiode has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760764K) : mdiode has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760896K) : mdiode has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760924K) : mdiode has 0 polygons
+2022-12-13 07:38:32 +0000: Memory Usage (760832K) : mdiode has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760872K) : mdiode has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760836K) : mdiode has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760888K) : mdiode has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760880K) : mdiode has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760872K) : mdiode has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760836K) : mdiode has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760872K) : mdiode has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760920K) : mdiode has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760852K) : mdiode has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : mdiode has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760896K) : mdiode has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : mdiode has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760760K) : mdiode has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760856K) : mdiode has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760876K) : mdiode has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (760832K) : mdiode has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (762968K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766808K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (762980K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (762988K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766820K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766828K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (763004K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (762984K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (763008K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (762964K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (763212K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766844K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (762960K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (762988K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (763392K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766804K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (767052K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (762964K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766824K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766800K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766848K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (763008K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (767424K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766828K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (763160K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (762964K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (762896K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766804K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (762964K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (763024K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (763044K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766848K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (767000K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766996K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (763052K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766884K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766868K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766736K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766804K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (767088K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (763004K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (762968K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766844K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766808K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766808K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (763020K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (770852K) : metal1_label has 19 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (763012K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (763004K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (770852K) : metal1_slot has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (762968K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766860K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766844K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (763052K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766852K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766808K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (763008K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (763004K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766892K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (762984K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766820K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (763028K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766828K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766848K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766824K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (763008K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766844K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (762892K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766868K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766848K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (770888K) : metal1_label has 19 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (762988K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766732K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (763008K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (770888K) : metal1_label has 19 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766844K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766828K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (770888K) : metal1_slot has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766848K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (762964K) : contact has 8949189 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (770888K) : metal1_slot has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (767052K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766804K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766848K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766804K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766824K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (770904K) : metal1_label has 19 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766800K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770892K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770868K) : metal1_label has 19 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766828K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (771100K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770868K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770904K) : metal1_slot has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (767424K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770868K) : metal1_slot has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766804K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770892K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770868K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770864K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (771100K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770868K) : metal1_label has 19 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766848K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766868K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (771256K) : metal1_label has 19 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766736K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770848K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770868K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770864K) : metal1_slot has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (767088K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (767000K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770888K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770776K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770848K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (771256K) : metal1_slot has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766996K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766804K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766884K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770924K) : metal1_label has 19 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766844K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770888K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (771056K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770776K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770784K) : metal1_label has 19 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766808K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770844K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770924K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770936K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770924K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (771056K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770784K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770844K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770936K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770904K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770924K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770884K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770904K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770884K) : metal1_slot has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766844K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766860K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766852K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770896K) : metal1_label has 19 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766892K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770892K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770900K) : metal1_label has 19 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766808K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770896K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770892K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770900K) : metal1_slot has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766844K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766848K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770944K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770868K) : metal1_label has 19 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766868K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766848K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766824K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766732K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770884K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770880K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770944K) : metal1_slot has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766828K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770868K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770888K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770884K) : metal1_slot has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (766848K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770880K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770908K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770932K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770804K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770888K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770892K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (766804K) : metal1_dummy has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770804K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770908K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770932K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770908K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770892K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770908K) : metal1_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770872K) : metal1_label has 19 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770872K) : metal1_slot has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (770852K) : metal1_blk has 0 polygons
+2022-12-13 07:38:33 +0000: Memory Usage (770888K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770888K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770904K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770868K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770868K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770892K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (771100K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770868K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770864K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (771256K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770888K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770848K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770776K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770924K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (771056K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770784K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770936K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770924K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770904K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770884K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770844K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770896K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770892K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770900K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770944K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770884K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770868K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770880K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770888K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770908K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770804K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770932K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770908K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770872K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (770892K) : metal1_blk has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775888K) : via1 has 1473783 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (784164K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775924K) : via1 has 1473783 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775924K) : via1 has 1473783 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784200K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784200K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775940K) : via1 has 1473783 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (776136K) : via1 has 1473783 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775928K) : via1 has 1473783 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775904K) : via1 has 1473783 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775904K) : via1 has 1473783 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775904K) : via1 has 1473783 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (776292K) : via1 has 1473783 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784216K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784412K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784204K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784180K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784180K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775924K) : via1 has 1473783 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775900K) : via1 has 1473783 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775884K) : via1 has 1473783 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775812K) : via1 has 1473783 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784180K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784568K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775960K) : via1 has 1473783 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784200K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784176K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775972K) : via1 has 1473783 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784160K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (776092K) : via1 has 1473783 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784088K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775820K) : via1 has 1473783 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784236K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784164K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775960K) : via1 has 1473783 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784248K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775940K) : via1 has 1473783 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775920K) : via1 has 1473783 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784368K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787264K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784096K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784236K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787264K) : metal2_slot has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775932K) : via1 has 1473783 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784196K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784216K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775936K) : via1 has 1473783 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775928K) : via1 has 1473783 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784208K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775980K) : via1 has 1473783 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775880K) : via1 has 1473783 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775920K) : via1 has 1473783 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784212K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784204K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775904K) : via1 has 1473783 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784256K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784200K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784200K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775924K) : via1 has 1473783 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784156K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784196K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775920K) : via1 has 1473783 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787300K) : metal2_label has 2097 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775840K) : via1 has 1473783 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784180K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787300K) : metal2_label has 2097 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775944K) : via1 has 1473783 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775968K) : via1 has 1473783 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775944K) : via1 has 1473783 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787300K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784200K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787300K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784192K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784116K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784220K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784244K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775908K) : via1 has 1473783 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784220K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784216K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784180K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784412K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784204K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784180K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787316K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787284K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784184K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787516K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787280K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787304K) : metal2_label has 2097 polygons
+2022-12-13 07:38:34 +0000: Memory Usage (775928K) : via1 has 1473783 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787316K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784568K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787284K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787516K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787304K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787280K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784200K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784176K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784160K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787668K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784088K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784204K) : metal2_drawn has 506494 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784180K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787300K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787260K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784236K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787276K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787668K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784248K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787188K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787280K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787260K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784368K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787276K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787300K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787336K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787348K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787280K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787188K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784096K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787468K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787336K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784236K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787348K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784216K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784196K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787196K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787468K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787336K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787316K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787296K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787196K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784208K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787336K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787316K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787296K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787312K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784204K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787312K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784256K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787304K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784196K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784212K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784156K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787356K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784180K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787304K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787296K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787312K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787256K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787284K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787356K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784200K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787296K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787312K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787256K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784192K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784220K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787284K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784116K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784244K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787300K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787296K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784220K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787320K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787216K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787344K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787300K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787296K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787320K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784184K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787320K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787216K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787344K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787284K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787320K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787284K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (784204K) : metal2_dummy has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787304K) : metal2_label has 2097 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787304K) : metal2_slot has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787264K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787300K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787300K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787284K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787316K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787304K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787516K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787280K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787300K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787188K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787276K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787668K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787260K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787280K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787336K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787348K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787468K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787196K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787316K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787296K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787312K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787336K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787304K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787356K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787296K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (793408K) : via2 has 1870904 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787256K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787284K) : metal2_blk has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795540K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787300K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787320K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787296K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787216K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787312K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787344K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787320K) : metal2_blk has 0 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787284K) : metal2_blk has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793444K) : via2 has 1870904 polygons
+2022-12-13 07:38:35 +0000: Memory Usage (787304K) : metal2_blk has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793444K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795576K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795576K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793660K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793460K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793448K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793428K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795788K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793424K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795592K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795580K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795556K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795556K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793444K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793332K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793404K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793812K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793420K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793424K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795576K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793492K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793480K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795540K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795536K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795464K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795944K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795552K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795556K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795624K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795612K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793612K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793340K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797016K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793460K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795744K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795472K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793440K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797016K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793456K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795592K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795572K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795584K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793448K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793504K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793440K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795580K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793428K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795632K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793400K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795576K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795576K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795572K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795556K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793480K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795532K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793444K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795612K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797020K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797020K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795576K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793440K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793360K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793456K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793464K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793488K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797020K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797020K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795568K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795588K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795596K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793428K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795492K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795620K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795788K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795592K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795580K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795560K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793464K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795556K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795556K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795596K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (793448K) : via2 has 1870904 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797236K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797036K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797056K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795576K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795580K) : metal3_drawn has 277166 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797004K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797236K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797036K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797028K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795464K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795944K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795536K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797056K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795612K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795556K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797004K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795624K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795552K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797028K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797048K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (796940K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797384K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797012K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797048K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797056K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795472K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795744K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797032K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797064K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797000K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797384K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (796940K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795592K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797012K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797056K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795572K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797032K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797064K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795584K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797000K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (796980K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797184K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797036K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797016K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797184K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (796980K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797060K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797036K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795580K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795632K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797016K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797060K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795556K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795572K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795532K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797080K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797056K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795612K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795576K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797048K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797004K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797080K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797056K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797008K) : metal3_label has 494 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797004K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795596K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795588K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797048K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797056K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795568K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797008K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795492K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797016K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795620K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797056K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795560K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797016K) : metal3_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797040K) : metal3_label has 494 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797032K) : metal3_label has 494 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797044K) : metal3_label has 494 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795596K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (796936K) : metal3_label has 494 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797040K) : metal3_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797004K) : metal3_label has 494 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797032K) : metal3_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797068K) : metal3_label has 494 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797044K) : metal3_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (796936K) : metal3_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797040K) : metal3_label has 494 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797004K) : metal3_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797068K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (795580K) : metal3_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797040K) : metal3_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797024K) : metal3_label has 494 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797024K) : metal3_slot has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797016K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801496K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797020K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801500K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797020K) : metal3_blk has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797004K) : metal3_blk has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797236K) : metal3_blk has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797036K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801504K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797056K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801484K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801716K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801516K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797028K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801536K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801508K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (796940K) : metal3_blk has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797384K) : metal3_blk has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797012K) : metal3_blk has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797000K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801496K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797056K) : metal3_blk has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797064K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802164K) : metal4_label has 360 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797032K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801420K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801864K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801492K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797036K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801480K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802164K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801536K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797184K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801544K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (796980K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801512K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801516K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797016K) : metal3_blk has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797060K) : metal3_blk has 0 polygons
+2022-12-13 07:38:36 +0000: Memory Usage (797048K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801664K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801460K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801540K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801496K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801528K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797056K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801500K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797080K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797048K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797004K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802168K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797008K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797056K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801536K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801560K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802168K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801528K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797016K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801484K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797040K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801488K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801504K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801536K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (796936K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797004K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797032K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801496K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801484K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802168K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801716K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801516K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801520K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802152K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801536K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802168K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802384K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797068K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801484K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801416K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801512K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802184K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797040K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802152K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802204K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801508K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802384K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797024K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802184K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802204K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801548K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802176K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (797044K) : metal3_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801520K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801504K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801492K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801420K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801864K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802176K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801536K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801544K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801480K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802156K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801524K) : metal4_drawn has 142068 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802088K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801512K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802532K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802212K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802144K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802204K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801516K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802156K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802088K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802532K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802180K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802212K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802184K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802144K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802204K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801664K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802180K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801496K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801540K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802184K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802332K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801460K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802164K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802208K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802332K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802132K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801528K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802208K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802164K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801536K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801528K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801560K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801484K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802196K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802132K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802204K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802196K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801488K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802228K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802148K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802196K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801536K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802204K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801496K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802196K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802156K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802228K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802148K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802204K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802164K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802156K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801520K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802204K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801484K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802164K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802188K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801512K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801416K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802152K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801548K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802188K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802180K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802084K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801520K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801504K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802152K) : metal4_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (802212K) : metal4_label has 360 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (802180K) : metal4_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (802084K) : metal4_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (802188K) : metal4_label has 360 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (802172K) : metal4_label has 360 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802164K) : metal4_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (802212K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (801524K) : metal4_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (802188K) : metal4_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (802172K) : metal4_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (802192K) : metal4_label has 360 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (802192K) : metal4_slot has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802168K) : metal4_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802168K) : metal4_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802152K) : metal4_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802384K) : metal4_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802204K) : metal4_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802184K) : metal4_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802176K) : metal4_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802088K) : metal4_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807880K) : via4 has 9157574 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802204K) : metal4_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802532K) : metal4_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807880K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802180K) : metal4_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802212K) : metal4_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802144K) : metal4_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802184K) : metal4_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802156K) : metal4_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802208K) : metal4_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802332K) : metal4_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802164K) : metal4_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807884K) : via4 has 9157574 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802228K) : metal4_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807884K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802204K) : metal4_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802148K) : metal4_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802196K) : metal4_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802156K) : metal4_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807884K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807868K) : via4 has 9157574 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802204K) : metal4_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802164K) : metal4_blk has 0 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802132K) : metal4_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808100K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (802188K) : metal4_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807884K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807868K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:37 +0000: Memory Usage (802196K) : metal4_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808100K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (802152K) : metal4_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (802084K) : metal4_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807920K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807900K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (802180K) : metal4_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (802188K) : metal4_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (802172K) : metal4_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (802212K) : metal4_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807920K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807900K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807896K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807804K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807880K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808248K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (802192K) : metal4_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807896K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807896K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807804K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807920K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807864K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807928K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808248K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807896K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808472K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807900K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807920K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807864K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807928K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807900K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808472K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807876K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808048K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807880K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807924K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808048K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807876K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807880K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807884K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807944K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807924K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808472K) : metal5_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807944K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808472K) : pad has 63 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807872K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807920K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808476K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807912K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807864K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807920K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807868K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808472K) : ubmpperi has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807920K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807884K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807880K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808100K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807872K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807864K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807912K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808476K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807912K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807848K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807920K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808472K) : ubmparray has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807904K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807880K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807912K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807848K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808476K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807868K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807904K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807800K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808692K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808460K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808472K) : ubmeplate has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807904K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807920K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807900K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808476K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807868K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807900K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808692K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807888K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808476K) : metal5_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807932K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807800K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808460K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808472K) : metal1_res has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807804K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808476K) : pad has 63 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807904K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807888K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808512K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807900K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807932K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808492K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808472K) : metal2_res has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808248K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807928K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808476K) : ubmpperi has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807896K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808512K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807896K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807908K) : via4 has 9157574 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807864K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808492K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808472K) : metal3_res has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808396K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807920K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808692K) : metal5_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807900K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808476K) : metal5_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807908K) : metal5_drawn has 84478 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808476K) : ubmparray has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808840K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808472K) : metal4_res has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808520K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808692K) : pad has 63 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808484K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808396K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808488K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808476K) : pad has 63 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808456K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808460K) : metal5_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808476K) : ubmeplate has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808840K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808512K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808472K) : metal5_res has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808520K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808492K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808484K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808692K) : ubmpperi has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808048K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808488K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808476K) : ubmpperi has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808512K) : metal5_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808460K) : pad has 63 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807880K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808456K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808476K) : metal1_res has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808492K) : metal5_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808512K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807924K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808692K) : ubmparray has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807876K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808512K) : pad has 63 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808460K) : ubmpperi has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808476K) : ubmparray has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808492K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808476K) : metal2_res has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808492K) : pad has 63 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808644K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808396K) : metal5_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808692K) : ubmeplate has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808472K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808460K) : ubmparray has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808512K) : ubmpperi has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808476K) : ubmeplate has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808476K) : metal3_res has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808492K) : ubmpperi has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807944K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808520K) : metal5_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808516K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808396K) : pad has 63 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808644K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808692K) : metal1_res has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808468K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808840K) : metal5_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808472K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808488K) : metal5_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808484K) : metal5_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808476K) : metal4_res has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808460K) : ubmeplate has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808512K) : ubmparray has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808492K) : ubmparray has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808456K) : metal5_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808476K) : metal1_res has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808516K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808512K) : metal5_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807920K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808396K) : ubmpperi has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808692K) : metal2_res has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808840K) : pad has 63 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808468K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808520K) : pad has 63 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808488K) : pad has 63 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807864K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807872K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808484K) : pad has 63 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808460K) : metal1_res has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808476K) : metal5_res has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808536K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807912K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808492K) : metal5_blk has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808492K) : ubmeplate has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808456K) : pad has 63 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808512K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808476K) : metal2_res has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807920K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808396K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808692K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808840K) : ubmpperi has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807880K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808488K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : pad has 63 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807848K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808484K) : ubmpperi has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807912K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807904K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808536K) : metal5_slot has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808456K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808476K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808396K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808464K) : metal5_label has 510 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808840K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal5_label has 510 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808488K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808692K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : ubmpperi has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808644K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : metal5_label has 510 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : ubmpperi has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808472K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808484K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807868K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808456K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal5_label has 510 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808476K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808464K) : metal5_slot has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808440K) : metal5_label has 510 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808488K) : ubmeplate has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807800K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808516K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808840K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808644K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : metal5_label has 510 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal5_slot has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808692K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : metal5_label has 510 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : metal5_label has 510 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808396K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808468K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : ubmparray has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807888K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : metal5_slot has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808484K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808456K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal5_slot has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807932K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808476K) : metal5_res has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807900K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807904K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808644K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808440K) : metal5_slot has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808840K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808396K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : metal5_slot has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808488K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : metal5_slot has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808516K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808468K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : metal5_slot has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal5_label has 510 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808484K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808456K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808536K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808392K) : metal5_label has 510 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808644K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808396K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808840K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808516K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808488K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal5_slot has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : metal5_label has 510 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (807908K) : metal5_dummy has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808484K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal5_label has 510 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808536K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808468K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808456K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : metal5_label has 510 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808392K) : metal5_slot has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808480K) : metal5_label has 510 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808464K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808516K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808840K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808488K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : ubmeplate has 0 polygons
+2022-12-13 07:38:38 +0000: Memory Usage (808472K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808396K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808644K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal5_slot has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808484K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : metal5_slot has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808456K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808468K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808536K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : metal5_slot has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808480K) : metal5_slot has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808464K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808440K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808516K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808488K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808396K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808840K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808456K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808644K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808500K) : metal5_label has 510 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808484K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808468K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808536K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808748K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808440K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808464K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808516K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808488K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808840K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808456K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808500K) : metal5_slot has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808484K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808644K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808468K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808392K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808748K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808536K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808464K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808516K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808440K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808392K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808644K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808468K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808536K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808480K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808748K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808464K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808516K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808440K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808392K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808536K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808480K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808644K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808468K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808464K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808516K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808440K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808500K) : metal5_blk has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808480K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808536K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808464K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808476K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808644K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808392K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808468K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808516K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808440K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808500K) : pad has 63 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808536K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808464K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808392K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808480K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808468K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808440K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808500K) : ubmpperi has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808692K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808536K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808480K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808464K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808752K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808392K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808440K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808500K) : ubmparray has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808476K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808464K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808480K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808440K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808392K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808752K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808500K) : ubmeplate has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808968K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808480K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808440K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808392K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808752K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808756K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808500K) : metal1_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808968K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808480K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808392K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808756K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808500K) : metal2_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808736K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808968K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808480K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808768K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808392K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808396K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808756K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808500K) : metal3_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808488K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808788K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808736K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808480K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808768K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808484K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808840K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808736K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808456K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808788K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808500K) : metal4_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808672K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808768K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808764K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808764K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808788K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808500K) : metal5_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (809116K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808732K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808672K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808796K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808764K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808764K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808788K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808768K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (809116K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808732K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808764K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808796K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808672K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808516K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808764K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808788K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (809116K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808768K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808732K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808748K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808796K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808644K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808468K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808788K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808768K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808536K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808792K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808748K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808744K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808792K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808748K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808464K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808512K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808920K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808812K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808792K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808744K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808440K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808740K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808472K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808812K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808504K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808736K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808780K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808920K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808788K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808788K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808744K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808492K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808736K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808740K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808780K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808920K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808812K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808772K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808788K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808496K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808392K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808716K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808460K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808740K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808780K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808780K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808736K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808772K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808748K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808788K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808788K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808716K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808520K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808768K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808780K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808480K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808748K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808772K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808772K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808736K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808668K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808788K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808768K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808716K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808780K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808748K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808736K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808772K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808668K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808800K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808756K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808768K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808736K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808500K) : metal6_res has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808772K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808756K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808800K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808668K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808800K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808776K) : pr_bndry has 218642 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808756K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808776K) : border has 0 polygons
+2022-12-13 07:38:39 +0000: Memory Usage (808776K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:38:39 +0000: Memory Usage (808768K) : Starting deriving base layers.
+2022-12-13 07:39:28 +0000: Memory Usage (1445564K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:28 +0000: Memory Usage (1445564K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:28 +0000: Memory Usage (1445564K) : Running all FEOL rules
+2022-12-13 07:38:39 +0000: Memory Usage (808748K) : Starting deriving base layers.
+2022-12-13 07:39:28 +0000: Memory Usage (1445540K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:28 +0000: Memory Usage (1445540K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:28 +0000: Memory Usage (1445540K) : Running all FEOL rules
+2022-12-13 07:38:39 +0000: Memory Usage (808752K) : Starting deriving base layers.
+2022-12-13 07:39:28 +0000: Memory Usage (1445540K) : Running all BEOL rules
+2022-12-13 07:39:28 +0000: Memory Usage (1445544K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:28 +0000: Memory Usage (1445544K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:28 +0000: Memory Usage (1445544K) : Running all FEOL rules
+2022-12-13 07:39:28 +0000: Memory Usage (1445540K) : Executing rule DN.1
+2022-12-13 07:39:28 +0000: Memory Usage (1445544K) : Running all BEOL rules
+2022-12-13 07:39:28 +0000: Memory Usage (1445540K) : CONNECTIVITY_RULES disabled section
+2022-12-13 07:39:29 +0000: Memory Usage (1445544K) : Executing rule ESD.1
+2022-12-13 07:39:29 +0000: Memory Usage (1445544K) : Executing rule ESD.2
+2022-12-13 07:39:29 +0000: Memory Usage (1445544K) : Executing rule ESD.3a
+2022-12-13 07:39:29 +0000: Memory Usage (1445544K) : Executing rule ESD.3b
+2022-12-13 07:38:39 +0000: Memory Usage (808764K) : Starting deriving base layers.
+2022-12-13 07:38:39 +0000: Memory Usage (808756K) : Starting deriving base layers.
+2022-12-13 07:38:39 +0000: Memory Usage (808748K) : Starting deriving base layers.
+2022-12-13 07:39:29 +0000: Memory Usage (1445548K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:29 +0000: Memory Usage (1445560K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:29 +0000: Memory Usage (1445540K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:38:39 +0000: Memory Usage (808780K) : Starting deriving base layers.
+2022-12-13 07:39:29 +0000: Memory Usage (1445548K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:29 +0000: Memory Usage (1445560K) : Starting GF180MCU DRC rules.
+2022-12-13 07:38:39 +0000: Memory Usage (808668K) : Starting deriving base layers.
+2022-12-13 07:39:29 +0000: Memory Usage (1445540K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:29 +0000: Memory Usage (1445548K) : Running all FEOL rules
+2022-12-13 07:39:29 +0000: Memory Usage (1445576K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:29 +0000: Memory Usage (1445560K) : Running all FEOL rules
+2022-12-13 07:39:29 +0000: Memory Usage (1445464K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:29 +0000: Memory Usage (1445540K) : Running all FEOL rules
+2022-12-13 07:39:29 +0000: Memory Usage (1445548K) : Running all BEOL rules
+2022-12-13 07:39:29 +0000: Memory Usage (1445576K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:29 +0000: Memory Usage (1445464K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:29 +0000: Memory Usage (1445540K) : Running all BEOL rules
+2022-12-13 07:38:39 +0000: Memory Usage (808764K) : Starting deriving base layers.
+2022-12-13 07:38:39 +0000: Memory Usage (808968K) : Starting deriving base layers.
+2022-12-13 07:39:29 +0000: Memory Usage (1445464K) : Running all FEOL rules
+2022-12-13 07:39:29 +0000: Memory Usage (1445576K) : Running all FEOL rules
+2022-12-13 07:38:39 +0000: Memory Usage (808716K) : Starting deriving base layers.
+2022-12-13 07:39:29 +0000: Memory Usage (1445548K) : Executing rule DV.1
+2022-12-13 07:39:29 +0000: Memory Usage (1445560K) : Running all BEOL rules
+2022-12-13 07:39:29 +0000: Memory Usage (1445556K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:29 +0000: Memory Usage (1445464K) : Running all BEOL rules
+2022-12-13 07:39:29 +0000: Memory Usage (1445760K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:29 +0000: Memory Usage (1445576K) : Running all BEOL rules
+2022-12-13 07:39:29 +0000: Memory Usage (1445512K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445464K) : tail DRC Total Run time 65.305700 seconds
+2022-12-13 07:39:30 +0000: Memory Usage (1445556K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:29 +0000: Memory Usage (1445560K) : Executing rule LPW.1_3.3V
+2022-12-13 07:39:30 +0000: Memory Usage (1445760K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445512K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445556K) : Running all FEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445760K) : Running all FEOL rules
+2022-12-13 07:38:39 +0000: Memory Usage (808748K) : Starting deriving base layers.
+2022-12-13 07:38:39 +0000: Memory Usage (808736K) : Starting deriving base layers.
+2022-12-13 07:39:30 +0000: Memory Usage (1445560K) : Executing rule LPW.1_5V
+2022-12-13 07:39:30 +0000: Memory Usage (1445512K) : Running all FEOL rules
+2022-12-13 07:38:39 +0000: Memory Usage (808772K) : Starting deriving base layers.
+2022-12-13 07:39:30 +0000: Memory Usage (1445540K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445760K) : Running all BEOL rules
+2022-12-13 07:38:39 +0000: Memory Usage (808732K) : Starting deriving base layers.
+2022-12-13 07:39:30 +0000: Memory Usage (1445560K) : CONNECTIVITY_RULES disabled section
+2022-12-13 07:38:39 +0000: Memory Usage (808788K) : Starting deriving base layers.
+2022-12-13 07:39:30 +0000: Memory Usage (1445512K) : Running all BEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445532K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:38:39 +0000: Memory Usage (808672K) : Starting deriving base layers.
+2022-12-13 07:38:39 +0000: Memory Usage (808796K) : Starting deriving base layers.
+2022-12-13 07:38:39 +0000: Memory Usage (809116K) : Starting deriving base layers.
+2022-12-13 07:39:30 +0000: Memory Usage (1445564K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445760K) : OFFGRID-ANGLES section
+2022-12-13 07:39:30 +0000: Memory Usage (1445524K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445540K) : Starting GF180MCU DRC rules.
+2022-12-13 07:38:39 +0000: Memory Usage (808736K) : Starting deriving base layers.
+2022-12-13 07:39:30 +0000: Memory Usage (1445580K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445468K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445532K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445592K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445912K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445560K) : Executing rule LPW.2a_3.3V_
+2022-12-13 07:39:30 +0000: Memory Usage (1445564K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445540K) : Running all FEOL rules
+2022-12-13 07:38:39 +0000: Memory Usage (808792K) : Starting deriving base layers.
+2022-12-13 07:39:30 +0000: Memory Usage (1445524K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445592K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445532K) : Running all FEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445912K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445468K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445532K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445580K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445564K) : Running all FEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445560K) : Executing rule LPW.2a_5V_
+2022-12-13 07:39:30 +0000: Memory Usage (1445588K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:38:39 +0000: Memory Usage (808744K) : Starting deriving base layers.
+2022-12-13 07:39:30 +0000: Memory Usage (1445524K) : Running all FEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445532K) : Running all BEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445912K) : Running all FEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445468K) : Running all FEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445592K) : Running all FEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445532K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445580K) : Running all FEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445564K) : Running all BEOL rules
+2022-12-13 07:38:39 +0000: Memory Usage (808768K) : Starting deriving base layers.
+2022-12-13 07:39:30 +0000: Memory Usage (1445588K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445536K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445524K) : Running all BEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445912K) : Running all BEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445532K) : Running all FEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445580K) : Running all BEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445592K) : Running all BEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445564K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445588K) : Running all FEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445536K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445560K) : Executing rule LPW.3_3.3V
+2022-12-13 07:39:30 +0000: Memory Usage (1445912K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:39:30 +0000: Memory Usage (1445532K) : Running all BEOL rules
+2022-12-13 07:38:39 +0000: Memory Usage (808736K) : Starting deriving base layers.
+2022-12-13 07:39:30 +0000: Memory Usage (1445564K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445588K) : Running all BEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445536K) : Running all FEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445528K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445532K) : Executing rule MC.1
+2022-12-13 07:39:30 +0000: Memory Usage (1445564K) : Running all FEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445536K) : Running all BEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445564K) : Running all BEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445528K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445524K) : Executing rule BJT.1
+2022-12-13 07:39:30 +0000: Memory Usage (1445560K) : Executing rule LPW.4
+2022-12-13 07:39:30 +0000: Memory Usage (1445532K) : Executing rule MC.2
+2022-12-13 07:38:39 +0000: Memory Usage (808788K) : Starting deriving base layers.
+2022-12-13 07:39:30 +0000: Memory Usage (1445760K) : Executing rule comp_OFFGRID
+2022-12-13 07:39:30 +0000: Memory Usage (1445564K) : MetalTop thickness 9k/11k section
+2022-12-13 07:38:39 +0000: Memory Usage (808788K) : Starting deriving base layers.
+2022-12-13 07:39:30 +0000: Memory Usage (1445528K) : Running all FEOL rules
+2022-12-13 07:38:39 +0000: Memory Usage (808788K) : Starting deriving base layers.
+2022-12-13 07:39:30 +0000: Memory Usage (1445580K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445532K) : Executing rule MC.3
+2022-12-13 07:39:30 +0000: Memory Usage (1445760K) : Executing rule dnwell_OFFGRID
+2022-12-13 07:39:30 +0000: Memory Usage (1445580K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445560K) : Executing rule LPW.5
+2022-12-13 07:39:30 +0000: Memory Usage (1445528K) : Running all BEOL rules
+2022-12-13 07:38:39 +0000: Memory Usage (808756K) : Starting deriving base layers.
+2022-12-13 07:39:30 +0000: Memory Usage (1445584K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445580K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445580K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445548K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445584K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445560K) : Executing rule LPW.11
+2022-12-13 07:39:30 +0000: Memory Usage (1445532K) : Executing rule MC.4
+2022-12-13 07:39:30 +0000: Memory Usage (1445580K) : Running all FEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445580K) : Running all FEOL rules
+2022-12-13 07:38:39 +0000: Memory Usage (808812K) : Starting deriving base layers.
+2022-12-13 07:39:30 +0000: Memory Usage (1445548K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445584K) : Running all FEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445580K) : Running all BEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445580K) : Running all BEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445608K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445548K) : Running all FEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445584K) : Running all BEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445608K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445548K) : Running all BEOL rules
+2022-12-13 07:38:39 +0000: Memory Usage (808780K) : Starting deriving base layers.
+2022-12-13 07:39:30 +0000: Memory Usage (1445580K) : Executing rule SB.1
+2022-12-13 07:39:30 +0000: Memory Usage (1445608K) : Running all FEOL rules
+2022-12-13 07:38:39 +0000: Memory Usage (808772K) : Starting deriving base layers.
+2022-12-13 07:38:39 +0000: Memory Usage (808800K) : Starting deriving base layers.
+2022-12-13 07:39:30 +0000: Memory Usage (1445572K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445608K) : Running all BEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445568K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445512K) : Executing rule DE.2
+2022-12-13 07:39:30 +0000: Memory Usage (1445572K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445588K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445568K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445588K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445572K) : Running all FEOL rules
+2022-12-13 07:38:39 +0000: Memory Usage (808776K) : Starting deriving base layers.
+2022-12-13 07:39:30 +0000: Memory Usage (1445568K) : Running all FEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445588K) : Running all FEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445572K) : Running all BEOL rules
+2022-12-13 07:38:39 +0000: Memory Usage (808740K) : Starting deriving base layers.
+2022-12-13 07:39:30 +0000: Memory Usage (1445572K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445588K) : Running all BEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445568K) : Running all BEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445536K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445572K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445580K) : Executing rule SB.2
+2022-12-13 07:39:30 +0000: Memory Usage (1445572K) : Running all FEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445576K) : via5 DRC Total Run time 65.268391 seconds
+2022-12-13 07:39:30 +0000: Memory Usage (1445464K) : tail DRC Total Run time 65.330620 seconds
+2022-12-13 07:39:30 +0000: Memory Usage (1445536K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445572K) : Running all BEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445536K) : Running all FEOL rules
+2022-12-13 07:38:39 +0000: Memory Usage (808920K) : Starting deriving base layers.
+2022-12-13 07:38:39 +0000: Memory Usage (808768K) : Starting deriving base layers.
+2022-12-13 07:39:30 +0000: Memory Usage (1445900K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:39:30 +0000: Memory Usage (1445536K) : Running all BEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1445560K) : Total area of the design is 19856543.89999999 um^2.
+13-Dec-2022 07:39:30 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design ymtp_mk on cell caravel_18000abd:
+2022-12-13 07:39:30 +0000: Memory Usage (1445900K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:30 +0000: Memory Usage (1445560K) : Starting GF180MCU DRC rules.
+2022-12-13 07:39:31 +0000: Memory Usage (1445900K) : Running all FEOL rules
+2022-12-13 07:39:31 +0000: Memory Usage (1445560K) : Running all FEOL rules
+2022-12-13 07:39:31 +0000: Memory Usage (1445560K) : Running all BEOL rules
+2022-12-13 07:39:31 +0000: Memory Usage (1445900K) : Running all BEOL rules
+2022-12-13 07:39:30 +0000: Memory Usage (1446012K) : Executing rule DE.3
+2022-12-13 07:39:31 +0000: Memory Usage (1445560K) : Executing rule O.DF.3a
+2022-12-13 07:39:30 +0000: Memory Usage (1445532K) : mcell DRC Total Run time 65.764913 seconds
+2022-12-13 07:39:31 +0000: Memory Usage (1445900K) : Executing rule DF.1a_3.3V
+2022-12-13 07:39:31 +0000: Memory Usage (1446696K) : Executing rule DE.4
+2022-12-13 07:39:31 +0000: Memory Usage (1445560K) : Executing rule O.DF.6
+2022-12-13 07:39:31 +0000: Memory Usage (1445560K) : Executing rule O.DF.9
+2022-12-13 07:39:29 +0000: Memory Usage (1445544K) : Executing rule ESD.4a
+2022-12-13 07:39:31 +0000: Memory Usage (1446420K) : Executing rule ESD.4b
+2022-12-13 07:39:31 +0000: Memory Usage (1446420K) : Executing rule ESD.5a
+2022-12-13 07:39:31 +0000: Memory Usage (1446420K) : Executing rule ESD.5b
+2022-12-13 07:39:30 +0000: Memory Usage (1445532K) : Executing rule M5.1
+2022-12-13 07:39:30 +0000: Memory Usage (1445564K) : Executing rule MT.1
+2022-12-13 07:39:31 +0000: Memory Usage (1445900K) : Executing rule DF.1a_5V
+2022-12-13 07:39:29 +0000: Memory Usage (1445540K) : Executing rule M4.1
+2022-12-13 07:39:31 +0000: Memory Usage (1446696K) : dummy_exclude DRC Total Run time 66.497270 seconds
+2022-12-13 07:39:31 +0000: Memory Usage (1445900K) : Executing rule DF.1c_3.3V
+2022-12-13 07:39:30 +0000: Memory Usage (1445580K) : Executing rule SB.3
+2022-12-13 07:39:32 +0000: Memory Usage (557316K) : Starting running GF180MCU Klayout DRC runset on /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas
+2022-12-13 07:39:30 +0000: Memory Usage (1445560K) : Executing rule LPW.12
+2022-12-13 07:39:30 +0000: Memory Usage (1445584K) : Executing rule PL.1_3.3V
+2022-12-13 07:39:30 +0000: Memory Usage (1445592K) : MIM Capacitor Option B section
+2022-12-13 07:39:30 +0000: Memory Usage (1445588K) : Executing rule EF.01
+2022-12-13 07:39:32 +0000: Memory Usage (1445560K) : lvpwell DRC Total Run time 67.941976 seconds
+2022-12-13 07:39:30 +0000: Memory Usage (1445912K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:39:32 +0000: Memory Usage (1455468K) : Executing rule MIMTM.1
+2022-12-13 07:39:31 +0000: Memory Usage (1450156K) : Executing rule M5.2a
+2022-12-13 07:39:33 +0000: Memory Usage (1626508K) : Loading database to memory is complete.
+2022-12-13 07:39:31 +0000: Memory Usage (1450188K) : Executing rule MT.2a
+2022-12-13 07:39:33 +0000: Memory Usage (1626508K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_main.lyrdb
+2022-12-13 07:39:32 +0000: Memory Usage (1445580K) : Executing rule SB.4
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:1112: warning: already initialized constant DRC::DRCEngine::CONNECTIVITY_RULES
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:76: warning: previous definition of CONNECTIVITY_RULES was here
+2022-12-13 07:39:33 +0000: Memory Usage (1626508K) : Evaluate switches.
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:1120: warning: already initialized constant DRC::DRCEngine::WEDGE
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:84: warning: previous definition of WEDGE was here
+2022-12-13 07:39:33 +0000: Memory Usage (1626508K) : connectivity rules are disabled.
+2022-12-13 07:39:33 +0000: Memory Usage (1448572K) : Executing rule EF.02
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:1129: warning: already initialized constant DRC::DRCEngine::BALL
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:93: warning: previous definition of BALL was here
+2022-12-13 07:39:33 +0000: Memory Usage (1626508K) : Wedge enabled  true
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:1138: warning: already initialized constant DRC::DRCEngine::GOLD
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:102: warning: previous definition of GOLD was here
+2022-12-13 07:39:33 +0000: Memory Usage (1626508K) : Ball enabled  true
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:1144: warning: already initialized constant DRC::DRCEngine::MIM_OPTION
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:108: warning: previous definition of MIM_OPTION was here
+2022-12-13 07:39:33 +0000: Memory Usage (1626508K) : Gold enabled  true
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:1155: warning: already initialized constant DRC::DRCEngine::OFFGRID
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:119: warning: previous definition of OFFGRID was here
+2022-12-13 07:39:33 +0000: Memory Usage (1626508K) : MIM Option selected B
+2022-12-13 07:39:33 +0000: Memory Usage (1626508K) : Offgrid enabled  true
+2022-12-13 07:39:33 +0000: Memory Usage (1626508K) : Number of threads to use 4
+2022-12-13 07:39:34 +0000: Memory Usage (1626508K) : Verbose mode: false
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:1195: warning: already initialized constant DRC::DRCEngine::METAL_TOP
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:159: warning: previous definition of METAL_TOP was here
+2022-12-13 07:39:34 +0000: Memory Usage (1626508K) : deep  mode is enabled.
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:1204: warning: already initialized constant DRC::DRCEngine::METAL_LEVEL
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:168: warning: previous definition of METAL_LEVEL was here
+2022-12-13 07:39:34 +0000: Memory Usage (1626508K) : METAL_TOP Selected is 9K
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:1216: warning: already initialized constant DRC::DRCEngine::FEOL
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:180: warning: previous definition of FEOL was here
+2022-12-13 07:39:34 +0000: Memory Usage (1626508K) : METAL_STACK Selected is 5LM
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:1225: warning: already initialized constant DRC::DRCEngine::BEOL
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:189: warning: previous definition of BEOL was here
+2022-12-13 07:39:34 +0000: Memory Usage (1626508K) : FEOL is enabled.
+2022-12-13 07:39:34 +0000: Memory Usage (1626508K) : BEOL is enabled.
+2022-12-13 07:39:30 +0000: Memory Usage (1445528K) : Executing rule M3.1
+2022-12-13 07:39:31 +0000: Memory Usage (1455252K) : Executing rule M4.2a
+2022-12-13 07:39:34 +0000: Memory Usage (1626508K) : Read in polygons from layers.
+2022-12-13 07:39:34 +0000: Memory Usage (1630520K) : comp has 675304 polygons
+2022-12-13 07:39:32 +0000: Memory Usage (1448928K) : Executing rule PL.1_5V
+2022-12-13 07:39:34 +0000: Memory Usage (1449736K) : Executing rule PL.1a_3.3V
+2022-12-13 07:39:34 +0000: Memory Usage (1449736K) : Executing rule PL.1a_5V
+2022-12-13 07:39:34 +0000: Memory Usage (1630520K) : dnwell has 0 polygons
+2022-12-13 07:39:30 +0000: Memory Usage (1445548K) : Executing rule NAT.1
+2022-12-13 07:39:33 +0000: Memory Usage (1450156K) : Executing rule M5.2b
+2022-12-13 07:39:31 +0000: Memory Usage (1445560K) : Executing rule O.PL.2
+2022-12-13 07:39:35 +0000: Memory Usage (1450156K) : Executing rule M5.3
+2022-12-13 07:39:33 +0000: Memory Usage (1450188K) : Executing rule MT.2b
+2022-12-13 07:39:35 +0000: Memory Usage (1446212K) : Executing rule NAT.2
+2022-12-13 07:39:35 +0000: Memory Usage (1446212K) : Executing rule NAT.3
+2022-12-13 07:39:35 +0000: Memory Usage (1450188K) : Executing rule MT.4
+2022-12-13 07:39:35 +0000: Memory Usage (1630520K) : nwell has 221165 polygons
+2022-12-13 07:39:32 +0000: Memory Usage (557316K) : Ruby Version for klayout: 2.0.0
+2022-12-13 07:39:35 +0000: Memory Usage (750712K) : Loading database to memory is complete.
+2022-12-13 07:39:35 +0000: Memory Usage (750712K) : GF180MCU Klayout DRC runset output at: /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/caravel_18000abd_ymtp_mk.lyrdb
+2022-12-13 07:39:35 +0000: Memory Usage (750712K) : Evaluate switches.
+2022-12-13 07:39:35 +0000: Memory Usage (750712K) : connectivity rules are disabled.
+2022-12-13 07:39:35 +0000: Memory Usage (750712K) : Wedge enabled  true
+2022-12-13 07:39:35 +0000: Memory Usage (750712K) : Ball enabled  true
+2022-12-13 07:39:35 +0000: Memory Usage (750712K) : Gold enabled  true
+2022-12-13 07:39:35 +0000: Memory Usage (1630520K) : lvpwell has 245301 polygons
+2022-12-13 07:39:35 +0000: Memory Usage (750712K) : MIM Option selected B
+2022-12-13 07:39:33 +0000: Memory Usage (1448572K) : Executing rule EF.03
+2022-12-13 07:39:35 +0000: Memory Usage (750712K) : Offgrid enabled  true
+2022-12-13 07:39:35 +0000: Memory Usage (750712K) : Number of threads to use 4
+2022-12-13 07:39:35 +0000: Memory Usage (750712K) : Verbose mode: false
+2022-12-13 07:39:35 +0000: Memory Usage (750712K) : deep  mode is enabled.
+2022-12-13 07:39:35 +0000: Memory Usage (750712K) : METAL_TOP Selected is 9K
+2022-12-13 07:39:35 +0000: Memory Usage (1448572K) : Executing rule EF.04a
+2022-12-13 07:39:35 +0000: Memory Usage (1630520K) : dualgate has 251510 polygons
+2022-12-13 07:39:35 +0000: Memory Usage (750712K) : METAL_STACK Selected is 5LM
+2022-12-13 07:39:35 +0000: Memory Usage (1450156K) : metal5 DRC Total Run time 70.509163 seconds
+2022-12-13 07:39:35 +0000: Memory Usage (750712K) : FEOL is enabled.
+2022-12-13 07:39:35 +0000: Memory Usage (750712K) : BEOL is enabled.
+2022-12-13 07:39:30 +0000: Memory Usage (1445536K) : Executing rule M2.1
+2022-12-13 07:39:35 +0000: Memory Usage (1450188K) : metaltop DRC Total Run time 70.659481 seconds
+2022-12-13 07:39:30 +0000: Memory Usage (1445556K) : Running all BEOL rules
+2022-12-13 07:39:36 +0000: Memory Usage (1447984K) : Executing rule LRES.1
+2022-12-13 07:39:35 +0000: Memory Usage (1630520K) : poly2 has 928772 polygons
+2022-12-13 07:39:36 +0000: Memory Usage (1447984K) : Executing rule LRES.2
+2022-12-13 07:39:36 +0000: Memory Usage (1447984K) : Executing rule LRES.3
+2022-12-13 07:39:35 +0000: Memory Usage (1448572K) : Executing rule EF.04b
+2022-12-13 07:39:36 +0000: Memory Usage (750712K) : Read in polygons from layers.
+2022-12-13 07:39:36 +0000: Memory Usage (760868K) : comp has 675304 polygons
+2022-12-13 07:39:36 +0000: Memory Usage (1630520K) : nplus has 257767 polygons
+2022-12-13 07:39:36 +0000: Memory Usage (1449304K) : Executing rule EF.04c
+2022-12-13 07:39:36 +0000: Memory Usage (1449304K) : Executing rule EF.04d
+2022-12-13 07:39:36 +0000: Memory Usage (760868K) : dnwell has 0 polygons
+2022-12-13 07:39:36 +0000: Memory Usage (1630520K) : pplus has 269125 polygons
+2022-12-13 07:39:36 +0000: Memory Usage (1630520K) : sab has 1921 polygons
+2022-12-13 07:39:36 +0000: Memory Usage (760868K) : nwell has 221165 polygons
+2022-12-13 07:39:36 +0000: Memory Usage (1630520K) : esd has 0 polygons
+2022-12-13 07:39:37 +0000: Memory Usage (1630520K) : resistor has 1 polygons
+2022-12-13 07:39:36 +0000: Memory Usage (760868K) : lvpwell has 245301 polygons
+2022-12-13 07:39:31 +0000: Memory Usage (1446420K) : Executing rule ESD.6
+2022-12-13 07:39:37 +0000: Memory Usage (1459004K) : Executing rule ESD.7
+2022-12-13 07:39:37 +0000: Memory Usage (1630520K) : fhres has 0 polygons
+2022-12-13 07:39:37 +0000: Memory Usage (1630520K) : fusetop has 9 polygons
+2022-12-13 07:39:37 +0000: Memory Usage (1630520K) : fusewindow_d has 0 polygons
+2022-12-13 07:39:37 +0000: Memory Usage (1630520K) : polyfuse has 0 polygons
+2022-12-13 07:39:37 +0000: Memory Usage (760868K) : dualgate has 251510 polygons
+2022-12-13 07:39:37 +0000: Memory Usage (1630520K) : mvsd has 0 polygons
+2022-12-13 07:39:37 +0000: Memory Usage (1630520K) : mvpsd has 0 polygons
+2022-12-13 07:39:37 +0000: Memory Usage (1630520K) : nat has 0 polygons
+2022-12-13 07:39:37 +0000: Memory Usage (1630520K) : comp_dummy has 0 polygons
+2022-12-13 07:39:37 +0000: Memory Usage (1630520K) : poly2_dummy has 0 polygons
+2022-12-13 07:39:37 +0000: Memory Usage (1630520K) : schottky_diode has 0 polygons
+2022-12-13 07:39:37 +0000: Memory Usage (760868K) : poly2 has 928772 polygons
+2022-12-13 07:39:34 +0000: Memory Usage (1455252K) : Executing rule M4.2b
+2022-12-13 07:39:34 +0000: Memory Usage (1480304K) : Executing rule M3.2a
+2022-12-13 07:39:30 +0000: Memory Usage (1445540K) : Running all BEOL rules
+2022-12-13 07:39:37 +0000: Memory Usage (1455252K) : Executing rule M4.3
+2022-12-13 07:39:37 +0000: Memory Usage (1446344K) : Executing rule PRES.1
+2022-12-13 07:39:30 +0000: Memory Usage (1445760K) : Executing rule nwell_OFFGRID
+2022-12-13 07:39:37 +0000: Memory Usage (1630520K) : zener has 0 polygons
+2022-12-13 07:39:37 +0000: Memory Usage (760868K) : nplus has 257767 polygons
+2022-12-13 07:39:37 +0000: Memory Usage (1630520K) : res_mk has 945 polygons
+2022-12-13 07:39:37 +0000: Memory Usage (1446344K) : Executing rule PRES.2
+2022-12-13 07:39:30 +0000: Memory Usage (1445580K) : Executing rule NP.1
+2022-12-13 07:39:37 +0000: Memory Usage (760868K) : pplus has 269125 polygons
+2022-12-13 07:39:37 +0000: Memory Usage (1630520K) : opc_drc has 0 polygons
+2022-12-13 07:39:30 +0000: Memory Usage (1445608K) : Executing rule PP.1
+2022-12-13 07:39:38 +0000: Memory Usage (760868K) : sab has 1921 polygons
+2022-12-13 07:39:38 +0000: Memory Usage (1630520K) : ndmy has 8 polygons
+2022-12-13 07:39:38 +0000: Memory Usage (1446344K) : Executing rule PRES.3
+2022-12-13 07:39:32 +0000: Memory Usage (1447452K) : Executing rule DF.1c_5V
+2022-12-13 07:39:38 +0000: Memory Usage (760868K) : esd has 0 polygons
+2022-12-13 07:39:37 +0000: Memory Usage (1455252K) : metal4 DRC Total Run time 73.058885 seconds
+2022-12-13 07:39:38 +0000: Memory Usage (760868K) : resistor has 1 polygons
+2022-12-13 07:39:38 +0000: Memory Usage (1630520K) : pmndmy has 8 polygons
+2022-12-13 07:39:30 +0000: Memory Usage (1445580K) : Executing rule CO.1
+2022-12-13 07:39:36 +0000: Memory Usage (1447984K) : Executing rule LRES.4
+2022-12-13 07:39:35 +0000: Memory Usage (1446796K) : Executing rule O.PL.3a
+2022-12-13 07:39:38 +0000: Memory Usage (1450180K) : Executing rule O.PL.4
+2022-12-13 07:39:38 +0000: Memory Usage (1630520K) : v5_xtor has 205372 polygons
+2022-12-13 07:39:38 +0000: Memory Usage (1450180K) : Executing rule O.SB.2
+2022-12-13 07:39:38 +0000: Memory Usage (760868K) : fhres has 0 polygons
+2022-12-13 07:39:38 +0000: Memory Usage (760868K) : fusetop has 9 polygons
+2022-12-13 07:39:38 +0000: Memory Usage (1630520K) : cap_mk has 9 polygons
+2022-12-13 07:39:38 +0000: Memory Usage (760868K) : fusewindow_d has 0 polygons
+2022-12-13 07:39:38 +0000: Memory Usage (1630520K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:39:38 +0000: Memory Usage (760868K) : polyfuse has 0 polygons
+2022-12-13 07:39:38 +0000: Memory Usage (760868K) : mvsd has 0 polygons
+2022-12-13 07:39:33 +0000: Memory Usage (1445580K) : Executing rule SB.5a
+2022-12-13 07:39:38 +0000: Memory Usage (760868K) : mvpsd has 0 polygons
+2022-12-13 07:39:38 +0000: Memory Usage (760868K) : nat has 0 polygons
+2022-12-13 07:39:38 +0000: Memory Usage (760868K) : comp_dummy has 0 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (760868K) : poly2_dummy has 0 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (760868K) : schottky_diode has 0 polygons
+2022-12-13 07:39:38 +0000: Memory Usage (1630520K) : ind_mk has 0 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (1630520K) : diode_mk has 2669 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (1630520K) : drc_bjt has 0 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (1630520K) : lvs_bjt has 0 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (760868K) : zener has 0 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (760868K) : res_mk has 945 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (1630520K) : mim_l_mk has 0 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (1630520K) : latchup_mk has 90 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (1630520K) : guard_ring_mk has 0 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (1630520K) : otp_mk has 0 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (1630520K) : mtpmark has 0 polygons
+2022-12-13 07:39:30 +0000: Memory Usage (1445572K) : Executing rule V1.1
+2022-12-13 07:39:39 +0000: Memory Usage (760868K) : opc_drc has 0 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (760868K) : ndmy has 8 polygons
+2022-12-13 07:39:36 +0000: Memory Usage (1449304K) : Executing rule EF.05
+2022-12-13 07:39:39 +0000: Memory Usage (1630520K) : neo_ee_mk has 0 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (1630520K) : sramcore has 20840 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (1630520K) : lvs_rf has 0 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (760868K) : pmndmy has 8 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (1630520K) : lvs_drain has 0 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (1630520K) : ind_mk has 0 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (1452252K) : Executing rule EF.06
+2022-12-13 07:39:38 +0000: Memory Usage (1672964K) : Executing rule CO.2a
+2022-12-13 07:39:39 +0000: Memory Usage (1630520K) : hvpolyrs has 0 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (1630520K) : lvs_io has 90 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (760868K) : v5_xtor has 205372 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (760868K) : cap_mk has 9 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (1630520K) : probe_mk has 0 polygons
+2022-12-13 07:39:38 +0000: Memory Usage (1447452K) : Executing rule DF.2a_3.3V
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : mos_cap_mk has 34420 polygons
+2022-12-13 07:39:33 +0000: Memory Usage (1455468K) : Executing rule MIMTM.2
+2022-12-13 07:39:40 +0000: Memory Usage (1630520K) : esd_mk has 90 polygons
+2022-12-13 07:39:38 +0000: Memory Usage (1450180K) : Executing rule O.SB.3
+2022-12-13 07:39:40 +0000: Memory Usage (1630520K) : lvs_source has 900 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (1630520K) : well_diode_mk has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (1450180K) : Executing rule O.SB.4
+2022-12-13 07:39:28 +0000: Memory Usage (1445564K) : Running all BEOL rules
+2022-12-13 07:39:40 +0000: Memory Usage (1630520K) : ldmos_xtor has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (1630520K) : plfuse has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : ind_mk has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (1630520K) : efuse_mk has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : diode_mk has 2669 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : drc_bjt has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (1630520K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : lvs_bjt has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (1630520K) : ymtp_mk has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (1630520K) : dev_wf_mk has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : mim_l_mk has 0 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (1452252K) : Executing rule EF.07
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : latchup_mk has 90 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (1630520K) : comp_label has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : guard_ring_mk has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (1630520K) : poly2_label has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : otp_mk has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : mtpmark has 0 polygons
+2022-12-13 07:39:39 +0000: Memory Usage (1776876K) : Executing rule V1.2a
+2022-12-13 07:39:38 +0000: Memory Usage (1446344K) : Executing rule PRES.4
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : neo_ee_mk has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (1534496K) : Executing rule MIMTM.3
+2022-12-13 07:39:40 +0000: Memory Usage (1452252K) : Executing rule EF.08
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : sramcore has 20840 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : lvs_rf has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : lvs_drain has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : ind_mk has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : hvpolyrs has 0 polygons
+2022-12-13 07:39:30 +0000: Memory Usage (1445468K) : Running all BEOL rules
+2022-12-13 07:39:40 +0000: Memory Usage (1630520K) : mdiode has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : lvs_io has 90 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (1479328K) : Executing rule LVS_BJT.1
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : probe_mk has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (1452252K) : Executing rule EF.09
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : esd_mk has 90 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (1452252K) : Executing rule EF.10
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : lvs_source has 900 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (1448304K) : Executing rule HRES.1
+2022-12-13 07:39:40 +0000: Memory Usage (1452252K) : Executing rule EF.11
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : well_diode_mk has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : ldmos_xtor has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (1448304K) : Executing rule HRES.2
+2022-12-13 07:39:29 +0000: Memory Usage (1445548K) : Executing rule DV.2
+2022-12-13 07:39:40 +0000: Memory Usage (1452252K) : Executing rule EF.12
+2022-12-13 07:39:40 +0000: Memory Usage (760868K) : plfuse has 0 polygons
+2022-12-13 07:39:41 +0000: Memory Usage (760868K) : efuse_mk has 0 polygons
+2022-12-13 07:39:41 +0000: Memory Usage (1452252K) : Executing rule EF.13
+2022-12-13 07:39:41 +0000: Memory Usage (760868K) : mcell_feol_mk has 0 polygons
+2022-12-13 07:39:41 +0000: Memory Usage (760868K) : ymtp_mk has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (1448304K) : Executing rule HRES.3
+2022-12-13 07:39:41 +0000: Memory Usage (1452252K) : Executing rule EF.14
+2022-12-13 07:39:41 +0000: Memory Usage (760868K) : dev_wf_mk has 0 polygons
+2022-12-13 07:39:41 +0000: Memory Usage (1452252K) : Executing rule EF.15
+2022-12-13 07:39:41 +0000: Memory Usage (760868K) : comp_label has 0 polygons
+2022-12-13 07:39:41 +0000: Memory Usage (1452252K) : Executing rule EF.16a
+2022-12-13 07:39:41 +0000: Memory Usage (760868K) : poly2_label has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (1630520K) : contact has 8949189 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (1534496K) : Executing rule MIMTM.4
+2022-12-13 07:39:41 +0000: Memory Usage (1452252K) : Executing rule EF.16b
+2022-12-13 07:39:41 +0000: Memory Usage (1634700K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:39:41 +0000: Memory Usage (1452252K) : Executing rule EF.17
+2022-12-13 07:39:41 +0000: Memory Usage (1452252K) : Executing rule EF.18
+2022-12-13 07:39:41 +0000: Memory Usage (1452252K) : Executing rule EF.19
+2022-12-13 07:39:41 +0000: Memory Usage (760868K) : mdiode has 0 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (1479328K) : lvs_bjt DRC Total Run time 76.199034 seconds
+2022-12-13 07:39:41 +0000: Memory Usage (1634700K) : metal1_dummy has 0 polygons
+2022-12-13 07:39:41 +0000: Memory Usage (1636936K) : metal1_label has 19 polygons
+2022-12-13 07:39:41 +0000: Memory Usage (1448304K) : Executing rule HRES.4
+2022-12-13 07:39:41 +0000: Memory Usage (1636936K) : metal1_slot has 0 polygons
+2022-12-13 07:39:38 +0000: Memory Usage (1452424K) : Executing rule SB.5b
+2022-12-13 07:39:41 +0000: Memory Usage (763000K) : contact has 8949189 polygons
+2022-12-13 07:39:35 +0000: Memory Usage (1446212K) : Executing rule NAT.4
+2022-12-13 07:39:42 +0000: Memory Usage (766840K) : metal1_drawn has 2416945 polygons
+2022-12-13 07:39:41 +0000: Memory Usage (1636936K) : metal1_blk has 0 polygons
+2022-12-13 07:39:41 +0000: Memory Usage (1452424K) : Executing rule SB.6
+2022-12-13 07:39:42 +0000: Memory Usage (766840K) : metal1_dummy has 0 polygons
+2022-12-13 07:39:42 +0000: Memory Usage (770872K) : metal1_label has 19 polygons
+2022-12-13 07:39:42 +0000: Memory Usage (770872K) : metal1_slot has 0 polygons
+2022-12-13 07:39:42 +0000: Memory Usage (1452424K) : Executing rule SB.7
+2022-12-13 07:39:41 +0000: Memory Usage (1448304K) : Executing rule HRES.5
+2022-12-13 07:39:42 +0000: Memory Usage (1641032K) : via1 has 1473783 polygons
+2022-12-13 07:39:40 +0000: Memory Usage (1450180K) : Executing rule O.SB.5b_3.3V
+2022-12-13 07:39:42 +0000: Memory Usage (1645128K) : metal2_drawn has 506494 polygons
+2022-12-13 07:39:42 +0000: Memory Usage (770872K) : metal1_blk has 0 polygons
+2022-12-13 07:39:41 +0000: Memory Usage (1452252K) : Executing rule EF.20
+2022-12-13 07:39:42 +0000: Memory Usage (1645128K) : metal2_dummy has 0 polygons
+2022-12-13 07:39:43 +0000: Memory Usage (1645128K) : metal2_label has 2097 polygons
+2022-12-13 07:39:43 +0000: Memory Usage (1645128K) : metal2_slot has 0 polygons
+2022-12-13 07:39:36 +0000: Memory Usage (1502396K) : Executing rule M2.2a
+2022-12-13 07:39:42 +0000: Memory Usage (1450476K) : Executing rule O.SB.9
+2022-12-13 07:39:43 +0000: Memory Usage (1450476K) : Executing rule O.SB.11
+2022-12-13 07:39:43 +0000: Memory Usage (1450476K) : Executing rule O.SB.13_3.3V
+2022-12-13 07:39:43 +0000: Memory Usage (1450476K) : Executing rule O.SB.13_5V
+2022-12-13 07:39:42 +0000: Memory Usage (775912K) : via1 has 1473783 polygons
+2022-12-13 07:39:43 +0000: Memory Usage (784184K) : metal2_drawn has 506494 polygons
+2022-12-13 07:39:43 +0000: Memory Usage (1645128K) : metal2_blk has 0 polygons
+2022-12-13 07:39:42 +0000: Memory Usage (1452652K) : Executing rule EF.21
+2022-12-13 07:39:43 +0000: Memory Usage (784184K) : metal2_dummy has 0 polygons
+2022-12-13 07:39:43 +0000: Memory Usage (787288K) : metal2_label has 2097 polygons
+2022-12-13 07:39:43 +0000: Memory Usage (787288K) : metal2_slot has 0 polygons
+2022-12-13 07:39:43 +0000: Memory Usage (1645128K) : via2 has 1870904 polygons
+2022-12-13 07:39:43 +0000: Memory Usage (1452652K) : Executing rule EF.22a
+2022-12-13 07:39:44 +0000: Memory Usage (1645128K) : metal3_drawn has 277166 polygons
+2022-12-13 07:39:43 +0000: Memory Usage (787288K) : metal2_blk has 0 polygons
+2022-12-13 07:39:44 +0000: Memory Usage (1645128K) : metal3_dummy has 0 polygons
+2022-12-13 07:39:44 +0000: Memory Usage (1645128K) : metal3_label has 494 polygons
+2022-12-13 07:39:44 +0000: Memory Usage (1452652K) : Executing rule EF.22b
+2022-12-13 07:39:44 +0000: Memory Usage (1645128K) : metal3_slot has 0 polygons
+2022-12-13 07:39:37 +0000: Memory Usage (1498720K) : Executing rule lvpwell_OFFGRID
+2022-12-13 07:39:44 +0000: Memory Usage (793432K) : via2 has 1870904 polygons
+2022-12-13 07:39:44 +0000: Memory Usage (795564K) : metal3_drawn has 277166 polygons
+2022-12-13 07:39:44 +0000: Memory Usage (795564K) : metal3_dummy has 0 polygons
+2022-12-13 07:39:45 +0000: Memory Usage (797036K) : metal3_label has 494 polygons
+2022-12-13 07:39:45 +0000: Memory Usage (797036K) : metal3_slot has 0 polygons
+2022-12-13 07:39:44 +0000: Memory Usage (1645128K) : metal3_blk has 0 polygons
+2022-12-13 07:39:45 +0000: Memory Usage (1645128K) : metal4_drawn has 142068 polygons
+2022-12-13 07:39:44 +0000: Memory Usage (1452652K) : efuse DRC Total Run time 79.937047 seconds
+2022-12-13 07:39:45 +0000: Memory Usage (1645128K) : metal4_dummy has 0 polygons
+2022-12-13 07:39:45 +0000: Memory Usage (1645128K) : metal4_label has 360 polygons
+2022-12-13 07:39:45 +0000: Memory Usage (1645128K) : metal4_slot has 0 polygons
+2022-12-13 07:39:45 +0000: Memory Usage (797036K) : metal3_blk has 0 polygons
+2022-12-13 07:39:45 +0000: Memory Usage (801516K) : metal4_drawn has 142068 polygons
+2022-12-13 07:39:45 +0000: Memory Usage (1645128K) : metal4_blk has 0 polygons
+2022-12-13 07:39:45 +0000: Memory Usage (801516K) : metal4_dummy has 0 polygons
+2022-12-13 07:39:46 +0000: Memory Usage (802184K) : metal4_label has 360 polygons
+2022-12-13 07:39:46 +0000: Memory Usage (802184K) : metal4_slot has 0 polygons
+2022-12-13 07:39:46 +0000: Memory Usage (1645128K) : via4 has 9157574 polygons
+2022-12-13 07:39:38 +0000: Memory Usage (1498504K) : Executing rule PP.2
+2022-12-13 07:39:46 +0000: Memory Usage (1645128K) : metal5_drawn has 84478 polygons
+2022-12-13 07:39:38 +0000: Memory Usage (1496536K) : Executing rule NP.2
+2022-12-13 07:39:42 +0000: Memory Usage (1452424K) : Executing rule SB.8
+2022-12-13 07:39:46 +0000: Memory Usage (1645128K) : metal5_dummy has 0 polygons
+2022-12-13 07:39:46 +0000: Memory Usage (802184K) : metal4_blk has 0 polygons
+2022-12-13 07:39:46 +0000: Memory Usage (1645128K) : metal5_label has 510 polygons
+2022-12-13 07:39:46 +0000: Memory Usage (1645128K) : metal5_slot has 0 polygons
+2022-12-13 07:39:37 +0000: Memory Usage (1459004K) : Executing rule ESD.8
+2022-12-13 07:39:46 +0000: Memory Usage (1645128K) : metal5_blk has 0 polygons
+2022-12-13 07:39:46 +0000: Memory Usage (1645128K) : pad has 63 polygons
+2022-12-13 07:39:46 +0000: Memory Usage (1645128K) : ubmpperi has 0 polygons
+2022-12-13 07:39:46 +0000: Memory Usage (1645128K) : ubmparray has 0 polygons
+2022-12-13 07:39:46 +0000: Memory Usage (1645128K) : ubmeplate has 0 polygons
+2022-12-13 07:39:46 +0000: Memory Usage (807900K) : via4 has 9157574 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (1645128K) : metal1_res has 0 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (807900K) : metal5_drawn has 84478 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (1645128K) : metal2_res has 0 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (1645128K) : metal3_res has 0 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (1645128K) : metal4_res has 0 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (1645128K) : metal5_res has 0 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (807900K) : metal5_dummy has 0 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (808492K) : metal5_label has 510 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (808492K) : metal5_slot has 0 polygons
+2022-12-13 07:39:34 +0000: Memory Usage (1449736K) : Executing rule PL.2_3.3V
+2022-12-13 07:39:47 +0000: Memory Usage (808492K) : metal5_blk has 0 polygons
+2022-12-13 07:39:46 +0000: Memory Usage (1487920K) : Executing rule SB.9
+2022-12-13 07:39:47 +0000: Memory Usage (808492K) : pad has 63 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (808492K) : ubmpperi has 0 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (808492K) : ubmparray has 0 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (808492K) : ubmeplate has 0 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (1459660K) : Executing rule PL.2_5V
+2022-12-13 07:39:47 +0000: Memory Usage (1645128K) : metal6_res has 0 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (808492K) : metal1_res has 0 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (808492K) : metal2_res has 0 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (1645128K) : pr_bndry has 218642 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (808492K) : metal3_res has 0 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (1645128K) : border has 0 polygons
+2022-12-13 07:39:41 +0000: Memory Usage (1534496K) : Executing rule MIMTM.5
+2022-12-13 07:39:47 +0000: Memory Usage (808492K) : metal4_res has 0 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (808492K) : metal5_res has 0 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (1645128K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:39:47 +0000: Memory Usage (1534496K) : Executing rule MIMTM.6
+2022-12-13 07:39:47 +0000: Memory Usage (1534496K) : Executing rule MIMTM.7
+2022-12-13 07:39:47 +0000: Memory Usage (808492K) : metal6_res has 0 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (808700K) : pr_bndry has 218642 polygons
+2022-12-13 07:39:46 +0000: Memory Usage (1490436K) : Executing rule ESD.pl
+2022-12-13 07:39:47 +0000: Memory Usage (808700K) : border has 0 polygons
+2022-12-13 07:39:47 +0000: Memory Usage (1498708K) : Executing rule ESD.9
+2022-12-13 07:39:47 +0000: Memory Usage (808700K) : Total no. of polygons in the design is 28217102
+2022-12-13 07:39:40 +0000: Memory Usage (1449452K) : Executing rule PRES.5
+2022-12-13 07:39:47 +0000: Memory Usage (1498708K) : Executing rule ESD.10
+2022-12-13 07:39:47 +0000: Memory Usage (1534496K) : Executing rule MIMTM.8a
+2022-12-13 07:39:48 +0000: Memory Usage (1534496K) : Executing rule MIMTM.8b
+2022-12-13 07:39:47 +0000: Memory Usage (1499824K) : Executing rule PRES.6
+2022-12-13 07:39:42 +0000: Memory Usage (1448304K) : Executing rule HRES.6
+2022-12-13 07:39:43 +0000: Memory Usage (1450476K) : Executing rule O.CO.7
+2022-12-13 07:39:47 +0000: Memory Usage (1498708K) : esd DRC Total Run time 83.327961 seconds
+2022-12-13 07:39:48 +0000: Memory Usage (1534496K) : Executing rule MIMTM.9
+2022-12-13 07:39:42 +0000: Memory Usage (1451152K) : Executing rule NAT.5
+2022-12-13 07:39:48 +0000: Memory Usage (1451316K) : Executing rule NAT.7
+2022-12-13 07:39:30 +0000: Memory Usage (1445524K) : Executing rule BJT.2
+2022-12-13 07:39:43 +0000: Memory Usage (1502396K) : Executing rule M2.2b
+2022-12-13 07:39:49 +0000: Memory Usage (1451316K) : Executing rule NAT.8
+2022-12-13 07:39:49 +0000: Memory Usage (1451316K) : Executing rule NAT.9
+2022-12-13 07:39:49 +0000: Memory Usage (1479808K) : Executing rule BJT.3
+2022-12-13 07:39:49 +0000: Memory Usage (1451316K) : Executing rule NAT.10
+2022-12-13 07:39:49 +0000: Memory Usage (1502396K) : Executing rule M2.3
+2022-12-13 07:39:49 +0000: Memory Usage (1451316K) : Executing rule NAT.11
+2022-12-13 07:39:49 +0000: Memory Usage (1451316K) : Executing rule NAT.12
+2022-12-13 07:39:38 +0000: Memory Usage (1449968K) : Executing rule LRES.5
+2022-12-13 07:39:47 +0000: Memory Usage (1487920K) : Executing rule SB.10
+2022-12-13 07:39:49 +0000: Memory Usage (1479808K) : drc_bjt DRC Total Run time 84.618810 seconds
+2022-12-13 07:39:49 +0000: Memory Usage (1487920K) : Executing rule SB.11
+2022-12-13 07:39:49 +0000: Memory Usage (1451316K) : nat DRC Total Run time 84.706300 seconds
+2022-12-13 07:39:49 +0000: Memory Usage (1502396K) : metal2 DRC Total Run time 84.613809 seconds
+2022-12-13 07:39:49 +0000: Memory Usage (1487920K) : Executing rule SB.12
+2022-12-13 07:39:51 +0000: Memory Usage (1487920K) : Executing rule SB.13
+2022-12-13 07:39:39 +0000: Memory Usage (1672964K) : Executing rule CO.2b
+2022-12-13 07:39:40 +0000: Memory Usage (1776876K) : Executing rule V1.2b
+2022-12-13 07:39:47 +0000: Memory Usage (1459660K) : Executing rule PL.3a_3.3V
+2022-12-13 07:39:44 +0000: Memory Usage (1498720K) : Executing rule dualgate_OFFGRID
+2022-12-13 07:39:48 +0000: Memory Usage (1489256K) : Executing rule O.PL.ORT
+2022-12-13 07:39:40 +0000: Memory Usage (1450172K) : Executing rule DF.2a_5V
+2022-12-13 07:39:53 +0000: Memory Usage (1535976K) : otp_mk DRC Total Run time 88.906669 seconds
+2022-12-13 07:39:49 +0000: Memory Usage (1449968K) : Executing rule LRES.6
+2022-12-13 07:39:53 +0000: Memory Usage (1485080K) : Executing rule poly2_OFFGRID
+2022-12-13 07:39:51 +0000: Memory Usage (1672964K) : Executing rule CO.3
+2022-12-13 07:39:37 +0000: Memory Usage (1480304K) : Executing rule M3.2b
+2022-12-13 07:39:55 +0000: Memory Usage (1873520K) : Executing rule M3.3
+2022-12-13 07:39:51 +0000: Memory Usage (1459660K) : Executing rule PL.3a_5V
+2022-12-13 07:39:41 +0000: Memory Usage (1511084K) : Executing rule DV.3
+2022-12-13 07:39:56 +0000: Memory Usage (1873520K) : metal3 DRC Total Run time 91.319535 seconds
+2022-12-13 07:39:55 +0000: Memory Usage (1672964K) : Executing rule CO.4
+2022-12-13 07:39:48 +0000: Memory Usage (1499824K) : Executing rule PRES.7
+2022-12-13 07:39:30 +0000: Memory Usage (1445588K) : Executing rule S.DF.4c_MV
+2022-12-13 07:39:48 +0000: Memory Usage (1534496K) : Executing rule MIMTM.10
+2022-12-13 07:39:58 +0000: Memory Usage (1546272K) : Executing rule MIMTM.11
+2022-12-13 07:39:57 +0000: Memory Usage (1507052K) : Executing rule PRES.9a
+2022-12-13 07:39:58 +0000: Memory Usage (1507052K) : Executing rule PRES.9b
+2022-12-13 07:39:54 +0000: Memory Usage (1449968K) : Executing rule LRES.7
+2022-12-13 07:39:58 +0000: Memory Usage (1546272K) : mim DRC Total Run time 93.452517 seconds
+2022-12-13 07:39:48 +0000: Memory Usage (1448304K) : Executing rule HRES.7
+2022-12-13 07:39:58 +0000: Memory Usage (1507052K) : pres DRC Total Run time 93.688718 seconds
+2022-12-13 07:39:56 +0000: Memory Usage (1459660K) : Executing rule PL.4_3.3V
+2022-12-13 07:39:51 +0000: Memory Usage (1776876K) : Executing rule V1.3a
+2022-12-13 07:39:57 +0000: Memory Usage (1672964K) : Executing rule CO.5a
+2022-12-13 07:39:58 +0000: Memory Usage (1449968K) : Executing rule LRES.9a
+2022-12-13 07:39:51 +0000: Memory Usage (1487920K) : Executing rule SB.14a
+2022-12-13 07:39:59 +0000: Memory Usage (1449968K) : Executing rule LRES.9b
+2022-12-13 07:39:46 +0000: Memory Usage (1564040K) : Executing rule PP.3a
+2022-12-13 07:39:57 +0000: Memory Usage (1500480K) : Executing rule S.DF.6_MV
+2022-12-13 07:40:00 +0000: Memory Usage (1500480K) : Executing rule S.DF.7_MV
+2022-12-13 07:39:59 +0000: Memory Usage (1449968K) : lres DRC Total Run time 95.325687 seconds
+2022-12-13 07:40:00 +0000: Memory Usage (1500480K) : Executing rule S.DF.8_MV
+2022-12-13 07:40:00 +0000: Memory Usage (1498504K) : Executing rule PP.3bi
+2022-12-13 07:39:59 +0000: Memory Usage (1459660K) : Executing rule PL.4_5V
+2022-12-13 07:39:55 +0000: Memory Usage (1496512K) : Executing rule nplus_OFFGRID
+2022-12-13 07:40:01 +0000: Memory Usage (1459660K) : Executing rule PL.5a_3.3V
+2022-12-13 07:39:59 +0000: Memory Usage (1502408K) : Executing rule HRES.8
+2022-12-13 07:39:30 +0000: Memory Usage (1445536K) : Executing rule M1.1
+2022-12-13 07:39:59 +0000: Memory Usage (1487920K) : Executing rule SB.14b
+2022-12-13 07:40:02 +0000: Memory Usage (1459660K) : Executing rule PL.5a_5V
+2022-12-13 07:40:02 +0000: Memory Usage (1502408K) : Executing rule HRES.9
+2022-12-13 07:39:46 +0000: Memory Usage (1562072K) : Executing rule NP.3a
+2022-12-13 07:40:03 +0000: Memory Usage (1459660K) : Executing rule PL.5b_3.3V
+2022-12-13 07:39:59 +0000: Memory Usage (1672964K) : Executing rule CO.5b
+2022-12-13 07:40:01 +0000: Memory Usage (1499132K) : Executing rule pplus_OFFGRID
+2022-12-13 07:40:06 +0000: Memory Usage (1502704K) : Executing rule sab_OFFGRID
+2022-12-13 07:40:06 +0000: Memory Usage (1502704K) : Executing rule esd_OFFGRID
+2022-12-13 07:40:04 +0000: Memory Usage (1526144K) : Executing rule NP.3bi
+2022-12-13 07:40:00 +0000: Memory Usage (1498504K) : Executing rule PP.3bii
+2022-12-13 07:40:06 +0000: Memory Usage (1502704K) : Executing rule contact_OFFGRID
+2022-12-13 07:40:00 +0000: Memory Usage (1500480K) : Executing rule S.DF.16_MV
+2022-12-13 07:40:05 +0000: Memory Usage (1672964K) : Executing rule CO.6
+2022-12-13 07:40:12 +0000: Memory Usage (1504696K) : Executing rule S.PL.5a_MV
+2022-12-13 07:40:03 +0000: Memory Usage (1502408K) : Executing rule HRES.10
+2022-12-13 07:40:05 +0000: Memory Usage (1459660K) : Executing rule PL.5b_5V
+2022-12-13 07:40:13 +0000: Memory Usage (1544696K) : Executing rule HRES.12a
+2022-12-13 07:40:14 +0000: Memory Usage (1544696K) : Executing rule HRES.12b
+2022-12-13 07:39:30 +0000: Memory Usage (1445564K) : Executing rule V4.1
+2022-12-13 07:40:13 +0000: Memory Usage (1504696K) : Executing rule S.PL.5b_MV
+2022-12-13 07:40:15 +0000: Memory Usage (1544696K) : hres DRC Total Run time 110.583216 seconds
+2022-12-13 07:40:15 +0000: Memory Usage (1838952K) : Executing rule V4.2a
+2022-12-13 07:40:14 +0000: Memory Usage (1459660K) : Executing rule PL.6
+2022-12-13 07:40:19 +0000: Memory Usage (1459660K) : Executing rule PL.7_3.3V
+2022-12-13 07:40:08 +0000: Memory Usage (1526144K) : Executing rule NP.3bii
+2022-12-13 07:39:47 +0000: Memory Usage (808700K) : Starting deriving base layers.
+2022-12-13 07:40:24 +0000: Memory Usage (1445564K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:40:24 +0000: Memory Usage (1445564K) : Starting GF180MCU DRC rules.
+2022-12-13 07:40:24 +0000: Memory Usage (1445564K) : Running all FEOL rules
+2022-12-13 07:40:24 +0000: Memory Usage (1445564K) : Running all BEOL rules
+2022-12-13 07:40:24 +0000: Memory Usage (1445564K) : Executing rule Y.NW.2b_3.3V
+2022-12-13 07:40:24 +0000: Memory Usage (1445564K) : Executing rule Y.NW.2b_5V
+2022-12-13 07:40:09 +0000: Memory Usage (1502024K) : Executing rule PP.3ci
+2022-12-13 07:40:24 +0000: Memory Usage (1445564K) : Executing rule Y.DF.6_5V
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:2056: warning: already initialized constant DRC::DRCEngine::CHIP
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc:1020: warning: previous definition of CHIP was here
+2022-12-13 07:39:47 +0000: Memory Usage (1645128K) : Starting deriving base layers.
+2022-12-13 07:40:25 +0000: Memory Usage (1737204K) : Total area of the design is 19856543.89999999 um^2.
+2022-12-13 07:40:25 +0000: Memory Usage (1737204K) : Starting GF180MCU DRC rules.
+2022-12-13 07:40:25 +0000: Memory Usage (1737204K) : Running all FEOL rules
+2022-12-13 07:40:25 +0000: Memory Usage (1737204K) : Running all BEOL rules
+2022-12-13 07:40:25 +0000: Memory Usage (1502840K) : Executing rule PP.3cii
+2022-12-13 07:40:25 +0000: Memory Usage (1737204K) : main DRC Total Run time 55.360298 seconds
+2022-12-13 07:40:15 +0000: Memory Usage (1504696K) : Executing rule S.CO.4_MV
+2022-12-13 07:40:17 +0000: Memory Usage (1838952K) : Executing rule V4.2b
+2022-12-13 07:40:21 +0000: Memory Usage (1528304K) : Executing rule PL.7_5V
+2022-12-13 07:40:26 +0000: Memory Usage (1502840K) : Executing rule PP.3d
+2022-12-13 07:40:25 +0000: Memory Usage (1445564K) : Executing rule Y.DF.16_3.3V
+2022-12-13 07:40:10 +0000: Memory Usage (1512228K) : Executing rule metal1_OFFGRID
+2022-12-13 07:40:31 +0000: Memory Usage (1448636K) : Executing rule Y.DF.16_5V
+2022-12-13 07:40:34 +0000: Memory Usage (1448636K) : Executing rule Y.PL.1_3.3V
+2022-12-13 07:40:35 +0000: Memory Usage (1448636K) : Executing rule Y.PL.1_5V
+2022-12-13 07:40:23 +0000: Memory Usage (1526144K) : Executing rule NP.3ci
+2022-12-13 07:40:30 +0000: Memory Usage (1510872K) : Executing rule PP.3e
+2022-12-13 07:40:33 +0000: Memory Usage (1668644K) : Executing rule via1_OFFGRID
+2022-12-13 07:40:35 +0000: Memory Usage (1526144K) : Executing rule NP.3cii
+2022-12-13 07:40:35 +0000: Memory Usage (1448636K) : Executing rule Y.PL.2_3.3V
+2022-12-13 07:40:36 +0000: Memory Usage (1526144K) : Executing rule NP.3d
+2022-12-13 07:40:30 +0000: Memory Usage (1536664K) : Executing rule PL.9
+2022-12-13 07:40:36 +0000: Memory Usage (1668644K) : Executing rule metal2_OFFGRID
+2022-12-13 07:40:38 +0000: Memory Usage (1448636K) : Executing rule Y.PL.2_5V
+2022-12-13 07:40:41 +0000: Memory Usage (1448636K) : Executing rule Y.PL.4_5V
+2022-12-13 07:40:41 +0000: Memory Usage (1448636K) : Executing rule Y.PL.5a_3.3V
+2022-12-13 07:40:41 +0000: Memory Usage (1448636K) : Executing rule Y.PL.5a_5V
+2022-12-13 07:40:41 +0000: Memory Usage (1448636K) : Executing rule Y.PL.5b_3.3V
+2022-12-13 07:40:41 +0000: Memory Usage (1448636K) : Executing rule Y.PL.5b_5V
+2022-12-13 07:40:39 +0000: Memory Usage (1526144K) : Executing rule NP.3e
+2022-12-13 07:40:42 +0000: Memory Usage (1448636K) : ymtp_mk DRC Total Run time 69.537688 seconds
+2022-12-13 07:40:30 +0000: Memory Usage (1838952K) : Executing rule V4.3a
+2022-12-13 07:40:43 +0000: Memory Usage (1838952K) : Executing rule V4.3c
+2022-12-13 07:40:36 +0000: Memory Usage (1510872K) : Executing rule PP.4a
+2022-12-13 07:40:50 +0000: Memory Usage (1510872K) : Executing rule PP.4b
+2022-12-13 07:40:41 +0000: Memory Usage (1686888K) : Executing rule via2_OFFGRID
+2022-12-13 07:40:40 +0000: Memory Usage (1536664K) : Executing rule PL.11
+2022-12-13 07:40:42 +0000: Memory Usage (1526144K) : Executing rule NP.4a
+2022-12-13 07:40:52 +0000: Memory Usage (1686888K) : Executing rule metal3_OFFGRID
+2022-12-13 07:40:55 +0000: Memory Usage (1526144K) : Executing rule NP.4b
+2022-12-13 07:40:29 +0000: Memory Usage (1506068K) : Executing rule S.DF.4c_LV
+2022-12-13 07:40:48 +0000: Memory Usage (1838952K) : Executing rule V4.3d
+2022-12-13 07:40:53 +0000: Memory Usage (1613404K) : Executing rule PL.12
+2022-12-13 07:41:00 +0000: Memory Usage (1615644K) : poly2 DRC Total Run time 155.632743 seconds
+2022-12-13 07:40:56 +0000: Memory Usage (1686888K) : Executing rule via3_OFFGRID
+2022-12-13 07:41:04 +0000: Memory Usage (1686888K) : Executing rule metal4_OFFGRID
+2022-12-13 07:41:00 +0000: Memory Usage (1838952K) : Executing rule V4.4a
+2022-12-13 07:40:57 +0000: Memory Usage (1507456K) : Executing rule S.DF.16_LV
+2022-12-13 07:41:06 +0000: Memory Usage (1838952K) : Executing rule V4.4b
+2022-12-13 07:39:29 +0000: Memory Usage (1445540K) : Executing rule DN.2b_
+2022-12-13 07:41:09 +0000: Memory Usage (1868064K) : Executing rule DN.3
+2022-12-13 07:41:06 +0000: Memory Usage (1686888K) : Executing rule via4_OFFGRID
+2022-12-13 07:41:09 +0000: Memory Usage (1868064K) : dnwell DRC Total Run time 165.093473 seconds
+2022-12-13 07:41:09 +0000: Memory Usage (1686888K) : Executing rule metal5_OFFGRID
+2022-12-13 07:41:07 +0000: Memory Usage (1507456K) : Executing rule S.CO.3_LV
+2022-12-13 07:40:56 +0000: Memory Usage (1526144K) : Executing rule NP.5a
+2022-12-13 07:41:10 +0000: Memory Usage (1686888K) : Executing rule pad_OFFGRID
+2022-12-13 07:41:10 +0000: Memory Usage (1686888K) : Executing rule resistor_OFFGRID
+2022-12-13 07:41:11 +0000: Memory Usage (1686888K) : Executing rule fhres_OFFGRID
+2022-12-13 07:41:11 +0000: Memory Usage (1686888K) : Executing rule fusetop_OFFGRID
+2022-12-13 07:41:11 +0000: Memory Usage (1686888K) : Executing rule fusewindow_d_OFFGRID
+2022-12-13 07:41:11 +0000: Memory Usage (1686888K) : Executing rule polyfuse_OFFGRID
+2022-12-13 07:41:11 +0000: Memory Usage (1686888K) : Executing rule mvsd_OFFGRID
+2022-12-13 07:41:11 +0000: Memory Usage (1686888K) : Executing rule mvpsd_OFFGRID
+2022-12-13 07:41:11 +0000: Memory Usage (1686888K) : Executing rule nat_OFFGRID
+2022-12-13 07:41:11 +0000: Memory Usage (1686888K) : Executing rule comp_dummy_OFFGRID
+2022-12-13 07:41:11 +0000: Memory Usage (1686888K) : Executing rule poly2_dummy_OFFGRID
+2022-12-13 07:41:11 +0000: Memory Usage (1686888K) : Executing rule metal1_dummy_OFFGRID
+2022-12-13 07:41:11 +0000: Memory Usage (1686888K) : Executing rule metal1_label_OFFGRID
+2022-12-13 07:41:12 +0000: Memory Usage (1686888K) : Executing rule metal1_slot_OFFGRID
+2022-12-13 07:41:12 +0000: Memory Usage (1686888K) : Executing rule metal1_blk_OFFGRID
+2022-12-13 07:41:12 +0000: Memory Usage (1686888K) : Executing rule metal2_dummy_OFFGRID
+2022-12-13 07:41:12 +0000: Memory Usage (1686888K) : Executing rule metal2_label_OFFGRID
+2022-12-13 07:41:12 +0000: Memory Usage (1686888K) : Executing rule metal2_slot_OFFGRID
+2022-12-13 07:41:12 +0000: Memory Usage (1686888K) : Executing rule metal2_blk_OFFGRID
+2022-12-13 07:40:02 +0000: Memory Usage (1658900K) : Executing rule M1.2a
+2022-12-13 07:41:12 +0000: Memory Usage (1686888K) : Executing rule metal3_dummy_OFFGRID
+2022-12-13 07:41:12 +0000: Memory Usage (1686888K) : Executing rule metal3_label_OFFGRID
+2022-12-13 07:41:13 +0000: Memory Usage (1686888K) : Executing rule metal3_slot_OFFGRID
+2022-12-13 07:41:13 +0000: Memory Usage (1686888K) : Executing rule metal3_blk_OFFGRID
+2022-12-13 07:41:13 +0000: Memory Usage (1686888K) : Executing rule metal4_dummy_OFFGRID
+2022-12-13 07:41:13 +0000: Memory Usage (1686888K) : Executing rule metal4_label_OFFGRID
+2022-12-13 07:41:13 +0000: Memory Usage (1686888K) : Executing rule metal4_slot_OFFGRID
+2022-12-13 07:41:13 +0000: Memory Usage (1686888K) : Executing rule metal4_blk_OFFGRID
+2022-12-13 07:41:13 +0000: Memory Usage (1686888K) : Executing rule metal5_dummy_OFFGRID
+2022-12-13 07:41:13 +0000: Memory Usage (1686888K) : Executing rule metal5_label_OFFGRID
+2022-12-13 07:41:13 +0000: Memory Usage (1686888K) : Executing rule metal5_slot_OFFGRID
+2022-12-13 07:41:08 +0000: Memory Usage (1838952K) : Executing rule V4.4c
+2022-12-13 07:41:13 +0000: Memory Usage (1686888K) : Executing rule metal5_blk_OFFGRID
+2022-12-13 07:41:14 +0000: Memory Usage (1686888K) : Executing rule comp_label_OFFGRID
+2022-12-13 07:41:14 +0000: Memory Usage (1686888K) : Executing rule poly2_label_OFFGRID
+2022-12-13 07:41:14 +0000: Memory Usage (1686888K) : Executing rule ubmpperi_OFFGRID
+2022-12-13 07:41:14 +0000: Memory Usage (1686888K) : Executing rule ubmparray_OFFGRID
+2022-12-13 07:41:14 +0000: Memory Usage (1686888K) : Executing rule ubmeplate_OFFGRID
+2022-12-13 07:41:14 +0000: Memory Usage (1686888K) : Executing rule schottky_diode_OFFGRID
+2022-12-13 07:41:14 +0000: Memory Usage (1686888K) : Executing rule zener_OFFGRID
+2022-12-13 07:41:13 +0000: Memory Usage (1838952K) : via4 DRC Total Run time 169.215588 seconds
+2022-12-13 07:41:14 +0000: Memory Usage (1686888K) : Executing rule res_mk_OFFGRID
+2022-12-13 07:41:14 +0000: Memory Usage (1686888K) : Executing rule opc_drc_OFFGRID
+2022-12-13 07:41:14 +0000: Memory Usage (1686888K) : Executing rule ndmy_OFFGRID
+2022-12-13 07:41:14 +0000: Memory Usage (1686888K) : Executing rule pmndmy_OFFGRID
+2022-12-13 07:41:10 +0000: Memory Usage (1507456K) : Executing rule S.CO.4_LV
+2022-12-13 07:40:51 +0000: Memory Usage (1510872K) : Executing rule PP.5a
+2022-12-13 07:39:30 +0000: Memory Usage (1445568K) : Executing rule V3.1
+2022-12-13 07:41:15 +0000: Memory Usage (1686888K) : Executing rule v5_xtor_OFFGRID
+2022-12-13 07:41:19 +0000: Memory Usage (1686888K) : Executing rule cap_mk_OFFGRID
+2022-12-13 07:41:20 +0000: Memory Usage (1686888K) : Executing rule mos_cap_mk_OFFGRID
+2022-12-13 07:41:20 +0000: Memory Usage (1686888K) : Executing rule ind_mk_OFFGRID
+2022-12-13 07:41:20 +0000: Memory Usage (1686888K) : Executing rule diode_mk_OFFGRID
+2022-12-13 07:41:20 +0000: Memory Usage (1686888K) : Executing rule drc_bjt_OFFGRID
+2022-12-13 07:41:20 +0000: Memory Usage (1686888K) : Executing rule lvs_bjt_OFFGRID
+2022-12-13 07:41:20 +0000: Memory Usage (1686888K) : Executing rule mim_l_mk_OFFGRID
+2022-12-13 07:41:20 +0000: Memory Usage (1686888K) : Executing rule latchup_mk_OFFGRID
+2022-12-13 07:41:21 +0000: Memory Usage (1686888K) : Executing rule guard_ring_mk_OFFGRID
+2022-12-13 07:41:21 +0000: Memory Usage (1686888K) : Executing rule otp_mk_OFFGRID
+2022-12-13 07:41:21 +0000: Memory Usage (1686888K) : Executing rule mtpmark_OFFGRID
+2022-12-13 07:41:21 +0000: Memory Usage (1686888K) : Executing rule neo_ee_mk_OFFGRID
+2022-12-13 07:41:16 +0000: Memory Usage (1839488K) : Executing rule V3.2a
+2022-12-13 07:41:21 +0000: Memory Usage (1686888K) : Executing rule sramcore_OFFGRID
+2022-12-13 07:41:21 +0000: Memory Usage (1686888K) : Executing rule lvs_rf_OFFGRID
+2022-12-13 07:41:21 +0000: Memory Usage (1686888K) : Executing rule lvs_drain_OFFGRID
+2022-12-13 07:41:22 +0000: Memory Usage (1686888K) : Executing rule ind_mk_OFFGRID
+2022-12-13 07:41:22 +0000: Memory Usage (1686888K) : Executing rule hvpolyrs_OFFGRID
+2022-12-13 07:41:22 +0000: Memory Usage (1686888K) : Executing rule lvs_io_OFFGRID
+2022-12-13 07:41:22 +0000: Memory Usage (1686888K) : Executing rule probe_mk_OFFGRID
+2022-12-13 07:41:22 +0000: Memory Usage (1686888K) : Executing rule esd_mk_OFFGRID
+2022-12-13 07:41:22 +0000: Memory Usage (1686888K) : Executing rule lvs_source_OFFGRID
+2022-12-13 07:41:23 +0000: Memory Usage (1686888K) : Executing rule well_diode_mk_OFFGRID
+2022-12-13 07:41:23 +0000: Memory Usage (1686888K) : Executing rule ldmos_xtor_OFFGRID
+2022-12-13 07:41:23 +0000: Memory Usage (1686888K) : Executing rule plfuse_OFFGRID
+2022-12-13 07:41:23 +0000: Memory Usage (1686888K) : Executing rule efuse_mk_OFFGRID
+2022-12-13 07:41:23 +0000: Memory Usage (1686888K) : Executing rule mcell_feol_mk_OFFGRID
+2022-12-13 07:41:23 +0000: Memory Usage (1686888K) : Executing rule ymtp_mk_OFFGRID
+2022-12-13 07:41:23 +0000: Memory Usage (1686888K) : Executing rule dev_wf_mk_OFFGRID
+2022-12-13 07:39:59 +0000: Memory Usage (1776876K) : Executing rule V1.3c
+2022-12-13 07:41:23 +0000: Memory Usage (1686888K) : Executing rule pr_bndry_OFFGRID
+2022-12-13 07:41:33 +0000: Memory Usage (1686888K) : Executing rule mdiode_OFFGRID
+2022-12-13 07:41:33 +0000: Memory Usage (1686888K) : Executing rule metal1_res_OFFGRID
+2022-12-13 07:41:33 +0000: Memory Usage (1686888K) : Executing rule metal2_res_OFFGRID
+2022-12-13 07:41:33 +0000: Memory Usage (1686888K) : Executing rule metal3_res_OFFGRID
+2022-12-13 07:41:33 +0000: Memory Usage (1686888K) : Executing rule metal4_res_OFFGRID
+2022-12-13 07:41:33 +0000: Memory Usage (1686888K) : Executing rule metal5_res_OFFGRID
+2022-12-13 07:41:33 +0000: Memory Usage (1686888K) : Executing rule metal6_res_OFFGRID
+2022-12-13 07:41:33 +0000: Memory Usage (1686888K) : Executing rule border_OFFGRID
+2022-12-13 07:41:34 +0000: Memory Usage (1686888K) : geom DRC Total Run time 189.399458 seconds
+2022-12-13 07:41:21 +0000: Memory Usage (1839488K) : Executing rule V3.2b
+2022-12-13 07:41:10 +0000: Memory Usage (1526144K) : Executing rule NP.5b
+2022-12-13 07:41:15 +0000: Memory Usage (1507456K) : Executing rule S.CO.6_ii_LV
+2022-12-13 07:40:12 +0000: Memory Usage (1672964K) : Executing rule CO.6a
+2022-12-13 07:41:42 +0000: Memory Usage (1668352K) : Executing rule S.M1.1_LV
+2022-12-13 07:41:37 +0000: Memory Usage (1839488K) : Executing rule V3.3a
+2022-12-13 07:41:43 +0000: Memory Usage (1668352K) : sram DRC Total Run time 199.056071 seconds
+2022-12-13 07:41:31 +0000: Memory Usage (1796872K) : Executing rule V1.3d
+2022-12-13 07:41:41 +0000: Memory Usage (1591680K) : Executing rule NP.5ci
+2022-12-13 07:41:44 +0000: Memory Usage (1839488K) : Executing rule V3.3c
+2022-12-13 07:41:51 +0000: Memory Usage (1796872K) : Executing rule V1.4a
+2022-12-13 07:41:15 +0000: Memory Usage (1510872K) : Executing rule PP.5b
+2022-12-13 07:41:55 +0000: Memory Usage (1796872K) : Executing rule V1.4b
+2022-12-13 07:41:42 +0000: Memory Usage (1798548K) : Executing rule CO.6b
+2022-12-13 07:41:57 +0000: Memory Usage (1530440K) : Executing rule PP.5ci
+2022-12-13 07:41:53 +0000: Memory Usage (1839488K) : Executing rule V3.3d
+2022-12-13 07:42:09 +0000: Memory Usage (1864084K) : Executing rule CO.7
+2022-12-13 07:41:53 +0000: Memory Usage (1591680K) : Executing rule NP.5cii
+2022-12-13 07:42:15 +0000: Memory Usage (1798548K) : Executing rule CO.8
+2022-12-13 07:42:18 +0000: Memory Usage (1798548K) : Executing rule CO.9
+2022-12-13 07:42:13 +0000: Memory Usage (1839488K) : Executing rule V3.4a
+2022-12-13 07:42:20 +0000: Memory Usage (1798548K) : Executing rule CO.10
+2022-12-13 07:42:20 +0000: Memory Usage (1798548K) : Executing rule CO.11
+2022-12-13 07:42:23 +0000: Memory Usage (1798548K) : contact DRC Total Run time 238.465909 seconds
+2022-12-13 07:42:08 +0000: Memory Usage (1796872K) : Executing rule V1.4c
+2022-12-13 07:42:20 +0000: Memory Usage (1839488K) : Executing rule V3.4b
+2022-12-13 07:42:24 +0000: Memory Usage (1796872K) : via1 DRC Total Run time 239.885386 seconds
+2022-12-13 07:42:13 +0000: Memory Usage (1530440K) : Executing rule PP.5cii
+2022-12-13 07:42:25 +0000: Memory Usage (1839488K) : Executing rule V3.4c
+2022-12-13 07:42:34 +0000: Memory Usage (1839488K) : via3 DRC Total Run time 249.316764 seconds
+2022-12-13 07:42:28 +0000: Memory Usage (1530440K) : Executing rule PP.5di
+2022-12-13 07:42:42 +0000: Memory Usage (1530440K) : Executing rule PP.5dii
+2022-12-13 07:42:16 +0000: Memory Usage (1526144K) : Executing rule NP.5di
+2022-12-13 07:42:44 +0000: Memory Usage (1591680K) : Executing rule NP.5dii
+2022-12-13 07:39:30 +0000: Memory Usage (1445572K) : Executing rule V2.1
+2022-12-13 07:42:43 +0000: Memory Usage (1530440K) : Executing rule PP.6
+2022-12-13 07:42:48 +0000: Memory Usage (1530440K) : Executing rule PP.7
+2022-12-13 07:42:49 +0000: Memory Usage (1530440K) : Executing rule PP.8a
+2022-12-13 07:42:49 +0000: Memory Usage (1530440K) : Executing rule PP.8b
+2022-12-13 07:42:47 +0000: Memory Usage (1828304K) : Executing rule V2.2a
+2022-12-13 07:42:49 +0000: Memory Usage (1530440K) : Executing rule PP.9
+2022-12-13 07:42:44 +0000: Memory Usage (1591680K) : Executing rule NP.6
+2022-12-13 07:42:54 +0000: Memory Usage (1530772K) : Executing rule NP.7
+2022-12-13 07:42:54 +0000: Memory Usage (1530772K) : Executing rule NP.8a
+2022-12-13 07:42:54 +0000: Memory Usage (1530772K) : Executing rule NP.8b
+2022-12-13 07:42:55 +0000: Memory Usage (1530772K) : Executing rule NP.9
+2022-12-13 07:42:56 +0000: Memory Usage (1530772K) : Executing rule NP.10
+2022-12-13 07:43:03 +0000: Memory Usage (1530772K) : Executing rule NP.11
+2022-12-13 07:42:52 +0000: Memory Usage (1530440K) : Executing rule PP.10
+2022-12-13 07:43:03 +0000: Memory Usage (1530440K) : Executing rule PP.11
+2022-12-13 07:43:03 +0000: Memory Usage (1530772K) : Executing rule NP.12
+2022-12-13 07:43:03 +0000: Memory Usage (1530440K) : Executing rule PP.12
+2022-12-13 07:43:04 +0000: Memory Usage (1530772K) : nplus DRC Total Run time 280.203177 seconds
+2022-12-13 07:43:05 +0000: Memory Usage (1530440K) : pplus DRC Total Run time 280.659053 seconds
+2022-12-13 07:42:52 +0000: Memory Usage (1828304K) : Executing rule V2.2b
+2022-12-13 07:43:07 +0000: Memory Usage (1828304K) : Executing rule V2.3a
+2022-12-13 07:43:12 +0000: Memory Usage (1828304K) : Executing rule V2.3c
+2022-12-13 07:41:12 +0000: Memory Usage (1789972K) : Executing rule M1.2b
+2022-12-13 07:43:23 +0000: Memory Usage (1828304K) : Executing rule V2.3d
+2022-12-13 07:43:39 +0000: Memory Usage (3706836K) : Executing rule M1.3
+2022-12-13 07:43:42 +0000: Memory Usage (3706836K) : metal1 DRC Total Run time 317.567171 seconds
+2022-12-13 07:43:41 +0000: Memory Usage (1828304K) : Executing rule V2.4a
+2022-12-13 07:43:44 +0000: Memory Usage (1828304K) : Executing rule V2.4b
+2022-12-13 07:43:52 +0000: Memory Usage (1828304K) : Executing rule V2.4c
+2022-12-13 07:44:15 +0000: Memory Usage (1893840K) : via2 DRC Total Run time 350.961929 seconds
+2022-12-13 07:39:56 +0000: Memory Usage (1486452K) : Executing rule DV.5
+2022-12-13 07:45:37 +0000: Memory Usage (1515124K) : Executing rule DV.6
+2022-12-13 07:45:48 +0000: Memory Usage (1515124K) : Executing rule DV.7
+2022-12-13 07:45:58 +0000: Memory Usage (1515124K) : Executing rule DV.8
+2022-12-13 07:46:25 +0000: Memory Usage (1580660K) : Executing rule DV.9
+2022-12-13 07:46:36 +0000: Memory Usage (1580660K) : dualgate DRC Total Run time 492.058868 seconds
+2022-12-13 07:40:03 +0000: Memory Usage (1487920K) : Executing rule SB.15a
+2022-12-13 07:52:04 +0000: Memory Usage (1503892K) : Executing rule SB.15b
+2022-12-13 07:52:04 +0000: Memory Usage (1503892K) : Executing rule SB.16
+2022-12-13 07:52:08 +0000: Memory Usage (1503892K) : sab DRC Total Run time 824.112896 seconds
+2022-12-13 07:39:54 +0000: Memory Usage (1559356K) : Executing rule DF.2b_3.3V
+2022-12-13 07:54:51 +0000: Memory Usage (1559356K) : Executing rule DF.2b_5V
+2022-12-13 08:09:12 +0000: Memory Usage (1559356K) : Executing rule DF.3a_3.3V
+2022-12-13 08:09:13 +0000: Memory Usage (1559356K) : Executing rule DF.3a_5V
+2022-12-13 08:09:43 +0000: Memory Usage (1559356K) : Executing rule DF.3b_3.3V
+2022-12-13 08:09:43 +0000: Memory Usage (1559356K) : Executing rule DF.3b_5V
+2022-12-13 08:09:43 +0000: Memory Usage (1559356K) : Executing rule DF.3c_3.3V
+2022-12-13 08:09:43 +0000: Memory Usage (1559356K) : Executing rule DF.3c_5V
+2022-12-13 08:09:44 +0000: Memory Usage (1559356K) : Executing rule DF.4a_3.3V
+2022-12-13 08:09:44 +0000: Memory Usage (1559356K) : Executing rule DF.4a_5V
+2022-12-13 08:09:44 +0000: Memory Usage (1559356K) : Executing rule DF.4b_3.3V
+2022-12-13 08:09:46 +0000: Memory Usage (1559356K) : Executing rule DF.4b_5V
+2022-12-13 08:09:47 +0000: Memory Usage (1559356K) : Executing rule DF.4c_3.3V
+2022-12-13 08:09:59 +0000: Memory Usage (1559356K) : Executing rule DF.4c_5V
+2022-12-13 08:10:07 +0000: Memory Usage (1559356K) : Executing rule DF.4d_3.3V
+2022-12-13 08:10:11 +0000: Memory Usage (1559356K) : Executing rule DF.4d_5V
+2022-12-13 08:10:15 +0000: Memory Usage (1559356K) : Executing rule DF.4e_3.3V
+2022-12-13 08:10:15 +0000: Memory Usage (1559356K) : Executing rule DF.4e_5V
+2022-12-13 08:10:15 +0000: Memory Usage (1559356K) : Executing rule DF.5_3.3V
+2022-12-13 08:10:25 +0000: Memory Usage (1559356K) : Executing rule DF.5_5V
+2022-12-13 08:10:35 +0000: Memory Usage (1559356K) : Executing rule DF.6_3.3V
+2022-12-13 08:10:51 +0000: Memory Usage (1690428K) : Executing rule DF.6_5V
+2022-12-13 08:11:11 +0000: Memory Usage (1690428K) : Executing rule DF.7_3.3V
+2022-12-13 08:11:11 +0000: Memory Usage (1690428K) : Executing rule DF.7_5V
+2022-12-13 08:11:12 +0000: Memory Usage (1690428K) : Executing rule DF.8_3.3V
+2022-12-13 08:11:12 +0000: Memory Usage (1690428K) : Executing rule DF.8_5V
+2022-12-13 08:11:12 +0000: Memory Usage (1690428K) : Executing rule DF.9_3.3V
+2022-12-13 08:11:12 +0000: Memory Usage (1690428K) : Executing rule DF.9_5V
+2022-12-13 08:11:12 +0000: Memory Usage (1690428K) : Executing rule DF.10_3.3V
+2022-12-13 08:12:53 +0000: Memory Usage (2561824K) : Executing rule DF.10_5V
+2022-12-13 08:14:34 +0000: Memory Usage (2561872K) : Executing rule DF.11_3.3V
+2022-12-13 08:14:34 +0000: Memory Usage (2561872K) : Executing rule DF.11_5V
+2022-12-13 08:14:34 +0000: Memory Usage (2561872K) : Executing rule DF.12_3.3V
+2022-12-13 08:20:02 +0000: Memory Usage (2561872K) : Executing rule DF.12_5V
+2022-12-13 08:25:45 +0000: Memory Usage (2561872K) : Executing rule DF.13_3.3V
+2022-12-13 08:26:44 +0000: Memory Usage (2627408K) : Executing rule DF.13_5V
+2022-12-13 08:27:12 +0000: Memory Usage (2561872K) : Executing rule DF.14_3.3V
+2022-12-13 08:28:41 +0000: Memory Usage (2561872K) : Executing rule DF.14_5V
+2022-12-13 08:29:36 +0000: Memory Usage (2561872K) : Executing rule DF.16_3.3V
+2022-12-13 08:29:38 +0000: Memory Usage (2561872K) : Executing rule DF.16_5V
+2022-12-13 08:29:45 +0000: Memory Usage (2561872K) : Executing rule DF.17_3.3V
+2022-12-13 08:29:48 +0000: Memory Usage (2561872K) : Executing rule DF.17_5V
+2022-12-13 08:29:52 +0000: Memory Usage (2561872K) : Executing rule DF.18_3.3V
+2022-12-13 08:29:52 +0000: Memory Usage (2561872K) : Executing rule DF.18_5V
+2022-12-13 08:29:52 +0000: Memory Usage (2561872K) : Executing rule DF.19_3.3V
+2022-12-13 08:29:52 +0000: Memory Usage (2561872K) : Executing rule DF.19_5V
+2022-12-13 08:29:52 +0000: Memory Usage (2561872K) : comp DRC Total Run time 3087.807918 seconds
+13-Dec-2022 08:29:53 | INFO    | Klayout DRC run is clean. GDS has no DRC violations.
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc
+16914.21user 236.03system 51:32.69elapsed 554%CPU (0avgtext+0avgdata 4336180maxresident)k
+8256inputs+3576outputs (0major+44643008minor)pagefaults 0swaps
diff --git a/signoff/klayout_drc_version b/signoff/klayout_drc_version
new file mode 100644
index 0000000..62170cc
--- /dev/null
+++ b/signoff/klayout_drc_version
@@ -0,0 +1 @@
+KLayout 0.28
diff --git a/signoff/make_final_oas b/signoff/make_final_oas
new file mode 100644
index 0000000..4052412
--- /dev/null
+++ b/signoff/make_final_oas
@@ -0,0 +1 @@
+a07b77370e92897171c8ff06afd0d00224755742  ./tapeout/outputs/oas/caravel_18000abd.oas
diff --git a/tapeout/logs/oasis.info b/tapeout/logs/oasis.info
index a91f24c..ac3011c 100644
--- a/tapeout/logs/oasis.info
+++ b/tapeout/logs/oasis.info
@@ -1 +1 @@
-caravel_18000abd.oas: 1daba046c467e91d7b742ceaa6da87f35f04f556
+caravel_18001e9a.oas: a07b77370e92897171c8ff06afd0d00224755742
diff --git a/tapeout/outputs/drc/caravel_18000abd.drc.summary b/tapeout/outputs/drc/caravel_18000abd.drc.summary
new file mode 100644
index 0000000..fd794d8
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd.drc.summary
@@ -0,0 +1 @@
+ERROR, too few arguments. Usage: kmHist.rb [options] <markerDBfileIn>
diff --git a/tapeout/outputs/drc/caravel_18000abd_comp.lyrdb b/tapeout/outputs/drc/caravel_18000abd_comp.lyrdb
new file mode 100644
index 0000000..7468267
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_comp.lyrdb
@@ -0,0 +1,333 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/comp.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>DF.1a_3.3V</name>
+   <description>DF.1a_3.3V : Min. COMP Width. : 0.22µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.1a_5V</name>
+   <description>DF.1a_5V : Min. COMP Width. : 0.3µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.1c_3.3V</name>
+   <description>DF.1c_3.3V : Min. COMP Width for MOSCAP. : 1µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.1c_5V</name>
+   <description>DF.1c_5V : Min. COMP Width for MOSCAP. : 1µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.2a_3.3V</name>
+   <description>DF.2a_3.3V : Min Channel Width. : nil,0.22µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.2a_5V</name>
+   <description>DF.2a_5V : Min Channel Width. : nil,0.3µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.2b_3.3V</name>
+   <description>DF.2b_3.3V : Max. COMP width for all cases except those used for capacitors, marked by ‘MOS_CAP_MK’ layer.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.2b_5V</name>
+   <description>DF.2b_5V : Max. COMP width for all cases except those used for capacitors, marked by ‘MOS_CAP_MK’ layer.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.3a_3.3V</name>
+   <description>DF.3a_3.3V : Min. COMP Space P-substrate tap (PCOMP outside NWELL and DNWELL) can be butted for different voltage devices as the potential is same. : 0.28µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.3a_5V</name>
+   <description>DF.3a_5V : Min. COMP Space P-substrate tap (PCOMP outside NWELL and DNWELL) can be butted for different voltage devices as the potential is same. : 0.36µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.3b_3.3V</name>
+   <description>DF.3b_3.3V : Min./Max. NCOMP Space to PCOMP in the same well for butted COMP (MOSCAP butting is not allowed).</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.3b_5V</name>
+   <description>DF.3b_5V : Min./Max. NCOMP Space to PCOMP in the same well for butted COMP(MOSCAP butting is not allowed).</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.3c_3.3V</name>
+   <description>DF.3c_3.3V : Min. COMP Space in BJT area (area marked by DRC_BJT layer). : 0.32µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.3c_5V</name>
+   <description>DF.3c_5V : Min. COMP Space in BJT area (area marked by DRC_BJT layer) hasn’t been assessed.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.4a_3.3V</name>
+   <description>DF.4a_3.3V : Min. (LVPWELL Space to NCOMP well tap) inside DNWELL. : 0.12µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.4a_5V</name>
+   <description>DF.4a_5V : Min. (LVPWELL Space to NCOMP well tap) inside DNWELL. : 0.16µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.4b_3.3V</name>
+   <description>DF.4b_3.3V : Min. DNWELL overlap of NCOMP well tap. : 0.62µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.4b_5V</name>
+   <description>DF.4b_5V : Min. DNWELL overlap of NCOMP well tap. : 0.66µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.4c_3.3V</name>
+   <description>DF.4c_3.3V : Min. (Nwell overlap of PCOMP) outside DNWELL. : 0.43µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.4c_5V</name>
+   <description>DF.4c_5V : Min. (Nwell overlap of PCOMP) outside DNWELL. : 0.6µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.4d_3.3V</name>
+   <description>DF.4d_3.3V : Min. (Nwell overlap of NCOMP) outside DNWELL. : 0.12µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.4d_5V</name>
+   <description>DF.4d_5V : Min. (Nwell overlap of NCOMP) outside DNWELL. : 0.16µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.4e_3.3V</name>
+   <description>DF.4e_3.3V : Min. DNWELL overlap of PCOMP. : 0.93µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.4e_5V</name>
+   <description>DF.4e_5V : Min. DNWELL overlap of PCOMP. : 1.1µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.5_3.3V</name>
+   <description>DF.5_3.3V : Min. (LVPWELL overlap of PCOMP well tap) inside DNWELL. : 0.12µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.5_5V</name>
+   <description>DF.5_5V : Min. (LVPWELL overlap of PCOMP well tap) inside DNWELL. : 0.16µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.6_3.3V</name>
+   <description>DF.6_3.3V : Min. COMP extend beyond gate (it also means source/drain overhang). : 0.24µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.6_5V</name>
+   <description>DF.6_5V : Min. COMP extend beyond gate (it also means source/drain overhang). : 0.4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.7_3.3V</name>
+   <description>DF.7_3.3V : Min. (LVPWELL Spacer to PCOMP) inside DNWELL. : 0.43µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.7_5V</name>
+   <description>DF.7_5V : Min. (LVPWELL Spacer to PCOMP) inside DNWELL. : 0.6µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.8_3.3V</name>
+   <description>DF.8_3.3V : Min. (LVPWELL overlap of NCOMP) Inside DNWELL. : 0.43µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.8_5V</name>
+   <description>DF.8_5V : Min. (LVPWELL overlap of NCOMP) Inside DNWELL. : 0.6µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.9_3.3V</name>
+   <description>DF.9_3.3V : Min. COMP area (um2). : 0.2025µm²</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.9_5V</name>
+   <description>DF.9_5V : Min. COMP area (um2). : 0.2025µm²</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.10_3.3V</name>
+   <description>DF.10_3.3V : Min. field area (um2). : 0.26µm²</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.10_5V</name>
+   <description>DF.10_5V : Min. field area (um2). : 0.26µm²</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.11_3.3V</name>
+   <description>DF.11_3.3V : Min. Length of butting COMP edge. : 0.3µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.11_5V</name>
+   <description>DF.11_5V : Min. Length of butting COMP edge. : 0.3µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.12_3.3V</name>
+   <description>DF.12_3.3V : COMP not covered by Nplus or Pplus is forbidden (except those COMP under marking).</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.12_5V</name>
+   <description>DF.12_5V : COMP not covered by Nplus or Pplus is forbidden (except those COMP under marking).</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.13_3.3V</name>
+   <description>DF.13_3.3V : Max distance of Nwell tap (NCOMP inside Nwell) from (PCOMP inside Nwell).</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.13_5V</name>
+   <description>DF.13_5V : Max distance of Nwell tap (NCOMP inside Nwell) from (PCOMP inside Nwell).</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.14_3.3V</name>
+   <description>DF.14_3.3V : Max distance of substrate tap (PCOMP outside Nwell) from (NCOMP outside Nwell).</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.14_5V</name>
+   <description>DF.14_5V : Max distance of substrate tap (PCOMP outside Nwell) from (NCOMP outside Nwell).</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.16_3.3V</name>
+   <description>DF.16_3.3V : Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). : 0.43µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.16_5V</name>
+   <description>DF.16_5V : Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). : 0.6µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.17_3.3V</name>
+   <description>DF.17_3.3V : Min. space from (Nwell Outside DNWELL) to (PCOMP outside Nwell and DNWELL). : 0.12µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.17_5V</name>
+   <description>DF.17_5V : Min. space from (Nwell Outside DNWELL) to (PCOMP outside Nwell and DNWELL). : 0.16µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.18_3.3V</name>
+   <description>DF.18_3.3V : Min. DNWELL space to (PCOMP outside Nwell and DNWELL). : 2.5µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.18_5V</name>
+   <description>DF.18_5V : Min. DNWELL space to (PCOMP outside Nwell and DNWELL). : 2.5µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.19_3.3V</name>
+   <description>DF.19_3.3V : Min. DNWELL space to (NCOMP outside Nwell and DNWELL). : 3.2µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DF.19_5V</name>
+   <description>DF.19_5V : Min. DNWELL space to (NCOMP outside Nwell and DNWELL). : 3.28µm</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_contact.lyrdb b/tapeout/outputs/drc/caravel_18000abd_contact.lyrdb
new file mode 100644
index 0000000..283ec2b
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_contact.lyrdb
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/contact.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>CO.1</name>
+   <description>CO.1 : Min/max contact size. : 0.22µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>CO.2a</name>
+   <description>CO.2a : min. contact spacing : 0.25µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>CO.2b</name>
+   <description>CO.2b : Space in 4x4 or larger contact array. : 0.28µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>CO.3</name>
+   <description>CO.3 : Poly2 overlap of contact. : 0.07µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>CO.4</name>
+   <description>CO.4 : COMP overlap of contact. : 0.07µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>CO.5a</name>
+   <description>CO.5a : Nplus overlap of contact on COMP (Only for contacts to butted Nplus and Pplus COMP areas). : 0.1µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>CO.5b</name>
+   <description>CO.5b : Pplus overlap of contact on COMP (Only for contacts to butted Nplus and Pplus COMP areas). : 0.1µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>CO.6</name>
+   <description>CO.6 : Metal1 overlap of contact &gt;= 0.005 um</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>CO.6a</name>
+   <description>CO.6a : (i) Metal1 (&lt; 0.34um) end-of-line overlap contact : 0.06µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>CO.6b</name>
+   <description>CO.6b : (ii) If Metal1 overlaps contact by &lt; 0.04um on one side, adjacent metal1 edges overlap : 0.06µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>CO.7</name>
+   <description>CO.7 : Space from COMP contact to Poly2 on COMP. : 0.15µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>CO.8</name>
+   <description>CO.8 : Space from Poly2 contact to COMP. : 0.17µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>CO.9</name>
+   <description>CO.9 : Contact on NCOMP to PCOMP butting edge is forbidden (contact must not straddle butting edge).</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>CO.10</name>
+   <description>CO.10 : Contact on Poly2 gate over COMP is forbidden.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>CO.11</name>
+   <description>CO.11 : Contact on field oxide is forbidden.</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_dnwell.lyrdb b/tapeout/outputs/drc/caravel_18000abd_dnwell.lyrdb
new file mode 100644
index 0000000..6f5cb4e
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_dnwell.lyrdb
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/dnwell.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>DN.1</name>
+   <description>DN.1 : Min. DNWELL Width : 1.7µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DN.2b_</name>
+   <description>DN.2b_ : Min. DNWELL Space (Different potential) : 5.42µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DN.3</name>
+   <description>DN.3 : Each DNWELL shall be directly surrounded by PCOMP guard ring tied to the P-substrate potential.</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_drc_bjt.lyrdb b/tapeout/outputs/drc/caravel_18000abd_drc_bjt.lyrdb
new file mode 100644
index 0000000..578d0e1
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_drc_bjt.lyrdb
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/drc_bjt.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>BJT.1</name>
+   <description>BJT.1 : Min. DRC_BJT overlap of DNWELL for NPN BJT.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>BJT.2</name>
+   <description>BJT.2 : Min. DRC_BJT overlap of PCOM in Psub.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>BJT.3</name>
+   <description>BJT.3 : Minimum space of DRC_BJT layer to unrelated COMP. : 0.1µm</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_dualgate.lyrdb b/tapeout/outputs/drc/caravel_18000abd_dualgate.lyrdb
new file mode 100644
index 0000000..5b7c5eb
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_dualgate.lyrdb
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/dualgate.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>DV.1</name>
+   <description>DV.1 : Min. Dualgate enclose DNWELL. : 0.5µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DV.2</name>
+   <description>DV.2 : Min. Dualgate Space. Merge if Space is less than this design rule. : 0.44µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DV.3</name>
+   <description>DV.3 : Min. Dualgate to COMP space [unrelated]. : 0.24µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DV.5</name>
+   <description>DV.5 : Min. Dualgate width. : 0.7µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DV.6</name>
+   <description>DV.6 : Min. Dualgate enclose COMP (except substrate tap). : 0.24µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DV.7</name>
+   <description>DV.7 : COMP (except substrate tap) can not be partially overlapped by Dualgate.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DV.8</name>
+   <description>DV.8 : Min Dualgate enclose Poly2. : 0.4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DV.9</name>
+   <description>DV.9 : 3.3V and 5V/6V PMOS cannot be sitting inside same NWELL.</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_dummy_exclude.lyrdb b/tapeout/outputs/drc/caravel_18000abd_dummy_exclude.lyrdb
new file mode 100644
index 0000000..48044ce
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_dummy_exclude.lyrdb
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/dummy_exclude.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>DE.2</name>
+   <description>DE.2 : Minimum NDMY or PMNDMY size (x or y dimension in um). : 0.8µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DE.3</name>
+   <description>DE.3 : If size greater than 15000 um2 then two sides should not be greater than (um).</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>DE.4</name>
+   <description>DE.4 : Minimum NDMY to NDMY space (Merge if space is less). : 20µm</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_efuse.lyrdb b/tapeout/outputs/drc/caravel_18000abd_efuse.lyrdb
new file mode 100644
index 0000000..fd156c5
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_efuse.lyrdb
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/efuse.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>EF.01</name>
+   <description>EF.01 : Min. (Poly2 butt PLFUSE) within EFUSE_MK and Pplus.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.02</name>
+   <description>EF.02 : Min. Max. PLFUSE width. : 0.18µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.03</name>
+   <description>EF.03 : Min. Max. PLFUSE length. : 1.26µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.04a</name>
+   <description>EF.04a : Min. Max. PLFUSE overlap Poly2 (coinciding permitted) and touch cathode and anode.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.04b</name>
+   <description>EF.04b : PLFUSE must be rectangular. : -µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.04c</name>
+   <description>EF.04c : Cathode Poly2 must be rectangular. : -µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.04d</name>
+   <description>EF.04d : Anode Poly2 must be rectangular. : -µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.05</name>
+   <description>EF.05 : Min./Max. LVS_Source overlap Poly2 (at Anode).</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.06</name>
+   <description>EF.06 : Min./Max. Cathode Poly2 width. : 2.26µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.07</name>
+   <description>EF.07 : Min./Max. Cathode Poly2 length. : 1.84µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.08</name>
+   <description>EF.08 : Min./Max. Anode Poly2 width. : 1.06µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.09</name>
+   <description>EF.09 : Min./Max. Anode Poly2 length. : 2.43µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.10</name>
+   <description>EF.10 : Min. Cathode Poly2 to Poly2 space. : 0.26µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.11</name>
+   <description>EF.11 : Min. Anode Poly2 to Poly2 space. : 0.26µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.12</name>
+   <description>EF.12 : Min. Space of Cathode Contact to PLFUSE end.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.13</name>
+   <description>EF.13 : Min. Space of Anode Contact to PLFUSE end.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.14</name>
+   <description>EF.14 : Min. EFUSE_MK enclose LVS_Source.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.15</name>
+   <description>EF.15 : NO Contact is allowed to touch PLFUSE.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.16a</name>
+   <description>EF.16a : Cathode must contain exact number of Contacts at each ends. : 4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.16b</name>
+   <description>EF.16b : Anode must contain exact number of Contacts at each ends. : 4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.17</name>
+   <description>EF.17 : Min. Space of EFUSE_MK to EFUSE_MK. : 0.26µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.18</name>
+   <description>EF.18 : PLFUSE must sit on field oxide (NOT COMP), no cross with any COMP, Nplus, Pplus, ESD, SAB, Resistor, Metal1, Metal2.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.19</name>
+   <description>EF.19 : Min. PLFUSE space to Metal1, Metal2.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.20</name>
+   <description>EF.20 : Min. PLFUSE space to COMP, Nplus, Pplus, Resistor, ESD, SAB. : 2.73µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.21</name>
+   <description>EF.21 : Min./Max. eFUSE Poly2 length. : 5.53µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.22a</name>
+   <description>EF.22a : Min./Max. Cathode Poly2 overlap with PLFUSE in width direction. : 1.04µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>EF.22b</name>
+   <description>EF.22b : Min./Max. Anode Poly2 overlap with PLFUSE in width direction. : 0.44µm</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_esd.lyrdb b/tapeout/outputs/drc/caravel_18000abd_esd.lyrdb
new file mode 100644
index 0000000..cd63e13
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_esd.lyrdb
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/esd.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>ESD.1</name>
+   <description>ESD.1 : Minimum width of an ESD implant area. : 0.6µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ESD.2</name>
+   <description>ESD.2 : Minimum space between two ESD implant areas. (Merge if the space is less than 0.6um). : 0.6µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ESD.3a</name>
+   <description>ESD.3a : Minimum space to NCOMP. : 0.6µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ESD.3b</name>
+   <description>ESD.3b : Min/max space to a butted PCOMP.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ESD.4a</name>
+   <description>ESD.4a : Extension beyond NCOMP. : 0.24µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ESD.4b</name>
+   <description>ESD.4b : Minimum overlap of an ESD implant edge to a COMP. : 0.45µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ESD.5a</name>
+   <description>ESD.5a : Minimum ESD area (um2). : 0.49µm²</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ESD.5b</name>
+   <description>ESD.5b : Minimum field area enclosed by ESD implant (um2). : 0.49µm²</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ESD.6</name>
+   <description>ESD.6 : Extension perpendicular to Poly2 gate. : 0.45µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ESD.7</name>
+   <description>ESD.7 : No ESD implant inside PCOMP.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ESD.8</name>
+   <description>ESD.8 : Minimum space to Nplus/Pplus. : 0.3µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ESD.pl</name>
+   <description>ESD.pl : Minimum gate length of 5V/6V gate NMOS. : 0.8µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ESD.9</name>
+   <description>ESD.9 : ESD implant layer must be overlapped by Dualgate layer (as ESD implant option is only for 5V/6V devices).</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ESD.10</name>
+   <description>ESD.10 : LVS_IO shall be drawn covering I/O MOS active area by minimum overlap.</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_geom.lyrdb b/tapeout/outputs/drc/caravel_18000abd_geom.lyrdb
new file mode 100644
index 0000000..075dd9c
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_geom.lyrdb
@@ -0,0 +1,1221 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/geom.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>comp_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on comp</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>comp_angle</name>
+   <description>ACUTE : non 45 degree angle comp</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>dnwell_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on dnwell</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>dnwell_angle</name>
+   <description>ACUTE : non 45 degree angle dnwell</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>nwell_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on nwell</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>nwell_angle</name>
+   <description>ACUTE : non 45 degree angle nwell</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>lvpwell_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on lvpwell</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>lvpwell_angle</name>
+   <description>ACUTE : non 45 degree angle lvpwell</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>dualgate_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on dualgate</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>dualgate_angle</name>
+   <description>ACUTE : non 45 degree angle dualgate</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>poly2_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on poly2</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>poly2_angle</name>
+   <description>ACUTE : non 45 degree angle poly2</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>nplus_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on nplus</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>nplus_angle</name>
+   <description>ACUTE : non 45 degree angle nplus</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>pplus_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on pplus</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>pplus_angle</name>
+   <description>ACUTE : non 45 degree angle pplus</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>sab_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on sab</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>sab_angle</name>
+   <description>ACUTE : non 45 degree angle sab</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>esd_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on esd</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>esd_angle</name>
+   <description>ACUTE : non 45 degree angle esd</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>contact_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on contact</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>contact_angle</name>
+   <description>ACUTE : non 45 degree angle contact</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal1_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal1</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal1_angle</name>
+   <description>ACUTE : non 45 degree angle metal1</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>via1_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on via1</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>via1_angle</name>
+   <description>ACUTE : non 45 degree angle via1</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal2_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal2</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal2_angle</name>
+   <description>ACUTE : non 45 degree angle metal2</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>via2_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on via2</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>via2_angle</name>
+   <description>ACUTE : non 45 degree angle via2</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal3_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal3</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal3_angle</name>
+   <description>ACUTE : non 45 degree angle metal3</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>via3_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on via3</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>via3_angle</name>
+   <description>ACUTE : non 45 degree angle via3</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal4_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal4</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal4_angle</name>
+   <description>ACUTE : non 45 degree angle metal4</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>via4_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on via4</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>via4_angle</name>
+   <description>ACUTE : non 45 degree angle via4</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal5_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal5</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal5_angle</name>
+   <description>ACUTE : non 45 degree angle metal5</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>pad_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on pad</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>pad_angle</name>
+   <description>ACUTE : non 45 degree angle pad</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>resistor_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on resistor</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>resistor_angle</name>
+   <description>ACUTE : non 45 degree angle resistor</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>fhres_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on fhres</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>fhres_angle</name>
+   <description>ACUTE : non 45 degree angle fhres</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>fusetop_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on fusetop</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>fusetop_angle</name>
+   <description>ACUTE : non 45 degree angle fusetop</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>fusewindow_d_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on fusewindow_d</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>fusewindow_d_angle</name>
+   <description>ACUTE : non 45 degree angle fusewindow_d</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>polyfuse_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on polyfuse</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>polyfuse_angle</name>
+   <description>ACUTE : non 45 degree angle polyfuse</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>mvsd_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on mvsd</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>mvsd_angle</name>
+   <description>ACUTE : non 45 degree angle mvsd</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>mvpsd_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on mvpsd</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>mvpsd_angle</name>
+   <description>ACUTE : non 45 degree angle mvpsd</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>nat_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on nat</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>nat_angle</name>
+   <description>ACUTE : non 45 degree angle nat</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>comp_dummy_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on comp_dummy</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>comp_dummy_angle</name>
+   <description>ACUTE : non 45 degree angle comp_dummy</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>poly2_dummy_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on poly2_dummy</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>poly2_dummy_angle</name>
+   <description>ACUTE : non 45 degree angle poly2_dummy</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal1_dummy_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal1_dummy</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal1_dummy_angle</name>
+   <description>ACUTE : non 45 degree angle metal1_dummy</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal1_label_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal1_label</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal1_label_angle</name>
+   <description>ACUTE : non 45 degree angle metal1_label</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal1_slot_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal1_slot</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal1_slot_angle</name>
+   <description>ACUTE : non 45 degree angle metal1_slot</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal1_blk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal1_blk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal1_blk_angle</name>
+   <description>ACUTE : non 45 degree angle metal1_blk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal2_dummy_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal2_dummy</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal2_dummy_angle</name>
+   <description>ACUTE : non 45 degree angle metal2_dummy</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal2_label_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal2_label</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal2_label_angle</name>
+   <description>ACUTE : non 45 degree angle metal2_label</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal2_slot_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal2_slot</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal2_slot_angle</name>
+   <description>ACUTE : non 45 degree angle metal2_slot</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal2_blk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal2_blk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal2_blk_angle</name>
+   <description>ACUTE : non 45 degree angle metal2_blk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal3_dummy_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal3_dummy</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal3_dummy_angle</name>
+   <description>ACUTE : non 45 degree angle metal3_dummy</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal3_label_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal3_label</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal3_label_angle</name>
+   <description>ACUTE : non 45 degree angle metal3_label</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal3_slot_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal3_slot</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal3_slot_angle</name>
+   <description>ACUTE : non 45 degree angle metal3_slot</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal3_blk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal3_blk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal3_blk_angle</name>
+   <description>ACUTE : non 45 degree angle metal3_blk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal4_dummy_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal4_dummy</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal4_dummy_angle</name>
+   <description>ACUTE : non 45 degree angle metal4_dummy</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal4_label_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal4_label</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal4_label_angle</name>
+   <description>ACUTE : non 45 degree angle metal4_label</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal4_slot_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal4_slot</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal4_slot_angle</name>
+   <description>ACUTE : non 45 degree angle metal4_slot</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal4_blk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal4_blk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal4_blk_angle</name>
+   <description>ACUTE : non 45 degree angle metal4_blk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal5_dummy_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal5_dummy</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal5_dummy_angle</name>
+   <description>ACUTE : non 45 degree angle metal5_dummy</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal5_label_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal5_label</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal5_label_angle</name>
+   <description>ACUTE : non 45 degree angle metal5_label</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal5_slot_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal5_slot</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal5_slot_angle</name>
+   <description>ACUTE : non 45 degree angle metal5_slot</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal5_blk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal5_blk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal5_blk_angle</name>
+   <description>ACUTE : non 45 degree angle metal5_blk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>comp_label_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on comp_label</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>comp_label_angle</name>
+   <description>ACUTE : non 45 degree angle comp_label</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>poly2_label_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on poly2_label</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>poly2_label_angle</name>
+   <description>ACUTE : non 45 degree angle poly2_label</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ubmpperi_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on ubmpperi</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ubmpperi_angle</name>
+   <description>ACUTE : non 45 degree angle ubmpperi</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ubmparray_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on ubmparray</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ubmparray_angle</name>
+   <description>ACUTE : non 45 degree angle ubmparray</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ubmeplate_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on ubmeplate</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ubmeplate_angle</name>
+   <description>ACUTE : non 45 degree angle ubmeplate</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>schottky_diode_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on schottky_diode</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>schottky_diode_angle</name>
+   <description>ACUTE : non 45 degree angle schottky_diode</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>zener_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on zener</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>zener_angle</name>
+   <description>ACUTE : non 45 degree angle zener</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>res_mk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on res_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>res_mk_angle</name>
+   <description>ACUTE : non 45 degree angle res_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>opc_drc_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on opc_drc</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>opc_drc_angle</name>
+   <description>ACUTE : non 45 degree angle opc_drc</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ndmy_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on ndmy</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ndmy_angle</name>
+   <description>ACUTE : non 45 degree angle ndmy</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>pmndmy_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on pmndmy</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>pmndmy_angle</name>
+   <description>ACUTE : non 45 degree angle pmndmy</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>v5_xtor_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on v5_xtor</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>v5_xtor_angle</name>
+   <description>ACUTE : non 45 degree angle v5_xtor</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>cap_mk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on cap_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>cap_mk_angle</name>
+   <description>ACUTE : non 45 degree angle cap_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>mos_cap_mk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on mos_cap_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>mos_cap_mk_angle</name>
+   <description>ACUTE : non 45 degree angle mos_cap_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ind_mk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on ind_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ind_mk_angle</name>
+   <description>ACUTE : non 45 degree angle ind_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>diode_mk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on diode_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>diode_mk_angle</name>
+   <description>ACUTE : non 45 degree angle diode_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>drc_bjt_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on drc_bjt</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>drc_bjt_angle</name>
+   <description>ACUTE : non 45 degree angle drc_bjt</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>lvs_bjt_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on lvs_bjt</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>lvs_bjt_angle</name>
+   <description>ACUTE : non 45 degree angle lvs_bjt</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>mim_l_mk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on mim_l_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>mim_l_mk_angle</name>
+   <description>ACUTE : non 45 degree angle mim_l_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>latchup_mk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on latchup_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>latchup_mk_angle</name>
+   <description>ACUTE : non 45 degree angle latchup_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>guard_ring_mk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on guard_ring_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>guard_ring_mk_angle</name>
+   <description>ACUTE : non 45 degree angle guard_ring_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>otp_mk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on otp_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>otp_mk_angle</name>
+   <description>ACUTE : non 45 degree angle otp_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>mtpmark_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on mtpmark</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>mtpmark_angle</name>
+   <description>ACUTE : non 45 degree angle mtpmark</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>neo_ee_mk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on neo_ee_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>neo_ee_mk_angle</name>
+   <description>ACUTE : non 45 degree angle neo_ee_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>sramcore_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on sramcore</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>sramcore_angle</name>
+   <description>ACUTE : non 45 degree angle sramcore</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>lvs_rf_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on lvs_rf</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>lvs_rf_angle</name>
+   <description>ACUTE : non 45 degree angle lvs_rf</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>lvs_drain_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on lvs_drain</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>lvs_drain_angle</name>
+   <description>ACUTE : non 45 degree angle lvs_drain</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ind_mk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on ind_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ind_mk_angle</name>
+   <description>ACUTE : non 45 degree angle ind_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>hvpolyrs_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on hvpolyrs</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>hvpolyrs_angle</name>
+   <description>ACUTE : non 45 degree angle hvpolyrs</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>lvs_io_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on lvs_io</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>lvs_io_angle</name>
+   <description>ACUTE : non 45 degree angle lvs_io</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>probe_mk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on probe_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>probe_mk_angle</name>
+   <description>ACUTE : non 45 degree angle probe_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>esd_mk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on esd_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>esd_mk_angle</name>
+   <description>ACUTE : non 45 degree angle esd_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>lvs_source_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on lvs_source</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>lvs_source_angle</name>
+   <description>ACUTE : non 45 degree angle lvs_source</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>well_diode_mk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on well_diode_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>well_diode_mk_angle</name>
+   <description>ACUTE : non 45 degree angle well_diode_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ldmos_xtor_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on ldmos_xtor</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ldmos_xtor_angle</name>
+   <description>ACUTE : non 45 degree angle ldmos_xtor</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>plfuse_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on plfuse</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>plfuse_angle</name>
+   <description>ACUTE : non 45 degree angle plfuse</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>efuse_mk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on efuse_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>efuse_mk_angle</name>
+   <description>ACUTE : non 45 degree angle efuse_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>mcell_feol_mk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on mcell_feol_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>mcell_feol_mk_angle</name>
+   <description>ACUTE : non 45 degree angle mcell_feol_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ymtp_mk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on ymtp_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>ymtp_mk_angle</name>
+   <description>ACUTE : non 45 degree angle ymtp_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>dev_wf_mk_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on dev_wf_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>dev_wf_mk_angle</name>
+   <description>ACUTE : non 45 degree angle dev_wf_mk</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>pr_bndry_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on pr_bndry</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>pr_bndry_angle</name>
+   <description>ACUTE : non 45 degree angle pr_bndry</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>mdiode_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on mdiode</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>mdiode_angle</name>
+   <description>ACUTE : non 45 degree angle mdiode</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal1_res_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal1_res</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal1_res_angle</name>
+   <description>ACUTE : non 45 degree angle metal1_res</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal2_res_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal2_res</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal2_res_angle</name>
+   <description>ACUTE : non 45 degree angle metal2_res</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal3_res_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal3_res</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal3_res_angle</name>
+   <description>ACUTE : non 45 degree angle metal3_res</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal4_res_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal4_res</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal4_res_angle</name>
+   <description>ACUTE : non 45 degree angle metal4_res</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal5_res_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal5_res</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal5_res_angle</name>
+   <description>ACUTE : non 45 degree angle metal5_res</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal6_res_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on metal6_res</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>metal6_res_angle</name>
+   <description>ACUTE : non 45 degree angle metal6_res</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>border_OFFGRID</name>
+   <description>OFFGRID : OFFGRID vertex on border</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>border_angle</name>
+   <description>ACUTE : non 45 degree angle border</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_hres.lyrdb b/tapeout/outputs/drc/caravel_18000abd_hres.lyrdb
new file mode 100644
index 0000000..19c4e36
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_hres.lyrdb
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/hres.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>HRES.1</name>
+   <description>HRES.1 : Minimum space. Note : Merge if the spacing is less than 0.4 um. : 0.4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>HRES.2</name>
+   <description>HRES.2 : Minimum width of Poly2 resistor. : 1µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>HRES.3</name>
+   <description>HRES.3 : Minimum space between Poly2 resistors. : 0.4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>HRES.4</name>
+   <description>HRES.4 : Minimum RESISTOR overlap of Poly2 resistor. : 0.4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>HRES.5</name>
+   <description>HRES.5 : Minimum RESISTOR space to unrelated Poly2. : 0.3µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>HRES.6</name>
+   <description>HRES.6 : Minimum RESISTOR space to COMP.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>HRES.7</name>
+   <description>HRES.7 : Minimum Pplus overlap of contact on Poly2 resistor. : 0.2µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>HRES.8</name>
+   <description>HRES.8 : Space from salicide block to contact on Poly2 resistor.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>HRES.9</name>
+   <description>HRES.9 : Minimum salicide block overlap of Poly2 resistor in width direction.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>HRES.10</name>
+   <description>HRES.10 : Minimum &amp; maximum Pplus overlap of SAB.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>HRES.12a</name>
+   <description>HRES.12a : P type Poly2 resistor (high sheet rho) shall be covered by RES_MK marking. RES_MK length shall be coincide with resistor length (Defined by Pplus space) and width covering the width of Poly2. </description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>HRES.12b</name>
+   <description>HRES.12b : If the size of single RES_MK mark layer is greater than 15000 um2 and both side (X and Y) are greater than 80 um. Then the minimum spacing to adjacent RES_MK layer. : 20µm</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_lres.lyrdb b/tapeout/outputs/drc/caravel_18000abd_lres.lyrdb
new file mode 100644
index 0000000..5255857
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_lres.lyrdb
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/lres.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>LRES.1</name>
+   <description>LRES.1 : Minimum width of Poly2 resistor. : 0.8µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>LRES.2</name>
+   <description>LRES.2 : Minimum space between Poly2 resistors. : 0.4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>LRES.3</name>
+   <description>LRES.3 : Minimum space from Poly2 resistor to COMP.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>LRES.4</name>
+   <description>LRES.4 : Minimum space from Poly2 resistor to unrelated Poly2. : 0.6µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>LRES.5</name>
+   <description>LRES.5 : Minimum Nplus implant overlap of Poly2 resistor. : 0.3µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>LRES.6</name>
+   <description>LRES.6 : Minimum salicide block overlap of Poly2 resistor in width direction. : 0.28µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>LRES.7</name>
+   <description>LRES.7 : Space from salicide block to contact on Poly2 resistor.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>LRES.9a</name>
+   <description>LRES.9a : Nplus Poly2 resistor shall be covered by RES_MK marking. RES_MK length shall be coincide with resistor length (Defined by SAB length) and width covering the width of Poly2. </description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>LRES.9b</name>
+   <description>LRES.9b : If the size of single RES_MK mark layer is greater than 15000um2 and both side (X and Y) are greater than 80um. then the minimum spacing to adjacent RES_MK layer. : 20µm</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_lvpwell.lyrdb b/tapeout/outputs/drc/caravel_18000abd_lvpwell.lyrdb
new file mode 100644
index 0000000..06f7584
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_lvpwell.lyrdb
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/lvpwell.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>LPW.1_3.3V</name>
+   <description>LPW.1_3.3V : Min. LVPWELL Width. : 0.6µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>LPW.1_5V</name>
+   <description>LPW.1_5V : Min. LVPWELL Width. : 0.74µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>LPW.2a_3.3V_</name>
+   <description>LPW.2a_3.3V_ : Min. LVPWELL to LVWELL Space (Inside DNWELL) [Different potential]. : 1.4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>LPW.2a_5V_</name>
+   <description>LPW.2a_5V_ : Min. LVPWELL to LVPWELL Space (Inside DNWELL) [Different potential]. : 1.7µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>LPW.3</name>
+   <description>LPW.3 : Min. DNWELL enclose LVPWELL. : 2.5µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>LPW.4</name>
+   <description>LPW.4 : If LVPWELL is used as resistor, it must be covered by RES_MK (for LVS
+    purpose). Width of the resistor determined by LVPWELL. Length by COMP-to-COMP space. RES_MK length shall be coinciding with resistor length
+    (Touching COMP each side) and width covering the width of LVPWELL.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>LPW.5</name>
+   <description>LPW.5_3.3V : LVPWELL resistors must be enclosed by DNWELL.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>LPW.11</name>
+   <description>LPW.11 : Min. (LVPWELL outside DNWELL) space to DNWELL. : 1.5µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>LPW.12</name>
+   <description>LPW.12 : LVPWELL cannot overlap with Nwell.</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_lvs_bjt.lyrdb b/tapeout/outputs/drc/caravel_18000abd_lvs_bjt.lyrdb
new file mode 100644
index 0000000..3e46045
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_lvs_bjt.lyrdb
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/lvs_bjt.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>LVS_BJT.1</name>
+   <description>LVS_BJT.1 : Minimum LVS_BJT enclosure of NPN or PNP Emitter COMP layers</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_main.lyrdb b/tapeout/outputs/drc/caravel_18000abd_main.lyrdb
new file mode 100644
index 0000000..c56f52f
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_main.lyrdb
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/main.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_mcell.lyrdb b/tapeout/outputs/drc/caravel_18000abd_mcell.lyrdb
new file mode 100644
index 0000000..fea6fa7
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_mcell.lyrdb
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/mcell.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>MC.1</name>
+   <description>MC.1 : min. mcell width : 0.4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>MC.2</name>
+   <description>MC.2 : min. mcell spacing : 0.4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>MC.3</name>
+   <description>MC.3 : Minimum Mcell area : 0.35µm²</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>MC.4</name>
+   <description>MC.4 : Minimum area enclosed by Mcell : 0.35µm²</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_metal1.lyrdb b/tapeout/outputs/drc/caravel_18000abd_metal1.lyrdb
new file mode 100644
index 0000000..f7c906f
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_metal1.lyrdb
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/metal1.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>M1.1</name>
+   <description>M1.1 : min. metal1 width : 0.23µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>M1.2a</name>
+   <description>M1.2a : min. metal1 spacing : 0.23µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>M1.2b</name>
+   <description>M1.2b : Space to wide Metal1 (length &amp; width &gt; 10um) : 0.3µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>M1.3</name>
+   <description>M1.3 : Minimum Metal1 area : 0.1444µm²</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_metal2.lyrdb b/tapeout/outputs/drc/caravel_18000abd_metal2.lyrdb
new file mode 100644
index 0000000..3ae64d5
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_metal2.lyrdb
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/metal2.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>M2.1</name>
+   <description>M2.1 : min. metal2 width : 0.28µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>M2.2a</name>
+   <description>M2.2a : min. metal2 spacing : 0.28µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>M2.2b</name>
+   <description>M2.2b : Space to wide Metal2 (length &amp; width &gt; 10um) : 0.3µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>M2.3</name>
+   <description>M2.3 : Minimum metal2 area : 0.1444µm²</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_metal3.lyrdb b/tapeout/outputs/drc/caravel_18000abd_metal3.lyrdb
new file mode 100644
index 0000000..c405c8a
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_metal3.lyrdb
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/metal3.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>M3.1</name>
+   <description>M3.1 : min. metal3 width : 0.28µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>M3.2a</name>
+   <description>M3.2a : min. metal3 spacing : 0.28µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>M3.2b</name>
+   <description>M3.2b : Space to wide Metal3 (length &amp; width &gt; 10um) : 0.3µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>M3.3</name>
+   <description>M3.3 : Minimum metal3 area : 0.1444µm²</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_metal4.lyrdb b/tapeout/outputs/drc/caravel_18000abd_metal4.lyrdb
new file mode 100644
index 0000000..472dc17
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_metal4.lyrdb
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/metal4.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>M4.1</name>
+   <description>M4.1 : min. metal4 width : 0.28µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>M4.2a</name>
+   <description>M4.2a : min. metal4 spacing : 0.28µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>M4.2b</name>
+   <description>M4.2b : Space to wide Metal4 (length &amp; width &gt; 10um) : 0.3µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>M4.3</name>
+   <description>M4.3 : Minimum metal4 area : 0.1444µm²</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_metal5.lyrdb b/tapeout/outputs/drc/caravel_18000abd_metal5.lyrdb
new file mode 100644
index 0000000..bc08e77
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_metal5.lyrdb
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/metal5.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>M5.1</name>
+   <description>M5.1 : min. metal5 width : 0.28µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>M5.2a</name>
+   <description>M5.2a : min. metal5 spacing : 0.28µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>M5.2b</name>
+   <description>M5.2b : Space to wide Metal5 (length &amp; width &gt; 10um) : 0.3µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>M5.3</name>
+   <description>M5.3 : Minimum metal5 area : 0.1444µm²</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_metaltop.lyrdb b/tapeout/outputs/drc/caravel_18000abd_metaltop.lyrdb
new file mode 100644
index 0000000..300af09
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_metaltop.lyrdb
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/metaltop.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>MT.1</name>
+   <description>MT.1 : min. metaltop width : 0.44µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>MT.2a</name>
+   <description>MT.2a : min. metaltop spacing : 0.46µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>MT.2b</name>
+   <description>MT.2b : Space to wide Metal2 (length &amp; width &gt; 10um) : 0.6µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>MT.4</name>
+   <description>MT.4 : Minimum MetalTop area : 0.5625µm²</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_mim.lyrdb b/tapeout/outputs/drc/caravel_18000abd_mim.lyrdb
new file mode 100644
index 0000000..8fa9809
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_mim.lyrdb
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/mim.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>MIMTM.1</name>
+   <description>MIMTM.1 : Minimum MiM bottom plate spacing to the bottom plate metal (whether adjacent MiM or routing metal). : 1.2µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>MIMTM.2</name>
+   <description>MIMTM.2 : Minimum MiM bottom plate overlap of Vian-1 layer. [This is applicable for Vian-1 within 1.06um oversize of FuseTop layer (referenced to virtual bottom plate)]. : 0.4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>MIMTM.3</name>
+   <description>MIMTM.3 : Minimum MiM bottom plate overlap of Top plate.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>MIMTM.4</name>
+   <description>MIMTM.4 : Minimum MiM top plate (FuseTop) overlap of Vian-1. : 0.4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>MIMTM.5</name>
+   <description>MIMTM.5 : Minimum spacing between top plate and the Vian-1 connecting to the bottom plate. : 0.4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>MIMTM.6</name>
+   <description>MIMTM.6 : Minimum spacing between unrelated top plates. : 0.6µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>MIMTM.7</name>
+   <description>MIMTM.7 : Min FuseTop enclosure by CAP_MK.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>MIMTM.8a</name>
+   <description>MIMTM.8a : Minimum MIM cap area (defined by FuseTop area) (um2). : 25µm²</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>MIMTM.8b</name>
+   <description>MIMTM.8b : Maximum single MIM Cap area (Use multiple MIM caps in parallel connection if bigger capacitors are required) (um2). : 10000µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>MIMTM.9</name>
+   <description>MIMTM.9 : Min. Via (Vian-1) spacing for sea of Via on MIM top plate. : 0.5µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>MIMTM.10</name>
+   <description>MIMTM.10 : (a) There cannot be any Vian-2 touching MIM bottom plate Metaln-1. (b) MIM bottom plate Metaln-1 can only be connected through the higher Via (Vian-1).</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>MIMTM.11</name>
+   <description>MIMTM.11 : Bottom plate of multiple MIM caps can be shared (for common nodes) as long as total MIM area with that single common plate does not exceed MIMTM.8b rule. : -µm</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_nat.lyrdb b/tapeout/outputs/drc/caravel_18000abd_nat.lyrdb
new file mode 100644
index 0000000..c348006
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_nat.lyrdb
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/nat.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>NAT.1</name>
+   <description>NAT.1 : Min. NAT Overlap of COMP of Native Vt NMOS. : 2µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NAT.2</name>
+   <description>NAT.2 : Space to unrelated COMP (outside NAT). : 0.3µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NAT.3</name>
+   <description>NAT.3 : Space to NWell edge. : 0.5µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NAT.4</name>
+   <description>NAT.4 : Minimum channel length for 3.3V Native Vt NMOS (For smaller L Ioff will be higher than Spec). : 1.8µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NAT.5</name>
+   <description>NAT.5 : Minimum channel length for 6.0V Native Vt NMOS (For smaller L Ioff will be higher than Spec). : 1.8µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NAT.7</name>
+   <description>NAT.7 : Minimum NAT to NAT spacing. : 0.74µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NAT.8</name>
+   <description>NAT.8 : Min. Dualgate overlap of NAT (for 5V/6V) native VT NMOS only.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NAT.9</name>
+   <description>NAT.9 : Poly interconnect under NAT layer is not allowed, minimum spacing of un-related poly from the NAT layer.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NAT.10</name>
+   <description>NAT.10 : Nwell, inside NAT layer are not allowed.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NAT.11</name>
+   <description>NAT.11 : NCOMP not intersecting to Poly2, is not allowed inside NAT layer.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NAT.12</name>
+   <description>NAT.12 : Poly2 not intersecting with COMP is not allowed inside NAT (Poly2 resistor is not allowed inside NAT).</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_nplus.lyrdb b/tapeout/outputs/drc/caravel_18000abd_nplus.lyrdb
new file mode 100644
index 0000000..79132dc
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_nplus.lyrdb
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/nplus.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>NP.1</name>
+   <description>NP.1 : min. nplus width : 0.4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.2</name>
+   <description>NP.2 : min. nplus spacing : 0.4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.3a</name>
+   <description>NP.3a : Space to PCOMP for PCOMP: (1) Inside Nwell (2) Outside LVPWELL but inside DNWELL. : 0.16µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.3bi</name>
+   <description>NP.3bi : Space to PCOMP: For Inside DNWELL, inside LVPWELL:(i) For PCOMP overlap by LVPWELL &lt; 0.43um. : 0.16µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.3bii</name>
+   <description>NP.3bii : Space to PCOMP: For Inside DNWELL, inside LVPWELL:(ii) For PCOMP overlap by LVPWELL &gt;= 0.43um. : 0.08µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.3ci</name>
+   <description>NP.3ci : Space to PCOMP: For Outside DNWELL:(i) For PCOMP space to Nwell &lt; 0.43um. : 0.16µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.3cii</name>
+   <description>NP.3cii : Space to PCOMP: For Outside DNWELL:(ii) For PCOMP space to Nwell &gt;= 0.43um. : 0.08µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.3d</name>
+   <description>NP.3d : Min/max space to a butted PCOMP.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.3e</name>
+   <description>NP.3e : Space to related PCOMP edge adjacent to a butting edge.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.4a</name>
+   <description>NP.4a : Space to related P-channel gate at a butting edge parallel to gate. : 0.32µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.4b</name>
+   <description>NP.4b : Within 0.32um of channel, space to P-channel gate extension perpendicular to the direction of Poly2.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.5a</name>
+   <description>NP.5a : Overlap of N-channel gate. : 0.23µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.5b</name>
+   <description>NP.5b : Extension beyond COMP for the COMP (1) inside LVPWELL (2) outside Nwell and DNWELL. : 0.16µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.5ci</name>
+   <description>NP.5ci : Extension beyond COMP: For Inside DNWELL: (i)For Nplus &lt; 0.43um from LVPWELL edge for Nwell or DNWELL tap inside DNWELL. : 0.16µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.5cii</name>
+   <description>NP.5cii : Extension beyond COMP: For Inside DNWELL: (ii) For Nplus &gt;= 0.43um from LVPWELL edge for Nwell or DNWELL tap inside DNWELL. : 0.02µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.5di</name>
+   <description>NP.5di : Extension beyond COMP: For Outside DNWELL, inside Nwell: (i) For Nwell overlap of Nplus &lt; 0.43um. : 0.16µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.5dii</name>
+   <description>NP.5dii : Extension beyond COMP: For Outside DNWELL, inside Nwell: (ii) For Nwell overlap of Nplus &gt;= 0.43um. : 0.02µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.6</name>
+   <description>NP.6 : Overlap with NCOMP butted to PCOMP. : 0.22µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.7</name>
+   <description>NP.7 : Space to unrelated unsalicided Poly2. : 0.18µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.8a</name>
+   <description>NP.8a : Minimum Nplus area (um2). : 0.35µm²</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.8b</name>
+   <description>NP.8b : Minimum area enclosed by Nplus (um2). : 0.35µm²</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.9</name>
+   <description>NP.9 : Overlap of unsalicided Poly2. : 0.18µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.10</name>
+   <description>NP.10 : Overlap of unsalicided COMP. : 0.18µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.11</name>
+   <description>NP.11 : Butting Nplus and PCOMP is forbidden within 0.43um of Nwell edge (for outside DNWELL) and of LVPWELL edge (for inside DNWELL case).</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>NP.12</name>
+   <description>NP.12 : Overlap with P-channel poly2 gate extension is forbidden within 0.32um of P-channel gate.</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_otp_mk.lyrdb b/tapeout/outputs/drc/caravel_18000abd_otp_mk.lyrdb
new file mode 100644
index 0000000..1323148
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_otp_mk.lyrdb
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/otp_mk.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>O.DF.3a</name>
+   <description>O.DF.3a : Min. COMP Space. P-substrate tap (PCOMP outside NWELL) can be butted for different voltage devices as the potential is same. : 0.24µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>O.DF.6</name>
+   <description>O.DF.6 : Min. COMP extend beyond poly2 (it also means source/drain overhang). : 0.22µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>O.DF.9</name>
+   <description>O.DF.9 : Min. COMP area (um2). : 0.1444µm²</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>O.PL.2</name>
+   <description>O.PL.2 : Min. poly2 width. : 0.22µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>O.PL.3a</name>
+   <description>O.PL.3a : Min. poly2 Space on COMP. : 0.18µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>O.PL.4</name>
+   <description>O.PL.4 : Min. extension beyond COMP to form Poly2 end cap. : 0.14µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>O.SB.2</name>
+   <description>O.SB.2 : Min. salicide Block Space. : 0.28µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>O.SB.3</name>
+   <description>O.SB.3 : Min. space from salicide block to unrelated COMP. : 0.09µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>O.SB.4</name>
+   <description>O.SB.4 : Min. space from salicide block to contact.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>O.SB.5b_3.3V</name>
+   <description>O.SB.5b_3.3V : Min. space from salicide block to unrelated Poly2 on COMP. : 0.1µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>O.SB.9</name>
+   <description>O.SB.9 : Min. salicide block extension beyond unsalicided Poly2. : 0.1µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>O.SB.11</name>
+   <description>O.SB.11 : Min. salicide block overlap with COMP. : 0.04µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>O.SB.13_3.3V</name>
+   <description>O.SB.13_3.3V : Min. area of silicide block (um2). : 1.488µm²</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>O.SB.13_5V</name>
+   <description>O.SB.13_5V : Min. area of silicide block (um2). : 2µm²</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>O.CO.7</name>
+   <description>O.CO.7 : Min. space from COMP contact to Poly2 on COMP. : 0.13µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>O.PL.ORT</name>
+   <description>O.PL.ORT : Orientation-restricted gates must have the gate width aligned along the X-axis (poly line running horizontally) in reference to wafer notch down. : 0µm</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_poly2.lyrdb b/tapeout/outputs/drc/caravel_18000abd_poly2.lyrdb
new file mode 100644
index 0000000..08bbd0b
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_poly2.lyrdb
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/poly2.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>PL.1_3.3V</name>
+   <description>PL.1_3.3V : Interconnect Width (outside PLFUSE). : 0.18µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PL.1_5V</name>
+   <description>PL.1_5V : Interconnect Width (outside PLFUSE). : 0.2µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PL.1a_3.3V</name>
+   <description>PL.1a_3.3V : Interconnect Width (inside PLFUSE). : 0.18µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PL.1a_5V</name>
+   <description>PL.1a_5V : Interconnect Width (inside PLFUSE). : 0.18µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PL.2_3.3V</name>
+   <description>PL.2_3.3V : Gate Width (Channel Length). : 0.28µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PL.2_5V</name>
+   <description>PL.2_5V : Gate Width (Channel Length).</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PL.3a_3.3V</name>
+   <description>PL.3a_3.3V : Space on COMP/Field. : 0.24µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PL.3a_5V</name>
+   <description>PL.3a_5V : Space on COMP/Field. : 0.24µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PL.4_3.3V</name>
+   <description>PL.4_3.3V : Extension beyond COMP to form Poly2 end cap. : 0.22µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PL.4_5V</name>
+   <description>PL.4_5V : Extension beyond COMP to form Poly2 end cap. : 0.22µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PL.5a_3.3V</name>
+   <description>PL.5a_3.3V : Space from field Poly2 to unrelated COMP Spacer from field Poly2 to Guard-ring. : 0.1µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PL.5a_5V</name>
+   <description>PL.5a_5V : Space from field Poly2 to unrelated COMP Spacer from field Poly2 to Guard-ring. : 0.3µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PL.5b_3.3V</name>
+   <description>PL.5b_3.3V : Space from field Poly2 to related COMP. : 0.1µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PL.5b_5V</name>
+   <description>PL.5b_5V : Space from field Poly2 to related COMP. : 0.3µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PL.6</name>
+   <description>PL.6 : 90 degree bends on the COMP are not allowed.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PL.7_3.3V</name>
+   <description>PL.7_3.3V : 45 degree bent gate width : 0.3µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PL.7_5V</name>
+   <description>PL.7_5V : 45 degree bent gate width : 0.7µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PL.9</name>
+   <description>PL.9 : Poly2 inter connect connecting 3.3V and 5V areas (area inside and outside Dualgate) are not allowed. They shall be done though metal lines only.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PL.11</name>
+   <description>PL.11 : V5_Xtor must enclose 5V device.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PL.12</name>
+   <description>PL.12 : V5_Xtor enclose 5V Comp.</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_pplus.lyrdb b/tapeout/outputs/drc/caravel_18000abd_pplus.lyrdb
new file mode 100644
index 0000000..5ba3faa
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_pplus.lyrdb
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/pplus.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>PP.1</name>
+   <description>PP.1 : min. pplus width : 0.4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.2</name>
+   <description>PP.2 : min. pplus spacing : 0.4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.3a</name>
+   <description>PP.3a : Space to NCOMP for NCOMP (1) inside LVPWELL (2) outside NWELL and DNWELL. : 0.16µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.3bi</name>
+   <description>PP.3bi : Space to NCOMP: For Inside DNWELL. (i) NCOMP space to LVPWELL &gt;= 0.43um. : 0.08µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.3bii</name>
+   <description>PP.3bii : Space to NCOMP: For Inside DNWELL. (ii) NCOMP space to LVPWELL &lt; 0.43um. : 0.16µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.3ci</name>
+   <description>PP.3ci : Space to NCOMP: For Outside DNWELL, inside Nwell: (i) NWELL Overlap of NCOMP &gt;= 0.43um. : 0.08µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.3cii</name>
+   <description>PP.3cii : Space to NCOMP: For Outside DNWELL, inside Nwell: (ii) NWELL Overlap of NCOMP 0.43um. : 0.16µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.3d</name>
+   <description>PP.3d : Min/max space to a butted NCOMP.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.3e</name>
+   <description>PP.3e : Space to NCOMP edge adjacent to a butting edge.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.4a</name>
+   <description>PP.4a : Space related to N-channel gate at a butting edge parallel to gate. : 0.32µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.4b</name>
+   <description>PP.4b : Within 0.32um of channel, space to N-channel gate extension perpendicular to the direction of Poly2.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.5a</name>
+   <description>PP.5a : Overlap of P-channel gate. : 0.23µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.5b</name>
+   <description>PP.5b : Extension beyond COMP for COMP (1) Inside NWELL (2) outside LVPWELL but inside DNWELL. : 0.16µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.5ci</name>
+   <description>PP.5ci : Extension beyond COMP: For Inside DNWELL, inside LVPWELL: (i) For LVPWELL overlap of Pplus &gt;= 0.43um for LVPWELL tap. : 0.02µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.5cii</name>
+   <description>PP.5cii : Extension beyond COMP: For Inside DNWELL, inside LVPWELL: (ii) For LVPWELL overlap of Pplus &lt; 0.43um for the LVPWELL tap. : 0.16µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.5di</name>
+   <description>PP.5di : Extension beyond COMP: For Outside DNWELL (i) For Pplus to NWELL space &gt;= 0.43um for Pfield or LVPWELL tap. : 0.02µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.5dii</name>
+   <description>PP.5dii : Extension beyond COMP: For Outside DNWELL (ii) For Pplus to NWELL space &lt; 0.43um for Pfield or LVPWELL tap. : 0.16µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.6</name>
+   <description>PP.6 : Overlap with PCOMP butted to NCOMP. : 0.22µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.7</name>
+   <description>PP.7 : Space to unrelated unsalicided Poly2. : 0.18µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.8a</name>
+   <description>PP.8a : Minimum Pplus area (um2). : 0.35µm²</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.8b</name>
+   <description>PP.8b : Minimum area enclosed by Pplus (um2). : 0.35µm²</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.9</name>
+   <description>PP.9 : Overlap of unsalicided Poly2. : 0.18µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.10</name>
+   <description>PP.10 : Overlap of unsalicided COMP. : 0.18µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.11</name>
+   <description>PP.11 : Butting Pplus and NCOMP is forbidden within 0.43um of Nwell edge (for outside DNWELL) and of LVPWELL edge (for inside DNWELL case).</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PP.12</name>
+   <description>PP.12 : Overlap with N-channel Poly2 gate extension is forbidden within 0.32um of N-channel gate.</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_pres.lyrdb b/tapeout/outputs/drc/caravel_18000abd_pres.lyrdb
new file mode 100644
index 0000000..ad93515
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_pres.lyrdb
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/pres.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>PRES.1</name>
+   <description>PRES.1 : Minimum width of Poly2 resistor. : 0.8µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PRES.2</name>
+   <description>PRES.2 : Minimum space between Poly2 resistors. : 0.4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PRES.3</name>
+   <description>PRES.3 : Minimum space from Poly2 resistor to COMP.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PRES.4</name>
+   <description>PRES.4 : Minimum space from Poly2 resistor to unrelated Poly2. : 0.6µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PRES.5</name>
+   <description>PRES.5 : Minimum Plus implant overlap of Poly2 resistor. : 0.3µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PRES.6</name>
+   <description>PRES.6 : Minimum salicide block overlap of Poly2 resistor in width direction. : 0.28µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PRES.7</name>
+   <description>PRES.7 : Space from salicide block to contact on Poly2 resistor.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PRES.9a</name>
+   <description>PRES.9a : Pplus Poly2 resistor shall be covered by RES_MK marking. RES_MK length shall be coincide with resistor length (Defined by SAB length) and width covering the width of Poly2.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>PRES.9b</name>
+   <description>PRES.9b : If the size of single RES_MK mark layer is greater than 15000um2 and both side (X and Y) are greater than 80um. then the minimum spacing to adjacent RES_MK layer. : 20µm</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_sab.lyrdb b/tapeout/outputs/drc/caravel_18000abd_sab.lyrdb
new file mode 100644
index 0000000..5903095
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_sab.lyrdb
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/sab.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>SB.1</name>
+   <description>SB.1 : min. sab width : 0.42µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>SB.2</name>
+   <description>SB.2 : min. sab spacing : 0.42µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>SB.3</name>
+   <description>SB.3 : Space from salicide block to unrelated COMP. : 0.22µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>SB.4</name>
+   <description>SB.4 : Space from salicide block to contact.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>SB.5a</name>
+   <description>SB.5a : Space from salicide block to unrelated Poly2 on field. : 0.3µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>SB.5b</name>
+   <description>SB.5b : Space from salicide block to unrelated Poly2 on COMP. : 0.28µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>SB.6</name>
+   <description>SB.6 : Salicide block extension beyond related COMP. : 0.22µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>SB.7</name>
+   <description>SB.7 : COMP extension beyond related salicide block. : 0.22µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>SB.8</name>
+   <description>SB.8 : Non-salicided contacts are forbidden.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>SB.9</name>
+   <description>SB.9 : Salicide block extension beyond unsalicided Poly2. : 0.22µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>SB.10</name>
+   <description>SB.10 : Poly2 extension beyond related salicide block. : 0.22µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>SB.11</name>
+   <description>SB.11 : Overlap with COMP. : 0.22µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>SB.12</name>
+   <description>SB.12 : Overlap with Poly2 outside ESD_MK. : 0.22µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>SB.13</name>
+   <description>SB.13 : Min. area (um2). : 2µm²</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>SB.14a</name>
+   <description>SB.14a : Space from unsalicided Nplus Poly2 to unsalicided Pplus Poly2. (Unsalicided Nplus Poly2 must not fall within a square of 0.56um x 0.56um at unsalicided Pplus Poly2 corners). : 0.56µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>SB.14b</name>
+   <description>SB.14b : Space from unsalicided Nplus Poly2 to P-channel gate. (Unsalicided Nplus Poly2 must not fall within a square of 0.56um x 0.56um at P-channel gate corners). : 0.56µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>SB.15a</name>
+   <description>SB.15a : Space from unsalicided Poly2 to unrelated Nplus/Pplus. : 0.18µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>SB.15b</name>
+   <description>SB.15b : Space from unsalicided Poly2 to unrelated Nplus/Pplus along Poly2 line. : 0.32µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>SB.16</name>
+   <description>SB.16 : SAB layer cannot exist on 3.3V and 5V/6V CMOS transistors' Poly and COMP area of the core circuit (Excluding the transistors used for ESD purpose). It can only exist on CMOS transistors marked by LVS_IO, OTP_MK, ESD_MK layers.</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_sram.lyrdb b/tapeout/outputs/drc/caravel_18000abd_sram.lyrdb
new file mode 100644
index 0000000..b71dc88
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_sram.lyrdb
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/sram.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>S.DF.4c_MV</name>
+   <description>S.DF.4c_MV : Min. (Nwell overlap of PCOMP) outside DNWELL. : 0.45µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>S.DF.6_MV</name>
+   <description>S.DF.6_MV : Min. COMP extend beyond gate (it also means source/drain overhang). : 0.32µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>S.DF.7_MV</name>
+   <description>S.DF.7_MV : Min. (LVPWELL Spacer to PCOMP) inside DNWELL. : 0.45µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>S.DF.8_MV</name>
+   <description>S.DF.8_MV : Min. (LVPWELL overlap of NCOMP) Inside DNWELL. : 0.45µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>S.DF.16_MV</name>
+   <description>S.DF.16_MV : Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). : 0.45µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>S.PL.5a_MV</name>
+   <description>S.PL.5a_MV : Space from field Poly2 to unrelated COMP Spacer from field Poly2 to Guard-ring. : 0.12µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>S.PL.5b_MV</name>
+   <description>S.PL.5b_MV : Space from field Poly2 to related COMP. : 0.12µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>S.CO.4_MV</name>
+   <description>S.CO.4_MV : COMP overlap of contact. : 0.04µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>S.DF.4c_LV</name>
+   <description>S.DF.4c_LV : Min. (Nwell overlap of PCOMP) outside DNWELL. : 0.4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>S.DF.16_LV</name>
+   <description>S.DF.16_LV : Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). : 0.4µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>S.CO.3_LV</name>
+   <description>S.CO.3_LV : Poly2 overlap of contact. : 0.04µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>S.CO.4_LV</name>
+   <description>S.CO.4_LV : COMP overlap of contact. : 0.03µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>S.CO.6_ii_LV</name>
+   <description>S.CO.6_ii_LV : (ii) If Metal1 overlaps contact by &lt; 0.04um on one side, adjacent metal1 edges overlap</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>S.M1.1_LV</name>
+   <description>S.M1.1_LV : min. metal1 width : 0.22µm</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_tail.lyrdb b/tapeout/outputs/drc/caravel_18000abd_tail.lyrdb
new file mode 100644
index 0000000..c0a17a2
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_tail.lyrdb
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/tail.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_via1.lyrdb b/tapeout/outputs/drc/caravel_18000abd_via1.lyrdb
new file mode 100644
index 0000000..7aed8c2
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_via1.lyrdb
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/via1.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>V1.1</name>
+   <description>V1.1 : Min/max Via1 size . : 0.26µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V1.2a</name>
+   <description>V1.2a : min. via1 spacing : 0.26µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V1.2b</name>
+   <description>V1.2b : Via1 Space in 4x4 or larger via1 array : 0.36µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V1.3a</name>
+   <description>V1.3a : metal1 overlap of via1 &gt;= 0.0</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V1.3c</name>
+   <description>V1.3c : metal1 (&lt; 0.34um) end-of-line overlap. : 0.06µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V1.3d</name>
+   <description>V1.3d : If metal1 overlap via1 by &lt; 0.04um on one side, adjacent metal1 edges overlap. : 0.06µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V1.4a</name>
+   <description>V1.4a : metal2 overlap of via1 &gt;= 0.01 um</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V1.4b</name>
+   <description>V1.4p : metal2 (&lt; 0.34um) end-of-line overlap. : 0.06µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V1.3d</name>
+   <description>V1.3d : If metal2 overlap via1 by &lt; 0.04um on one side, adjacent metal2 edges overlap. : 0.06µm</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_via2.lyrdb b/tapeout/outputs/drc/caravel_18000abd_via2.lyrdb
new file mode 100644
index 0000000..4dae15b
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_via2.lyrdb
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/via2.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>V2.1</name>
+   <description>V2.1 : Min/max Via1 size . : 0.26µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V2.2a</name>
+   <description>V2.2a : min. via2 spacing : 0.26µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V2.2b</name>
+   <description>V2.2b : Via1 Space in 4x4 or larger via2 array : 0.36µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V2.3a</name>
+   <description>V2.3a : metal2 overlap of via2 &gt;= 0.01</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V2.3c</name>
+   <description>V2.3c : metal2 (&lt; 0.34um) end-of-line overlap. : 0.06µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V2.3d</name>
+   <description>V2.3d : If metal2 overlap via2 by &lt; 0.04um on one side, adjacent metal2 edges overlap. : 0.06µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V2.4a</name>
+   <description>V2.4a : metal3 overlap of via2 &gt;= 0.01 um</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V2.4b</name>
+   <description>V2.4p : metal3 (&lt; 0.34um) end-of-line overlap. : 0.06µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V2.3d</name>
+   <description>V2.3d : If metal3 overlap via2 by &lt; 0.04um on one side, adjacent metal3 edges overlap. : 0.06µm</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_via3.lyrdb b/tapeout/outputs/drc/caravel_18000abd_via3.lyrdb
new file mode 100644
index 0000000..b13fd70
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_via3.lyrdb
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/via3.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>V3.1</name>
+   <description>V3.1 : Min/max Via1 size . : 0.26µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V3.2a</name>
+   <description>V3.2a : min. via3 spacing : 0.26µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V3.2b</name>
+   <description>V3.2b : Via1 Space in 4x4 or larger via3 array : 0.36µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V3.3a</name>
+   <description>V3.3a : metal3 overlap of via3 &gt;= 0.01</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V3.3c</name>
+   <description>V3.3c : metal3 (&lt; 0.34um) end-of-line overlap. : 0.06µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V3.3d</name>
+   <description>V3.3d : If metal3 overlap via3 by &lt; 0.04um on one side, adjacent metal3 edges overlap. : 0.06µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V3.4a</name>
+   <description>V3.4a : metal4 overlap of via3 &gt;= 0.01 um</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V3.4b</name>
+   <description>V3.4p : metal4 (&lt; 0.34um) end-of-line overlap. : 0.06µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V3.3d</name>
+   <description>V3.3d : If metal4 overlap via3 by &lt; 0.04um on one side, adjacent metal4 edges overlap. : 0.06µm</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_via4.lyrdb b/tapeout/outputs/drc/caravel_18000abd_via4.lyrdb
new file mode 100644
index 0000000..e53ddda
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_via4.lyrdb
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/via4.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>V4.1</name>
+   <description>V4.1 : Min/max Via1 size . : 0.26µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V4.2a</name>
+   <description>V4.2a : min. via4 spacing : 0.26µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V4.2b</name>
+   <description>V4.2b : Via1 Space in 4x4 or larger via4 array : 0.36µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V4.3a</name>
+   <description>V4.3a : metal4 overlap of via4 &gt;= 0.01</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V4.3c</name>
+   <description>V4.3c : metal4 (&lt; 0.34um) end-of-line overlap. : 0.06µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V4.3d</name>
+   <description>V4.3d : If metal4 overlap via4 by &lt; 0.04um on one side, adjacent metal4 edges overlap. : 0.06µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V4.4a</name>
+   <description>V4.4a : metal5 overlap of via4 &gt;= 0.01 um</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V4.4b</name>
+   <description>V4.4p : metal5 (&lt; 0.34um) end-of-line overlap. : 0.06µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>V4.3d</name>
+   <description>V4.3d : If metal5 overlap via4 by &lt; 0.04um on one side, adjacent metal5 edges overlap. : 0.06µm</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_via5.lyrdb b/tapeout/outputs/drc/caravel_18000abd_via5.lyrdb
new file mode 100644
index 0000000..12f0e52
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_via5.lyrdb
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/via5.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/caravel_18000abd_ymtp_mk.lyrdb b/tapeout/outputs/drc/caravel_18000abd_ymtp_mk.lyrdb
new file mode 100644
index 0000000..c50a7e9
--- /dev/null
+++ b/tapeout/outputs/drc/caravel_18000abd_ymtp_mk.lyrdb
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="utf-8"?>
+<report-database>
+ <description>DRC Run Report at</description>
+ <original-file/>
+ <generator>drc: script='/mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/drc/ymtp_mk.drc'</generator>
+ <top-cell>caravel_18000abd</top-cell>
+ <tags>
+ </tags>
+ <categories>
+  <category>
+   <name>Y.NW.2b_3.3V</name>
+   <description>Y.NW.2b_3.3V : Min. Nwell Space (Outside DNWELL, Inside YMTP_MK) [Different potential]. : 1µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>Y.NW.2b_5V</name>
+   <description>Y.NW.2b_5V : Min. Nwell Space (Outside DNWELL, Inside YMTP_MK) [Different potential]. : 1µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>Y.DF.6_5V</name>
+   <description>Y.DF.6_5V : Min. COMP extend beyond gate (it also means source/drain overhang) inside YMTP_MK. : 0.15µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>Y.DF.16_3.3V</name>
+   <description>Y.DF.16_3.3V : Min. space from (Nwell outside DNWELL) to (unrelated NCOMP outside Nwell and DNWELL) (inside YMTP_MK). : 0.27µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>Y.DF.16_5V</name>
+   <description>Y.DF.16_5V : Min. space from (Nwell outside DNWELL) to (unrelated NCOMP outside Nwell and DNWELL) (inside YMTP_MK). : 0.23µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>Y.PL.1_3.3V</name>
+   <description>Y.PL.1_3.3V : Interconnect Width (inside YMTP_MK). : 0.13µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>Y.PL.1_5V</name>
+   <description>Y.PL.1_5V : Interconnect Width (inside YMTP_MK). This rule is currently not applicable for 5V.</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>Y.PL.2_3.3V</name>
+   <description>Y.PL.2_3.3V : Gate Width (Channel Length) (inside YMTP_MK). : 0.13µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>Y.PL.2_5V</name>
+   <description>Y.PL.2_5V : Gate Width (Channel Length) (inside YMTP_MK). : 0.47µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>Y.PL.4_5V</name>
+   <description>Y.PL.4_5V : Poly2 extension beyond COMP to form Poly2 end cap (inside YMTP_MK). : 0.16µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>Y.PL.5a_3.3V</name>
+   <description>Y.PL.5a_3.3V : Space from field Poly2 to unrelated COMP (inside YMTP_MK). Space from field Poly2 to Guard-ring (inside YMTP_MK). : 0.04µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>Y.PL.5a_5V</name>
+   <description>Y.PL.5a_5V : Space from field Poly2 to unrelated COMP (inside YMTP_MK). Space from field Poly2 to Guard-ring (inside YMTP_MK). : 0.2µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>Y.PL.5b_3.3V</name>
+   <description>Y.PL.5b_3.3V : Space from field Poly2 to related COMP (inside YMTP_MK). : 0.04µm</description>
+   <categories>
+   </categories>
+  </category>
+  <category>
+   <name>Y.PL.5b_5V</name>
+   <description>Y.PL.5b_5V : Space from field Poly2 to related COMP (inside YMTP_MK). : 0.2µm</description>
+   <categories>
+   </categories>
+  </category>
+ </categories>
+ <cells>
+  <cell>
+   <name>caravel_18000abd</name>
+   <variant/>
+   <references>
+   </references>
+  </cell>
+ </cells>
+ <items>
+ </items>
+</report-database>
diff --git a/tapeout/outputs/drc/comp.drc b/tapeout/outputs/drc/comp.drc
new file mode 100644
index 0000000..810c836
--- /dev/null
+++ b/tapeout/outputs/drc/comp.drc
@@ -0,0 +1,1490 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+if FEOL
+    #================================================
+    #----------------------COMP----------------------
+    #================================================
+
+    # Rule DF.1a_3.3V: Min. COMP Width. is 0.22µm
+    logger.info("Executing rule DF.1a_3.3V")
+    df1a_l1  = comp.width(0.22.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    df1a_l1.output("DF.1a_3.3V", "DF.1a_3.3V : Min. COMP Width. : 0.22µm")
+    df1a_l1.forget
+
+    # Rule DF.1a_5V: Min. COMP Width. is 0.3µm
+    logger.info("Executing rule DF.1a_5V")
+    df1a_l1  = comp.not_inside(mvsd).not_inside(mvpsd).width(0.3.um, euclidian).polygons(0.001).overlapping(dualgate)
+    df1a_l1.output("DF.1a_5V", "DF.1a_5V : Min. COMP Width. : 0.3µm")
+    df1a_l1.forget
+
+    # rule DF.1b_3.3V is not a DRC check
+
+    # rule DF.1b_5V is not a DRC check
+
+    # Rule DF.1c_3.3V: Min. COMP Width for MOSCAP. is 1µm
+    logger.info("Executing rule DF.1c_3.3V")
+    df1c_l1  = comp.and(mos_cap_mk).width(1.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    df1c_l1.output("DF.1c_3.3V", "DF.1c_3.3V : Min. COMP Width for MOSCAP. : 1µm")
+    df1c_l1.forget
+
+    # Rule DF.1c_5V: Min. COMP Width for MOSCAP. is 1µm
+    logger.info("Executing rule DF.1c_5V")
+    df1c_l1  = comp.and(mos_cap_mk).width(1.um, euclidian).polygons(0.001).overlapping(dualgate)
+    df1c_l1.output("DF.1c_5V", "DF.1c_5V : Min. COMP Width for MOSCAP. : 1µm")
+    df1c_l1.forget
+
+    df_2a = comp.not(poly2).edges.and(tgate.edges)
+    # Rule DF.2a_3.3V: Min Channel Width. is nil,0.22µm
+    logger.info("Executing rule DF.2a_3.3V")
+    df2a_l1 = df_2a.with_length(nil,0.22.um).extended(0, 0, 0.001, 0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    df2a_l1.output("DF.2a_3.3V", "DF.2a_3.3V : Min Channel Width. : nil,0.22µm")
+    df2a_l1.forget
+
+    # Rule DF.2a_5V: Min Channel Width. is nil,0.3µm
+    logger.info("Executing rule DF.2a_5V")
+    df2a_l1 = df_2a.with_length(nil,0.3.um).extended(0, 0, 0.001, 0.001).overlapping(dualgate)
+    df2a_l1.output("DF.2a_5V", "DF.2a_5V : Min Channel Width. : nil,0.3µm")
+    df2a_l1.forget
+
+    df_2a.forget
+
+    df_2b = comp.width(100.um + 1.dbu).polygons(0.001).not_inside(mos_cap_mk)
+    # Rule DF.2b_3.3V: Max. COMP width for all cases except those used for capacitors, marked by ‘MOS_CAP_MK’ layer.
+    logger.info("Executing rule DF.2b_3.3V")
+    df2b_l1 = comp.not_inside(mos_cap_mk).not_interacting(df_2b).not_interacting(v5_xtor).not_interacting(dualgate)
+    df2b_l1.output("DF.2b_3.3V", "DF.2b_3.3V : Max. COMP width for all cases except those used for capacitors, marked by ‘MOS_CAP_MK’ layer.")
+    df2b_l1.forget
+
+    # Rule DF.2b_5V: Max. COMP width for all cases except those used for capacitors, marked by ‘MOS_CAP_MK’ layer.
+    logger.info("Executing rule DF.2b_5V")
+    df2b_l1 = comp.not_inside(mos_cap_mk).not_interacting(df_2b).overlapping(dualgate)
+    df2b_l1.output("DF.2b_5V", "DF.2b_5V : Max. COMP width for all cases except those used for capacitors, marked by ‘MOS_CAP_MK’ layer.")
+    df2b_l1.forget
+
+    df_2b.forget
+
+    # Rule DF.3a_3.3V: Min. COMP Space P-substrate tap (PCOMP outside NWELL and DNWELL) can be butted for different voltage devices as the potential is same. is 0.28µm
+    logger.info("Executing rule DF.3a_3.3V")
+    df3a_l1  = comp.not(otp_mk).space(0.28.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    df3a_l1.output("DF.3a_3.3V", "DF.3a_3.3V : Min. COMP Space P-substrate tap (PCOMP outside NWELL and DNWELL) can be butted for different voltage devices as the potential is same. : 0.28µm")
+    df3a_l1.forget
+
+    # Rule DF.3a_5V: Min. COMP Space P-substrate tap (PCOMP outside NWELL and DNWELL) can be butted for different voltage devices as the potential is same. is 0.36µm
+    logger.info("Executing rule DF.3a_5V")
+    df3a_l1  = comp.not(otp_mk).space(0.36.um, euclidian).polygons(0.001).overlapping(dualgate)
+    df3a_l1.output("DF.3a_5V", "DF.3a_5V : Min. COMP Space P-substrate tap (PCOMP outside NWELL and DNWELL) can be butted for different voltage devices as the potential is same. : 0.36µm")
+    df3a_l1.forget
+
+    df_3b_same_well = ncomp.inside(nwell).not_outside(pcomp.inside(nwell)).or(ncomp.inside(lvpwell).not_outside(pcomp.inside(lvpwell)))
+    df_3b_moscap = ncomp.inside(nwell).interacting(pcomp.inside(nwell)).or(ncomp.inside(lvpwell).interacting(pcomp.inside(lvpwell))).inside(mos_cap_mk)
+    # Rule DF.3b_3.3V: Min./Max. NCOMP Space to PCOMP in the same well for butted COMP (MOSCAP butting is not allowed).
+    logger.info("Executing rule DF.3b_3.3V")
+    df3b_l1 = df_3b_same_well.or(df_3b_moscap).not_interacting(v5_xtor).not_interacting(dualgate)
+    df3b_l1.output("DF.3b_3.3V", "DF.3b_3.3V : Min./Max. NCOMP Space to PCOMP in the same well for butted COMP (MOSCAP butting is not allowed).")
+    df3b_l1.forget
+
+    # Rule DF.3b_5V: Min./Max. NCOMP Space to PCOMP in the same well for butted COMP(MOSCAP butting is not allowed).
+    logger.info("Executing rule DF.3b_5V")
+    df3b_l1 = df_3b_same_well.or(df_3b_moscap).overlapping(dualgate)
+    df3b_l1.output("DF.3b_5V", "DF.3b_5V : Min./Max. NCOMP Space to PCOMP in the same well for butted COMP(MOSCAP butting is not allowed).")
+    df3b_l1.forget
+
+    df_3b_same_well.forget
+
+    df_3b_moscap.forget
+
+    # Rule DF.3c_3.3V: Min. COMP Space in BJT area (area marked by DRC_BJT layer). is 0.32µm
+    logger.info("Executing rule DF.3c_3.3V")
+    df3c_l1  = comp.inside(drc_bjt).space(0.32.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    df3c_l1.output("DF.3c_3.3V", "DF.3c_3.3V : Min. COMP Space in BJT area (area marked by DRC_BJT layer). : 0.32µm")
+    df3c_l1.forget
+
+    # Rule DF.3c_5V: Min. COMP Space in BJT area (area marked by DRC_BJT layer) hasn’t been assessed.
+    logger.info("Executing rule DF.3c_5V")
+    df3c_l1 = comp.interacting(comp.inside(drc_bjt).and(dualgate).space(10.um, euclidian).polygons(0.001))
+    df3c_l1.output("DF.3c_5V", "DF.3c_5V : Min. COMP Space in BJT area (area marked by DRC_BJT layer) hasn’t been assessed.")
+    df3c_l1.forget
+
+    ntap_dnwell = ncomp.not_interacting(tgate).inside(dnwell)
+    # Rule DF.4a_3.3V: Min. (LVPWELL Space to NCOMP well tap) inside DNWELL. is 0.12µm
+    logger.info("Executing rule DF.4a_3.3V")
+    df4a_l1  = ntap_dnwell.separation(lvpwell.inside(dnwell), 0.12.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    df4a_l1.output("DF.4a_3.3V", "DF.4a_3.3V : Min. (LVPWELL Space to NCOMP well tap) inside DNWELL. : 0.12µm")
+    df4a_l1.forget
+
+    # Rule DF.4a_5V: Min. (LVPWELL Space to NCOMP well tap) inside DNWELL. is 0.16µm
+    logger.info("Executing rule DF.4a_5V")
+    df4a_l1  = ntap_dnwell.separation(lvpwell.inside(dnwell), 0.16.um, euclidian).polygons(0.001).overlapping(dualgate)
+    df4a_l1.output("DF.4a_5V", "DF.4a_5V : Min. (LVPWELL Space to NCOMP well tap) inside DNWELL. : 0.16µm")
+    df4a_l1.forget
+
+    # Rule DF.4b_3.3V: Min. DNWELL overlap of NCOMP well tap. is 0.62µm
+    logger.info("Executing rule DF.4b_3.3V")
+    df4b_l1 = dnwell.enclosing(ncomp.not_interacting(tgate), 0.62.um, euclidian).polygons(0.001)
+    df4b_l2 = ncomp.not_interacting(tgate).not_outside(dnwell).not(dnwell)
+    df4b_l  = df4b_l1.or(df4b_l2).not_interacting(v5_xtor).not_interacting(dualgate)
+    df4b_l.output("DF.4b_3.3V", "DF.4b_3.3V : Min. DNWELL overlap of NCOMP well tap. : 0.62µm")
+    df4b_l1.forget
+    df4b_l2.forget
+    df4b_l.forget
+
+    # Rule DF.4b_5V: Min. DNWELL overlap of NCOMP well tap. is 0.66µm
+    logger.info("Executing rule DF.4b_5V")
+    df4b_l1 = dnwell.enclosing(ncomp.not_interacting(tgate), 0.66.um, euclidian).polygons(0.001)
+    df4b_l2 = ncomp.not_interacting(tgate).not_outside(dnwell).not(dnwell)
+    df4b_l  = df4b_l1.or(df4b_l2).overlapping(dualgate)
+    df4b_l.output("DF.4b_5V", "DF.4b_5V : Min. DNWELL overlap of NCOMP well tap. : 0.66µm")
+    df4b_l1.forget
+    df4b_l2.forget
+    df4b_l.forget
+
+    ntap_dnwell.forget
+
+    nwell_n_dnwell = nwell.outside(dnwell)
+    # Rule DF.4c_3.3V: Min. (Nwell overlap of PCOMP) outside DNWELL. is 0.43µm
+    logger.info("Executing rule DF.4c_3.3V")
+    df4c_l1 = nwell_n_dnwell.outside(sramcore).enclosing(pcomp.outside(dnwell), 0.43.um, euclidian).polygons(0.001)
+    df4c_l2 = pcomp.outside(dnwell).not_outside(nwell_n_dnwell.outside(sramcore)).not(nwell_n_dnwell.outside(sramcore))
+    df4c_l  = df4c_l1.or(df4c_l2).not_interacting(v5_xtor).not_interacting(dualgate)
+    df4c_l.output("DF.4c_3.3V", "DF.4c_3.3V : Min. (Nwell overlap of PCOMP) outside DNWELL. : 0.43µm")
+    df4c_l1.forget
+    df4c_l2.forget
+    df4c_l.forget
+
+    # Rule DF.4c_5V: Min. (Nwell overlap of PCOMP) outside DNWELL. is 0.6µm
+    logger.info("Executing rule DF.4c_5V")
+    df4c_l1 = nwell_n_dnwell.outside(sramcore).enclosing(pcomp.outside(dnwell), 0.6.um, euclidian).polygons(0.001)
+    df4c_l2 = pcomp.outside(dnwell).not_outside(nwell_n_dnwell.outside(sramcore)).not(nwell_n_dnwell.outside(sramcore))
+    df4c_l  = df4c_l1.or(df4c_l2).overlapping(dualgate)
+    df4c_l.output("DF.4c_5V", "DF.4c_5V : Min. (Nwell overlap of PCOMP) outside DNWELL. : 0.6µm")
+    df4c_l1.forget
+    df4c_l2.forget
+    df4c_l.forget
+
+    # Rule DF.4d_3.3V: Min. (Nwell overlap of NCOMP) outside DNWELL. is 0.12µm
+    logger.info("Executing rule DF.4d_3.3V")
+    df4d_l1 = nwell_n_dnwell.not_inside(ymtp_mk).not_inside(neo_ee_mk).enclosing(ncomp.outside(dnwell).not_inside(ymtp_mk), 0.12.um, euclidian).polygons(0.001)
+    df4d_l2 = ncomp.outside(dnwell).not_inside(ymtp_mk).not_outside(nwell_n_dnwell.not_inside(ymtp_mk).not_inside(neo_ee_mk)).not(nwell_n_dnwell.not_inside(ymtp_mk).not_inside(neo_ee_mk))
+    df4d_l  = df4d_l1.or(df4d_l2).not_interacting(v5_xtor).not_interacting(dualgate)
+    df4d_l.output("DF.4d_3.3V", "DF.4d_3.3V : Min. (Nwell overlap of NCOMP) outside DNWELL. : 0.12µm")
+    df4d_l1.forget
+    df4d_l2.forget
+    df4d_l.forget
+
+    # Rule DF.4d_5V: Min. (Nwell overlap of NCOMP) outside DNWELL. is 0.16µm
+    logger.info("Executing rule DF.4d_5V")
+    df4d_l1 = nwell_n_dnwell.not_inside(ymtp_mk).enclosing(ncomp.outside(dnwell).not_inside(ymtp_mk), 0.16.um, euclidian).polygons(0.001)
+    df4d_l2 = ncomp.outside(dnwell).not_inside(ymtp_mk).not_outside(nwell_n_dnwell.not_inside(ymtp_mk)).not(nwell_n_dnwell.not_inside(ymtp_mk))
+    df4d_l  = df4d_l1.or(df4d_l2).overlapping(dualgate)
+    df4d_l.output("DF.4d_5V", "DF.4d_5V : Min. (Nwell overlap of NCOMP) outside DNWELL. : 0.16µm")
+    df4d_l1.forget
+    df4d_l2.forget
+    df4d_l.forget
+
+    nwell_n_dnwell.forget
+
+    # Rule DF.4e_3.3V: Min. DNWELL overlap of PCOMP. is 0.93µm
+    logger.info("Executing rule DF.4e_3.3V")
+    df4e_l1 = dnwell.enclosing(pcomp, 0.93.um, euclidian).polygons(0.001)
+    df4e_l2 = pcomp.not_outside(dnwell).not(dnwell)
+    df4e_l  = df4e_l1.or(df4e_l2).not_interacting(v5_xtor).not_interacting(dualgate)
+    df4e_l.output("DF.4e_3.3V", "DF.4e_3.3V : Min. DNWELL overlap of PCOMP. : 0.93µm")
+    df4e_l1.forget
+    df4e_l2.forget
+    df4e_l.forget
+
+    # Rule DF.4e_5V: Min. DNWELL overlap of PCOMP. is 1.1µm
+    logger.info("Executing rule DF.4e_5V")
+    df4e_l1 = dnwell.enclosing(pcomp, 1.1.um, euclidian).polygons(0.001)
+    df4e_l2 = pcomp.not_outside(dnwell).not(dnwell)
+    df4e_l  = df4e_l1.or(df4e_l2).overlapping(dualgate)
+    df4e_l.output("DF.4e_5V", "DF.4e_5V : Min. DNWELL overlap of PCOMP. : 1.1µm")
+    df4e_l1.forget
+    df4e_l2.forget
+    df4e_l.forget
+
+    pwell_dnwell = lvpwell.inside(dnwell)
+    # Rule DF.5_3.3V: Min. (LVPWELL overlap of PCOMP well tap) inside DNWELL. is 0.12µm
+    logger.info("Executing rule DF.5_3.3V")
+    df5_l1 = pwell_dnwell.enclosing(pcomp.outside(nwell), 0.12.um, euclidian).polygons(0.001)
+    df5_l2 = pcomp.outside(nwell).not_outside(pwell_dnwell).not(pwell_dnwell)
+    df5_l  = df5_l1.or(df5_l2).not_interacting(v5_xtor).not_interacting(dualgate)
+    df5_l.output("DF.5_3.3V", "DF.5_3.3V : Min. (LVPWELL overlap of PCOMP well tap) inside DNWELL. : 0.12µm")
+    df5_l1.forget
+    df5_l2.forget
+    df5_l.forget
+
+    # Rule DF.5_5V: Min. (LVPWELL overlap of PCOMP well tap) inside DNWELL. is 0.16µm
+    logger.info("Executing rule DF.5_5V")
+    df5_l1 = pwell_dnwell.enclosing(pcomp.outside(nwell), 0.16.um, euclidian).polygons(0.001)
+    df5_l2 = pcomp.outside(nwell).not_outside(pwell_dnwell).not(pwell_dnwell)
+    df5_l  = df5_l1.or(df5_l2).overlapping(dualgate)
+    df5_l.output("DF.5_5V", "DF.5_5V : Min. (LVPWELL overlap of PCOMP well tap) inside DNWELL. : 0.16µm")
+    df5_l1.forget
+    df5_l2.forget
+    df5_l.forget
+
+    # Rule DF.6_3.3V: Min. COMP extend beyond gate (it also means source/drain overhang). is 0.24µm
+    logger.info("Executing rule DF.6_3.3V")
+    df6_l1 = comp.not(otp_mk).not_inside(ymtp_mk).enclosing(poly2.not_inside(ymtp_mk), 0.24.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    df6_l1.output("DF.6_3.3V", "DF.6_3.3V : Min. COMP extend beyond gate (it also means source/drain overhang). : 0.24µm")
+    df6_l1.forget
+
+    # Rule DF.6_5V: Min. COMP extend beyond gate (it also means source/drain overhang). is 0.4µm
+    logger.info("Executing rule DF.6_5V")
+    df6_l1 = comp.not(otp_mk).not_inside(mvpsd).not_inside(mvsd).not_inside(ymtp_mk).outside(sramcore).enclosing(poly2.not_inside(ymtp_mk), 0.4.um, euclidian).polygons(0.001).overlapping(dualgate)
+    df6_l1.output("DF.6_5V", "DF.6_5V : Min. COMP extend beyond gate (it also means source/drain overhang). : 0.4µm")
+    df6_l1.forget
+
+    # Rule DF.7_3.3V: Min. (LVPWELL Spacer to PCOMP) inside DNWELL. is 0.43µm
+    logger.info("Executing rule DF.7_3.3V")
+    df7_l1  = pcomp.inside(dnwell).separation(pwell_dnwell, 0.43.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    df7_l1.output("DF.7_3.3V", "DF.7_3.3V : Min. (LVPWELL Spacer to PCOMP) inside DNWELL. : 0.43µm")
+    df7_l1.forget
+
+    # Rule DF.7_5V: Min. (LVPWELL Spacer to PCOMP) inside DNWELL. is 0.6µm
+    logger.info("Executing rule DF.7_5V")
+    df7_l1  = pcomp.inside(dnwell).outside(sramcore).separation(pwell_dnwell, 0.6.um, euclidian).polygons(0.001).overlapping(dualgate)
+    df7_l1.output("DF.7_5V", "DF.7_5V : Min. (LVPWELL Spacer to PCOMP) inside DNWELL. : 0.6µm")
+    df7_l1.forget
+
+    # Rule DF.8_3.3V: Min. (LVPWELL overlap of NCOMP) Inside DNWELL. is 0.43µm
+    logger.info("Executing rule DF.8_3.3V")
+    df8_l1 = pwell_dnwell.enclosing(ncomp.inside(dnwell), 0.43.um, euclidian).polygons(0.001)
+    df8_l2 = ncomp.inside(dnwell).not_outside(pwell_dnwell).not(pwell_dnwell)
+    df8_l  = df8_l1.or(df8_l2).not_interacting(v5_xtor).not_interacting(dualgate)
+    df8_l.output("DF.8_3.3V", "DF.8_3.3V : Min. (LVPWELL overlap of NCOMP) Inside DNWELL. : 0.43µm")
+    df8_l1.forget
+    df8_l2.forget
+    df8_l.forget
+
+    # Rule DF.8_5V: Min. (LVPWELL overlap of NCOMP) Inside DNWELL. is 0.6µm
+    logger.info("Executing rule DF.8_5V")
+    df8_l1 = pwell_dnwell.outside(sramcore).enclosing(ncomp.inside(dnwell), 0.6.um, euclidian).polygons(0.001)
+    df8_l2 = ncomp.inside(dnwell).not_outside(pwell_dnwell.outside(sramcore)).not(pwell_dnwell.outside(sramcore))
+    df8_l  = df8_l1.or(df8_l2).overlapping(dualgate)
+    df8_l.output("DF.8_5V", "DF.8_5V : Min. (LVPWELL overlap of NCOMP) Inside DNWELL. : 0.6µm")
+    df8_l1.forget
+    df8_l2.forget
+    df8_l.forget
+
+    pwell_dnwell.forget
+
+    # Rule DF.9_3.3V: Min. COMP area (um2). is 0.2025µm²
+    logger.info("Executing rule DF.9_3.3V")
+    df9_l1  = comp.not(otp_mk).with_area(nil, 0.2025.um).not_interacting(v5_xtor).not_interacting(dualgate)
+    df9_l1.output("DF.9_3.3V", "DF.9_3.3V : Min. COMP area (um2). : 0.2025µm²")
+    df9_l1.forget
+
+    # Rule DF.9_5V: Min. COMP area (um2). is 0.2025µm²
+    logger.info("Executing rule DF.9_5V")
+    df9_l1  = comp.not(otp_mk).with_area(nil, 0.2025.um).overlapping(dualgate)
+    df9_l1.output("DF.9_5V", "DF.9_5V : Min. COMP area (um2). : 0.2025µm²")
+    df9_l1.forget
+
+    # Rule DF.10_3.3V: Min. field area (um2). is 0.26µm²
+    logger.info("Executing rule DF.10_3.3V")
+    df10_l1  = comp.holes.not(comp).with_area(nil, 0.26.um).not_interacting(v5_xtor).not_interacting(dualgate)
+    df10_l1.output("DF.10_3.3V", "DF.10_3.3V : Min. field area (um2). : 0.26µm²")
+    df10_l1.forget
+
+    # Rule DF.10_5V: Min. field area (um2). is 0.26µm²
+    logger.info("Executing rule DF.10_5V")
+    df10_l1  = comp.holes.not(comp).with_area(nil, 0.26.um).overlapping(dualgate)
+    df10_l1.output("DF.10_5V", "DF.10_5V : Min. field area (um2). : 0.26µm²")
+    df10_l1.forget
+
+    comp_butt = comp.interacting(ncomp.interacting(pcomp).outside(pcomp))
+    # Rule DF.11_3.3V: Min. Length of butting COMP edge. is 0.3µm
+    logger.info("Executing rule DF.11_3.3V")
+    df11_l1  = comp_butt.width(0.3.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    df11_l1.output("DF.11_3.3V", "DF.11_3.3V : Min. Length of butting COMP edge. : 0.3µm")
+    df11_l1.forget
+
+    # Rule DF.11_5V: Min. Length of butting COMP edge. is 0.3µm
+    logger.info("Executing rule DF.11_5V")
+    df11_l1  = comp_butt.width(0.3.um, euclidian).polygons(0.001).overlapping(dualgate)
+    df11_l1.output("DF.11_5V", "DF.11_5V : Min. Length of butting COMP edge. : 0.3µm")
+    df11_l1.forget
+
+    comp_butt.forget
+
+    # Rule DF.12_3.3V: COMP not covered by Nplus or Pplus is forbidden (except those COMP under marking).
+    logger.info("Executing rule DF.12_3.3V")
+    df12_l1 = comp.not_interacting(schottky_diode).not_inside(nplus.or(pplus)).not_interacting(v5_xtor).not_interacting(dualgate)
+    df12_l1.output("DF.12_3.3V", "DF.12_3.3V : COMP not covered by Nplus or Pplus is forbidden (except those COMP under marking).")
+    df12_l1.forget
+
+    # Rule DF.12_5V: COMP not covered by Nplus or Pplus is forbidden (except those COMP under marking).
+    logger.info("Executing rule DF.12_5V")
+    df12_l1 = comp.not_interacting(schottky_diode).not_inside(nplus.or(pplus)).overlapping(dualgate)
+    df12_l1.output("DF.12_5V", "DF.12_5V : COMP not covered by Nplus or Pplus is forbidden (except those COMP under marking).")
+    df12_l1.forget
+
+    df13_ncomp = ncomp.inside(nwell.covering(ncomp).covering(pcomp))
+    df13_pcomp = pcomp.inside(nwell.covering(ncomp).covering(pcomp))
+    # Rule DF.13_3.3V: Max distance of Nwell tap (NCOMP inside Nwell) from (PCOMP inside Nwell).
+    logger.info("Executing rule DF.13_3.3V")
+    df13_l1 = df13_ncomp.not_interacting(df13_pcomp.sized(20.um)).not_interacting(v5_xtor).not_interacting(dualgate)
+    df13_l1.output("DF.13_3.3V", "DF.13_3.3V : Max distance of Nwell tap (NCOMP inside Nwell) from (PCOMP inside Nwell).")
+    df13_l1.forget
+
+    # Rule DF.13_5V: Max distance of Nwell tap (NCOMP inside Nwell) from (PCOMP inside Nwell).
+    logger.info("Executing rule DF.13_5V")
+    df13_l1 = df13_ncomp.not_interacting(df13_pcomp.sized(15.um)).overlapping(dualgate)
+    df13_l1.output("DF.13_5V", "DF.13_5V : Max distance of Nwell tap (NCOMP inside Nwell) from (PCOMP inside Nwell).")
+    df13_l1.forget
+
+    df13_ncomp.forget
+
+    df13_pcomp.forget
+
+    # Rule DF.14_3.3V: Max distance of substrate tap (PCOMP outside Nwell) from (NCOMP outside Nwell).
+    logger.info("Executing rule DF.14_3.3V")
+    df14_l1 = pcomp.outside(nwell).not_interacting(ncomp.outside(nwell).sized(20.um)).not_interacting(v5_xtor).not_interacting(dualgate)
+    df14_l1.output("DF.14_3.3V", "DF.14_3.3V : Max distance of substrate tap (PCOMP outside Nwell) from (NCOMP outside Nwell).")
+    df14_l1.forget
+
+    # Rule DF.14_5V: Max distance of substrate tap (PCOMP outside Nwell) from (NCOMP outside Nwell).
+    logger.info("Executing rule DF.14_5V")
+    df14_l1 = pcomp.outside(nwell).not_interacting(ncomp.outside(nwell).sized(15.um)).overlapping(dualgate)
+    df14_l1.output("DF.14_5V", "DF.14_5V : Max distance of substrate tap (PCOMP outside Nwell) from (NCOMP outside Nwell).")
+    df14_l1.forget
+
+    # rule DF.15a_3.3V is not a DRC check
+
+    # rule DF.15a_5V is not a DRC check
+
+    # rule DF.15b_3.3V is not a DRC check
+
+    # rule DF.15b_5V is not a DRC check
+
+    ncomp_df16 = ncomp.outside(nwell).outside(dnwell)
+    # Rule DF.16_3.3V: Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). is 0.43µm
+    logger.info("Executing rule DF.16_3.3V")
+    df16_l1  = ncomp_df16.not_inside(ymtp_mk).outside(sramcore).separation(nwell.outside(dnwell).not_inside(ymtp_mk), 0.43.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    df16_l1.output("DF.16_3.3V", "DF.16_3.3V : Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). : 0.43µm")
+    df16_l1.forget
+
+    # Rule DF.16_5V: Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). is 0.6µm
+    logger.info("Executing rule DF.16_5V")
+    df16_l1  = ncomp_df16.not_inside(ymtp_mk).outside(sramcore).separation(nwell.outside(dnwell).not_inside(ymtp_mk), 0.6.um, euclidian).polygons(0.001).overlapping(dualgate)
+    df16_l1.output("DF.16_5V", "DF.16_5V : Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). : 0.6µm")
+    df16_l1.forget
+
+    pcomp_df17 = pcomp.outside(nwell).outside(dnwell)
+    # Rule DF.17_3.3V: Min. space from (Nwell Outside DNWELL) to (PCOMP outside Nwell and DNWELL). is 0.12µm
+    logger.info("Executing rule DF.17_3.3V")
+    df17_l1  = pcomp_df17.separation(nwell.outside(dnwell), 0.12.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    df17_l1.output("DF.17_3.3V", "DF.17_3.3V : Min. space from (Nwell Outside DNWELL) to (PCOMP outside Nwell and DNWELL). : 0.12µm")
+    df17_l1.forget
+
+    # Rule DF.17_5V: Min. space from (Nwell Outside DNWELL) to (PCOMP outside Nwell and DNWELL). is 0.16µm
+    logger.info("Executing rule DF.17_5V")
+    df17_l1  = pcomp_df17.separation(nwell.outside(dnwell), 0.16.um, euclidian).polygons(0.001).overlapping(dualgate)
+    df17_l1.output("DF.17_5V", "DF.17_5V : Min. space from (Nwell Outside DNWELL) to (PCOMP outside Nwell and DNWELL). : 0.16µm")
+    df17_l1.forget
+
+    # Rule DF.18_3.3V: Min. DNWELL space to (PCOMP outside Nwell and DNWELL). is 2.5µm
+    logger.info("Executing rule DF.18_3.3V")
+    df18_l1  = pcomp_df17.separation(dnwell, 2.5.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    df18_l1.output("DF.18_3.3V", "DF.18_3.3V : Min. DNWELL space to (PCOMP outside Nwell and DNWELL). : 2.5µm")
+    df18_l1.forget
+
+    # Rule DF.18_5V: Min. DNWELL space to (PCOMP outside Nwell and DNWELL). is 2.5µm
+    logger.info("Executing rule DF.18_5V")
+    df18_l1  = pcomp_df17.separation(dnwell, 2.5.um, euclidian).polygons(0.001).overlapping(dualgate)
+    df18_l1.output("DF.18_5V", "DF.18_5V : Min. DNWELL space to (PCOMP outside Nwell and DNWELL). : 2.5µm")
+    df18_l1.forget
+
+    pcomp_df17.forget
+
+    # Rule DF.19_3.3V: Min. DNWELL space to (NCOMP outside Nwell and DNWELL). is 3.2µm
+    logger.info("Executing rule DF.19_3.3V")
+    df19_l1  = ncomp_df16.separation(dnwell, 3.2.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    df19_l1.output("DF.19_3.3V", "DF.19_3.3V : Min. DNWELL space to (NCOMP outside Nwell and DNWELL). : 3.2µm")
+    df19_l1.forget
+
+    # Rule DF.19_5V: Min. DNWELL space to (NCOMP outside Nwell and DNWELL). is 3.28µm
+    logger.info("Executing rule DF.19_5V")
+    df19_l1  = ncomp_df16.separation(dnwell, 3.28.um, euclidian).polygons(0.001).overlapping(dualgate)
+    df19_l1.output("DF.19_5V", "DF.19_5V : Min. DNWELL space to (NCOMP outside Nwell and DNWELL). : 3.28µm")
+    df19_l1.forget
+
+    ncomp_df16.forget
+end #FEOL
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/contact.drc b/tapeout/outputs/drc/contact.drc
new file mode 100644
index 0000000..fb700f1
--- /dev/null
+++ b/tapeout/outputs/drc/contact.drc
@@ -0,0 +1,1211 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if FEOL
+
+    #================================================
+    #--------------------CONTACT---------------------
+    #================================================
+
+    # Rule CO.1: Min/max contact size. is 0.22µm
+    logger.info("Executing rule CO.1")
+    co1_l1 = contact.edges.without_length(0.22.um).extended(0, 0, 0.001, 0.001)
+    co1_l1.output("CO.1", "CO.1 : Min/max contact size. : 0.22µm")
+    co1_l1.forget
+
+    # Rule CO.2a: min. contact spacing is 0.25µm
+    logger.info("Executing rule CO.2a")
+    co2a_l1  = contact.space(0.25.um, euclidian)
+    co2a_l1.output("CO.2a", "CO.2a : min. contact spacing : 0.25µm")
+    co2a_l1.forget
+
+    # Rule CO.2b: Space in 4x4 or larger contact array. is 0.28µm
+    logger.info("Executing rule CO.2b")
+    poss_4_4_contact = contact.sized(0.14, "square_limit").merged.sized(-0.14, "square_limit")
+    co_4x4_loc = poss_4_4_contact.not_interacting(poss_4_4_contact.edges.with_length(nil, 1.715))
+    selected_co = contact.interacting(co_4x4_loc)
+
+    co2b_l1  = selected_co.space(0.28.um, euclidian)
+    co2b_l1.output("CO.2b", "CO.2b : Space in 4x4 or larger contact array. : 0.28µm")
+    co2b_l1.forget
+    poss_4_4_contact.forget
+    co_4x4_loc.forget
+    selected_co.forget
+
+    # Rule CO.3: Poly2 overlap of contact. is 0.07µm
+    logger.info("Executing rule CO.3")
+    main_contact = contact.not(sramcore)
+    co3_l = main_contact.enclosed(poly2, 0.07.um, euclidian)
+    co3_l.output("CO.3", "CO.3 : Poly2 overlap of contact. : 0.07µm")
+    co3_l.forget
+
+    # Rule CO.4: COMP overlap of contact. is 0.07µm
+    logger.info("Executing rule CO.4")
+    co4_l = main_contact.enclosed(comp, 0.07.um, euclidian)
+    co4_l.output("CO.4", "CO.4 : COMP overlap of contact. : 0.07µm")
+    co4_l.forget
+
+    # Rule CO.5a: Nplus overlap of contact on COMP (Only for contacts to butted Nplus and Pplus COMP areas). is 0.1µm
+    logger.info("Executing rule CO.5a")
+    co_5a_ncomp_butted = ncomp.interacting(pcomp)
+    co_ncomp_check = contact.interacting(co_5a_ncomp_butted)
+    co5a_l1 = co_ncomp_check.enclosed(co_5a_ncomp_butted, 0.1.um, euclidian)
+    co5a_l1.output("CO.5a", "CO.5a : Nplus overlap of contact on COMP (Only for contacts to butted Nplus and Pplus COMP areas). : 0.1µm")
+    co5a_l1.forget
+    co_ncomp_check.forget
+    co_5a_ncomp_butted.forget
+
+    # Rule CO.5b: Pplus overlap of contact on COMP (Only for contacts to butted Nplus and Pplus COMP areas). is 0.1µm
+    logger.info("Executing rule CO.5b")
+    co_5b_pcomp_butted = pcomp.interacting(ncomp)
+    co_pcomp_check = contact.interacting(co_5b_pcomp_butted)
+    co5b_l1 = co_pcomp_check.enclosed(co_5b_pcomp_butted, 0.1.um, euclidian)
+    co5b_l1.output("CO.5b", "CO.5b : Pplus overlap of contact on COMP (Only for contacts to butted Nplus and Pplus COMP areas). : 0.1µm")
+    co5b_l1.forget
+    co_pcomp_check.forget
+    co_5b_pcomp_butted.forget
+
+    # Rule CO.6: Metal1 overlap of contact.
+    logger.info("Executing rule CO.6")
+    co6_l1 = contact.enclosed(metal1, 0.005.um, euclidian).polygons(0.001) 
+    co6_l2 = contact.not(metal1)
+    co6_l = co6_l1.or(co6_l2)
+    co6_l.output("CO.6", "CO.6 : Metal1 overlap of contact >= 0.005 um")
+    co6_l1.forget
+    co6_l2.forget
+    co6_l.forget
+
+    # Rule CO.6a: (i) Metal1 (< 0.34um) end-of-line overlap. is 0.06µm
+    logger.info("Executing rule CO.6a")
+    cont_6a_cond = metal1.width(0.34.um + 1.dbu).with_length(0.28.um,nil,both)
+    cont_6a_eol = metal1.edges.with_length(nil, 0.34.um).interacting(cont_6a_cond.first_edges).interacting(cont_6a_cond.second_edges).not(cont_6a_cond.first_edges).not(cont_6a_cond.second_edges)
+    cont_6a_l1 = contact.edges.enclosed(cont_6a_eol, 0.06.um, projection)
+    cont_6a_l1.output("CO.6a", "CO.6a : (i) Metal1 (< 0.34um) end-of-line overlap contact : 0.06µm")
+    cont_6a_l1.forget
+    cont_6a_cond.forget
+    cont_6a_eol.forget
+    cont_6a_cond.forget
+
+    # # Rule CO.6b: (ii) If Metal1 overlaps contact by < 0.04um on one side, adjacent metal1 edges overlap is 0.06µm
+    logger.info("Executing rule CO.6b")
+    cont_6b_cond_edges = main_contact.edges.not_outside(main_contact.enclosed(metal1, 0.04.um, projection).edges)
+    cont_6b_check_corner = cont_6b_cond_edges.extended_in(0.002.um)
+    cont_6b_check = main_contact.edges.interacting(cont_6b_check_corner).not(cont_6b_cond_edges)
+    cont_6b_cond_corner = cont_6b_cond_edges.width(0.002.um, angle_limit(135)).polygons
+    cont_6b_l1 = cont_6b_check.enclosed(metal1.edges, 0.06.um, projection).polygons
+    cont_6b_l2 = main_contact.interacting(cont_6b_cond_corner)
+    cont_6b_l = cont_6b_l1.or(cont_6b_l2)
+    cont_6b_l.output("CO.6b", "CO.6b : (ii) If Metal1 overlaps contact by < 0.04um on one side, adjacent metal1 edges overlap : 0.06µm")
+    cont_6b_l2.forget
+    cont_6b_l1.forget
+    cont_6b_cond_corner.forget
+    cont_6b_check.forget
+    cont_6b_check_corner.forget
+    cont_6b_cond_edges.forget
+
+    # rule CO.6c is a guideline rule.
+
+    # Rule CO.7: Space from COMP contact to Poly2 on COMP. is 0.15µm
+    logger.info("Executing rule CO.7")
+    co7_l1  = contact.and(comp).not(otp_mk).separation(tgate.not(otp_mk), 0.15.um, euclidian)
+    co7_l1.output("CO.7", "CO.7 : Space from COMP contact to Poly2 on COMP. : 0.15µm")
+    co7_l1.forget
+
+    # Rule CO.8: Space from Poly2 contact to COMP. is 0.17µm
+    logger.info("Executing rule CO.8")
+    co8_l1  = contact.and(poly2).separation(comp, 0.17.um, euclidian)
+    co8_l1.output("CO.8", "CO.8 : Space from Poly2 contact to COMP. : 0.17µm")
+    co8_l1.forget
+
+    # Rule CO.9: Contact on NCOMP to PCOMP butting edge is forbidden (contact must not straddle butting edge).
+    logger.info("Executing rule CO.9")
+    co9_l1 = contact.interacting(ncomp.edges.and(pcomp.edges))
+    co9_l1.output("CO.9", "CO.9 : Contact on NCOMP to PCOMP butting edge is forbidden (contact must not straddle butting edge).")
+    co9_l1.forget
+
+    # Rule CO.10: Contact on Poly2 gate over COMP is forbidden.
+    logger.info("Executing rule CO.10")
+    co10_l1 = contact.and(tgate)
+    co10_l1.output("CO.10", "CO.10 : Contact on Poly2 gate over COMP is forbidden.")
+    co10_l1.forget
+
+    # Rule CO.11: Contact on field oxide is forbidden.
+    logger.info("Executing rule CO.11")
+    co11_l1 = contact.not(poly2).not(comp)
+    co11_l1.output("CO.11", "CO.11 : Contact on field oxide is forbidden.")
+    co11_l1.forget
+
+end #FEOL
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/dnwell.drc b/tapeout/outputs/drc/dnwell.drc
new file mode 100644
index 0000000..05cdc48
--- /dev/null
+++ b/tapeout/outputs/drc/dnwell.drc
@@ -0,0 +1,1127 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if FEOL
+    #================================================
+    #---------------------DNWELL---------------------
+    #================================================
+
+    # Rule DN.1: Min. DNWELL Width is 1.7µm
+    logger.info("Executing rule DN.1")
+    dn1_l1  = dnwell.width(1.7.um, euclidian).polygons(0.001)
+    dn1_l1.output("DN.1", "DN.1 : Min. DNWELL Width : 1.7µm")
+    dn1_l1.forget
+
+    if CONNECTIVITY_RULES
+    logger.info("CONNECTIVITY_RULES section")
+
+    connected_dnwell, unconnected_dnwell = conn_space(dnwell, 2.5, 5.42, euclidian)
+
+    # Rule DN.2a: Min. DNWELL Space (Equi-potential), Merge if the space is less than is 2.5µm
+    logger.info("Executing rule DN.2a")
+    dn2a_l1  = connected_dnwell
+    dn2a_l1.output("DN.2a", "DN.2a : Min. DNWELL Space (Equi-potential), Merge if the space is less than : 2.5µm")
+    dn2a_l1.forget
+
+    # Rule DN.2b: Min. DNWELL Space (Different potential) is 5.42µm
+    logger.info("Executing rule DN.2b")
+    dn2b_l1  = unconnected_dnwell
+    dn2b_l1.output("DN.2b", "DN.2b : Min. DNWELL Space (Different potential) : 5.42µm")
+    dn2b_l1.forget
+
+    else
+    logger.info("CONNECTIVITY_RULES disabled section")
+
+    # Rule DN.2b_: Min. DNWELL Space (Different potential) is 5.42µm
+    logger.info("Executing rule DN.2b_")
+    dn2b_l1  = dnwell.isolated(5.42.um, euclidian).polygons(0.001)
+    dn2b_l1.output("DN.2b_", "DN.2b_ : Min. DNWELL Space (Different potential) : 5.42µm")
+    dn2b_l1.forget
+
+    end #CONNECTIVITY_RULES
+
+    dn3_1 = dnwell.not_inside(pcomp.holes.not(pcomp).interacting(dnwell, 1..1).extents)
+    dn3_2 = dnwell.inside((pcomp.holes.not(pcomp).covering(nat.or(ncomp).or(nwell).not_interacting(dnwell))))
+    # Rule DN.3: Each DNWELL shall be directly surrounded by PCOMP guard ring tied to the P-substrate potential.
+    logger.info("Executing rule DN.3")
+    dn3_l1 = dn3_1.or(dn3_2)
+    dn3_l1.output("DN.3", "DN.3 : Each DNWELL shall be directly surrounded by PCOMP guard ring tied to the P-substrate potential.")
+    dn3_l1.forget
+
+    dn3_1.forget
+
+    dn3_2.forget
+end #FEOL
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/drc_bjt.drc b/tapeout/outputs/drc/drc_bjt.drc
new file mode 100644
index 0000000..0f9fd96
--- /dev/null
+++ b/tapeout/outputs/drc/drc_bjt.drc
@@ -0,0 +1,1100 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+if FEOL
+    #================================================
+    #--------------------DRC_BJT---------------------
+    #================================================
+
+    # Rule BJT.1: Min. DRC_BJT overlap of DNWELL for NPN BJT.
+    logger.info("Executing rule BJT.1")
+    bjt1_l1 = dnwell.interacting(drc_bjt).not(dnwell.inside(drc_bjt))
+    bjt1_l1.output("BJT.1", "BJT.1 : Min. DRC_BJT overlap of DNWELL for NPN BJT.")
+    bjt1_l1.forget
+
+    # Rule BJT.2: Min. DRC_BJT overlap of PCOM in Psub.
+    logger.info("Executing rule BJT.2")
+    bjt2_l1 = pcomp.outside(nwell).outside(dnwell).interacting(drc_bjt).not(pcomp.outside(nwell).outside(dnwell).inside(drc_bjt))
+    bjt2_l1.output("BJT.2", "BJT.2 : Min. DRC_BJT overlap of PCOM in Psub.")
+    bjt2_l1.forget
+
+    # Rule BJT.3: Minimum space of DRC_BJT layer to unrelated COMP. is 0.1µm
+    logger.info("Executing rule BJT.3")
+    bjt3_l1  = comp.outside(drc_bjt).separation(drc_bjt, 0.1.um, euclidian).polygons(0.001)
+    bjt3_l1.output("BJT.3", "BJT.3 : Minimum space of DRC_BJT layer to unrelated COMP. : 0.1µm")
+    bjt3_l1.forget
+end #FEOL
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/drc_run_2022_12_13_07_38_20.log b/tapeout/outputs/drc/drc_run_2022_12_13_07_38_20.log
new file mode 100644
index 0000000..e6d46b7
--- /dev/null
+++ b/tapeout/outputs/drc/drc_run_2022_12_13_07_38_20.log
@@ -0,0 +1,76 @@
+13-Dec-2022 07:38:20 | INFO    | Your Klayout version is: KLayout 0.28
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['comp.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['contact.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['dnwell.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['drc_bjt.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['dualgate.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['dummy_exclude.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['efuse.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['esd.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['geom.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['hres.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['lres.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['lvpwell.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['lvs_bjt.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['main.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['mcell.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['metal1.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['metal2.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['metal3.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['metal4.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['metal5.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['metaltop.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['mim.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['nat.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['nplus.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['otp_mk.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['poly2.drc']
+13-Dec-2022 07:38:22 | INFO    | ## Generating template with for the following rule tables: ['pplus.drc']
+13-Dec-2022 07:38:23 | INFO    | ## Generating template with for the following rule tables: ['pres.drc']
+13-Dec-2022 07:38:23 | INFO    | ## Generating template with for the following rule tables: ['sab.drc']
+13-Dec-2022 07:38:23 | INFO    | ## Generating template with for the following rule tables: ['sram.drc']
+13-Dec-2022 07:38:23 | INFO    | ## Generating template with for the following rule tables: ['tail.drc']
+13-Dec-2022 07:38:23 | INFO    | ## Generating template with for the following rule tables: ['via1.drc']
+13-Dec-2022 07:38:23 | INFO    | ## Generating template with for the following rule tables: ['via2.drc']
+13-Dec-2022 07:38:23 | INFO    | ## Generating template with for the following rule tables: ['via3.drc']
+13-Dec-2022 07:38:23 | INFO    | ## Generating template with for the following rule tables: ['via4.drc']
+13-Dec-2022 07:38:23 | INFO    | ## Generating template with for the following rule tables: ['via5.drc']
+13-Dec-2022 07:38:23 | INFO    | ## Generating template with for the following rule tables: ['ymtp_mk.drc']
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design comp on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design contact on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design dnwell on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design drc_bjt on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design dualgate on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design dummy_exclude on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design efuse on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design esd on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design geom on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design hres on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design lres on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design lvpwell on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design lvs_bjt on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design main on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design mcell on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design metal1 on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design metal2 on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design metal3 on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design metal4 on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design metal5 on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design metaltop on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design mim on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design nat on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design nplus on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design otp_mk on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design poly2 on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design pplus on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design pres on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design sab on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design sram on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design tail on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design via1 on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design via2 on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design via3 on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design via4 on cell caravel_18000abd:
+13-Dec-2022 07:38:23 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design via5 on cell caravel_18000abd:
+13-Dec-2022 07:39:30 | INFO    | Running Global Foundries 180nm MCU /mnt/shuttles/shuttle/gfmpw-0/u463_russellf/gf180_russell/tapeout/outputs/oas/caravel_18000abd.oas checks on design ymtp_mk on cell caravel_18000abd:
+13-Dec-2022 08:29:53 | INFO    | Klayout DRC run is clean. GDS has no DRC violations.
diff --git a/tapeout/outputs/drc/dualgate.drc b/tapeout/outputs/drc/dualgate.drc
new file mode 100644
index 0000000..cbfe5b2
--- /dev/null
+++ b/tapeout/outputs/drc/dualgate.drc
@@ -0,0 +1,1146 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if FEOL
+    #================================================
+    #--------------------DUALGATE--------------------
+    #================================================
+
+    # Rule DV.1: Min. Dualgate enclose DNWELL. is 0.5µm
+    logger.info("Executing rule DV.1")
+    dv1_l1 = dualgate.enclosing(dnwell, 0.5.um, euclidian).polygons(0.001)
+    dv1_l2 = dnwell.not_outside(dualgate).not(dualgate)
+    dv1_l  = dv1_l1.or(dv1_l2)
+    dv1_l.output("DV.1", "DV.1 : Min. Dualgate enclose DNWELL. : 0.5µm")
+    dv1_l1.forget
+    dv1_l2.forget
+    dv1_l.forget
+
+    # Rule DV.2: Min. Dualgate Space. Merge if Space is less than this design rule. is 0.44µm
+    logger.info("Executing rule DV.2")
+    dv2_l1  = dualgate.space(0.44.um, euclidian).polygons(0.001)
+    dv2_l1.output("DV.2", "DV.2 : Min. Dualgate Space. Merge if Space is less than this design rule. : 0.44µm")
+    dv2_l1.forget
+
+    # Rule DV.3: Min. Dualgate to COMP space [unrelated]. is 0.24µm
+    logger.info("Executing rule DV.3")
+    dv3_l1  = dualgate.separation(comp.outside(dualgate), 0.24.um, euclidian).polygons(0.001)
+    dv3_l1.output("DV.3", "DV.3 : Min. Dualgate to COMP space [unrelated]. : 0.24µm")
+    dv3_l1.forget
+
+    # rule DV.4 is not a DRC check
+
+    # Rule DV.5: Min. Dualgate width. is 0.7µm
+    logger.info("Executing rule DV.5")
+    dv5_l1  = dualgate.width(0.7.um, euclidian).polygons(0.001)
+    dv5_l1.output("DV.5", "DV.5 : Min. Dualgate width. : 0.7µm")
+    dv5_l1.forget
+
+    comp_dv = comp.not(pcomp.outside(nwell))
+    # Rule DV.6: Min. Dualgate enclose COMP (except substrate tap). is 0.24µm
+    logger.info("Executing rule DV.6")
+    dv6_l1 = dualgate.enclosing(comp_dv, 0.24.um, euclidian).polygons(0.001)
+    dv6_l2 = comp_dv.not_outside(dualgate).not(dualgate)
+    dv6_l  = dv6_l1.or(dv6_l2)
+    dv6_l.output("DV.6", "DV.6 : Min. Dualgate enclose COMP (except substrate tap). : 0.24µm")
+    dv6_l1.forget
+    dv6_l2.forget
+    dv6_l.forget
+
+    # Rule DV.7: COMP (except substrate tap) can not be partially overlapped by Dualgate.
+    logger.info("Executing rule DV.7")
+    dv7_l1 = dualgate.not_outside(comp_dv).not(dualgate.covering(comp_dv))
+    dv7_l1.output("DV.7", "DV.7 : COMP (except substrate tap) can not be partially overlapped by Dualgate.")
+    dv7_l1.forget
+
+    comp_dv.forget
+
+    # Rule DV.8: Min Dualgate enclose Poly2. is 0.4µm
+    logger.info("Executing rule DV.8")
+    dv8_l1 = dualgate.enclosing(poly2, 0.4.um, euclidian).polygons(0.001)
+    dv8_l2 = poly2.not_outside(dualgate).not(dualgate)
+    dv8_l  = dv8_l1.or(dv8_l2)
+    dv8_l.output("DV.8", "DV.8 : Min Dualgate enclose Poly2. : 0.4µm")
+    dv8_l1.forget
+    dv8_l2.forget
+    dv8_l.forget
+
+    # Rule DV.9: 3.3V and 5V/6V PMOS cannot be sitting inside same NWELL.
+    logger.info("Executing rule DV.9")
+    dv9_l1 = nwell.covering(pgate.and(dualgate)).covering(pgate.not_inside(v5_xtor).not_inside(dualgate))
+    dv9_l1.output("DV.9", "DV.9 : 3.3V and 5V/6V PMOS cannot be sitting inside same NWELL.")
+    dv9_l1.forget
+end #FEOL
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/dummy_exclude.drc b/tapeout/outputs/drc/dummy_exclude.drc
new file mode 100644
index 0000000..2747236
--- /dev/null
+++ b/tapeout/outputs/drc/dummy_exclude.drc
@@ -0,0 +1,1102 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+#================================================
+#--------------DUMMY EXCLUDE LAYERS--------------
+#================================================
+
+# rule DE.1 is not a DRC check
+
+# Rule DE.2: Minimum NDMY or PMNDMY size (x or y dimension in um). is 0.8µm
+logger.info("Executing rule DE.2")
+de2_l1  = ndmy.or(pmndmy).width(0.8.um, euclidian).polygons(0.001)
+de2_l1.output("DE.2", "DE.2 : Minimum NDMY or PMNDMY size (x or y dimension in um). : 0.8µm")
+de2_l1.forget
+
+de3_ndmy_area = ndmy.with_area(15000.um, nil)
+# Rule DE.3: If size greater than 15000 um2 then two sides should not be greater than (um).
+logger.info("Executing rule DE.3")
+de3_l1 = de3_ndmy_area.edges.with_length(80.um, nil).not_interacting(de3_ndmy_area.edges.with_length(nil, 80.um))
+de3_l1.output("DE.3", "DE.3 : If size greater than 15000 um2 then two sides should not be greater than (um).")
+de3_l1.forget
+
+de3_ndmy_area.forget
+
+# Rule DE.4: Minimum NDMY to NDMY space (Merge if space is less). is 20µm
+logger.info("Executing rule DE.4")
+de4_l1  = ndmy.space(20.um, euclidian).polygons(0.001)
+de4_l1.output("DE.4", "DE.4 : Minimum NDMY to NDMY space (Merge if space is less). : 20µm")
+de4_l1.forget
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/efuse.drc b/tapeout/outputs/drc/efuse.drc
new file mode 100644
index 0000000..5d735a5
--- /dev/null
+++ b/tapeout/outputs/drc/efuse.drc
@@ -0,0 +1,1258 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+#================================================
+#---------------------EFUSE----------------------
+#================================================
+
+# Rule EF.01: Min. (Poly2 butt PLFUSE) within EFUSE_MK and Pplus.
+logger.info("Executing rule EF.01")
+ef01_l1 = poly2.or(plfuse).interacting(efuse_mk).not_inside(efuse_mk.and(pplus))
+ef01_l1.output("EF.01", "EF.01 : Min. (Poly2 butt PLFUSE) within EFUSE_MK and Pplus.")
+ef01_l1.forget
+
+# Rule EF.02: Min. Max. PLFUSE width. is 0.18µm
+logger.info("Executing rule EF.02")
+ef02_l1 = plfuse.drc(width != 0.18.um).extended(0, 0, 0.001, 0.001)
+ef02_l1.output("EF.02", "EF.02 : Min. Max. PLFUSE width. : 0.18µm")
+ef02_l1.forget
+
+# Rule EF.03: Min. Max. PLFUSE length. is 1.26µm
+logger.info("Executing rule EF.03")
+ef03_l1 = plfuse.edges.interacting(poly2.edges.and(plfuse.edges).centers(0, 0.95)).without_length(1.26.um).extended(0, 0, 0.001, 0.001)
+ef03_l1.output("EF.03", "EF.03 : Min. Max. PLFUSE length. : 1.26µm")
+ef03_l1.forget
+
+# Rule EF.04a: Min. Max. PLFUSE overlap Poly2 (coinciding permitted) and touch cathode and anode.
+logger.info("Executing rule EF.04a")
+ef04a_l1 = plfuse.not_in(plfuse.interacting(poly2.not(plfuse), 2, 2)).inside(efuse_mk).or(plfuse.not(poly2).inside(efuse_mk))
+ef04a_l1.output("EF.04a", "EF.04a : Min. Max. PLFUSE overlap Poly2 (coinciding permitted) and touch cathode and anode.")
+ef04a_l1.forget
+
+# Rule EF.04b: PLFUSE must be rectangular. is -µm
+logger.info("Executing rule EF.04b")
+ef04b_l1 = plfuse.non_rectangles
+ef04b_l1.output("EF.04b", "EF.04b : PLFUSE must be rectangular. : -µm")
+ef04b_l1.forget
+
+cathode = poly2.inside(efuse_mk).not(lvs_source.or(plfuse))
+# Rule EF.04c: Cathode Poly2 must be rectangular. is -µm
+logger.info("Executing rule EF.04c")
+ef04c_l1 = cathode.non_rectangles
+ef04c_l1.output("EF.04c", "EF.04c : Cathode Poly2 must be rectangular. : -µm")
+ef04c_l1.forget
+
+anode = poly2.and(lvs_source).inside(efuse_mk)
+# Rule EF.04d: Anode Poly2 must be rectangular. is -µm
+logger.info("Executing rule EF.04d")
+ef04d_l1 = anode.non_rectangles
+ef04d_l1.output("EF.04d", "EF.04d : Anode Poly2 must be rectangular. : -µm")
+ef04d_l1.forget
+
+# Rule EF.05: Min./Max. LVS_Source overlap Poly2 (at Anode).
+logger.info("Executing rule EF.05")
+ef05_l1 = poly2.not(plfuse).interacting(lvs_source).not(lvs_source).inside(efuse_mk).or(lvs_source.not(poly2).inside(efuse_mk))
+ef05_l1.output("EF.05", "EF.05 : Min./Max. LVS_Source overlap Poly2 (at Anode).")
+ef05_l1.forget
+
+cathode_width = cathode.edges.not_interacting(cathode.edges.interacting(plfuse)).or(cathode.edges.interacting(plfuse))
+# Rule EF.06: Min./Max. Cathode Poly2 width. is 2.26µm
+logger.info("Executing rule EF.06")
+ef06_l1 = cathode_width.without_length(2.26.um).extended(0, 0, 0.001, 0.001)
+ef06_l1.output("EF.06", "EF.06 : Min./Max. Cathode Poly2 width. : 2.26µm")
+ef06_l1.forget
+
+# Rule EF.07: Min./Max. Cathode Poly2 length. is 1.84µm
+logger.info("Executing rule EF.07")
+ef07_l1 = cathode.edges.not(cathode_width).without_length(1.84.um).extended(0, 0, 0.001, 0.001)
+ef07_l1.output("EF.07", "EF.07 : Min./Max. Cathode Poly2 length. : 1.84µm")
+ef07_l1.forget
+
+anode_width = anode.edges.not_interacting(anode.edges.interacting(plfuse)).or(anode.edges.interacting(plfuse))
+# Rule EF.08: Min./Max. Anode Poly2 width. is 1.06µm
+logger.info("Executing rule EF.08")
+ef08_l1 = anode_width.without_length(1.06.um).extended(0, 0, 0.001, 0.001)
+ef08_l1.output("EF.08", "EF.08 : Min./Max. Anode Poly2 width. : 1.06µm")
+ef08_l1.forget
+
+# Rule EF.09: Min./Max. Anode Poly2 length. is 2.43µm
+logger.info("Executing rule EF.09")
+ef09_l1 = anode.edges.not(anode_width).without_length(2.43.um).extended(0, 0, 0.001, 0.001)
+ef09_l1.output("EF.09", "EF.09 : Min./Max. Anode Poly2 length. : 2.43µm")
+ef09_l1.forget
+
+# Rule EF.10: Min. Cathode Poly2 to Poly2 space. is 0.26µm
+logger.info("Executing rule EF.10")
+ef10_l1  = cathode.space(0.26.um, euclidian).polygons(0.001)
+ef10_l1.output("EF.10", "EF.10 : Min. Cathode Poly2 to Poly2 space. : 0.26µm")
+ef10_l1.forget
+
+# Rule EF.11: Min. Anode Poly2 to Poly2 space. is 0.26µm
+logger.info("Executing rule EF.11")
+ef11_l1  = anode.space(0.26.um, euclidian).polygons(0.001)
+ef11_l1.output("EF.11", "EF.11 : Min. Anode Poly2 to Poly2 space. : 0.26µm")
+ef11_l1.forget
+
+cont_ef = contact.and(plfuse.inside(efuse_mk))
+# Rule EF.12: Min. Space of Cathode Contact to PLFUSE end.
+logger.info("Executing rule EF.12")
+ef12_l1 = plfuse.inside(efuse_mk).separation(contact.inside(cathode), 0.155.um).polygons(0.001).or(cont_ef)
+ef12_l1.output("EF.12", "EF.12 : Min. Space of Cathode Contact to PLFUSE end.")
+ef12_l1.forget
+
+# Rule EF.13: Min. Space of Anode Contact to PLFUSE end.
+logger.info("Executing rule EF.13")
+ef13_l1 = plfuse.inside(efuse_mk).separation(contact.inside(anode), 0.14.um).polygons(0.001).or(cont_ef)
+ef13_l1.output("EF.13", "EF.13 : Min. Space of Anode Contact to PLFUSE end.")
+ef13_l1.forget
+
+cont_ef.forget
+
+# Rule EF.14: Min. EFUSE_MK enclose LVS_Source.
+logger.info("Executing rule EF.14")
+ef14_l1 = lvs_source.not_outside(efuse_mk).not(efuse_mk)
+ef14_l1.output("EF.14", "EF.14 : Min. EFUSE_MK enclose LVS_Source.")
+ef14_l1.forget
+
+# Rule EF.15: NO Contact is allowed to touch PLFUSE.
+logger.info("Executing rule EF.15")
+ef15_l1 = plfuse.interacting(contact)
+ef15_l1.output("EF.15", "EF.15 : NO Contact is allowed to touch PLFUSE.")
+ef15_l1.forget
+
+# Rule EF.16a: Cathode must contain exact number of Contacts at each ends. is 4µm
+logger.info("Executing rule EF.16a")
+ef16a_l1 = cathode.not_covering(contact, 4, 4)
+ef16a_l1.output("EF.16a", "EF.16a : Cathode must contain exact number of Contacts at each ends. : 4µm")
+ef16a_l1.forget
+
+# Rule EF.16b: Anode must contain exact number of Contacts at each ends. is 4µm
+logger.info("Executing rule EF.16b")
+ef16b_l1 = anode.not_covering(contact, 4, 4)
+ef16b_l1.output("EF.16b", "EF.16b : Anode must contain exact number of Contacts at each ends. : 4µm")
+ef16b_l1.forget
+
+# Rule EF.17: Min. Space of EFUSE_MK to EFUSE_MK. is 0.26µm
+logger.info("Executing rule EF.17")
+ef17_l1  = efuse_mk.space(0.26.um, euclidian).polygons(0.001)
+ef17_l1.output("EF.17", "EF.17 : Min. Space of EFUSE_MK to EFUSE_MK. : 0.26µm")
+ef17_l1.forget
+
+# Rule EF.18: PLFUSE must sit on field oxide (NOT COMP), no cross with any COMP, Nplus, Pplus, ESD, SAB, Resistor, Metal1, Metal2.
+logger.info("Executing rule EF.18")
+ef18_l1 = plfuse.not(plfuse.outside(comp).outside(nplus).outside(esd).outside(sab).outside(resistor).outside(metal1).outside(metal2))
+ef18_l1.output("EF.18", "EF.18 : PLFUSE must sit on field oxide (NOT COMP), no cross with any COMP, Nplus, Pplus, ESD, SAB, Resistor, Metal1, Metal2.")
+ef18_l1.forget
+
+# Rule EF.19: Min. PLFUSE space to Metal1, Metal2.
+logger.info("Executing rule EF.19")
+ef19_l1 = plfuse.not(plfuse.outside(metal1).outside(metal2))
+ef19_l1.output("EF.19", "EF.19 : Min. PLFUSE space to Metal1, Metal2.")
+ef19_l1.forget
+
+# Rule EF.20: Min. PLFUSE space to COMP, Nplus, Pplus, Resistor, ESD, SAB. is 2.73µm
+logger.info("Executing rule EF.20")
+ef20_l1 = plfuse.separation(comp + nplus + esd + sab + resistor, 2.73.um, euclidian)
+ef20_l1.output("EF.20", "EF.20 : Min. PLFUSE space to COMP, Nplus, Pplus, Resistor, ESD, SAB. : 2.73µm")
+ef20_l1.forget
+
+ef_21_fuse    = poly2.interacting(plfuse).inside(efuse_mk.and(pplus)).extents.edges
+ef_21_anode   = anode.edges.not_interacting(anode.edges.interacting(plfuse))
+ef_21_cathode = cathode.edges.not_interacting(cathode.edges.interacting(plfuse))
+# Rule EF.21: Min./Max. eFUSE Poly2 length. is 5.53µm
+logger.info("Executing rule EF.21")
+ef21_l1 = ef_21_fuse.not_interacting(ef_21_anode.or(ef_21_cathode).centers(0, 0.95)).without_length(5.53.um).extended(0, 0, 0.001, 0.001)
+ef21_l1.output("EF.21", "EF.21 : Min./Max. eFUSE Poly2 length. : 5.53µm")
+ef21_l1.forget
+
+ef_21_fuse.forget
+
+ef_21_anode.forget
+
+ef_21_cathode.forget
+
+# Rule EF.22a: Min./Max. Cathode Poly2 overlap with PLFUSE in width direction. is 1.04µm
+logger.info("Executing rule EF.22a")
+ef22a_l1 = cathode.edges.interacting(plfuse).not(plfuse.edges).without_length(1.04.um).extended(0, 0, 0.001, 0.001)
+ef22a_l1.output("EF.22a", "EF.22a : Min./Max. Cathode Poly2 overlap with PLFUSE in width direction. : 1.04µm")
+ef22a_l1.forget
+
+# Rule EF.22b: Min./Max. Anode Poly2 overlap with PLFUSE in width direction. is 0.44µm
+logger.info("Executing rule EF.22b")
+ef22b_l1 = anode.edges.interacting(plfuse).not(plfuse.edges).without_length(0.44.um).extended(0, 0, 0.001, 0.001)
+ef22b_l1.output("EF.22b", "EF.22b : Min./Max. Anode Poly2 overlap with PLFUSE in width direction. : 0.44µm")
+ef22b_l1.forget
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/esd.drc b/tapeout/outputs/drc/esd.drc
new file mode 100644
index 0000000..9e81da9
--- /dev/null
+++ b/tapeout/outputs/drc/esd.drc
@@ -0,0 +1,1166 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+if FEOL
+    #================================================
+    #----------------------ESD-----------------------
+    #================================================
+
+    # Rule ESD.1: Minimum width of an ESD implant area. is 0.6µm
+    logger.info("Executing rule ESD.1")
+    esd1_l1  = esd.width(0.6.um, euclidian).polygons(0.001)
+    esd1_l1.output("ESD.1", "ESD.1 : Minimum width of an ESD implant area. : 0.6µm")
+    esd1_l1.forget
+
+    # Rule ESD.2: Minimum space between two ESD implant areas. (Merge if the space is less than 0.6um). is 0.6µm
+    logger.info("Executing rule ESD.2")
+    esd2_l1  = esd.space(0.6.um, euclidian).polygons(0.001)
+    esd2_l1.output("ESD.2", "ESD.2 : Minimum space between two ESD implant areas. (Merge if the space is less than 0.6um). : 0.6µm")
+    esd2_l1.forget
+
+    # Rule ESD.3a: Minimum space to NCOMP. is 0.6µm
+    logger.info("Executing rule ESD.3a")
+    esd3a_l1  = esd.separation(ncomp, 0.6.um, euclidian).polygons(0.001)
+    esd3a_l1.output("ESD.3a", "ESD.3a : Minimum space to NCOMP. : 0.6µm")
+    esd3a_l1.forget
+
+    # Rule ESD.3b: Min/max space to a butted PCOMP.
+    logger.info("Executing rule ESD.3b")
+    esd3b_l1 = esd.not_outside(pcomp)
+    esd3b_l1.output("ESD.3b", "ESD.3b : Min/max space to a butted PCOMP.")
+    esd3b_l1.forget
+
+    # Rule ESD.4a: Extension beyond NCOMP. is 0.24µm
+    logger.info("Executing rule ESD.4a")
+    esd4a_l1 = esd.edges.not_interacting(pcomp).enclosing(ncomp.edges, 0.24.um, euclidian).polygons(0.001)
+    esd4a_l1.output("ESD.4a", "ESD.4a : Extension beyond NCOMP. : 0.24µm")
+    esd4a_l1.forget
+
+    # Rule ESD.4b: Minimum overlap of an ESD implant edge to a COMP. is 0.45µm
+    logger.info("Executing rule ESD.4b")
+    esd4b_l1  = esd.overlap(comp, 0.45.um, euclidian).polygons(0.001)
+    esd4b_l1.output("ESD.4b", "ESD.4b : Minimum overlap of an ESD implant edge to a COMP. : 0.45µm")
+    esd4b_l1.forget
+
+    # Rule ESD.5a: Minimum ESD area (um2). is 0.49µm²
+    logger.info("Executing rule ESD.5a")
+    esd5a_l1  = esd.with_area(nil, 0.49.um)
+    esd5a_l1.output("ESD.5a", "ESD.5a : Minimum ESD area (um2). : 0.49µm²")
+    esd5a_l1.forget
+
+    # Rule ESD.5b: Minimum field area enclosed by ESD implant (um2). is 0.49µm²
+    logger.info("Executing rule ESD.5b")
+    esd5b_l1  = esd.holes.with_area(nil, 0.49.um)
+    esd5b_l1.output("ESD.5b", "ESD.5b : Minimum field area enclosed by ESD implant (um2). : 0.49µm²")
+    esd5b_l1.forget
+
+    # Rule ESD.6: Extension perpendicular to Poly2 gate. is 0.45µm
+    logger.info("Executing rule ESD.6")
+    esd6_l1 = esd.edges.enclosing(poly2.edges.interacting(tgate.edges), 0.45.um, projection).polygons(0.001)
+    esd6_l1.output("ESD.6", "ESD.6 : Extension perpendicular to Poly2 gate. : 0.45µm")
+    esd6_l1.forget
+
+    # Rule ESD.7: No ESD implant inside PCOMP.
+    logger.info("Executing rule ESD.7")
+    esd7_l1 = esd.not_outside(pcomp)
+    esd7_l1.output("ESD.7", "ESD.7 : No ESD implant inside PCOMP.")
+    esd7_l1.forget
+
+    # Rule ESD.8: Minimum space to Nplus/Pplus. is 0.3µm
+    logger.info("Executing rule ESD.8")
+    esd8_l1 = esd.separation(nplus.or(pplus), 0.3.um).polygons
+    esd8_l1.output("ESD.8", "ESD.8 : Minimum space to Nplus/Pplus. : 0.3µm")
+    esd8_l1.forget
+
+    # Rule ESD.pl: Minimum gate length of 5V/6V gate NMOS. is 0.8µm
+    logger.info("Executing rule ESD.pl")
+    esdpl_l1  = poly2.interacting(esd).edges.and(tgate.edges).width(0.8.um, euclidian).polygons(0.001).overlapping(dualgate)
+    esdpl_l1.output("ESD.pl", "ESD.pl : Minimum gate length of 5V/6V gate NMOS. : 0.8µm")
+    esdpl_l1.forget
+
+    # Rule ESD.9: ESD implant layer must be overlapped by Dualgate layer (as ESD implant option is only for 5V/6V devices).
+    logger.info("Executing rule ESD.9")
+    esd9_l1 = esd.not_inside(dualgate)
+    esd9_l1.output("ESD.9", "ESD.9 : ESD implant layer must be overlapped by Dualgate layer (as ESD implant option is only for 5V/6V devices).")
+    esd9_l1.forget
+
+    # Rule ESD.10: LVS_IO shall be drawn covering I/O MOS active area by minimum overlap.
+    logger.info("Executing rule ESD.10")
+    esd10_l1 = comp.and(esd).not_outside(lvs_io).not(lvs_io)
+    esd10_l1.output("ESD.10", "ESD.10 : LVS_IO shall be drawn covering I/O MOS active area by minimum overlap.")
+    esd10_l1.forget
+end #FEOL
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/geom.drc b/tapeout/outputs/drc/geom.drc
new file mode 100644
index 0000000..1dca33f
--- /dev/null
+++ b/tapeout/outputs/drc/geom.drc
@@ -0,0 +1,1524 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+#================================================
+#-----------------GEOMETRY RULES-----------------
+#================================================
+
+if OFFGRID
+    logger.info("OFFGRID-ANGLES section")
+    
+    logger.info("Executing rule comp_OFFGRID")
+    comp.ongrid(0.005).output("comp_OFFGRID", "OFFGRID : OFFGRID vertex on comp")
+    comp.with_angle(0 .. 45).output("comp_angle", "ACUTE : non 45 degree angle comp")
+    
+    logger.info("Executing rule dnwell_OFFGRID")
+    dnwell.ongrid(0.005).output("dnwell_OFFGRID", "OFFGRID : OFFGRID vertex on dnwell")
+    dnwell.with_angle(0 .. 45).output("dnwell_angle", "ACUTE : non 45 degree angle dnwell")
+    
+    logger.info("Executing rule nwell_OFFGRID")
+    nwell.ongrid(0.005).output("nwell_OFFGRID", "OFFGRID : OFFGRID vertex on nwell")
+    nwell.with_angle(0 .. 45).output("nwell_angle", "ACUTE : non 45 degree angle nwell")
+    
+    logger.info("Executing rule lvpwell_OFFGRID")
+    lvpwell.ongrid(0.005).output("lvpwell_OFFGRID", "OFFGRID : OFFGRID vertex on lvpwell")
+    lvpwell.with_angle(0 .. 45).output("lvpwell_angle", "ACUTE : non 45 degree angle lvpwell")
+    
+    logger.info("Executing rule dualgate_OFFGRID")
+    dualgate.ongrid(0.005).output("dualgate_OFFGRID", "OFFGRID : OFFGRID vertex on dualgate")
+    dualgate.with_angle(0 .. 45).output("dualgate_angle", "ACUTE : non 45 degree angle dualgate")
+    
+    logger.info("Executing rule poly2_OFFGRID")
+    poly2.ongrid(0.005).output("poly2_OFFGRID", "OFFGRID : OFFGRID vertex on poly2")
+    poly2.with_angle(0 .. 45).output("poly2_angle", "ACUTE : non 45 degree angle poly2")
+    
+    logger.info("Executing rule nplus_OFFGRID")
+    nplus.ongrid(0.005).output("nplus_OFFGRID", "OFFGRID : OFFGRID vertex on nplus")
+    nplus.with_angle(0 .. 45).output("nplus_angle", "ACUTE : non 45 degree angle nplus")
+    
+    logger.info("Executing rule pplus_OFFGRID")
+    pplus.ongrid(0.005).output("pplus_OFFGRID", "OFFGRID : OFFGRID vertex on pplus")
+    pplus.with_angle(0 .. 45).output("pplus_angle", "ACUTE : non 45 degree angle pplus")
+    
+    logger.info("Executing rule sab_OFFGRID")
+    sab.ongrid(0.005).output("sab_OFFGRID", "OFFGRID : OFFGRID vertex on sab")
+    sab.with_angle(0 .. 45).output("sab_angle", "ACUTE : non 45 degree angle sab")
+    
+    logger.info("Executing rule esd_OFFGRID")
+    esd.ongrid(0.005).output("esd_OFFGRID", "OFFGRID : OFFGRID vertex on esd")
+    esd.with_angle(0 .. 45).output("esd_angle", "ACUTE : non 45 degree angle esd")
+    
+    logger.info("Executing rule contact_OFFGRID")
+    contact.ongrid(0.005).output("contact_OFFGRID", "OFFGRID : OFFGRID vertex on contact")
+    contact.with_angle(0 .. 45).output("contact_angle", "ACUTE : non 45 degree angle contact")
+    
+    logger.info("Executing rule metal1_OFFGRID")
+    metal1.ongrid(0.005).output("metal1_OFFGRID", "OFFGRID : OFFGRID vertex on metal1")
+    metal1.with_angle(0 .. 45).output("metal1_angle", "ACUTE : non 45 degree angle metal1")
+    
+    logger.info("Executing rule via1_OFFGRID")
+    via1.ongrid(0.005).output("via1_OFFGRID", "OFFGRID : OFFGRID vertex on via1")
+    via1.with_angle(0 .. 45).output("via1_angle", "ACUTE : non 45 degree angle via1")
+    
+    logger.info("Executing rule metal2_OFFGRID")
+    metal2.ongrid(0.005).output("metal2_OFFGRID", "OFFGRID : OFFGRID vertex on metal2")
+    metal2.with_angle(0 .. 45).output("metal2_angle", "ACUTE : non 45 degree angle metal2")
+    
+    if METAL_LEVEL == "3LM" || METAL_LEVEL == "4LM" || METAL_LEVEL == "5LM" || METAL_LEVEL == "6LM"
+        logger.info("Executing rule via2_OFFGRID")
+        via2.ongrid(0.005).output("via2_OFFGRID", "OFFGRID : OFFGRID vertex on via2")
+        via2.with_angle(0 .. 45).output("via2_angle", "ACUTE : non 45 degree angle via2")
+        
+        logger.info("Executing rule metal3_OFFGRID")
+        metal3.ongrid(0.005).output("metal3_OFFGRID", "OFFGRID : OFFGRID vertex on metal3")
+        metal3.with_angle(0 .. 45).output("metal3_angle", "ACUTE : non 45 degree angle metal3")
+        
+        if METAL_LEVEL == "4LM" || METAL_LEVEL == "5LM" || METAL_LEVEL == "6LM"
+            logger.info("Executing rule via3_OFFGRID")
+            via3.ongrid(0.005).output("via3_OFFGRID", "OFFGRID : OFFGRID vertex on via3")
+            via3.with_angle(0 .. 45).output("via3_angle", "ACUTE : non 45 degree angle via3")
+            
+            logger.info("Executing rule metal4_OFFGRID")
+            metal4.ongrid(0.005).output("metal4_OFFGRID", "OFFGRID : OFFGRID vertex on metal4")
+            metal4.with_angle(0 .. 45).output("metal4_angle", "ACUTE : non 45 degree angle metal4")
+            
+            if METAL_LEVEL == "5LM" || METAL_LEVEL == "6LM"
+                logger.info("Executing rule via4_OFFGRID")
+                via4.ongrid(0.005).output("via4_OFFGRID", "OFFGRID : OFFGRID vertex on via4")
+                via4.with_angle(0 .. 45).output("via4_angle", "ACUTE : non 45 degree angle via4")
+                
+                logger.info("Executing rule metal5_OFFGRID")
+                metal5.ongrid(0.005).output("metal5_OFFGRID", "OFFGRID : OFFGRID vertex on metal5")
+                metal5.with_angle(0 .. 45).output("metal5_angle", "ACUTE : non 45 degree angle metal5")
+
+                if METAL_LEVEL == "6LM"
+                    logger.info("Executing rule via5_OFFGRID")
+                    via5.ongrid(0.005).output("via5_OFFGRID", "OFFGRID : OFFGRID vertex on via5")
+                    via5.with_angle(0 .. 45).output("via5_angle", "ACUTE : non 45 degree angle via5")
+                    
+                    logger.info("Executing rule metaltop_OFFGRID")
+                    metaltop.ongrid(0.005).output("metaltop_OFFGRID", "OFFGRID : OFFGRID vertex on metaltop")
+                    metaltop.with_angle(0 .. 45).output("metaltop_angle", "ACUTE : non 45 degree angle metaltop")
+                end
+            end
+        end
+    end
+    
+    logger.info("Executing rule pad_OFFGRID")
+    pad.ongrid(0.005).output("pad_OFFGRID", "OFFGRID : OFFGRID vertex on pad")
+    pad.with_angle(0 .. 45).output("pad_angle", "ACUTE : non 45 degree angle pad")
+    
+    logger.info("Executing rule resistor_OFFGRID")
+    resistor.ongrid(0.005).output("resistor_OFFGRID", "OFFGRID : OFFGRID vertex on resistor")
+    resistor.with_angle(0 .. 45).output("resistor_angle", "ACUTE : non 45 degree angle resistor")
+    
+    logger.info("Executing rule fhres_OFFGRID")
+    fhres.ongrid(0.005).output("fhres_OFFGRID", "OFFGRID : OFFGRID vertex on fhres")
+    fhres.with_angle(0 .. 45).output("fhres_angle", "ACUTE : non 45 degree angle fhres")
+    
+    logger.info("Executing rule fusetop_OFFGRID")
+    fusetop.ongrid(0.005).output("fusetop_OFFGRID", "OFFGRID : OFFGRID vertex on fusetop")
+    fusetop.with_angle(0 .. 45).output("fusetop_angle", "ACUTE : non 45 degree angle fusetop")
+    
+    logger.info("Executing rule fusewindow_d_OFFGRID")
+    fusewindow_d.ongrid(0.005).output("fusewindow_d_OFFGRID", "OFFGRID : OFFGRID vertex on fusewindow_d")
+    fusewindow_d.with_angle(0 .. 45).output("fusewindow_d_angle", "ACUTE : non 45 degree angle fusewindow_d")
+    
+    logger.info("Executing rule polyfuse_OFFGRID")
+    polyfuse.ongrid(0.005).output("polyfuse_OFFGRID", "OFFGRID : OFFGRID vertex on polyfuse")
+    polyfuse.with_angle(0 .. 45).output("polyfuse_angle", "ACUTE : non 45 degree angle polyfuse")
+    
+    logger.info("Executing rule mvsd_OFFGRID")
+    mvsd.ongrid(0.005).output("mvsd_OFFGRID", "OFFGRID : OFFGRID vertex on mvsd")
+    mvsd.with_angle(0 .. 45).output("mvsd_angle", "ACUTE : non 45 degree angle mvsd")
+    
+    logger.info("Executing rule mvpsd_OFFGRID")
+    mvpsd.ongrid(0.005).output("mvpsd_OFFGRID", "OFFGRID : OFFGRID vertex on mvpsd")
+    mvpsd.with_angle(0 .. 45).output("mvpsd_angle", "ACUTE : non 45 degree angle mvpsd")
+    
+    logger.info("Executing rule nat_OFFGRID")
+    nat.ongrid(0.005).output("nat_OFFGRID", "OFFGRID : OFFGRID vertex on nat")
+    nat.with_angle(0 .. 45).output("nat_angle", "ACUTE : non 45 degree angle nat")
+    
+    logger.info("Executing rule comp_dummy_OFFGRID")
+    comp_dummy.ongrid(0.005).output("comp_dummy_OFFGRID", "OFFGRID : OFFGRID vertex on comp_dummy")
+    comp_dummy.with_angle(0 .. 45).output("comp_dummy_angle", "ACUTE : non 45 degree angle comp_dummy")
+    
+    logger.info("Executing rule poly2_dummy_OFFGRID")
+    poly2_dummy.ongrid(0.005).output("poly2_dummy_OFFGRID", "OFFGRID : OFFGRID vertex on poly2_dummy")
+    poly2_dummy.with_angle(0 .. 45).output("poly2_dummy_angle", "ACUTE : non 45 degree angle poly2_dummy")
+    
+    logger.info("Executing rule metal1_dummy_OFFGRID")
+    metal1_dummy.ongrid(0.005).output("metal1_dummy_OFFGRID", "OFFGRID : OFFGRID vertex on metal1_dummy")
+    metal1_dummy.with_angle(0 .. 45).output("metal1_dummy_angle", "ACUTE : non 45 degree angle metal1_dummy")
+
+    logger.info("Executing rule metal1_label_OFFGRID")
+    metal1_label.ongrid(0.005).output("metal1_label_OFFGRID", "OFFGRID : OFFGRID vertex on metal1_label")
+    metal1_label.with_angle(0 .. 45).output("metal1_label_angle", "ACUTE : non 45 degree angle metal1_label")
+
+    logger.info("Executing rule metal1_slot_OFFGRID")
+    metal1_slot.ongrid(0.005).output("metal1_slot_OFFGRID", "OFFGRID : OFFGRID vertex on metal1_slot")
+    metal1_slot.with_angle(0 .. 45).output("metal1_slot_angle", "ACUTE : non 45 degree angle metal1_slot")
+
+    logger.info("Executing rule metal1_blk_OFFGRID")
+    metal1_blk.ongrid(0.005).output("metal1_blk_OFFGRID", "OFFGRID : OFFGRID vertex on metal1_blk")
+    metal1_blk.with_angle(0 .. 45).output("metal1_blk_angle", "ACUTE : non 45 degree angle metal1_blk")
+    
+    logger.info("Executing rule metal2_dummy_OFFGRID")
+    metal2_dummy.ongrid(0.005).output("metal2_dummy_OFFGRID", "OFFGRID : OFFGRID vertex on metal2_dummy")
+    metal2_dummy.with_angle(0 .. 45).output("metal2_dummy_angle", "ACUTE : non 45 degree angle metal2_dummy")
+
+    logger.info("Executing rule metal2_label_OFFGRID")
+    metal2_label.ongrid(0.005).output("metal2_label_OFFGRID", "OFFGRID : OFFGRID vertex on metal2_label")
+    metal2_label.with_angle(0 .. 45).output("metal2_label_angle", "ACUTE : non 45 degree angle metal2_label")
+
+    logger.info("Executing rule metal2_slot_OFFGRID")
+    metal2_slot.ongrid(0.005).output("metal2_slot_OFFGRID", "OFFGRID : OFFGRID vertex on metal2_slot")
+    metal2_slot.with_angle(0 .. 45).output("metal2_slot_angle", "ACUTE : non 45 degree angle metal2_slot")
+
+    logger.info("Executing rule metal2_blk_OFFGRID")
+    metal2_blk.ongrid(0.005).output("metal2_blk_OFFGRID", "OFFGRID : OFFGRID vertex on metal2_blk")
+    metal2_blk.with_angle(0 .. 45).output("metal2_blk_angle", "ACUTE : non 45 degree angle metal2_blk")
+    
+    if METAL_LEVEL == "3LM" || METAL_LEVEL == "4LM" || METAL_LEVEL == "5LM" || METAL_LEVEL == "6LM"
+        logger.info("Executing rule metal3_dummy_OFFGRID")
+        metal3_dummy.ongrid(0.005).output("metal3_dummy_OFFGRID", "OFFGRID : OFFGRID vertex on metal3_dummy")
+        metal3_dummy.with_angle(0 .. 45).output("metal3_dummy_angle", "ACUTE : non 45 degree angle metal3_dummy")
+
+        logger.info("Executing rule metal3_label_OFFGRID")
+        metal3_label.ongrid(0.005).output("metal3_label_OFFGRID", "OFFGRID : OFFGRID vertex on metal3_label")
+        metal3_label.with_angle(0 .. 45).output("metal3_label_angle", "ACUTE : non 45 degree angle metal3_label")
+
+        logger.info("Executing rule metal3_slot_OFFGRID")
+        metal3_slot.ongrid(0.005).output("metal3_slot_OFFGRID", "OFFGRID : OFFGRID vertex on metal3_slot")
+        metal3_slot.with_angle(0 .. 45).output("metal3_slot_angle", "ACUTE : non 45 degree angle metal3_slot")
+
+        logger.info("Executing rule metal3_blk_OFFGRID")
+        metal3_blk.ongrid(0.005).output("metal3_blk_OFFGRID", "OFFGRID : OFFGRID vertex on metal3_blk")
+        metal3_blk.with_angle(0 .. 45).output("metal3_blk_angle", "ACUTE : non 45 degree angle metal3_blk")
+        
+        if METAL_LEVEL == "4LM" || METAL_LEVEL == "5LM" || METAL_LEVEL == "6LM"
+            logger.info("Executing rule metal4_dummy_OFFGRID")
+            metal4_dummy.ongrid(0.005).output("metal4_dummy_OFFGRID", "OFFGRID : OFFGRID vertex on metal4_dummy")
+            metal4_dummy.with_angle(0 .. 45).output("metal4_dummy_angle", "ACUTE : non 45 degree angle metal4_dummy")
+
+            logger.info("Executing rule metal4_label_OFFGRID")
+            metal4_label.ongrid(0.005).output("metal4_label_OFFGRID", "OFFGRID : OFFGRID vertex on metal4_label")
+            metal4_label.with_angle(0 .. 45).output("metal4_label_angle", "ACUTE : non 45 degree angle metal4_label")
+
+            logger.info("Executing rule metal4_slot_OFFGRID")
+            metal4_slot.ongrid(0.005).output("metal4_slot_OFFGRID", "OFFGRID : OFFGRID vertex on metal4_slot")
+            metal4_slot.with_angle(0 .. 45).output("metal4_slot_angle", "ACUTE : non 45 degree angle metal4_slot")
+
+            logger.info("Executing rule metal4_blk_OFFGRID")
+            metal4_blk.ongrid(0.005).output("metal4_blk_OFFGRID", "OFFGRID : OFFGRID vertex on metal4_blk")
+            metal4_blk.with_angle(0 .. 45).output("metal4_blk_angle", "ACUTE : non 45 degree angle metal4_blk")
+            
+            if METAL_LEVEL == "5LM" || METAL_LEVEL == "6LM"
+                logger.info("Executing rule metal5_dummy_OFFGRID")
+                metal5_dummy.ongrid(0.005).output("metal5_dummy_OFFGRID", "OFFGRID : OFFGRID vertex on metal5_dummy")
+                metal5_dummy.with_angle(0 .. 45).output("metal5_dummy_angle", "ACUTE : non 45 degree angle metal5_dummy")
+
+                logger.info("Executing rule metal5_label_OFFGRID")
+                metal5_label.ongrid(0.005).output("metal5_label_OFFGRID", "OFFGRID : OFFGRID vertex on metal5_label")
+                metal5_label.with_angle(0 .. 45).output("metal5_label_angle", "ACUTE : non 45 degree angle metal5_label")
+
+                logger.info("Executing rule metal5_slot_OFFGRID")
+                metal5_slot.ongrid(0.005).output("metal5_slot_OFFGRID", "OFFGRID : OFFGRID vertex on metal5_slot")
+                metal5_slot.with_angle(0 .. 45).output("metal5_slot_angle", "ACUTE : non 45 degree angle metal5_slot")
+
+                logger.info("Executing rule metal5_blk_OFFGRID")
+                metal5_blk.ongrid(0.005).output("metal5_blk_OFFGRID", "OFFGRID : OFFGRID vertex on metal5_blk")
+                metal5_blk.with_angle(0 .. 45).output("metal5_blk_angle", "ACUTE : non 45 degree angle metal5_blk")
+            
+                
+                if METAL_LEVEL == "6LM"
+                    logger.info("Executing rule metaltop_dummy_OFFGRID")
+                    metaltop_dummy.ongrid(0.005).output("metaltop_dummy_OFFGRID", "OFFGRID : OFFGRID vertex on metaltop_dummy")
+                    metaltop_dummy.with_angle(0 .. 45).output("metaltop_dummy_angle", "ACUTE : non 45 degree angle metaltop_dummy")
+
+                    logger.info("Executing rule metaltop_label_OFFGRID")
+                    metaltop_label.ongrid(0.005).output("metaltop_label_OFFGRID", "OFFGRID : OFFGRID vertex on metaltop_label")
+                    metaltop_label.with_angle(0 .. 45).output("metaltop_label_angle", "ACUTE : non 45 degree angle metaltop_label")
+
+                    logger.info("Executing rule metaltop_slot_OFFGRID")
+                    metaltop_slot.ongrid(0.005).output("metaltop_slot_OFFGRID", "OFFGRID : OFFGRID vertex on metaltop_slot")
+                    metaltop_slot.with_angle(0 .. 45).output("metaltop_slot_angle", "ACUTE : non 45 degree angle metaltop_slot")
+
+                    logger.info("Executing rule metalt_blk_OFFGRID")
+                    metalt_blk.ongrid(0.005).output("metalt_blk_OFFGRID", "OFFGRID : OFFGRID vertex on metalt_blk")
+                    metalt_blk.with_angle(0 .. 45).output("metalt_blk_angle", "ACUTE : non 45 degree angle metalt_blk")
+                end
+            end
+        end
+    end
+    
+    logger.info("Executing rule comp_label_OFFGRID")
+    comp_label.ongrid(0.005).output("comp_label_OFFGRID", "OFFGRID : OFFGRID vertex on comp_label")
+    comp_label.with_angle(0 .. 45).output("comp_label_angle", "ACUTE : non 45 degree angle comp_label")
+    
+    logger.info("Executing rule poly2_label_OFFGRID")
+    poly2_label.ongrid(0.005).output("poly2_label_OFFGRID", "OFFGRID : OFFGRID vertex on poly2_label")
+    poly2_label.with_angle(0 .. 45).output("poly2_label_angle", "ACUTE : non 45 degree angle poly2_label")
+    
+    logger.info("Executing rule ubmpperi_OFFGRID")
+    ubmpperi.ongrid(0.005).output("ubmpperi_OFFGRID", "OFFGRID : OFFGRID vertex on ubmpperi")
+    ubmpperi.with_angle(0 .. 45).output("ubmpperi_angle", "ACUTE : non 45 degree angle ubmpperi")
+    
+    logger.info("Executing rule ubmparray_OFFGRID")
+    ubmparray.ongrid(0.005).output("ubmparray_OFFGRID", "OFFGRID : OFFGRID vertex on ubmparray")
+    ubmparray.with_angle(0 .. 45).output("ubmparray_angle", "ACUTE : non 45 degree angle ubmparray")
+    
+    logger.info("Executing rule ubmeplate_OFFGRID")
+    ubmeplate.ongrid(0.005).output("ubmeplate_OFFGRID", "OFFGRID : OFFGRID vertex on ubmeplate")
+    ubmeplate.with_angle(0 .. 45).output("ubmeplate_angle", "ACUTE : non 45 degree angle ubmeplate")
+    
+    logger.info("Executing rule schottky_diode_OFFGRID")
+    schottky_diode.ongrid(0.005).output("schottky_diode_OFFGRID", "OFFGRID : OFFGRID vertex on schottky_diode")
+    schottky_diode.with_angle(0 .. 45).output("schottky_diode_angle", "ACUTE : non 45 degree angle schottky_diode")
+    
+    logger.info("Executing rule zener_OFFGRID")
+    zener.ongrid(0.005).output("zener_OFFGRID", "OFFGRID : OFFGRID vertex on zener")
+    zener.with_angle(0 .. 45).output("zener_angle", "ACUTE : non 45 degree angle zener")
+    
+    logger.info("Executing rule res_mk_OFFGRID")
+    res_mk.ongrid(0.005).output("res_mk_OFFGRID", "OFFGRID : OFFGRID vertex on res_mk")
+    res_mk.with_angle(0 .. 45).output("res_mk_angle", "ACUTE : non 45 degree angle res_mk")
+    
+    logger.info("Executing rule opc_drc_OFFGRID")
+    opc_drc.ongrid(0.005).output("opc_drc_OFFGRID", "OFFGRID : OFFGRID vertex on opc_drc")
+    opc_drc.with_angle(0 .. 45).output("opc_drc_angle", "ACUTE : non 45 degree angle opc_drc")
+    
+    logger.info("Executing rule ndmy_OFFGRID")
+    ndmy.ongrid(0.005).output("ndmy_OFFGRID", "OFFGRID : OFFGRID vertex on ndmy")
+    ndmy.with_angle(0 .. 45).output("ndmy_angle", "ACUTE : non 45 degree angle ndmy")
+    
+    logger.info("Executing rule pmndmy_OFFGRID")
+    pmndmy.ongrid(0.005).output("pmndmy_OFFGRID", "OFFGRID : OFFGRID vertex on pmndmy")
+    pmndmy.with_angle(0 .. 45).output("pmndmy_angle", "ACUTE : non 45 degree angle pmndmy")
+    
+    logger.info("Executing rule v5_xtor_OFFGRID")
+    v5_xtor.ongrid(0.005).output("v5_xtor_OFFGRID", "OFFGRID : OFFGRID vertex on v5_xtor")
+    v5_xtor.with_angle(0 .. 45).output("v5_xtor_angle", "ACUTE : non 45 degree angle v5_xtor")
+    
+    logger.info("Executing rule cap_mk_OFFGRID")
+    cap_mk.ongrid(0.005).output("cap_mk_OFFGRID", "OFFGRID : OFFGRID vertex on cap_mk")
+    cap_mk.with_angle(0 .. 45).output("cap_mk_angle", "ACUTE : non 45 degree angle cap_mk")
+    
+    logger.info("Executing rule mos_cap_mk_OFFGRID")
+    mos_cap_mk.ongrid(0.005).output("mos_cap_mk_OFFGRID", "OFFGRID : OFFGRID vertex on mos_cap_mk")
+    mos_cap_mk.with_angle(0 .. 45).output("mos_cap_mk_angle", "ACUTE : non 45 degree angle mos_cap_mk")
+    
+    logger.info("Executing rule ind_mk_OFFGRID")
+    ind_mk.ongrid(0.005).output("ind_mk_OFFGRID", "OFFGRID : OFFGRID vertex on ind_mk")
+    ind_mk.with_angle(0 .. 45).output("ind_mk_angle", "ACUTE : non 45 degree angle ind_mk")
+    
+    logger.info("Executing rule diode_mk_OFFGRID")
+    diode_mk.ongrid(0.005).output("diode_mk_OFFGRID", "OFFGRID : OFFGRID vertex on diode_mk")
+    diode_mk.with_angle(0 .. 45).output("diode_mk_angle", "ACUTE : non 45 degree angle diode_mk")
+    
+    logger.info("Executing rule drc_bjt_OFFGRID")
+    drc_bjt.ongrid(0.005).output("drc_bjt_OFFGRID", "OFFGRID : OFFGRID vertex on drc_bjt")
+    drc_bjt.with_angle(0 .. 45).output("drc_bjt_angle", "ACUTE : non 45 degree angle drc_bjt")
+    
+    logger.info("Executing rule lvs_bjt_OFFGRID")
+    lvs_bjt.ongrid(0.005).output("lvs_bjt_OFFGRID", "OFFGRID : OFFGRID vertex on lvs_bjt")
+    lvs_bjt.with_angle(0 .. 45).output("lvs_bjt_angle", "ACUTE : non 45 degree angle lvs_bjt")
+    
+    logger.info("Executing rule mim_l_mk_OFFGRID")
+    mim_l_mk.ongrid(0.005).output("mim_l_mk_OFFGRID", "OFFGRID : OFFGRID vertex on mim_l_mk")
+    mim_l_mk.with_angle(0 .. 45).output("mim_l_mk_angle", "ACUTE : non 45 degree angle mim_l_mk")
+    
+    logger.info("Executing rule latchup_mk_OFFGRID")
+    latchup_mk.ongrid(0.005).output("latchup_mk_OFFGRID", "OFFGRID : OFFGRID vertex on latchup_mk")
+    latchup_mk.with_angle(0 .. 45).output("latchup_mk_angle", "ACUTE : non 45 degree angle latchup_mk")
+    
+    logger.info("Executing rule guard_ring_mk_OFFGRID")
+    guard_ring_mk.ongrid(0.005).output("guard_ring_mk_OFFGRID", "OFFGRID : OFFGRID vertex on guard_ring_mk")
+    guard_ring_mk.with_angle(0 .. 45).output("guard_ring_mk_angle", "ACUTE : non 45 degree angle guard_ring_mk")
+    
+    logger.info("Executing rule otp_mk_OFFGRID")
+    otp_mk.ongrid(0.005).output("otp_mk_OFFGRID", "OFFGRID : OFFGRID vertex on otp_mk")
+    otp_mk.with_angle(0 .. 45).output("otp_mk_angle", "ACUTE : non 45 degree angle otp_mk")
+    
+    logger.info("Executing rule mtpmark_OFFGRID")
+    mtpmark.ongrid(0.005).output("mtpmark_OFFGRID", "OFFGRID : OFFGRID vertex on mtpmark")
+    mtpmark.with_angle(0 .. 45).output("mtpmark_angle", "ACUTE : non 45 degree angle mtpmark")
+    
+    logger.info("Executing rule neo_ee_mk_OFFGRID")
+    neo_ee_mk.ongrid(0.005).output("neo_ee_mk_OFFGRID", "OFFGRID : OFFGRID vertex on neo_ee_mk")
+    neo_ee_mk.with_angle(0 .. 45).output("neo_ee_mk_angle", "ACUTE : non 45 degree angle neo_ee_mk")
+    
+    logger.info("Executing rule sramcore_OFFGRID")
+    sramcore.ongrid(0.005).output("sramcore_OFFGRID", "OFFGRID : OFFGRID vertex on sramcore")
+    sramcore.with_angle(0 .. 45).output("sramcore_angle", "ACUTE : non 45 degree angle sramcore")
+    
+    logger.info("Executing rule lvs_rf_OFFGRID")
+    lvs_rf.ongrid(0.005).output("lvs_rf_OFFGRID", "OFFGRID : OFFGRID vertex on lvs_rf")
+    lvs_rf.with_angle(0 .. 45).output("lvs_rf_angle", "ACUTE : non 45 degree angle lvs_rf")
+    
+    logger.info("Executing rule lvs_drain_OFFGRID")
+    lvs_drain.ongrid(0.005).output("lvs_drain_OFFGRID", "OFFGRID : OFFGRID vertex on lvs_drain")
+    lvs_drain.with_angle(0 .. 45).output("lvs_drain_angle", "ACUTE : non 45 degree angle lvs_drain")
+    
+    logger.info("Executing rule ind_mk_OFFGRID")
+    ind_mk.ongrid(0.005).output("ind_mk_OFFGRID", "OFFGRID : OFFGRID vertex on ind_mk")
+    ind_mk.with_angle(0 .. 45).output("ind_mk_angle", "ACUTE : non 45 degree angle ind_mk")
+    
+    logger.info("Executing rule hvpolyrs_OFFGRID")
+    hvpolyrs.ongrid(0.005).output("hvpolyrs_OFFGRID", "OFFGRID : OFFGRID vertex on hvpolyrs")
+    hvpolyrs.with_angle(0 .. 45).output("hvpolyrs_angle", "ACUTE : non 45 degree angle hvpolyrs")
+    
+    logger.info("Executing rule lvs_io_OFFGRID")
+    lvs_io.ongrid(0.005).output("lvs_io_OFFGRID", "OFFGRID : OFFGRID vertex on lvs_io")
+    lvs_io.with_angle(0 .. 45).output("lvs_io_angle", "ACUTE : non 45 degree angle lvs_io")
+    
+    logger.info("Executing rule probe_mk_OFFGRID")
+    probe_mk.ongrid(0.005).output("probe_mk_OFFGRID", "OFFGRID : OFFGRID vertex on probe_mk")
+    probe_mk.with_angle(0 .. 45).output("probe_mk_angle", "ACUTE : non 45 degree angle probe_mk")
+    
+    logger.info("Executing rule esd_mk_OFFGRID")
+    esd_mk.ongrid(0.005).output("esd_mk_OFFGRID", "OFFGRID : OFFGRID vertex on esd_mk")
+    esd_mk.with_angle(0 .. 45).output("esd_mk_angle", "ACUTE : non 45 degree angle esd_mk")
+    
+    logger.info("Executing rule lvs_source_OFFGRID")
+    lvs_source.ongrid(0.005).output("lvs_source_OFFGRID", "OFFGRID : OFFGRID vertex on lvs_source")
+    lvs_source.with_angle(0 .. 45).output("lvs_source_angle", "ACUTE : non 45 degree angle lvs_source")
+    
+    logger.info("Executing rule well_diode_mk_OFFGRID")
+    well_diode_mk.ongrid(0.005).output("well_diode_mk_OFFGRID", "OFFGRID : OFFGRID vertex on well_diode_mk")
+    well_diode_mk.with_angle(0 .. 45).output("well_diode_mk_angle", "ACUTE : non 45 degree angle well_diode_mk")
+    
+    logger.info("Executing rule ldmos_xtor_OFFGRID")
+    ldmos_xtor.ongrid(0.005).output("ldmos_xtor_OFFGRID", "OFFGRID : OFFGRID vertex on ldmos_xtor")
+    ldmos_xtor.with_angle(0 .. 45).output("ldmos_xtor_angle", "ACUTE : non 45 degree angle ldmos_xtor")
+    
+    logger.info("Executing rule plfuse_OFFGRID")
+    plfuse.ongrid(0.005).output("plfuse_OFFGRID", "OFFGRID : OFFGRID vertex on plfuse")
+    plfuse.with_angle(0 .. 45).output("plfuse_angle", "ACUTE : non 45 degree angle plfuse")
+    
+    logger.info("Executing rule efuse_mk_OFFGRID")
+    efuse_mk.ongrid(0.005).output("efuse_mk_OFFGRID", "OFFGRID : OFFGRID vertex on efuse_mk")
+    efuse_mk.with_angle(0 .. 45).output("efuse_mk_angle", "ACUTE : non 45 degree angle efuse_mk")
+    
+    logger.info("Executing rule mcell_feol_mk_OFFGRID")
+    mcell_feol_mk.ongrid(0.005).output("mcell_feol_mk_OFFGRID", "OFFGRID : OFFGRID vertex on mcell_feol_mk")
+    mcell_feol_mk.with_angle(0 .. 45).output("mcell_feol_mk_angle", "ACUTE : non 45 degree angle mcell_feol_mk")
+    
+    logger.info("Executing rule ymtp_mk_OFFGRID")
+    ymtp_mk.ongrid(0.005).output("ymtp_mk_OFFGRID", "OFFGRID : OFFGRID vertex on ymtp_mk")
+    ymtp_mk.with_angle(0 .. 45).output("ymtp_mk_angle", "ACUTE : non 45 degree angle ymtp_mk")
+    
+    logger.info("Executing rule dev_wf_mk_OFFGRID")
+    dev_wf_mk.ongrid(0.005).output("dev_wf_mk_OFFGRID", "OFFGRID : OFFGRID vertex on dev_wf_mk")
+    dev_wf_mk.with_angle(0 .. 45).output("dev_wf_mk_angle", "ACUTE : non 45 degree angle dev_wf_mk")
+    
+    logger.info("Executing rule pr_bndry_OFFGRID")
+    pr_bndry.ongrid(0.005).output("pr_bndry_OFFGRID", "OFFGRID : OFFGRID vertex on pr_bndry")
+    pr_bndry.with_angle(0 .. 45).output("pr_bndry_angle", "ACUTE : non 45 degree angle pr_bndry")
+    
+    logger.info("Executing rule mdiode_OFFGRID")
+    mdiode.ongrid(0.005).output("mdiode_OFFGRID", "OFFGRID : OFFGRID vertex on mdiode")
+    mdiode.with_angle(0 .. 45).output("mdiode_angle", "ACUTE : non 45 degree angle mdiode")
+    
+    logger.info("Executing rule metal1_res_OFFGRID")
+    metal1_res.ongrid(0.005).output("metal1_res_OFFGRID", "OFFGRID : OFFGRID vertex on metal1_res")
+    metal1_res.with_angle(0 .. 45).output("metal1_res_angle", "ACUTE : non 45 degree angle metal1_res")
+    
+    logger.info("Executing rule metal2_res_OFFGRID")
+    metal2_res.ongrid(0.005).output("metal2_res_OFFGRID", "OFFGRID : OFFGRID vertex on metal2_res")
+    metal2_res.with_angle(0 .. 45).output("metal2_res_angle", "ACUTE : non 45 degree angle metal2_res")
+    
+    logger.info("Executing rule metal3_res_OFFGRID")
+    metal3_res.ongrid(0.005).output("metal3_res_OFFGRID", "OFFGRID : OFFGRID vertex on metal3_res")
+    metal3_res.with_angle(0 .. 45).output("metal3_res_angle", "ACUTE : non 45 degree angle metal3_res")
+    
+    logger.info("Executing rule metal4_res_OFFGRID")
+    metal4_res.ongrid(0.005).output("metal4_res_OFFGRID", "OFFGRID : OFFGRID vertex on metal4_res")
+    metal4_res.with_angle(0 .. 45).output("metal4_res_angle", "ACUTE : non 45 degree angle metal4_res")
+    
+    logger.info("Executing rule metal5_res_OFFGRID")
+    metal5_res.ongrid(0.005).output("metal5_res_OFFGRID", "OFFGRID : OFFGRID vertex on metal5_res")
+    metal5_res.with_angle(0 .. 45).output("metal5_res_angle", "ACUTE : non 45 degree angle metal5_res")
+    
+    logger.info("Executing rule metal6_res_OFFGRID")
+    metal6_res.ongrid(0.005).output("metal6_res_OFFGRID", "OFFGRID : OFFGRID vertex on metal6_res")
+    metal6_res.with_angle(0 .. 45).output("metal6_res_angle", "ACUTE : non 45 degree angle metal6_res")
+    
+    logger.info("Executing rule border_OFFGRID")
+    border.ongrid(0.005).output("border_OFFGRID", "OFFGRID : OFFGRID vertex on border")
+    border.with_angle(0 .. 45).output("border_angle", "ACUTE : non 45 degree angle border")
+    
+end #OFFGRID-ANGLES
+    ################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/hres.drc b/tapeout/outputs/drc/hres.drc
new file mode 100644
index 0000000..07e146d
--- /dev/null
+++ b/tapeout/outputs/drc/hres.drc
@@ -0,0 +1,1194 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+if FEOL
+    #================================================
+    #----------------H POLY RESISTOR-----------------
+    #================================================
+
+    hres_poly = poly2.interacting(pplus).interacting(sab).interacting(res_mk).interacting(resistor)
+    hres1_poly = poly2.interacting(pplus).interacting(sab).interacting(res_mk)
+    # Rule HRES.1: Minimum space. Note : Merge if the spacing is less than 0.4 um. is 0.4µm
+    logger.info("Executing rule HRES.1")
+    hres1_l1  = resistor.interacting(hres1_poly).space(0.4.um, euclidian).polygons(0.001)
+    hres1_l1.output("HRES.1", "HRES.1 : Minimum space. Note : Merge if the spacing is less than 0.4 um. : 0.4µm")
+    hres1_l1.forget
+
+    # Rule HRES.2: Minimum width of Poly2 resistor. is 1µm
+    logger.info("Executing rule HRES.2")
+    hres2_l1  = hres_poly.width(1.um, euclidian).polygons(0.001)
+    hres2_l1.output("HRES.2", "HRES.2 : Minimum width of Poly2 resistor. : 1µm")
+    hres2_l1.forget
+
+    # Rule HRES.3: Minimum space between Poly2 resistors. is 0.4µm
+    logger.info("Executing rule HRES.3")
+    hres3_l1  = hres_poly.space(0.4.um, euclidian).polygons(0.001)
+    hres3_l1.output("HRES.3", "HRES.3 : Minimum space between Poly2 resistors. : 0.4µm")
+    hres3_l1.forget
+
+    # Rule HRES.4: Minimum RESISTOR overlap of Poly2 resistor. is 0.4µm
+    logger.info("Executing rule HRES.4")
+    hres4_l1 = resistor.enclosing(hres_poly, 0.4.um, euclidian).polygons(0.001)
+    hres4_l2 = hres_poly.not_outside(resistor).not(resistor)
+    hres4_l  = hres4_l1.or(hres4_l2)
+    hres4_l.output("HRES.4", "HRES.4 : Minimum RESISTOR overlap of Poly2 resistor. : 0.4µm")
+    hres4_l1.forget
+    hres4_l2.forget
+    hres4_l.forget
+
+    # Rule HRES.5: Minimum RESISTOR space to unrelated Poly2. is 0.3µm
+    logger.info("Executing rule HRES.5")
+    hres5_l1  = resistor.interacting(hres1_poly).separation(poly2.not_interacting(sab), 0.3.um, euclidian).polygons(0.001)
+    hres5_l1.output("HRES.5", "HRES.5 : Minimum RESISTOR space to unrelated Poly2. : 0.3µm")
+    hres5_l1.forget
+
+    # Rule HRES.6: Minimum RESISTOR space to COMP.
+    logger.info("Executing rule HRES.6")
+    hres6_l1 = resistor.interacting(hres1_poly).separation(comp, 0.3.um, euclidian).polygons(0.001).or(comp.not_outside(resistor.interacting(poly2.interacting(pplus).interacting(sab).interacting(res_mk))))
+    hres6_l1.output("HRES.6", "HRES.6 : Minimum RESISTOR space to COMP.")
+    hres6_l1.forget
+
+    hres1_poly.forget
+
+    # Rule HRES.7: Minimum Pplus overlap of contact on Poly2 resistor. is 0.2µm
+    logger.info("Executing rule HRES.7")
+    hres7_l1 = pplus.enclosing(contact.inside(hres_poly), 0.2.um, euclidian).polygons(0.001)
+    hres7_l2 = contact.inside(hres_poly).not_outside(pplus).not(pplus)
+    hres7_l  = hres7_l1.or(hres7_l2)
+    hres7_l.output("HRES.7", "HRES.7 : Minimum Pplus overlap of contact on Poly2 resistor. : 0.2µm")
+    hres7_l1.forget
+    hres7_l2.forget
+    hres7_l.forget
+
+    # Rule HRES.8: Space from salicide block to contact on Poly2 resistor.
+    logger.info("Executing rule HRES.8")
+    hres8_l1 = contact.inside(hres_poly).separation(sab,0.22.um).polygons(0.001).or(contact.inside(hres_poly).interacting(sab))
+    hres8_l1.output("HRES.8", "HRES.8 : Space from salicide block to contact on Poly2 resistor.")
+    hres8_l1.forget
+
+    hres9_sab             = sab.interacting(pplus).interacting(res_mk).interacting(resistor)
+    hres9_clear_sab       = hres9_sab.not(hres_poly)
+    hres9_bad_inside_edge = hres9_sab.edges.inside_part(hres_poly).extended(0,0,0.001,0.001).interacting(hres9_clear_sab, 1, 1)
+    hres9_sab_hole        = hres9_sab.holes.and(hres_poly)
+    # Rule HRES.9: Minimum salicide block overlap of Poly2 resistor in width direction.
+    logger.info("Executing rule HRES.9")
+    hres9_l1 = hres9_sab.enclosing(hres_poly, 0.28.um, euclidian).polygons(0.001).or(hres9_bad_inside_edge).or(hres9_sab_hole)
+    hres9_l1.output("HRES.9", "HRES.9 : Minimum salicide block overlap of Poly2 resistor in width direction.")
+    hres9_l1.forget
+
+    hres9_sab.forget
+
+    hres9_clear_sab.forget
+
+    hres9_bad_inside_edge.forget
+
+    hres9_sab_hole.forget
+
+    pplus1_hres10 = pplus.and(sab).drc(width != 0.1.um)
+    pplus2_hres10 = pplus.not_overlapping(sab).edges
+    # Rule HRES.10: Minimum & maximum Pplus overlap of SAB.
+    logger.info("Executing rule HRES.10")
+    hres10_l1 = pplus1_hres10.or(pplus2_hres10).extended(0, 0, 0.001, 0.001).interacting(hres_poly)
+    hres10_l1.output("HRES.10", "HRES.10 : Minimum & maximum Pplus overlap of SAB.")
+    hres10_l1.forget
+
+    pplus1_hres10.forget
+
+    pplus2_hres10.forget
+
+    # rule HRES.11 is not a DRC check
+
+    mk_hres12a = res_mk.edges.not(poly2.not(pplus).and(sab).edges).inside_part(poly2)
+    # Rule HRES.12a: P type Poly2 resistor (high sheet rho) shall be covered by RES_MK marking. RES_MK length shall be coincide with resistor length (Defined by Pplus space) and width covering the width of Poly2.
+    logger.info("Executing rule HRES.12a")
+    hres12a_l1 = res_mk.interacting(resistor).interacting(mk_hres12a)
+    hres12a_l1.output("HRES.12a", "HRES.12a : P type Poly2 resistor (high sheet rho) shall be covered by RES_MK marking. RES_MK length shall be coincide with resistor length (Defined by Pplus space) and width covering the width of Poly2. ")
+    hres12a_l1.forget
+
+    mk_hres12a.forget
+
+    hres12b = res_mk.with_area(15000.01.um,nil).in(res_mk.interacting(res_mk.edges.with_length(80.01.um,nil)))
+    # Rule HRES.12b: If the size of single RES_MK mark layer is greater than 15000 um2 and both side (X and Y) are greater than 80 um. Then the minimum spacing to adjacent RES_MK layer. is 20µm
+    logger.info("Executing rule HRES.12b")
+    hres12b_l1 = res_mk.interacting(hres_poly).drc(separation(hres12b) < 20.um).polygons(0.001)
+    hres12b_l1.output("HRES.12b", "HRES.12b : If the size of single RES_MK mark layer is greater than 15000 um2 and both side (X and Y) are greater than 80 um. Then the minimum spacing to adjacent RES_MK layer. : 20µm")
+    hres12b_l1.forget
+
+    hres12b.forget
+
+    hres_poly.forget
+end #FEOL
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/lres.drc b/tapeout/outputs/drc/lres.drc
new file mode 100644
index 0000000..5963c80
--- /dev/null
+++ b/tapeout/outputs/drc/lres.drc
@@ -0,0 +1,1155 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+if FEOL
+    #================================================
+    #----------------N+ POLY RESISTOR----------------
+    #================================================
+
+    lres_poly = poly2.and(nplus).interacting(sab).interacting(res_mk)
+    # Rule LRES.1: Minimum width of Poly2 resistor. is 0.8µm
+    logger.info("Executing rule LRES.1")
+    lres1_l1  = lres_poly.width(0.8.um, euclidian).polygons(0.001)
+    lres1_l1.output("LRES.1", "LRES.1 : Minimum width of Poly2 resistor. : 0.8µm")
+    lres1_l1.forget
+
+    # Rule LRES.2: Minimum space between Poly2 resistors. is 0.4µm
+    logger.info("Executing rule LRES.2")
+    lres2_l1  = lres_poly.isolated(0.4.um, euclidian).polygons(0.001)
+    lres2_l1.output("LRES.2", "LRES.2 : Minimum space between Poly2 resistors. : 0.4µm")
+    lres2_l1.forget
+
+    # Rule LRES.3: Minimum space from Poly2 resistor to COMP.
+    logger.info("Executing rule LRES.3")
+    lres3_l1 = lres_poly.separation(comp, 0.6.um, euclidian).polygons(0.001).or(comp.not_outside(lres_poly))
+    lres3_l1.output("LRES.3", "LRES.3 : Minimum space from Poly2 resistor to COMP.")
+    lres3_l1.forget
+
+    # Rule LRES.4: Minimum space from Poly2 resistor to unrelated Poly2. is 0.6µm
+    logger.info("Executing rule LRES.4")
+    lres4_l1  = lres_poly.separation(poly2.not_interacting(sab), 0.6.um, euclidian).polygons(0.001)
+    lres4_l1.output("LRES.4", "LRES.4 : Minimum space from Poly2 resistor to unrelated Poly2. : 0.6µm")
+    lres4_l1.forget
+
+    # Rule LRES.5: Minimum Nplus implant overlap of Poly2 resistor. is 0.3µm
+    logger.info("Executing rule LRES.5")
+    lres5_l1 = nplus.enclosing(poly2.and(nplus).interacting(sab).interacting(res_mk), 0.3.um, euclidian).polygons(0.001)
+    lres5_l2 = poly2.and(nplus).interacting(sab).interacting(res_mk).not_outside(nplus).not(nplus)
+    lres5_l  = lres5_l1.or(lres5_l2)
+    lres5_l.output("LRES.5", "LRES.5 : Minimum Nplus implant overlap of Poly2 resistor. : 0.3µm")
+    lres5_l1.forget
+    lres5_l2.forget
+    lres5_l.forget
+
+    # Rule LRES.6: Minimum salicide block overlap of Poly2 resistor in width direction. is 0.28µm
+    logger.info("Executing rule LRES.6")
+    lres6_l1 = sab.enclosing(lres_poly,0.28.um).polygons(0.001)
+    lres6_l1.output("LRES.6", "LRES.6 : Minimum salicide block overlap of Poly2 resistor in width direction. : 0.28µm")
+    lres6_l1.forget
+
+    cont_lres7 = contact.inside(poly2.and(nplus).interacting(sab).interacting(res_mk))
+    # Rule LRES.7: Space from salicide block to contact on Poly2 resistor.
+    logger.info("Executing rule LRES.7")
+    lres7_l1 = cont_lres7.separation(sab,0.22.um).polygons(0.001).or(cont_lres7.interacting(sab))
+    lres7_l1.output("LRES.7", "LRES.7 : Space from salicide block to contact on Poly2 resistor.")
+    lres7_l1.forget
+
+    cont_lres7.forget
+
+    # rule LRES.8 is not a DRC check
+
+    mk_lres9 = res_mk.edges.not(poly2.and(nplus).and(sab).edges).inside_part(poly2)
+    # Rule LRES.9a: Nplus Poly2 resistor shall be covered by RES_MK marking. RES_MK length shall be coincide with resistor length (Defined by SAB length) and width covering the width of Poly2.
+    logger.info("Executing rule LRES.9a")
+    lres9a_l1 = res_mk.interacting(lres_poly).interacting(mk_lres9)
+    lres9a_l1.output("LRES.9a", "LRES.9a : Nplus Poly2 resistor shall be covered by RES_MK marking. RES_MK length shall be coincide with resistor length (Defined by SAB length) and width covering the width of Poly2. ")
+    lres9a_l1.forget
+
+    mk_lres9.forget
+
+    lres9b = res_mk.with_area(15000.01.um,nil).in(res_mk.interacting(res_mk.edges.with_length(80.01.um,nil)))
+    # Rule LRES.9b: If the size of single RES_MK mark layer is greater than 15000um2 and both side (X and Y) are greater than 80um. then the minimum spacing to adjacent RES_MK layer. is 20µm
+    logger.info("Executing rule LRES.9b")
+    lres9b_l1 = res_mk.interacting(lres_poly).drc(separation(lres9b) < 20.um).polygons(0.001)
+    lres9b_l1.output("LRES.9b", "LRES.9b : If the size of single RES_MK mark layer is greater than 15000um2 and both side (X and Y) are greater than 80um. then the minimum spacing to adjacent RES_MK layer. : 20µm")
+    lres9b_l1.forget
+
+    lres9b.forget
+
+    lres_poly.forget
+
+end #FEOL
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/lvpwell.drc b/tapeout/outputs/drc/lvpwell.drc
new file mode 100644
index 0000000..c8f78ca
--- /dev/null
+++ b/tapeout/outputs/drc/lvpwell.drc
@@ -0,0 +1,1187 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if FEOL
+    lvpwell_dn_56V = lvpwell_dn.interacting(dualgate)
+
+    #================================================
+    #--------------------LVPWELL---------------------
+    #================================================
+
+    # Rule LPW.1_3.3V: Min. LVPWELL Width. is 0.6µm
+    logger.info("Executing rule LPW.1_3.3V")
+    lpw1_l1  = lvpwell_dn.width(0.6.um, euclidian)
+    lpw1_l1.output("LPW.1_3.3V", "LPW.1_3.3V : Min. LVPWELL Width. : 0.6µm")
+    lpw1_l1.forget
+
+    # Rule LPW.1_5V: Min. LVPWELL Width. is 0.74µm
+    logger.info("Executing rule LPW.1_5V")
+    lpw1_l1  = lvpwell_dn_56V.width(0.74.um, euclidian)
+    lpw1_l1.output("LPW.1_5V", "LPW.1_5V : Min. LVPWELL Width. : 0.74µm")
+    lpw1_l1.forget
+
+    if CONNECTIVITY_RULES
+    logger.info("CONNECTIVITY_RULES section")
+
+    connected_lvpwell_3p3v, unconnected_lvpwell_3p3v = conn_space(lvpwell_dn, 0.86, 1.4, euclidian)
+
+    connected_lvpwell_5p0v, unconnected_lvpwell_5p0v = conn_space(lvpwell_dn, 0.86, 1.7, euclidian)
+
+    # Rule LPW.2a_3.3V: Min. LVPWELL to LVWELL Space (Inside DNWELL) [Different potential]. is 1.4µm
+    logger.info("Executing rule LPW.2a_3.3V")
+    lpw2a_l1  = unconnected_lvpwell_3p3v.not_interacting(v5_xtor).not_interacting(dualgate)
+    lpw2a_l1.output("LPW.2a_3.3V", "LPW.2a_3.3V : Min. LVPWELL to LVWELL Space (Inside DNWELL) [Different potential]. : 1.4µm")
+    lpw2a_l1.forget
+
+    # Rule LPW.2a_5V: Min. LVPWELL to LVPWELL Space (Inside DNWELL) [Different potential]. is 1.7µm
+    logger.info("Executing rule LPW.2a_5V")
+    lpw2a_l1  = unconnected_lvpwell_5p0v.overlapping(dualgate)
+    lpw2a_l1.output("LPW.2a_5V", "LPW.2a_5V : Min. LVPWELL to LVPWELL Space (Inside DNWELL) [Different potential]. : 1.7µm")
+    lpw2a_l1.forget
+
+    # Rule LPW.2b_3.3V: Min. LVPWELL to LVPWELL Space [Equi potential]. is 0.86µm
+    logger.info("Executing rule LPW.2b_3.3V")
+    lpw2b_l1  = connected_lvpwell_3p3v.not_interacting(v5_xtor).not_interacting(dualgate)
+    lpw2b_l1.output("LPW.2b_3.3V", "LPW.2b_3.3V : Min. LVPWELL to LVPWELL Space [Equi potential]. : 0.86µm")
+    lpw2b_l1.forget
+
+    # Rule LPW.2b_5V: Min. LVPWELL to LVPWELL Space [Equi potential]. is 0.86µm
+    logger.info("Executing rule LPW.2b_5V")
+    lpw2b_l1  = connected_lvpwell_5p0v.overlapping(dualgate)
+    lpw2b_l1.output("LPW.2b_5V", "LPW.2b_5V : Min. LVPWELL to LVPWELL Space [Equi potential]. : 0.86µm")
+    lpw2b_l1.forget
+
+    else
+    logger.info("CONNECTIVITY_RULES disabled section")
+
+    # Rule LPW.2a_3.3V_: Min. LVPWELL to LVWELL Space (Inside DNWELL) [Different potential]. is 1.4µm
+    logger.info("Executing rule LPW.2a_3.3V_")
+    lpw2a_l1  = lvpwell_dn.isolated(1.4.um, euclidian)
+    lpw2a_l1.output("LPW.2a_3.3V_", "LPW.2a_3.3V_ : Min. LVPWELL to LVWELL Space (Inside DNWELL) [Different potential]. : 1.4µm")
+    lpw2a_l1.forget
+
+    # Rule LPW.2a_5V_: Min. LVPWELL to LVPWELL Space (Inside DNWELL) [Different potential]. is 1.7µm
+    logger.info("Executing rule LPW.2a_5V_")
+    lpw2a_l1  = lvpwell_dn_56V.isolated(1.7.um, euclidian)
+    lpw2a_l1.output("LPW.2a_5V_", "LPW.2a_5V_ : Min. LVPWELL to LVPWELL Space (Inside DNWELL) [Different potential]. : 1.7µm")
+    lpw2a_l1.forget
+
+    end #CONNECTIVITY_RULES
+
+    # Rule LPW.3_3.3V: Min. DNWELL enclose LVPWELL. is 2.5µm
+    logger.info("Executing rule LPW.3_3.3V")
+    lpw3_l1 = dnwell.enclosing(lvpwell_dn, 2.5.um, euclidian).polygons(0.001)
+    lpw3_l2 = lvpwell_dn.not(dnwell)
+    lpw3_l = lpw3_l1.or(lpw3_l2)
+    lpw3_l.output("LPW.3", "LPW.3 : Min. DNWELL enclose LVPWELL. : 2.5µm")
+    lpw3_l1.forget
+    lpw3_l2.forget
+    lpw3_l.forget
+
+    # Rule LPW.4: If LVPWELL is used as resistor, it must be covered by RES_MK (for LVS
+    ## purpose). Width of the resistor determined by LVPWELL. Length by COMP-
+    ## to-COMP space. RES_MK length shall be coinciding with resistor length
+    ## (Touching COMP each side) and width covering the width of LVPWELL.
+    logger.info("Executing rule LPW.4")
+    res_lpw = lvpwell_dn.interacting(res_mk)
+    res_lpw_cont = lvpwell_dn.not(res_mk)
+
+    lpw4_l1 = res_lpw.not_interacting(pcomp)
+    lpw4_l2 = res_lpw.interacting(poly2)
+    lpw4_l3 = lvpwell_dn.interacting(res_lpw_cont, 2..2)
+    lpw4_l = lpw4_l1.or(lpw4_l2).or(lpw4_l3)
+    lpw4_l.output("LPW.4", "LPW.4 : If LVPWELL is used as resistor, it must be covered by RES_MK (for LVS
+    purpose). Width of the resistor determined by LVPWELL. Length by COMP-to-COMP space. RES_MK length shall be coinciding with resistor length
+    (Touching COMP each side) and width covering the width of LVPWELL.")
+
+    # Rule LPW.5: LVPWELL resistors must be enclosed by DNWELL.
+    logger.info("Executing rule LPW.5")
+    lpw5_l1 = lvpwell_dn.and(res_mk).not(dnwell)
+    lpw5_l1.output("LPW.5", "LPW.5_3.3V : LVPWELL resistors must be enclosed by DNWELL.")
+    lpw5_l1.forget
+
+    # Rule LPW.11: Min. (LVPWELL outside DNWELL) space to DNWELL. is 1.5µm
+    logger.info("Executing rule LPW.11")
+    lpw11_l1  = lvpwell_out.separation(dnwell, 1.5.um, euclidian)
+    lpw11_l1.output("LPW.11", "LPW.11 : Min. (LVPWELL outside DNWELL) space to DNWELL. : 1.5µm")
+    lpw11_l1.forget
+
+    # Rule LPW.12: LVPWELL cannot overlap with Nwell.
+    logger.info("Executing rule LPW.12")
+    lpw12_l1 = lvpwell_out.and(nwell)
+    lpw12_l1.output("LPW.12", "LPW.12 : LVPWELL cannot overlap with Nwell.")
+    lpw12_l1.forget
+end #FEOL
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/lvs_bjt.drc b/tapeout/outputs/drc/lvs_bjt.drc
new file mode 100644
index 0000000..d6c80b1
--- /dev/null
+++ b/tapeout/outputs/drc/lvs_bjt.drc
@@ -0,0 +1,1093 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if FEOL
+    #================================================
+    #--------------------LVS_BJT---------------------
+    #================================================
+
+    vnpn_e = ncomp.interacting(lvs_bjt).inside(dnwell)
+    vpnp_e = pcomp.inside(nwell).interacting(lvs_bjt)
+    # Rule LVS_BJT.1: Minimum LVS_BJT enclosure of NPN or PNP Emitter COMP layers
+    logger.info("Executing rule LVS_BJT.1")
+    lvs_l1 = vnpn_e.or(vpnp_e).not_inside(lvs_bjt)
+    lvs_l1.output("LVS_BJT.1", "LVS_BJT.1 : Minimum LVS_BJT enclosure of NPN or PNP Emitter COMP layers")
+    lvs_l1.forget
+
+    vnpn_e.forget
+
+    vpnp_e.forget
+end #FEOL
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/main.drc b/tapeout/outputs/drc/main.drc
new file mode 100644
index 0000000..f74a4c5
--- /dev/null
+++ b/tapeout/outputs/drc/main.drc
@@ -0,0 +1,2095 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/mcell.drc b/tapeout/outputs/drc/mcell.drc
new file mode 100644
index 0000000..0431ed5
--- /dev/null
+++ b/tapeout/outputs/drc/mcell.drc
@@ -0,0 +1,1106 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if FEOL
+    #================================================
+    #---------------------MCELL----------------------
+    #================================================
+
+    # Rule MC.1: min. mcell width is 0.4µm
+    logger.info("Executing rule MC.1")
+    mc1_l1  = mcell_feol_mk.width(0.4.um, euclidian).polygons(0.001)
+    mc1_l1.output("MC.1", "MC.1 : min. mcell width : 0.4µm")
+    mc1_l1.forget
+
+    # Rule MC.2: min. mcell spacing is 0.4µm
+    logger.info("Executing rule MC.2")
+    mc2_l1  = mcell_feol_mk.space(0.4.um, euclidian).polygons(0.001)
+    mc2_l1.output("MC.2", "MC.2 : min. mcell spacing : 0.4µm")
+    mc2_l1.forget
+
+    # Rule MC.3: Minimum Mcell area is 0.35µm²
+    logger.info("Executing rule MC.3")
+    mc3_l1  = mcell_feol_mk.with_area(nil, 0.35.um)
+    mc3_l1.output("MC.3", "MC.3 : Minimum Mcell area : 0.35µm²")
+    mc3_l1.forget
+
+    # Rule MC.4: Minimum area enclosed by Mcell is 0.35µm²
+    logger.info("Executing rule MC.4")
+    mc4_l1  = mcell_feol_mk.holes.with_area(nil, 0.35.um)
+    mc4_l1.output("MC.4", "MC.4 : Minimum area enclosed by Mcell : 0.35µm²")
+    mc4_l1.forget
+end #FEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/metal1.drc b/tapeout/outputs/drc/metal1.drc
new file mode 100644
index 0000000..8633646
--- /dev/null
+++ b/tapeout/outputs/drc/metal1.drc
@@ -0,0 +1,1105 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if BEOL
+    #================================================
+    #---------------------METAL1---------------------
+    #================================================
+
+    # Rule M1.1: min. metal1 width is 0.23µm
+    logger.info("Executing rule M1.1")
+    m11_l1  = metal1.not(sramcore).width(0.23.um, euclidian).polygons(0.001)
+    m11_l1.output("M1.1", "M1.1 : min. metal1 width : 0.23µm")
+    m11_l1.forget
+
+    # Rule M1.2a: min. metal1 spacing is 0.23µm
+    logger.info("Executing rule M1.2a")
+    m12a_l1  = metal1.space(0.23.um, euclidian).polygons(0.001)
+    m12a_l1.output("M1.2a", "M1.2a : min. metal1 spacing : 0.23µm")
+    m12a_l1.forget
+
+    # Rule M1.2b: Space to wide Metal1 (length & width > 10um) is 0.3µm
+    logger.info("Executing rule M1.2b")
+    m12b_l1  = metal1.separation(metal1.not_interacting(metal1.edges.with_length(nil, 10.um)), 0.3.um, euclidian).polygons(0.001)
+    m12b_l1.output("M1.2b", "M1.2b : Space to wide Metal1 (length & width > 10um) : 0.3µm")
+    m12b_l1.forget
+
+    # Rule M1.3: Minimum Metal1 area is 0.1444µm²
+    logger.info("Executing rule M1.3")
+    m13_l1  = metal1.with_area(nil, 0.1444.um)
+    m13_l1.output("M1.3", "M1.3 : Minimum Metal1 area : 0.1444µm²")
+    m13_l1.forget
+end #BEOL
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/metal2.drc b/tapeout/outputs/drc/metal2.drc
new file mode 100644
index 0000000..1ecbf6c
--- /dev/null
+++ b/tapeout/outputs/drc/metal2.drc
@@ -0,0 +1,1104 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if BEOL
+    #================================================
+    #---------------------METAL2---------------------
+    #================================================
+
+    # Rule M2.1: min. metal2 width is 0.28µm
+    logger.info("Executing rule M2.1")
+    m21_l1  = metal2.width(0.28.um, euclidian).polygons(0.001)
+    m21_l1.output("M2.1", "M2.1 : min. metal2 width : 0.28µm")
+    m21_l1.forget
+
+    # Rule M2.2a: min. metal2 spacing is 0.28µm
+    logger.info("Executing rule M2.2a")
+    m22a_l1  = metal2.space(0.28.um, euclidian).polygons(0.001)
+    m22a_l1.output("M2.2a", "M2.2a : min. metal2 spacing : 0.28µm")
+    m22a_l1.forget
+
+    # Rule M2.2b: Space to wide Metal2 (length & width > 10um) is 0.3µm
+    logger.info("Executing rule M2.2b")
+    m22b_l1  = metal2.separation(metal2.not_interacting(metal2.edges.with_length(nil, 10.um)), 0.3.um, euclidian).polygons(0.001)
+    m22b_l1.output("M2.2b", "M2.2b : Space to wide Metal2 (length & width > 10um) : 0.3µm")
+    m22b_l1.forget
+
+    # Rule M2.3: Minimum metal2 area is 0.1444µm²
+    logger.info("Executing rule M2.3")
+    m23_l1  = metal2.with_area(nil, 0.1444.um)
+    m23_l1.output("M2.3", "M2.3 : Minimum metal2 area : 0.1444µm²")
+    m23_l1.forget
+end # BEOL
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/metal3.drc b/tapeout/outputs/drc/metal3.drc
new file mode 100644
index 0000000..7635c48
--- /dev/null
+++ b/tapeout/outputs/drc/metal3.drc
@@ -0,0 +1,1106 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if BEOL
+    if METAL_LEVEL == "3LM" || METAL_LEVEL == "4LM" || METAL_LEVEL == "5LM" || METAL_LEVEL == "6LM"
+        #================================================
+        #---------------------METAL3---------------------
+        #================================================
+
+        # Rule M3.1: min. metal3 width is 0.28µm
+        logger.info("Executing rule M3.1")
+        m31_l1  = metal3.width(0.28.um, euclidian).polygons(0.001)
+        m31_l1.output("M3.1", "M3.1 : min. metal3 width : 0.28µm")
+        m31_l1.forget
+
+        # Rule M3.2a: min. metal3 spacing is 0.28µm
+        logger.info("Executing rule M3.2a")
+        m32a_l1  = metal3.space(0.28.um, euclidian).polygons(0.001)
+        m32a_l1.output("M3.2a", "M3.2a : min. metal3 spacing : 0.28µm")
+        m32a_l1.forget
+
+        # Rule M3.2b: Space to wide Metal3 (length & width > 10um) is 0.3µm
+        logger.info("Executing rule M3.2b")
+        m32b_l1  = metal3.separation(metal3.not_interacting(metal3.edges.with_length(nil, 10.um)), 0.3.um, euclidian).polygons(0.001)
+        m32b_l1.output("M3.2b", "M3.2b : Space to wide Metal3 (length & width > 10um) : 0.3µm")
+        m32b_l1.forget
+
+        # Rule M3.3: Minimum metal3 area is 0.1444µm²
+        logger.info("Executing rule M3.3")
+        m33_l1  = metal3.with_area(nil, 0.1444.um)
+        m33_l1.output("M3.3", "M3.3 : Minimum metal3 area : 0.1444µm²")
+        m33_l1.forget
+    end
+end # BEOL
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/metal4.drc b/tapeout/outputs/drc/metal4.drc
new file mode 100644
index 0000000..108ef6a
--- /dev/null
+++ b/tapeout/outputs/drc/metal4.drc
@@ -0,0 +1,1107 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if BEOL
+    if METAL_LEVEL == "4LM" || METAL_LEVEL == "5LM" || METAL_LEVEL == "6LM"
+        #================================================
+        #---------------------METAL4---------------------
+        #================================================
+
+        # Rule M4.1: min. metal4 width is 0.28µm
+        logger.info("Executing rule M4.1")
+        m41_l1  = metal4.width(0.28.um, euclidian).polygons(0.001)
+        m41_l1.output("M4.1", "M4.1 : min. metal4 width : 0.28µm")
+        m41_l1.forget
+
+        # Rule M4.2a: min. metal4 spacing is 0.28µm
+        logger.info("Executing rule M4.2a")
+        m42a_l1  = metal4.space(0.28.um, euclidian).polygons(0.001)
+        m42a_l1.output("M4.2a", "M4.2a : min. metal4 spacing : 0.28µm")
+        m42a_l1.forget
+
+        # Rule M4.2b: Space to wide Metal4 (length & width > 10um) is 0.3µm
+        logger.info("Executing rule M4.2b")
+        m42b_l1  = metal4.separation(metal4.not_interacting(metal4.edges.with_length(nil, 10.um)), 0.3.um, euclidian).polygons(0.001)
+        m42b_l1.output("M4.2b", "M4.2b : Space to wide Metal4 (length & width > 10um) : 0.3µm")
+        m42b_l1.forget
+
+        # Rule M4.3: Minimum metal4 area is 0.1444µm²
+        logger.info("Executing rule M4.3")
+        m43_l1  = metal4.with_area(nil, 0.1444.um)
+        m43_l1.output("M4.3", "M4.3 : Minimum metal4 area : 0.1444µm²")
+        m43_l1.forget
+    end
+end #BEOL
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/metal5.drc b/tapeout/outputs/drc/metal5.drc
new file mode 100644
index 0000000..ca46613
--- /dev/null
+++ b/tapeout/outputs/drc/metal5.drc
@@ -0,0 +1,1106 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if BEOL
+    if METAL_LEVEL == "5LM" || METAL_LEVEL == "6LM"
+        #================================================
+        #---------------------METAL5---------------------
+        #================================================
+
+        # Rule M5.1: min. metal5 width is 0.28µm
+        logger.info("Executing rule M5.1")
+        m51_l1  = metal5.width(0.28.um, euclidian).polygons(0.001)
+        m51_l1.output("M5.1", "M5.1 : min. metal5 width : 0.28µm")
+        m51_l1.forget
+
+        # Rule M5.2a: min. metal5 spacing is 0.28µm
+        logger.info("Executing rule M5.2a")
+        m52a_l1  = metal5.space(0.28.um, euclidian).polygons(0.001)
+        m52a_l1.output("M5.2a", "M5.2a : min. metal5 spacing : 0.28µm")
+        m52a_l1.forget
+
+        # Rule M5.2b: Space to wide Metal5 (length & width > 10um) is 0.3µm
+        logger.info("Executing rule M5.2b")
+        m52b_l1  = metal5.separation(metal5.not_interacting(metal5.edges.with_length(nil, 10.um)), 0.3.um, euclidian).polygons(0.001)
+        m52b_l1.output("M5.2b", "M5.2b : Space to wide Metal5 (length & width > 10um) : 0.3µm")
+        m52b_l1.forget
+
+        # Rule M5.3: Minimum metal5 area is 0.1444µm²
+        logger.info("Executing rule M5.3")
+        m53_l1  = metal5.with_area(nil, 0.1444.um)
+        m53_l1.output("M5.3", "M5.3 : Minimum metal5 area : 0.1444µm²")
+        m53_l1.forget
+    end
+end #BEOL
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/metaltop.drc b/tapeout/outputs/drc/metaltop.drc
new file mode 100644
index 0000000..efbe717
--- /dev/null
+++ b/tapeout/outputs/drc/metaltop.drc
@@ -0,0 +1,1204 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+#================================================
+#--------------------METALTOP--------------------
+#================================================
+if BEOL
+
+    if METAL_TOP == "6K"
+        logger.info("MetalTop thickness 6k section")
+        
+        # Rule MT.1: min. metaltop width is 0.36µm
+        logger.info("Executing rule MT.1")
+        mt1_l1  = top_metal.width(0.36.um, euclidian)
+        mt1_l1.output("MT.1", "MT.1 : min. metaltop width : 0.36µm")
+        mt1_l1.forget
+        
+        # Rule MT.2a: min. metaltop spacing is 0.38µm
+        logger.info("Executing rule MT.2a")
+        mt2a_l1  = top_metal.space(0.38.um, euclidian)
+        mt2a_l1.output("MT.2a", "MT.2a : min. metaltop spacing : 0.38µm")
+        mt2a_l1.forget
+        
+        # Rule MT.2b: Space to wide Metal2 (length & width > 10um) is 0.5µm
+        logger.info("Executing rule MT.2b")
+        wide_top_metal = top_metal.not_interacting(top_metal.edges.with_length(nil, 10.um))
+        mt2b_l1  = top_metal.separation(wide_top_metal, 0.5.um, euclidian)
+        mt2b_l1.output("MT.2b", "MT.2b : Space to wide Metal2 (length & width > 10um) : 0.5µm")
+        mt2b_l1.forget
+        wide_top_metal.forget
+        
+        # Rule MT.4: Minimum MetalTop area is 0.5625µm²
+        logger.info("Executing rule MT.4")
+        mt4_l1  = top_metal.with_area(nil, 0.5625.um)
+        mt4_l1.output("MT.4", "MT.4 : Minimum MetalTop area : 0.5625µm²")
+        mt4_l1.forget
+        
+    elsif METAL_TOP == "9K"
+        logger.info("MetalTop thickness 9k/11k section")
+        
+        # Rule MT.1: min. metaltop width is 0.44µm
+        logger.info("Executing rule MT.1")
+        mt1_l1  = top_metal.width(0.44.um, euclidian)
+        mt1_l1.output("MT.1", "MT.1 : min. metaltop width : 0.44µm")
+        mt1_l1.forget
+        
+        # Rule MT.2a: min. metaltop spacing is 0.46µm
+        logger.info("Executing rule MT.2a")
+        mt2a_l1  = top_metal.space(0.46.um, euclidian)
+        mt2a_l1.output("MT.2a", "MT.2a : min. metaltop spacing : 0.46µm")
+        mt2a_l1.forget
+        
+        # Rule MT.2b: Space to wide Metal2 (length & width > 10um) is 0.6µm
+        logger.info("Executing rule MT.2b")
+        wide_top_metal = top_metal.not_interacting(top_metal.edges.with_length(nil, 10.um))
+        mt2b_l1  = top_metal.separation(wide_top_metal, 0.6.um, euclidian)
+        mt2b_l1.output("MT.2b", "MT.2b : Space to wide Metal2 (length & width > 10um) : 0.6µm")
+        mt2b_l1.forget 
+        wide_top_metal.forget
+        
+        # Rule MT.4: Minimum MetalTop area is 0.5625µm²
+        logger.info("Executing rule MT.4")
+        mt4_l1  = top_metal.with_area(nil, 0.5625.um)
+        mt4_l1.output("MT.4", "MT.4 : Minimum MetalTop area : 0.5625µm²")
+        mt4_l1.forget
+        
+    elsif METAL_TOP == "30K"
+        logger.info("MetalTop thickness 30K section")
+        
+        # Rule MT30.1a: Min. thick MetalTop width. is 1.8µm
+        logger.info("Executing rule MT30.1a")
+        mt301a_l1  = top_metal.width(1.8.um, euclidian)
+        mt301a_l1.output("MT30.1a", "MT30.1a : Min. thick MetalTop width. : 1.8µm")
+        mt301a_l1.forget
+        
+        # Rule MT30.1b: Min width for >1000um long metal line (based on metal edge). is 2.2µm
+        logger.info("Executing rule MT30.1b")
+        long_edge = top_metal.edges.with_length(1000.um, nil)
+        mt301b_l1  = top_metal.interacting(long_edge).width(2.2.um, euclidian)
+        mt301b_l1.output("MT30.1b", "MT30.1b : Min width for >1000um long metal line (based on metal edge). : 2.2µm")
+        mt301b_l1.forget
+        long_edge.forget
+        
+        # Rule MT30.2: Min. thick MetalTop space. is 1.8µmtop_metal.not_interacting(metal2.edges.with_length(nil, 10.um)
+        logger.info("Executing rule MT30.2")
+        mt302_l1  = top_metal.space(1.8.um, euclidian)
+        mt302_l1.output("MT30.2", "MT30.2 : Min. thick MetalTop space. : 1.8µm")
+        mt302_l1.forget
+        
+        # Rule MT30.5: Minimum thick MetalTop enclose underlying via (for example: via5 for 6LM case) [Outside Not Allowed].
+        logger.info("Executing rule MT30.5")
+        mt305_l1 = top_metal.enclosing(top_via, 0.12.um, euclidian).polygons(0.001).or(top_via.not_inside(top_metal))
+        mt305_l1.output("MT30.5", "MT30.5 : Minimum thick MetalTop enclose underlying via (for example: via5 for 6LM case) [Outside Not Allowed].")
+        mt305_l1.forget
+        
+        # Rule MT30.6: Thick MetalTop end-of-line (width <2.5um) enclose underlying via (for example: via5 for 6LM case) [Outside Not Allowed].
+        logger.info("Executing rule MT30.6")
+
+        mt30p6_cond = top_metal.width(2.5.um)
+        mt30p6_eol = top_metal.edges.with_length(nil, 2.5.um).interacting(mt30p6_cond.first_edges).interacting(mt30p6_cond.second_edges).not(mt30p6_cond.first_edges).not(mt30p6_cond.second_edges)
+        mt306_l1 = mt30p6_eol.enclosing(top_via.edges,0.25.um, projection)
+        mt306_l1.output("MT30.6", "MT30.6 : Thick MetalTop end-of-line (width <2.5um) enclose underlying via (for example: via5 for 6LM case) [Outside Not Allowed].")
+        mt306_l1.forget
+        mt30p6_cond.forget
+        mt30p6_eol.forget
+        
+        # Rule MT30.8: There shall be minimum 2X2 array of vias (top vias) at one location connecting to 3um thick top metal.
+        logger.info("Executing rule MT30.8")
+        top_via_not_seal_ring = top_via.not(guard_ring_mk)
+        metal_top_intersections = top_metal.and(topmin1_metal).not(guard_ring_mk).interacting(top_via_not_seal_ring)
+        mt308_l1 = metal_top_intersections.interacting(top_via_not_seal_ring, 1, 3)
+        mt308_poss_l2 = metal_top_intersections.interacting(top_via_not_seal_ring, 4, nil)
+        mt308_poss_via = top_via_not_seal_ring.interacting(mt308_poss_l2)
+        mt308_poss_via_over_under = mt308_poss_via.sized(0.13, "square_limit").merged.sized(-0.13, "square_limit")
+        bad_via_array = mt308_poss_via_over_under.interacting(mt308_poss_via_over_under.edges.with_length(nil, 0.775))
+        mt308_l2 = mt308_poss_l2.interacting(bad_via_array)
+        mt308_output = mt301a_l1.or(mt308_l2)
+        mt308_output.output("MT30.8", "MT30.8 : There shall be minimum 2X2 array of vias (top vias) at one location connecting to 3um thick top metal.")
+        top_via_not_seal_ring.forget
+        metal_top_intersections.forget
+        mt308_l1.forget
+        mt308_poss_l2.forget
+        mt308_poss_via.forget
+        mt308_poss_via_over_under.forget
+        bad_via_array.forget
+        mt308_l2.forget
+        mt308_output.forget
+        
+    end #METAL_TOP
+end #BEOL
+    
+    ################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/mim.drc b/tapeout/outputs/drc/mim.drc
new file mode 100644
index 0000000..d24ac88
--- /dev/null
+++ b/tapeout/outputs/drc/mim.drc
@@ -0,0 +1,1298 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+#================================================
+#------------MIM CAPACITOR OPTION A -------------
+#================================================
+
+if MIM_OPTION == "A"
+    logger.info("MIM Capacitor Option A section")
+    
+    mim_virtual = fusetop.sized(1.06.um).and(metal2.interacting(fusetop))
+    # Rule MIM.1: Minimum MiM bottom plate spacing to the bottom plate metal (whether adjacent MiM or routing metal). is 1.2µm
+    logger.info("Executing rule MIM.1")
+    mim1_l1 = metal2.separation(mim_virtual ,transparent, 1.2.um).polygons(0.001)
+    mim1_l1.output("MIM.1", "MIM.1 : Minimum MiM bottom plate spacing to the bottom plate metal (whether adjacent MiM or routing metal). : 1.2µm")
+    mim1_l1.forget
+    
+    # Rule MIM.2: Minimum MiM bottom plate overlap of Via2 layer. [This is applicable for via2 within 1.06um oversize of FuseTop layer (referenced to virtual bottom plate)]. is 0.4µm
+    logger.info("Executing rule MIM.2")
+    mim2_l1 = metal2.enclosing(via2.overlapping(mim_virtual), 0.4.um, euclidian).polygons(0.001)
+    mim2_l2 = via2.overlapping(mim_virtual).not_outside(metal2).not(metal2)
+    mim2_l  = mim2_l1.or(mim2_l2)
+    mim2_l.output("MIM.2", "MIM.2 : Minimum MiM bottom plate overlap of Via2 layer. [This is applicable for via2 within 1.06um oversize of FuseTop layer (referenced to virtual bottom plate)]. : 0.4µm")
+    mim2_l1.forget
+    mim2_l2.forget
+    mim2_l.forget
+    
+    # Rule MIM.3: Minimum MiM bottom plate overlap of Top plate.
+    logger.info("Executing rule MIM.3")
+    mim3_l1 = mim_virtual.enclosing(fusetop,0.6.um).polygons(0.001).or(fusetop.not_inside(mim_virtual))
+    mim3_l1.output("MIM.3", "MIM.3 : Minimum MiM bottom plate overlap of Top plate.")
+    mim3_l1.forget
+    
+    mim_virtual.forget
+    
+    # Rule MIM.4: Minimum MiM top plate (FuseTop) overlap of Via2. is 0.4µm
+    logger.info("Executing rule MIM.4")
+    mim4_l1 = fusetop.enclosing(via2, 0.4.um, euclidian).polygons(0.001)
+    mim4_l2 = via2.not_outside(fusetop).not(fusetop)
+    mim4_l  = mim4_l1.or(mim4_l2)
+    mim4_l.output("MIM.4", "MIM.4 : Minimum MiM top plate (FuseTop) overlap of Via2. : 0.4µm")
+    mim4_l1.forget
+    mim4_l2.forget
+    mim4_l.forget
+    
+    # Rule MIM.5: Minimum spacing between top plate and the Via2 connecting to the bottom plate. is 0.4µm
+    logger.info("Executing rule MIM.5")
+    mim5_l1  = fusetop.separation(via2.interacting(metal2), 0.4.um, euclidian).polygons(0.001)
+    mim5_l1.output("MIM.5", "MIM.5 : Minimum spacing between top plate and the Via2 connecting to the bottom plate. : 0.4µm")
+    mim5_l1.forget
+    
+    # Rule MIM.6: Minimum spacing between unrelated top plates. is 0.6µm
+    logger.info("Executing rule MIM.6")
+    mim6_l1  = fusetop.space(0.6.um, euclidian).polygons(0.001)
+    mim6_l1.output("MIM.6", "MIM.6 : Minimum spacing between unrelated top plates. : 0.6µm")
+    mim6_l1.forget
+    
+    # Rule MIM.7: Min FuseTop enclosure by CAP_MK.
+    logger.info("Executing rule MIM.7")
+    mim7_l1 = fusetop.not_inside(cap_mk)
+    mim7_l1.output("MIM.7", "MIM.7 : Min FuseTop enclosure by CAP_MK.")
+    mim7_l1.forget
+    
+    # Rule MIM.8a: Minimum MIM cap area (defined by FuseTop area) (um2). is 25µm²
+    logger.info("Executing rule MIM.8a")
+    mim8a_l1  = fusetop.with_area(nil, 25.um)
+    mim8a_l1.output("MIM.8a", "MIM.8a : Minimum MIM cap area (defined by FuseTop area) (um2). : 25µm²")
+    mim8a_l1.forget
+    
+    # Rule MIM.8b: Maximum single MIM Cap area (Use multiple MIM caps in parallel connection if bigger capacitors are required) (um2). is 10000µm
+    logger.info("Executing rule MIM.8b")
+    mim8b_l1 = fusetop.with_area(10000.um,nil).not_in(fusetop.with_area(10000.um))
+    mim8b_l1.output("MIM.8b", "MIM.8b : Maximum single MIM Cap area (Use multiple MIM caps in parallel connection if bigger capacitors are required) (um2). : 10000µm")
+    mim8b_l1.forget
+    
+    # Rule MIM.9: Min. via spacing for sea of via on MIM top plate. is 0.5µm
+    logger.info("Executing rule MIM.9")
+    mim9_l1  = via2.inside(fusetop).space(0.5.um, euclidian).polygons(0.001)
+    mim9_l1.output("MIM.9", "MIM.9 : Min. via spacing for sea of via on MIM top plate. : 0.5µm")
+    mim9_l1.forget
+    
+    # Rule MIM.10: (a) There cannot be any Via1 touching MIM bottom plate Metal2. (b) MIM bottom plate Metal2 can only be connected through the higher Via (Via2).
+    logger.info("Executing rule MIM.10")
+    mim10_l1 = via1.interacting(metal2.interacting(fusetop))
+    mim10_l1.output("MIM.10", "MIM.10 : (a) There cannot be any Via1 touching MIM bottom plate Metal2. (b) MIM bottom plate Metal2 can only be connected through the higher Via (Via2).")
+    mim10_l1.forget
+    
+    mim11_large_metal2 = metal2.interacting(fusetop).with_area(10000, nil)
+    mim11_large_metal2_violation = polygon_layer
+    mim11_large_metal2.data.each do |p|
+      mim11_metal2_polygon_layer = polygon_layer
+      mim11_metal2_polygon_layer.data.insert(p)
+      fuse_in_polygon = fusetop.and(mim11_metal2_polygon_layer)
+      if(fuse_in_polygon.area > 10000)
+        mim11_bad_metal2_polygon = mim11_metal2_polygon_layer.interacting(fuse_in_polygon)
+        mim11_bad_metal2_polygon.data.each do |b|
+          b.num_points > 0 && mim11_large_metal2_violation.data.insert(b)
+        end
+      end
+    end
+    # Rule MIM.11: Bottom plate of multiple MIM caps can be shared (for common nodes) as long as total MIM area with that single common plate does not exceed MIM.8b rule. is -µm
+    logger.info("Executing rule MIM.11")
+    mim11_l1  = mim11_large_metal2_violation
+    mim11_l1.output("MIM.11", "MIM.11 : Bottom plate of multiple MIM caps can be shared (for common nodes) as long as total MIM area with that single common plate does not exceed MIM.8b rule. : -µm")
+    mim11_l1.forget
+    
+    mim11_large_metal2.forget
+    
+    mim11_large_metal2_violation.forget
+    
+    # rule MIM.12 is not a DRC check
+    
+    #================================================
+    #-------------MIM CAPACITOR OPTION B-------------
+    #================================================
+    
+elsif MIM_OPTION == "B"
+    logger.info("MIM Capacitor Option B section")
+    
+    mimtm_virtual = fusetop.sized(1.06.um).and(topmin1_metal.interacting(fusetop))
+    # Rule MIMTM.1: Minimum MiM bottom plate spacing to the bottom plate metal (whether adjacent MiM or routing metal). is 1.2µm
+    logger.info("Executing rule MIMTM.1")
+    mimtm1_l1 = topmin1_metal.separation(mimtm_virtual ,transparent, 1.2.um).polygons(0.001)
+    mimtm1_l1.output("MIMTM.1", "MIMTM.1 : Minimum MiM bottom plate spacing to the bottom plate metal (whether adjacent MiM or routing metal). : 1.2µm")
+    mimtm1_l1.forget
+    
+    # Rule MIMTM.2: Minimum MiM bottom plate overlap of Vian-1 layer. [This is applicable for Vian-1 within 1.06um oversize of FuseTop layer (referenced to virtual bottom plate)]. is 0.4µm
+    logger.info("Executing rule MIMTM.2")
+    mimtm2_l1 = topmin1_metal.enclosing(top_via.overlapping(mimtm_virtual), 0.4.um, euclidian).polygons(0.001)
+    mimtm2_l2 = top_via.overlapping(mimtm_virtual).not_outside(topmin1_metal).not(topmin1_metal)
+    mimtm2_l  = mimtm2_l1.or(mimtm2_l2)
+    mimtm2_l.output("MIMTM.2", "MIMTM.2 : Minimum MiM bottom plate overlap of Vian-1 layer. [This is applicable for Vian-1 within 1.06um oversize of FuseTop layer (referenced to virtual bottom plate)]. : 0.4µm")
+    mimtm2_l1.forget
+    mimtm2_l2.forget
+    mimtm2_l.forget
+    
+    # Rule MIMTM.3: Minimum MiM bottom plate overlap of Top plate.
+    logger.info("Executing rule MIMTM.3")
+    mimtm3_l1 = mimtm_virtual.enclosing(fusetop,0.6.um).polygons(0.001).or(fusetop.not_inside(mimtm_virtual))
+    mimtm3_l1.output("MIMTM.3", "MIMTM.3 : Minimum MiM bottom plate overlap of Top plate.")
+    mimtm3_l1.forget
+    
+    mimtm_virtual.forget
+    
+    # Rule MIMTM.4: Minimum MiM top plate (FuseTop) overlap of Vian-1. is 0.4µm
+    logger.info("Executing rule MIMTM.4")
+    mimtm4_l1 = fusetop.enclosing(top_via, 0.4.um, euclidian).polygons(0.001)
+    mimtm4_l2 = top_via.not_outside(fusetop).not(fusetop)
+    mimtm4_l  = mimtm4_l1.or(mimtm4_l2)
+    mimtm4_l.output("MIMTM.4", "MIMTM.4 : Minimum MiM top plate (FuseTop) overlap of Vian-1. : 0.4µm")
+    mimtm4_l1.forget
+    mimtm4_l2.forget
+    mimtm4_l.forget
+    
+    # Rule MIMTM.5: Minimum spacing between top plate and the Vian-1 connecting to the bottom plate. is 0.4µm
+    logger.info("Executing rule MIMTM.5")
+    mimtm5_l1  = fusetop.separation(top_via.interacting(topmin1_metal), 0.4.um, euclidian).polygons(0.001)
+    mimtm5_l1.output("MIMTM.5", "MIMTM.5 : Minimum spacing between top plate and the Vian-1 connecting to the bottom plate. : 0.4µm")
+    mimtm5_l1.forget
+    
+    # Rule MIMTM.6: Minimum spacing between unrelated top plates. is 0.6µm
+    logger.info("Executing rule MIMTM.6")
+    mimtm6_l1  = fusetop.space(0.6.um, euclidian).polygons(0.001)
+    mimtm6_l1.output("MIMTM.6", "MIMTM.6 : Minimum spacing between unrelated top plates. : 0.6µm")
+    mimtm6_l1.forget
+    
+    # Rule MIMTM.7: Min FuseTop enclosure by CAP_MK.
+    logger.info("Executing rule MIMTM.7")
+    mimtm7_l1 = fusetop.not_inside(cap_mk)
+    mimtm7_l1.output("MIMTM.7", "MIMTM.7 : Min FuseTop enclosure by CAP_MK.")
+    mimtm7_l1.forget
+    
+    # Rule MIMTM.8a: Minimum MIM cap area (defined by FuseTop area) (um2). is 25µm²
+    logger.info("Executing rule MIMTM.8a")
+    mimtm8a_l1  = fusetop.with_area(nil, 25.um)
+    mimtm8a_l1.output("MIMTM.8a", "MIMTM.8a : Minimum MIM cap area (defined by FuseTop area) (um2). : 25µm²")
+    mimtm8a_l1.forget
+    
+    # Rule MIMTM.8b: Maximum single MIM Cap area (Use multiple MIM caps in parallel connection if bigger capacitors are required) (um2). is 10000µm
+    logger.info("Executing rule MIMTM.8b")
+    mimtm8b_l1 = fusetop.with_area(10000.um,nil).not_in(fusetop.with_area(10000.um))
+    mimtm8b_l1.output("MIMTM.8b", "MIMTM.8b : Maximum single MIM Cap area (Use multiple MIM caps in parallel connection if bigger capacitors are required) (um2). : 10000µm")
+    mimtm8b_l1.forget
+    
+    # Rule MIMTM.9: Min. Via (Vian-1) spacing for sea of Via on MIM top plate. is 0.5µm
+    logger.info("Executing rule MIMTM.9")
+    mimtm9_l1  = top_via.inside(fusetop).space(0.5.um, euclidian).polygons(0.001)
+    mimtm9_l1.output("MIMTM.9", "MIMTM.9 : Min. Via (Vian-1) spacing for sea of Via on MIM top plate. : 0.5µm")
+    mimtm9_l1.forget
+    
+    # Rule MIMTM.10: (a) There cannot be any Vian-2 touching MIM bottom plate Metaln-1. (b) MIM bottom plate Metaln-1 can only be connected through the higher Via (Vian-1).
+    logger.info("Executing rule MIMTM.10")
+    mimtm10_l1 = topmin1_via.interacting(topmin1_metal.interacting(fusetop))
+    mimtm10_l1.output("MIMTM.10", "MIMTM.10 : (a) There cannot be any Vian-2 touching MIM bottom plate Metaln-1. (b) MIM bottom plate Metaln-1 can only be connected through the higher Via (Vian-1).")
+    mimtm10_l1.forget
+    
+    mimtm11_large_topmin1_metal = topmin1_metal.interacting(fusetop).with_area(10000, nil)
+    mimtm11_large_topmin1_metal_violation = polygon_layer
+    mimtm11_large_topmin1_metal.data.each do |p|
+      mimtm11_topmin1_metal_polygon_layer = polygon_layer
+      mimtm11_topmin1_metal_polygon_layer.data.insert(p)
+      fuse_in_polygon = fusetop.and(mimtm11_topmin1_metal_polygon_layer)
+      if(fuse_in_polygon.area > 10000)
+        mimtm11_bad_topmin1_metal_polygon = mimtm11_topmin1_metal_polygon_layer.interacting(fuse_in_polygon)
+        mimtm11_bad_topmin1_metal_polygon.data.each do |b|
+          b.num_points > 0 && mimtm11_large_topmin1_metal_violation.data.insert(b)
+        end
+      end
+    end
+    # Rule MIMTM.11: Bottom plate of multiple MIM caps can be shared (for common nodes) as long as total MIM area with that single common plate does not exceed MIMTM.8b rule. is -µm
+    logger.info("Executing rule MIMTM.11")
+    mimtm11_l1  = mimtm11_large_topmin1_metal_violation
+    mimtm11_l1.output("MIMTM.11", "MIMTM.11 : Bottom plate of multiple MIM caps can be shared (for common nodes) as long as total MIM area with that single common plate does not exceed MIMTM.8b rule. : -µm")
+    mimtm11_l1.forget
+    
+    mimtm11_large_topmin1_metal.forget
+    
+    mimtm11_large_topmin1_metal_violation.forget
+    
+    # rule MIMTM.12 is not a DRC check
+    
+else
+  logger.info("No MIM Capacitor Option Selected section")  
+end #MIM_OPTION
+
+    ################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/nat.drc b/tapeout/outputs/drc/nat.drc
new file mode 100644
index 0000000..57088a3
--- /dev/null
+++ b/tapeout/outputs/drc/nat.drc
@@ -0,0 +1,1167 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if FEOL
+    #================================================
+    #-----------------NATIVE VT NMOS-----------------
+    #================================================
+
+    # Rule NAT.1: Min. NAT Overlap of COMP of Native Vt NMOS. is 2µm
+    logger.info("Executing rule NAT.1")
+    nat1_l1 = nat.enclosing(ncomp.outside(nwell).interacting(nat), 2.um, euclidian).polygons(0.001)
+    nat1_l1.output("NAT.1", "NAT.1 : Min. NAT Overlap of COMP of Native Vt NMOS. : 2µm")
+    nat1_l1.forget
+
+    # Rule NAT.2: Space to unrelated COMP (outside NAT). is 0.3µm
+    logger.info("Executing rule NAT.2")
+    nat2_l1  = nat.separation(comp.outside(nat), 0.3.um, euclidian).polygons(0.001)
+    nat2_l1.output("NAT.2", "NAT.2 : Space to unrelated COMP (outside NAT). : 0.3µm")
+    nat2_l1.forget
+
+    # Rule NAT.3: Space to NWell edge. is 0.5µm
+    logger.info("Executing rule NAT.3")
+    nat3_l1  = nat.separation(nwell, 0.5.um, euclidian).polygons(0.001)
+    nat3_l1.output("NAT.3", "NAT.3 : Space to NWell edge. : 0.5µm")
+    nat3_l1.forget
+
+    # Rule NAT.4: Minimum channel length for 3.3V Native Vt NMOS (For smaller L Ioff will be higher than Spec). is 1.8µm
+    logger.info("Executing rule NAT.4")
+    nat4_l1  = poly2.edges.and(ngate.edges).not(nwell).interacting(nat).width(1.8.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    nat4_l1.output("NAT.4", "NAT.4 : Minimum channel length for 3.3V Native Vt NMOS (For smaller L Ioff will be higher than Spec). : 1.8µm")
+    nat4_l1.forget
+
+    # Rule NAT.5: Minimum channel length for 6.0V Native Vt NMOS (For smaller L Ioff will be higher than Spec). is 1.8µm
+    logger.info("Executing rule NAT.5")
+    nat5_l1  = poly2.edges.and(ngate.edges).not(nwell).interacting(nat).width(1.8.um, euclidian).polygons(0.001).overlapping(dualgate)
+    nat5_l1.output("NAT.5", "NAT.5 : Minimum channel length for 6.0V Native Vt NMOS (For smaller L Ioff will be higher than Spec). : 1.8µm")
+    nat5_l1.forget
+
+    if CONNECTIVITY_RULES
+    logger.info("CONNECTIVITY_RULES section")
+
+    connected_nat, unconnected_nat = conn_space(natcompsd, 10, 10, transparent)
+
+    # Rule NAT.6: Two or more COMPs if connected to different potential are not allowed under same NAT layer.
+    logger.info("Executing rule NAT.6")
+    nat6_l1 = comp.and(nat).interacting(unconnected_nat.inside(nat.covering(comp, 2)).not(poly2))
+    nat6_l1.output("NAT.6", "NAT.6 : Two or more COMPs if connected to different potential are not allowed under same NAT layer.")
+    nat6_l1.forget
+
+    end #CONNECTIVITY_RULES
+
+    natcompsd.forget
+
+    # Rule NAT.7: Minimum NAT to NAT spacing. is 0.74µm
+    logger.info("Executing rule NAT.7")
+    nat7_l1  = nat.space(0.74.um, euclidian).polygons(0.001)
+    nat7_l1.output("NAT.7", "NAT.7 : Minimum NAT to NAT spacing. : 0.74µm")
+    nat7_l1.forget
+
+    # Rule NAT.8: Min. Dualgate overlap of NAT (for 5V/6V) native VT NMOS only.
+    logger.info("Executing rule NAT.8")
+    nat8_l1 = nat.not_outside(dualgate).not(dualgate)
+    nat8_l1.output("NAT.8", "NAT.8 : Min. Dualgate overlap of NAT (for 5V/6V) native VT NMOS only.")
+    nat8_l1.forget
+
+    nat9_1 = poly2.and(nat).not(ncomp).interacting(ngate.and(nat) , 2)
+    nat9_2 = poly2.not(nat).separation(nat, 0.3.um, euclidian).polygons(0.001)
+    # Rule NAT.9: Poly interconnect under NAT layer is not allowed, minimum spacing of un-related poly from the NAT layer.
+    logger.info("Executing rule NAT.9")
+    nat9_l1 = nat9_1.or(nat9_2)
+    nat9_l1.output("NAT.9", "NAT.9 : Poly interconnect under NAT layer is not allowed, minimum spacing of un-related poly from the NAT layer.")
+    nat9_l1.forget
+
+    nat9_1.forget
+
+    nat9_2.forget
+
+    # Rule NAT.10: Nwell, inside NAT layer are not allowed.
+    logger.info("Executing rule NAT.10")
+    nat10_l1 = nwell.inside(nat)
+    nat10_l1.output("NAT.10", "NAT.10 : Nwell, inside NAT layer are not allowed.")
+    nat10_l1.forget
+
+    # Rule NAT.11: NCOMP not intersecting to Poly2, is not allowed inside NAT layer.
+    logger.info("Executing rule NAT.11")
+    nat11_l1 = ncomp.and(nat).outside(poly2)
+    nat11_l1.output("NAT.11", "NAT.11 : NCOMP not intersecting to Poly2, is not allowed inside NAT layer.")
+    nat11_l1.forget
+
+    # Rule NAT.12: Poly2 not intersecting with COMP is not allowed inside NAT (Poly2 resistor is not allowed inside NAT).
+    logger.info("Executing rule NAT.12")
+    nat12_l1 = poly2.interacting(nat).not_interacting(comp.and(nat))
+    nat12_l1.output("NAT.12", "NAT.12 : Poly2 not intersecting with COMP is not allowed inside NAT (Poly2 resistor is not allowed inside NAT).")
+    nat12_l1.forget
+end #FEOL
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/nplus.drc b/tapeout/outputs/drc/nplus.drc
new file mode 100644
index 0000000..720bb46
--- /dev/null
+++ b/tapeout/outputs/drc/nplus.drc
@@ -0,0 +1,1295 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if FEOL
+    #================================================
+    #---------------------NPLUS----------------------
+    #================================================
+
+    # Rule NP.1: min. nplus width is 0.4µm
+    logger.info("Executing rule NP.1")
+    np1_l1  = nplus.width(0.4.um, euclidian).polygons(0.001)
+    np1_l1.output("NP.1", "NP.1 : min. nplus width : 0.4µm")
+    np1_l1.forget
+
+    # Rule NP.2: min. nplus spacing is 0.4µm
+    logger.info("Executing rule NP.2")
+    np2_l1  = nplus.space(0.4.um, euclidian).polygons(0.001)
+    np2_l1.output("NP.2", "NP.2 : min. nplus spacing : 0.4µm")
+    np2_l1.forget
+
+    # Rule NP.3a: Space to PCOMP for PCOMP: (1) Inside Nwell (2) Outside LVPWELL but inside DNWELL. is 0.16µm
+    logger.info("Executing rule NP.3a")
+    np3a_l1  = nplus.separation((pcomp.inside(nwell)).or(pcomp.outside(lvpwell).inside(dnwell)), 0.16.um, euclidian).polygons(0.001)
+    np3a_l1.output("NP.3a", "NP.3a : Space to PCOMP for PCOMP: (1) Inside Nwell (2) Outside LVPWELL but inside DNWELL. : 0.16µm")
+    np3a_l1.forget
+
+    np_3bi_extend = lvpwell.inside(dnwell).sized(-0.429.um)
+    np_3bi = pcomp.edges.and(lvpwell.inside(dnwell).not(np_3bi_extend))
+    # Rule NP.3bi: Space to PCOMP: For Inside DNWELL, inside LVPWELL:(i) For PCOMP overlap by LVPWELL < 0.43um. is 0.16µm
+    logger.info("Executing rule NP.3bi")
+    np3bi_l1  = nplus.not_outside(lvpwell).inside(dnwell).edges.separation(np_3bi, 0.16.um, euclidian).polygons(0.001)
+    np3bi_l1.output("NP.3bi", "NP.3bi : Space to PCOMP: For Inside DNWELL, inside LVPWELL:(i) For PCOMP overlap by LVPWELL < 0.43um. : 0.16µm")
+    np3bi_l1.forget
+
+    np_3bi_extend.forget
+
+    np_3bi.forget
+
+    np_3bii_extend = lvpwell.inside(dnwell).sized(-0.429.um)
+    np_3bii = pcomp.edges.and(np_3bii_extend)
+    # Rule NP.3bii: Space to PCOMP: For Inside DNWELL, inside LVPWELL:(ii) For PCOMP overlap by LVPWELL >= 0.43um. is 0.08µm
+    logger.info("Executing rule NP.3bii")
+    np3bii_l1  = nplus.not_outside(lvpwell).inside(dnwell).edges.separation(np_3bii, 0.08.um, euclidian).polygons(0.001)
+    np3bii_l1.output("NP.3bii", "NP.3bii : Space to PCOMP: For Inside DNWELL, inside LVPWELL:(ii) For PCOMP overlap by LVPWELL >= 0.43um. : 0.08µm")
+    np3bii_l1.forget
+
+    np_3bii_extend.forget
+
+    np_3bii.forget
+
+    np_3ci = pcomp.edges.and(nwell.outside(dnwell).sized(0.429.um))
+    # Rule NP.3ci: Space to PCOMP: For Outside DNWELL:(i) For PCOMP space to Nwell < 0.43um. is 0.16µm
+    logger.info("Executing rule NP.3ci")
+    np3ci_l1 = nplus.outside(dnwell).edges.separation(np_3ci, 0.16.um, euclidian).polygons
+    np3ci_l1.output("NP.3ci", "NP.3ci : Space to PCOMP: For Outside DNWELL:(i) For PCOMP space to Nwell < 0.43um. : 0.16µm")
+    np3ci_l1.forget
+
+    np_3ci.forget
+
+    np_3cii = pcomp.edges.not(nwell.outside(dnwell).sized(0.429.um))
+    # Rule NP.3cii: Space to PCOMP: For Outside DNWELL:(ii) For PCOMP space to Nwell >= 0.43um. is 0.08µm
+    logger.info("Executing rule NP.3cii")
+    np3cii_l1 = nplus.outside(dnwell).edges.separation(np_3cii, 0.08.um, euclidian).polygons
+    np3cii_l1.output("NP.3cii", "NP.3cii : Space to PCOMP: For Outside DNWELL:(ii) For PCOMP space to Nwell >= 0.43um. : 0.08µm")
+    np3cii_l1.forget
+
+    np_3cii.forget
+
+    # Rule NP.3d: Min/max space to a butted PCOMP.
+    logger.info("Executing rule NP.3d")
+    np3d_l1 = nplus.not_outside(pcomp)
+    np3d_l1.output("NP.3d", "NP.3d : Min/max space to a butted PCOMP.")
+    np3d_l1.forget
+
+    # Rule NP.3e: Space to related PCOMP edge adjacent to a butting edge.
+    logger.info("Executing rule NP.3e")
+    np3e_l1 = nplus.not_outside(pcomp)
+    np3e_l1.output("NP.3e", "NP.3e : Space to related PCOMP edge adjacent to a butting edge.")
+    np3e_l1.forget
+
+    # Rule NP.4a: Space to related P-channel gate at a butting edge parallel to gate. is 0.32µm
+    logger.info("Executing rule NP.4a")
+    np4a_l1 = nplus.edges.and(pcomp.edges).separation(pgate.edges, 0.32.um, projection).polygons(0.001)
+    np4a_l1.output("NP.4a", "NP.4a : Space to related P-channel gate at a butting edge parallel to gate. : 0.32µm")
+    np4a_l1.forget
+
+    np_4b_poly = poly2.edges.interacting(pgate.edges.not(pcomp.edges)).centers(0, 0.99).and(pgate.sized(0.32.um))
+    # Rule NP.4b: Within 0.32um of channel, space to P-channel gate extension perpendicular to the direction of Poly2.
+    logger.info("Executing rule NP.4b")
+    np4b_l1 = nplus.interacting(nplus.edges.separation(np_4b_poly, 0.22.um, projection).polygons(0.001))
+    np4b_l1.output("NP.4b", "NP.4b : Within 0.32um of channel, space to P-channel gate extension perpendicular to the direction of Poly2.")
+    np4b_l1.forget
+
+    np_4b_poly.forget
+
+    # Rule NP.5a: Overlap of N-channel gate. is 0.23µm
+    logger.info("Executing rule NP.5a")
+    np5a_l1 = nplus.enclosing(ngate, 0.23.um, euclidian).polygons(0.001)
+    np5a_l2 = ngate.not_outside(nplus).not(nplus)
+    np5a_l  = np5a_l1.or(np5a_l2)
+    np5a_l.output("NP.5a", "NP.5a : Overlap of N-channel gate. : 0.23µm")
+    np5a_l1.forget
+    np5a_l2.forget
+    np5a_l.forget
+
+    # Rule NP.5b: Extension beyond COMP for the COMP (1) inside LVPWELL (2) outside Nwell and DNWELL. is 0.16µm
+    logger.info("Executing rule NP.5b")
+    np5b_l1 = nplus.not_outside(lvpwell).or(nplus.outside(nwell).outside(dnwell)).edges.not(pplus).enclosing(comp.edges, 0.16.um, euclidian).polygons(0.001)
+    np5b_l1.output("NP.5b", "NP.5b : Extension beyond COMP for the COMP (1) inside LVPWELL (2) outside Nwell and DNWELL. : 0.16µm")
+    np5b_l1.forget
+
+    np_5ci_background = nplus.not_inside(lvpwell).inside(dnwell).edges
+    np_5ci_foreground = ncomp.not_inside(lvpwell).inside(dnwell).edges.not(pplus.edges).and(lvpwell.inside(dnwell).sized(0.429.um))
+    # Rule NP.5ci: Extension beyond COMP: For Inside DNWELL: (i)For Nplus < 0.43um from LVPWELL edge for Nwell or DNWELL tap inside DNWELL. is 0.16µm
+    logger.info("Executing rule NP.5ci")
+    np5ci_l1 = np_5ci_background.enclosing(np_5ci_foreground, 0.16.um, projection).polygons(0.001)
+    np5ci_l1.output("NP.5ci", "NP.5ci : Extension beyond COMP: For Inside DNWELL: (i)For Nplus < 0.43um from LVPWELL edge for Nwell or DNWELL tap inside DNWELL. : 0.16µm")
+    np5ci_l1.forget
+
+    np_5ci_background.forget
+
+    np_5ci_foreground.forget
+
+    np_5cii_background = nplus.not_inside(lvpwell).inside(dnwell).edges
+    np_5cii_foreground = ncomp.not_inside(lvpwell).inside(dnwell).edges.not(pplus.edges).not(lvpwell.inside(dnwell).sized(0.429.um))
+    # Rule NP.5cii: Extension beyond COMP: For Inside DNWELL: (ii) For Nplus >= 0.43um from LVPWELL edge for Nwell or DNWELL tap inside DNWELL. is 0.02µm
+    logger.info("Executing rule NP.5cii")
+    np5cii_l1 = np_5cii_background.enclosing(np_5cii_foreground, 0.02.um, projection).polygons(0.001)
+    np5cii_l1.output("NP.5cii", "NP.5cii : Extension beyond COMP: For Inside DNWELL: (ii) For Nplus >= 0.43um from LVPWELL edge for Nwell or DNWELL tap inside DNWELL. : 0.02µm")
+    np5cii_l1.forget
+
+    np_5cii_background.forget
+
+    np_5cii_foreground.forget
+
+    np_5di_background = nplus.not_outside(nwell).outside(dnwell).edges
+    np_5di_extend     = nwell.outside(dnwell).not(nwell.outside(dnwell).sized(-0.429.um))
+    np_5di_foreground = ncomp.not_outside(nwell).outside(dnwell).edges.not(pplus.edges).and(np_5di_extend)
+    # Rule NP.5di: Extension beyond COMP: For Outside DNWELL, inside Nwell: (i) For Nwell overlap of Nplus < 0.43um. is 0.16µm
+    logger.info("Executing rule NP.5di")
+    np5di_l1 = np_5di_background.enclosing(np_5di_foreground, 0.16.um, projection).polygons(0.001)
+    np5di_l1.output("NP.5di", "NP.5di : Extension beyond COMP: For Outside DNWELL, inside Nwell: (i) For Nwell overlap of Nplus < 0.43um. : 0.16µm")
+    np5di_l1.forget
+
+    np_5di_background.forget
+
+    np_5di_extend.forget
+
+    np_5di_foreground.forget
+
+    np_5dii_background = nplus.not_outside(nwell).outside(dnwell).edges.not(pplus.edges)
+    np_5dii_extend     = nwell.outside(dnwell).sized(-0.429.um)
+    np_5dii_foreground = ncomp.not_outside(nwell).outside(dnwell).edges.not(pplus.edges).and(np_5dii_extend)
+    # Rule NP.5dii: Extension beyond COMP: For Outside DNWELL, inside Nwell: (ii) For Nwell overlap of Nplus >= 0.43um. is 0.02µm
+    logger.info("Executing rule NP.5dii")
+    np5dii_l1 = np_5dii_background.enclosing(np_5dii_foreground, 0.02.um, euclidian).polygons(0.001)
+    np5dii_l1.output("NP.5dii", "NP.5dii : Extension beyond COMP: For Outside DNWELL, inside Nwell: (ii) For Nwell overlap of Nplus >= 0.43um. : 0.02µm")
+    np5dii_l1.forget
+
+    np_5dii_background.forget
+
+    np_5dii_extend.forget
+
+    np_5dii_foreground.forget
+
+    # Rule NP.6: Overlap with NCOMP butted to PCOMP. is 0.22µm
+    logger.info("Executing rule NP.6")
+    np6_l1 = comp.interacting(nplus).enclosing(pcomp.interacting(nplus), 0.22.um, projection).polygons
+    np6_l1.output("NP.6", "NP.6 : Overlap with NCOMP butted to PCOMP. : 0.22µm")
+    np6_l1.forget
+
+    # Rule NP.7: Space to unrelated unsalicided Poly2. is 0.18µm
+    logger.info("Executing rule NP.7")
+    np7_l1  = nplus.separation(poly2.and(sab), 0.18.um, euclidian).polygons(0.001)
+    np7_l1.output("NP.7", "NP.7 : Space to unrelated unsalicided Poly2. : 0.18µm")
+    np7_l1.forget
+
+    # Rule NP.8a: Minimum Nplus area (um2). is 0.35µm²
+    logger.info("Executing rule NP.8a")
+    np8a_l1  = nplus.with_area(nil, 0.35.um)
+    np8a_l1.output("NP.8a", "NP.8a : Minimum Nplus area (um2). : 0.35µm²")
+    np8a_l1.forget
+
+    # Rule NP.8b: Minimum area enclosed by Nplus (um2). is 0.35µm²
+    logger.info("Executing rule NP.8b")
+    np8b_l1  = nplus.holes.with_area(nil, 0.35.um)
+    np8b_l1.output("NP.8b", "NP.8b : Minimum area enclosed by Nplus (um2). : 0.35µm²")
+    np8b_l1.forget
+
+    # Rule NP.9: Overlap of unsalicided Poly2. is 0.18µm
+    logger.info("Executing rule NP.9")
+    np9_l1 = nplus.enclosing(poly2.and(sab), 0.18.um, euclidian).polygons(0.001)
+    np9_l2 = poly2.and(sab).not_outside(nplus).not(nplus)
+    np9_l  = np9_l1.or(np9_l2)
+    np9_l.output("NP.9", "NP.9 : Overlap of unsalicided Poly2. : 0.18µm")
+    np9_l1.forget
+    np9_l2.forget
+    np9_l.forget
+
+    # Rule NP.10: Overlap of unsalicided COMP. is 0.18µm
+    logger.info("Executing rule NP.10")
+    np10_l1 = nplus.enclosing(comp.and(sab), 0.18.um, euclidian).polygons(0.001)
+    np10_l1.output("NP.10", "NP.10 : Overlap of unsalicided COMP. : 0.18µm")
+    np10_l1.forget
+
+    np_11_in_dnwell = nplus.interacting(nplus.edges.and(pcomp.edges).and(lvpwell.inside(dnwell).not(lvpwell.inside(dnwell).sized(-0.429.um))))
+    np_11_out_dnwell = nplus.interacting(nplus.edges.and(pcomp.edges).and(nwell.outside(dnwell).sized(0.429.um)))
+    # Rule NP.11: Butting Nplus and PCOMP is forbidden within 0.43um of Nwell edge (for outside DNWELL) and of LVPWELL edge (for inside DNWELL case).
+    logger.info("Executing rule NP.11")
+    np11_l1 = np_11_in_dnwell.or(np_11_out_dnwell)
+    np11_l1.output("NP.11", "NP.11 : Butting Nplus and PCOMP is forbidden within 0.43um of Nwell edge (for outside DNWELL) and of LVPWELL edge (for inside DNWELL case).")
+    np11_l1.forget
+
+    np_11_in_dnwell.forget
+
+    np_11_out_dnwell.forget
+
+    # Rule NP.12: Overlap with P-channel poly2 gate extension is forbidden within 0.32um of P-channel gate.
+    logger.info("Executing rule NP.12")
+    np12_l1 = nplus.interacting(nplus.edges.separation(pgate.edges.and(pcomp.edges), 0.32.um, euclidian).polygons(0.001))
+    np12_l1.output("NP.12", "NP.12 : Overlap with P-channel poly2 gate extension is forbidden within 0.32um of P-channel gate.")
+    np12_l1.forget
+end #FEOL
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/otp_mk.drc b/tapeout/outputs/drc/otp_mk.drc
new file mode 100644
index 0000000..5335145
--- /dev/null
+++ b/tapeout/outputs/drc/otp_mk.drc
@@ -0,0 +1,1190 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if FEOL
+    #================================================
+    #---------------------OTP_MK---------------------
+    #================================================
+
+    # Rule O.DF.3a: Min. COMP Space. P-substrate tap (PCOMP outside NWELL) can be butted for different voltage devices as the potential is same. is 0.24µm
+    logger.info("Executing rule O.DF.3a")
+    odf3a_l1  = comp.and(otp_mk).space(0.24.um, euclidian).polygons(0.001)
+    odf3a_l1.output("O.DF.3a", "O.DF.3a : Min. COMP Space. P-substrate tap (PCOMP outside NWELL) can be butted for different voltage devices as the potential is same. : 0.24µm")
+    odf3a_l1.forget
+
+    # Rule O.DF.6: Min. COMP extend beyond poly2 (it also means source/drain overhang). is 0.22µm
+    logger.info("Executing rule O.DF.6")
+    odf6_l1 = comp.and(otp_mk).enclosing(poly2.and(otp_mk), 0.22.um, euclidian).polygons(0.001)
+    odf6_l1.output("O.DF.6", "O.DF.6 : Min. COMP extend beyond poly2 (it also means source/drain overhang). : 0.22µm")
+    odf6_l1.forget
+
+    # Rule O.DF.9: Min. COMP area (um2). is 0.1444µm²
+    logger.info("Executing rule O.DF.9")
+    odf9_l1  = comp.and(otp_mk).with_area(nil, 0.1444.um)
+    odf9_l1.output("O.DF.9", "O.DF.9 : Min. COMP area (um2). : 0.1444µm²")
+    odf9_l1.forget
+
+    # Rule O.PL.2: Min. poly2 width. is 0.22µm
+    logger.info("Executing rule O.PL.2")
+    opl2_l1  = poly2.edges.and(tgate.edges).and(otp_mk).width(0.22.um, euclidian).polygons(0.001)
+    opl2_l1.output("O.PL.2", "O.PL.2 : Min. poly2 width. : 0.22µm")
+    opl2_l1.forget
+
+    # Rule O.PL.3a: Min. poly2 Space on COMP. is 0.18µm
+    logger.info("Executing rule O.PL.3a")
+    opl3a_l1  = (tgate).or(poly2.not(comp)).and(otp_mk).space(0.18.um, euclidian).polygons(0.001)
+    opl3a_l1.output("O.PL.3a", "O.PL.3a : Min. poly2 Space on COMP. : 0.18µm")
+    opl3a_l1.forget
+
+    # Rule O.PL.4: Min. extension beyond COMP to form Poly2 end cap. is 0.14µm
+    logger.info("Executing rule O.PL.4")
+    opl4_l1 = poly2.and(otp_mk).enclosing(comp.and(otp_mk), 0.14.um, euclidian).polygons(0.001)
+    opl4_l1.output("O.PL.4", "O.PL.4 : Min. extension beyond COMP to form Poly2 end cap. : 0.14µm")
+    opl4_l1.forget
+
+    # rule O.PL.5a is not a DRC check
+
+    # rule O.PL.5b is not a DRC check
+
+    # Rule O.SB.2: Min. salicide Block Space. is 0.28µm
+    logger.info("Executing rule O.SB.2")
+    osb2_l1  = sab.and(otp_mk).space(0.28.um, euclidian).polygons(0.001)
+    osb2_l1.output("O.SB.2", "O.SB.2 : Min. salicide Block Space. : 0.28µm")
+    osb2_l1.forget
+
+    # Rule O.SB.3: Min. space from salicide block to unrelated COMP. is 0.09µm
+    logger.info("Executing rule O.SB.3")
+    osb3_l1  = sab.outside(comp).and(otp_mk).separation(comp.outside(sab), 0.09.um, euclidian).polygons(0.001)
+    osb3_l1.output("O.SB.3", "O.SB.3 : Min. space from salicide block to unrelated COMP. : 0.09µm")
+    osb3_l1.forget
+
+    # Rule O.SB.4: Min. space from salicide block to contact.
+    logger.info("Executing rule O.SB.4")
+    osb4_l1 = sab.and(otp_mk).separation(contact, 0.03.um, euclidian).polygons(0.001).or(sab.and(otp_mk).and(contact))
+    osb4_l1.output("O.SB.4", "O.SB.4 : Min. space from salicide block to contact.")
+    osb4_l1.forget
+
+    # rule O.SB.5a is not a DRC check
+
+    # Rule O.SB.5b_3.3V: Min. space from salicide block to unrelated Poly2 on COMP. is 0.1µm
+    logger.info("Executing rule O.SB.5b_3.3V")
+    osb5b_l1  = sab.outside(tgate).and(otp_mk).separation(tgate.outside(sab), 0.1.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    osb5b_l1.output("O.SB.5b_3.3V", "O.SB.5b_3.3V : Min. space from salicide block to unrelated Poly2 on COMP. : 0.1µm")
+    osb5b_l1.forget
+
+    # rule O.SB.5b_5V is not a DRC check
+
+    # Rule O.SB.9: Min. salicide block extension beyond unsalicided Poly2. is 0.1µm
+    logger.info("Executing rule O.SB.9")
+    osb9_l1 = sab.and(otp_mk).enclosing(poly2.and(sab), 0.1.um, euclidian).polygons
+    osb9_l1.output("O.SB.9", "O.SB.9 : Min. salicide block extension beyond unsalicided Poly2. : 0.1µm")
+    osb9_l1.forget
+
+    # Rule O.SB.11: Min. salicide block overlap with COMP. is 0.04µm
+    logger.info("Executing rule O.SB.11")
+    osb11_l1 = sab.and(otp_mk).overlap(comp, 0.04.um, euclidian).polygons
+    osb11_l1.output("O.SB.11", "O.SB.11 : Min. salicide block overlap with COMP. : 0.04µm")
+    osb11_l1.forget
+
+    # rule O.SB.12 is not a DRC check
+
+    # Rule O.SB.13_3.3V: Min. area of silicide block (um2). is 1.488µm²
+    logger.info("Executing rule O.SB.13_3.3V")
+    osb13_l1  = sab.and(otp_mk).with_area(nil, 1.488.um).not_interacting(v5_xtor).not_interacting(dualgate)
+    osb13_l1.output("O.SB.13_3.3V", "O.SB.13_3.3V : Min. area of silicide block (um2). : 1.488µm²")
+    osb13_l1.forget
+
+    # Rule O.SB.13_5V: Min. area of silicide block (um2). is 2µm²
+    logger.info("Executing rule O.SB.13_5V")
+    osb13_l1  = sab.and(otp_mk).and(v5_xtor).with_area(nil, 2.um)
+    osb13_l1.output("O.SB.13_5V", "O.SB.13_5V : Min. area of silicide block (um2). : 2µm²")
+    osb13_l1.forget
+
+    # rule O.SB.15b is not a DRC check
+
+    # Rule O.CO.7: Min. space from COMP contact to Poly2 on COMP. is 0.13µm
+    logger.info("Executing rule O.CO.7")
+    oco7_l1  = contact.not_outside(comp).and(otp_mk).separation(tgate.and(otp_mk), 0.13.um, euclidian).polygons(0.001)
+    oco7_l1.output("O.CO.7", "O.CO.7 : Min. space from COMP contact to Poly2 on COMP. : 0.13µm")
+    oco7_l1.forget
+
+    # Rule O.PL.ORT: Orientation-restricted gates must have the gate width aligned along the X-axis (poly line running horizontally) in reference to wafer notch down. is 0µm
+    logger.info("Executing rule O.PL.ORT")
+    oplort_l1 = comp.not(poly2).edges.and(tgate.edges).and(otp_mk).without_angle(0.um).extended(0, 0, 0.001, 0.001)
+    oplort_l1.output("O.PL.ORT", "O.PL.ORT : Orientation-restricted gates must have the gate width aligned along the X-axis (poly line running horizontally) in reference to wafer notch down. : 0µm")
+    oplort_l1.forget
+
+end #FEOL
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/poly2.drc b/tapeout/outputs/drc/poly2.drc
new file mode 100644
index 0000000..98ab07f
--- /dev/null
+++ b/tapeout/outputs/drc/poly2.drc
@@ -0,0 +1,1240 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if FEOL
+    #================================================
+    #---------------------POLY2----------------------
+    #================================================
+
+    # Rule PL.1_3.3V: Interconnect Width (outside PLFUSE). is 0.18µm
+    logger.info("Executing rule PL.1_3.3V")
+    pl1_l1  = poly2.outside(plfuse).not(ymtp_mk).width(0.18.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    pl1_l1.output("PL.1_3.3V", "PL.1_3.3V : Interconnect Width (outside PLFUSE). : 0.18µm")
+    pl1_l1.forget
+
+    # Rule PL.1_5V: Interconnect Width (outside PLFUSE). is 0.2µm
+    logger.info("Executing rule PL.1_5V")
+    pl1_l1  = poly2.outside(plfuse).not(ymtp_mk).width(0.2.um, euclidian).polygons(0.001).overlapping(dualgate)
+    pl1_l1.output("PL.1_5V", "PL.1_5V : Interconnect Width (outside PLFUSE). : 0.2µm")
+    pl1_l1.forget
+
+    # Rule PL.1a_3.3V: Interconnect Width (inside PLFUSE). is 0.18µm
+    logger.info("Executing rule PL.1a_3.3V")
+    pl1a_l1  = poly2.inside(plfuse).width(0.18.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    pl1a_l1.output("PL.1a_3.3V", "PL.1a_3.3V : Interconnect Width (inside PLFUSE). : 0.18µm")
+    pl1a_l1.forget
+
+    # Rule PL.1a_5V: Interconnect Width (inside PLFUSE). is 0.18µm
+    logger.info("Executing rule PL.1a_5V")
+    pl1a_l1  = poly2.inside(plfuse).width(0.18.um, euclidian).polygons(0.001).overlapping(dualgate)
+    pl1a_l1.output("PL.1a_5V", "PL.1a_5V : Interconnect Width (inside PLFUSE). : 0.18µm")
+    pl1a_l1.forget
+
+    # Rule PL.2_3.3V: Gate Width (Channel Length). is 0.28µm
+    logger.info("Executing rule PL.2_3.3V")
+    pl2_l1  = tgate.not(otp_mk).not(ymtp_mk).width(0.28.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    pl2_l1.output("PL.2_3.3V", "PL.2_3.3V : Gate Width (Channel Length). : 0.28µm")
+    pl2_l1.forget
+
+    pl_2_5v_n = ngate_5V.edges.inside_part(comp).width(0.6.um, euclidian).polygons
+    pl_2_5v_p = pgate_5V.edges.inside_part(comp).width(0.5.um, euclidian).polygons
+
+    pl_2_6v_n = ngate_6V.edges.inside_part(comp).width(0.7.um, euclidian).polygons
+    pl_2_6v_p = pgate_6V.edges.inside_part(comp).width(0.55.um, euclidian).polygons
+
+    # Rule PL.2_5V: Gate Width (Channel Length).
+    logger.info("Executing rule PL.2_5V")
+    pl2_l1 = pl_2_5v_n.or(pl_2_5v_p).or(pl_2_6v_n.or(pl_2_6v_p))
+    pl2_l1.output("PL.2_5V", "PL.2_5V : Gate Width (Channel Length).")
+    pl2_l1.forget
+
+    pl_2_5v_n.forget
+    pl_2_5v_p.forget
+    pl_2_6v_n.forget
+    pl_2_6v_p.forget
+
+    # Rule PL.3a_3.3V: Space on COMP/Field. is 0.24µm
+    logger.info("Executing rule PL.3a_3.3V")
+    pl3a_l1  = (tgate).or(poly2.not(comp)).not(otp_mk).space(0.24.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    pl3a_l1.output("PL.3a_3.3V", "PL.3a_3.3V : Space on COMP/Field. : 0.24µm")
+    pl3a_l1.forget
+
+    # Rule PL.3a_5V: Space on COMP/Field. is 0.24µm
+    logger.info("Executing rule PL.3a_5V")
+    pl3a_l1  = (tgate).or(poly2.not(comp)).not(otp_mk).space(0.24.um, euclidian).polygons(0.001).overlapping(dualgate)
+    pl3a_l1.output("PL.3a_5V", "PL.3a_5V : Space on COMP/Field. : 0.24µm")
+    pl3a_l1.forget
+
+    # rule PL.3b_3.3V is not a DRC check
+
+    # rule PL.3b_5V is not a DRC check
+
+    poly_pl = poly2.not(otp_mk).not(ymtp_mk).not(mvsd).not(mvpsd)
+    comp_pl = comp.not(otp_mk).not(ymtp_mk).not(mvsd).not(mvpsd)
+    # Rule PL.4_3.3V: Extension beyond COMP to form Poly2 end cap. is 0.22µm
+    logger.info("Executing rule PL.4_3.3V")
+    pl4_l1 = poly_pl.enclosing(comp.not(otp_mk).not(ymtp_mk), 0.22.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    pl4_l1.output("PL.4_3.3V", "PL.4_3.3V : Extension beyond COMP to form Poly2 end cap. : 0.22µm")
+    pl4_l1.forget
+
+    # Rule PL.4_5V: Extension beyond COMP to form Poly2 end cap. is 0.22µm
+    logger.info("Executing rule PL.4_5V")
+    pl4_l1 = poly_pl.enclosing(comp.not(otp_mk).not(ymtp_mk), 0.22.um, euclidian).polygons(0.001).overlapping(dualgate)
+    pl4_l1.output("PL.4_5V", "PL.4_5V : Extension beyond COMP to form Poly2 end cap. : 0.22µm")
+    pl4_l1.forget
+
+    # Rule PL.5a_3.3V: Space from field Poly2 to unrelated COMP Spacer from field Poly2 to Guard-ring. is 0.1µm
+    logger.info("Executing rule PL.5a_3.3V")
+    pl5a_l1  = poly_pl.separation(comp_pl, 0.1.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    pl5a_l1.output("PL.5a_3.3V", "PL.5a_3.3V : Space from field Poly2 to unrelated COMP Spacer from field Poly2 to Guard-ring. : 0.1µm")
+    pl5a_l1.forget
+
+    # Rule PL.5a_5V: Space from field Poly2 to unrelated COMP Spacer from field Poly2 to Guard-ring. is 0.3µm
+    logger.info("Executing rule PL.5a_5V")
+    pl5a_l1  = poly_pl.outside(sramcore).separation(comp_pl, 0.3.um, euclidian).polygons(0.001).overlapping(dualgate)
+    pl5a_l1.output("PL.5a_5V", "PL.5a_5V : Space from field Poly2 to unrelated COMP Spacer from field Poly2 to Guard-ring. : 0.3µm")
+    pl5a_l1.forget
+
+    # Rule PL.5b_3.3V: Space from field Poly2 to related COMP. is 0.1µm
+    logger.info("Executing rule PL.5b_3.3V")
+    pl5b_l1  = poly_pl.separation(comp_pl, 0.1.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    pl5b_l1.output("PL.5b_3.3V", "PL.5b_3.3V : Space from field Poly2 to related COMP. : 0.1µm")
+    pl5b_l1.forget
+
+    # Rule PL.5b_5V: Space from field Poly2 to related COMP. is 0.3µm
+    logger.info("Executing rule PL.5b_5V")
+    pl5b_l1  = poly_pl.outside(sramcore).separation(comp_pl, 0.3.um, euclidian).polygons(0.001).overlapping(dualgate)
+    pl5b_l1.output("PL.5b_5V", "PL.5b_5V : Space from field Poly2 to related COMP. : 0.3µm")
+    pl5b_l1.forget
+    poly_pl.forget
+    comp_pl.forget
+
+    poly_90deg = poly2.corners(90.0).sized(0.1).or(poly2.corners(-90.0).sized(0.1)).not(ymtp_mk)
+    # Rule PL.6: 90 degree bends on the COMP are not allowed.
+    logger.info("Executing rule PL.6")
+    pl6_l1 = poly2.corners(90.0).sized(0.1).or(poly2.corners(-90.0).sized(0.1)).not(ymtp_mk).inside(comp.not(ymtp_mk))
+    pl6_l1.output("PL.6", "PL.6 : 90 degree bends on the COMP are not allowed.")
+    pl6_l1.forget
+
+    poly_90deg.forget
+
+    # Rule PL.7_3.3V: 45 degree bent gate width is 0.3µm
+    logger.info("Executing rule PL.7_3.3V")
+    nom_e1 = nom_gate.edges.inside_part(comp).with_angle(25, 65)
+    nom_e2 = nom_gate.edges.inside_part(comp).with_angle(-65, -25)
+    pl7_edges_nom = nom_e1.or(nom_e2)
+    pl7_l1  = pl7_edges_nom.width(0.3.um, euclidian)
+    pl7_l1.output("PL.7_3.3V", "PL.7_3.3V : 45 degree bent gate width : 0.3µm")
+    pl7_l1.forget
+    nom_e1.forget
+    nom_e2.forget
+    pl7_edges_nom.forget
+
+    # Rule PL.7_5V: 45 degree bent gate width is 0.7µm
+    logger.info("Executing rule PL.7_5V")
+    thick_e1 = thick_gate.edges.inside_part(comp).with_angle(25, 65)
+    thick_e2 = thick_gate.edges.inside_part(comp).with_angle(-65, -25)
+    pl7_edges_thick = thick_e1.or(thick_e2)
+    pl7_l2 = pl7_edges_thick.width(0.7.um, euclidian)
+    pl7_l2.output("PL.7_5V", "PL.7_5V : 45 degree bent gate width : 0.7µm")
+    pl7_l2.forget
+    thick_e1.forget
+    thick_e2.forget
+    pl7_edges_thick.forget
+
+
+    # Rule PL.9: Poly2 inter connect connecting 3.3V and 5V areas (area inside and outside Dualgate) are not allowed. They shall be done though metal lines only.
+    logger.info("Executing rule PL.9")
+    pl9_l1 = poly2.interacting(poly2.not(v5_xtor).not(dualgate)).interacting(poly2.and(dualgate))
+    pl9_l1.output("PL.9", "PL.9 : Poly2 inter connect connecting 3.3V and 5V areas (area inside and outside Dualgate) are not allowed. They shall be done though metal lines only.")
+    pl9_l1.forget
+
+    # rule PL.10 is not a DRC check
+
+    # Rule PL.11: V5_Xtor must enclose 5V device.
+    logger.info("Executing rule PL.11")
+    pl11_l1 = v5_xtor.not_interacting(dualgate.or(otp_mk))
+    pl11_l1.output("PL.11", "PL.11 : V5_Xtor must enclose 5V device.")
+    pl11_l1.forget
+
+    # rule PL.12_3.3V is not a DRC check
+
+    # Rule PL.12: V5_Xtor enclose 5V Comp.
+    logger.info("Executing rule PL.12")
+    pl12_l1 = comp.interacting(v5_xtor).not(v5_xtor)
+    pl12_l1.output("PL.12", "PL.12 : V5_Xtor enclose 5V Comp.")
+    pl12_l1.forget
+
+end #FEOL
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/pplus.drc b/tapeout/outputs/drc/pplus.drc
new file mode 100644
index 0000000..457c9e3
--- /dev/null
+++ b/tapeout/outputs/drc/pplus.drc
@@ -0,0 +1,1298 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if FEOL
+
+    #================================================
+    #---------------------PPLUS----------------------
+    #================================================
+
+    # Rule PP.1: min. pplus width is 0.4µm
+    logger.info("Executing rule PP.1")
+    pp1_l1  = pplus.width(0.4.um, euclidian).polygons(0.001)
+    pp1_l1.output("PP.1", "PP.1 : min. pplus width : 0.4µm")
+    pp1_l1.forget
+
+    # Rule PP.2: min. pplus spacing is 0.4µm
+    logger.info("Executing rule PP.2")
+    pp2_l1  = pplus.space(0.4.um, euclidian).polygons(0.001)
+    pp2_l1.output("PP.2", "PP.2 : min. pplus spacing : 0.4µm")
+    pp2_l1.forget
+
+    # Rule PP.3a: Space to NCOMP for NCOMP (1) inside LVPWELL (2) outside NWELL and DNWELL. is 0.16µm
+    logger.info("Executing rule PP.3a")
+    pp3a_l1  = pplus.separation((ncomp.inside(lvpwell)).or(ncomp.outside(nwell).outside(dnwell)), 0.16.um, euclidian).polygons(0.001)
+    pp3a_l1.output("PP.3a", "PP.3a : Space to NCOMP for NCOMP (1) inside LVPWELL (2) outside NWELL and DNWELL. : 0.16µm")
+    pp3a_l1.forget
+
+    pp_3bi = ncomp.edges.not(lvpwell.inside(dnwell).sized(0.429.um))
+    # Rule PP.3bi: Space to NCOMP: For Inside DNWELL. (i) NCOMP space to LVPWELL >= 0.43um. is 0.08µm
+    logger.info("Executing rule PP.3bi")
+    pp3bi_l1  = pplus.inside(dnwell).edges.separation(pp_3bi, 0.08.um, euclidian).polygons(0.001)
+    pp3bi_l1.output("PP.3bi", "PP.3bi : Space to NCOMP: For Inside DNWELL. (i) NCOMP space to LVPWELL >= 0.43um. : 0.08µm")
+    pp3bi_l1.forget
+
+    pp_3bi.forget
+
+    pp_3bii = ncomp.edges.and(lvpwell.inside(dnwell).sized(0.429.um))
+    # Rule PP.3bii: Space to NCOMP: For Inside DNWELL. (ii) NCOMP space to LVPWELL < 0.43um. is 0.16µm
+    logger.info("Executing rule PP.3bii")
+    pp3bii_l1  = pplus.inside(dnwell).edges.separation(pp_3bii, 0.16.um, euclidian).polygons(0.001)
+    pp3bii_l1.output("PP.3bii", "PP.3bii : Space to NCOMP: For Inside DNWELL. (ii) NCOMP space to LVPWELL < 0.43um. : 0.16µm")
+    pp3bii_l1.forget
+
+    pp_3bii.forget
+
+    pp_3ci_extend = nwell.outside(dnwell).sized(-0.429.um)
+    pp_3ci = ncomp.edges.and(pp_3ci_extend)
+    # Rule PP.3ci: Space to NCOMP: For Outside DNWELL, inside Nwell: (i) NWELL Overlap of NCOMP >= 0.43um. is 0.08µm
+    logger.info("Executing rule PP.3ci")
+    pp3ci_l1  = pplus.outside(dnwell).edges.separation(pp_3ci, 0.08.um, euclidian).polygons(0.001)
+    pp3ci_l1.output("PP.3ci", "PP.3ci : Space to NCOMP: For Outside DNWELL, inside Nwell: (i) NWELL Overlap of NCOMP >= 0.43um. : 0.08µm")
+    pp3ci_l1.forget
+
+    pp_3ci_extend.forget
+
+    pp_3ci.forget
+
+    pp_3cii_extend = nwell.outside(dnwell).not(nwell.outside(dnwell).sized(-0.429.um))
+    pp_3cii = ncomp.edges.and(pp_3cii_extend)
+    # Rule PP.3cii: Space to NCOMP: For Outside DNWELL, inside Nwell: (ii) NWELL Overlap of NCOMP 0.43um. is 0.16µm
+    logger.info("Executing rule PP.3cii")
+    pp3cii_l1  = pplus.outside(dnwell).edges.separation(pp_3cii, 0.16.um, euclidian).polygons(0.001)
+    pp3cii_l1.output("PP.3cii", "PP.3cii : Space to NCOMP: For Outside DNWELL, inside Nwell: (ii) NWELL Overlap of NCOMP 0.43um. : 0.16µm")
+    pp3cii_l1.forget
+
+    pp_3cii_extend.forget
+
+    pp_3cii.forget
+
+    # Rule PP.3d: Min/max space to a butted NCOMP.
+    logger.info("Executing rule PP.3d")
+    pp3d_l1 = pplus.not_outside(ncomp)
+    pp3d_l1.output("PP.3d", "PP.3d : Min/max space to a butted NCOMP.")
+    pp3d_l1.forget
+
+    # Rule PP.3e: Space to NCOMP edge adjacent to a butting edge.
+    logger.info("Executing rule PP.3e")
+    pp3e_l1 = pplus.not_outside(ncomp)
+    pp3e_l1.output("PP.3e", "PP.3e : Space to NCOMP edge adjacent to a butting edge.")
+    pp3e_l1.forget
+
+    # Rule PP.4a: Space related to N-channel gate at a butting edge parallel to gate. is 0.32µm
+    logger.info("Executing rule PP.4a")
+    pp4a_l1 = pplus.edges.and(ncomp.edges).separation(ngate.edges, 0.32.um, projection).polygons(0.001)
+    pp4a_l1.output("PP.4a", "PP.4a : Space related to N-channel gate at a butting edge parallel to gate. : 0.32µm")
+    pp4a_l1.forget
+
+    pp_4b_poly = poly2.edges.interacting(ngate.edges.not(ncomp.edges)).centers(0, 0.99).and(ngate.sized(0.32.um))
+    # Rule PP.4b: Within 0.32um of channel, space to N-channel gate extension perpendicular to the direction of Poly2.
+    logger.info("Executing rule PP.4b")
+    pp4b_l1 = pplus.interacting(pplus.edges.separation(pp_4b_poly, 0.22.um, projection).polygons(0.001))
+    pp4b_l1.output("PP.4b", "PP.4b : Within 0.32um of channel, space to N-channel gate extension perpendicular to the direction of Poly2.")
+    pp4b_l1.forget
+
+    pp_4b_poly.forget
+
+    # Rule PP.5a: Overlap of P-channel gate. is 0.23µm
+    logger.info("Executing rule PP.5a")
+    pp5a_l1 = pplus.enclosing(pgate, 0.23.um, euclidian).polygons(0.001)
+    pp5a_l2 = pgate.not_outside(pplus).not(pplus)
+    pp5a_l  = pp5a_l1.or(pp5a_l2)
+    pp5a_l.output("PP.5a", "PP.5a : Overlap of P-channel gate. : 0.23µm")
+    pp5a_l1.forget
+    pp5a_l2.forget
+    pp5a_l.forget
+
+    # Rule PP.5b: Extension beyond COMP for COMP (1) Inside NWELL (2) outside LVPWELL but inside DNWELL. is 0.16µm
+    logger.info("Executing rule PP.5b")
+    pp5b_l1 = pplus.not_outside(nwell).or(pplus.outside(lvpwell).inside(dnwell)).edges.not(nplus).enclosing(comp.edges, 0.16.um, euclidian).polygons(0.001)
+    pp5b_l1.output("PP.5b", "PP.5b : Extension beyond COMP for COMP (1) Inside NWELL (2) outside LVPWELL but inside DNWELL. : 0.16µm")
+    pp5b_l1.forget
+
+    pp_5ci_background = pplus.not_outside(lvpwell).inside(dnwell).edges.not(nplus.edges)
+    pp_5ci_extend = lvpwell.inside(dnwell).sized(-0.429.um)
+    pp_5ci_foreground = pcomp.not_outside(lvpwell).inside(dnwell).edges.not(nplus.edges).inside_part(pp_5ci_extend)
+    # Rule PP.5ci: Extension beyond COMP: For Inside DNWELL, inside LVPWELL: (i) For LVPWELL overlap of Pplus >= 0.43um for LVPWELL tap. is 0.02µm
+    logger.info("Executing rule PP.5ci")
+    pp5ci_l1 = pp_5ci_background.enclosing(pp_5ci_foreground, 0.02.um, euclidian).polygons(0.001)
+    pp5ci_l1.output("PP.5ci", "PP.5ci : Extension beyond COMP: For Inside DNWELL, inside LVPWELL: (i) For LVPWELL overlap of Pplus >= 0.43um for LVPWELL tap. : 0.02µm")
+    pp5ci_l1.forget
+
+    pp_5ci_background.forget
+
+    pp_5ci_extend.forget
+
+    pp_5ci_foreground.forget
+
+    pp_5cii_background = pplus.not_outside(lvpwell).inside(dnwell).edges
+    pp_5cii_extend = lvpwell.inside(dnwell).not(lvpwell.inside(dnwell).sized(-0.429.um))
+    pp_5cii_foreground = pcomp.not_outside(lvpwell).inside(dnwell).edges.not(nplus.edges).and(pp_5cii_extend)
+    # Rule PP.5cii: Extension beyond COMP: For Inside DNWELL, inside LVPWELL: (ii) For LVPWELL overlap of Pplus < 0.43um for the LVPWELL tap. is 0.16µm
+    logger.info("Executing rule PP.5cii")
+    pp5cii_l1 = pp_5cii_background.enclosing(pp_5cii_foreground, 0.16.um, projection).polygons(0.001)
+    pp5cii_l1.output("PP.5cii", "PP.5cii : Extension beyond COMP: For Inside DNWELL, inside LVPWELL: (ii) For LVPWELL overlap of Pplus < 0.43um for the LVPWELL tap. : 0.16µm")
+    pp5cii_l1.forget
+
+    pp_5cii_background.forget
+
+    pp_5cii_extend.forget
+
+    pp_5cii_foreground.forget
+
+    pp_5di_background = pplus.outside(dnwell).edges
+    pp_5di_foreground = pcomp.outside(dnwell).edges.not(nplus.edges).not(nwell.outside(dnwell).sized(0.429.um))
+    # Rule PP.5di: Extension beyond COMP: For Outside DNWELL (i) For Pplus to NWELL space >= 0.43um for Pfield or LVPWELL tap. is 0.02µm
+    logger.info("Executing rule PP.5di")
+    pp5di_l1 = pp_5di_background.enclosing(pp_5di_foreground, 0.02.um, projection).polygons(0.001)
+    pp5di_l1.output("PP.5di", "PP.5di : Extension beyond COMP: For Outside DNWELL (i) For Pplus to NWELL space >= 0.43um for Pfield or LVPWELL tap. : 0.02µm")
+    pp5di_l1.forget
+
+    pp_5di_background.forget
+
+    pp_5di_foreground.forget
+
+    pp_5dii_background = pplus.outside(dnwell).edges
+    pp_5dii_foreground = pcomp.outside(dnwell).edges.not(nplus.edges).and(nwell.outside(dnwell).sized(0.429.um))
+    # Rule PP.5dii: Extension beyond COMP: For Outside DNWELL (ii) For Pplus to NWELL space < 0.43um for Pfield or LVPWELL tap. is 0.16µm
+    logger.info("Executing rule PP.5dii")
+    pp5dii_l1 = pp_5dii_background.enclosing(pp_5dii_foreground, 0.16.um, projection).polygons(0.001)
+    pp5dii_l1.output("PP.5dii", "PP.5dii : Extension beyond COMP: For Outside DNWELL (ii) For Pplus to NWELL space < 0.43um for Pfield or LVPWELL tap. : 0.16µm")
+    pp5dii_l1.forget
+
+    pp_5dii_background.forget
+
+    pp_5dii_foreground.forget
+
+    # Rule PP.6: Overlap with PCOMP butted to NCOMP. is 0.22µm
+    logger.info("Executing rule PP.6")
+    pp6_l1 = comp.interacting(pplus).enclosing(ncomp.interacting(pplus), 0.22.um, projection).polygons
+    pp6_l1.output("PP.6", "PP.6 : Overlap with PCOMP butted to NCOMP. : 0.22µm")
+    pp6_l1.forget
+
+    # Rule PP.7: Space to unrelated unsalicided Poly2. is 0.18µm
+    logger.info("Executing rule PP.7")
+    pp7_l1  = pplus.separation(poly2.and(sab), 0.18.um, euclidian).polygons(0.001)
+    pp7_l1.output("PP.7", "PP.7 : Space to unrelated unsalicided Poly2. : 0.18µm")
+    pp7_l1.forget
+
+    # Rule PP.8a: Minimum Pplus area (um2). is 0.35µm²
+    logger.info("Executing rule PP.8a")
+    pp8a_l1  = pplus.with_area(nil, 0.35.um)
+    pp8a_l1.output("PP.8a", "PP.8a : Minimum Pplus area (um2). : 0.35µm²")
+    pp8a_l1.forget
+
+    # Rule PP.8b: Minimum area enclosed by Pplus (um2). is 0.35µm²
+    logger.info("Executing rule PP.8b")
+    pp8b_l1  = pplus.holes.with_area(nil, 0.35.um)
+    pp8b_l1.output("PP.8b", "PP.8b : Minimum area enclosed by Pplus (um2). : 0.35µm²")
+    pp8b_l1.forget
+
+    # Rule PP.9: Overlap of unsalicided Poly2. is 0.18µm
+    logger.info("Executing rule PP.9")
+    pp9_l1 = pplus.enclosing(poly2.not_interacting(resistor).and(sab), 0.18.um, euclidian).polygons(0.001)
+    pp9_l2 = poly2.not_interacting(resistor).and(sab).not_outside(pplus).not(pplus)
+    pp9_l  = pp9_l1.or(pp9_l2)
+    pp9_l.output("PP.9", "PP.9 : Overlap of unsalicided Poly2. : 0.18µm")
+    pp9_l1.forget
+    pp9_l2.forget
+    pp9_l.forget
+
+    # Rule PP.10: Overlap of unsalicided COMP. is 0.18µm
+    logger.info("Executing rule PP.10")
+    pp10_l1 = pplus.enclosing(comp.and(sab), 0.18.um, euclidian).polygons(0.001)
+    pp10_l1.output("PP.10", "PP.10 : Overlap of unsalicided COMP. : 0.18µm")
+    pp10_l1.forget
+
+    pp_11_in_dnwell = pplus.interacting(pplus.edges.and(ncomp.edges).and(lvpwell.inside(dnwell).sized(0.429.um)))
+    pp_11_out_dnwell = pplus.interacting(pplus.edges.and(ncomp.edges).and(nwell.outside(dnwell).not(nwell.outside(dnwell).sized(-0.429.um))))
+    # Rule PP.11: Butting Pplus and NCOMP is forbidden within 0.43um of Nwell edge (for outside DNWELL) and of LVPWELL edge (for inside DNWELL case).
+    logger.info("Executing rule PP.11")
+    pp11_l1 = pp_11_in_dnwell.or(pp_11_out_dnwell)
+    pp11_l1.output("PP.11", "PP.11 : Butting Pplus and NCOMP is forbidden within 0.43um of Nwell edge (for outside DNWELL) and of LVPWELL edge (for inside DNWELL case).")
+    pp11_l1.forget
+
+    pp_11_in_dnwell.forget
+
+    pp_11_out_dnwell.forget
+
+    # Rule PP.12: Overlap with N-channel Poly2 gate extension is forbidden within 0.32um of N-channel gate.
+    logger.info("Executing rule PP.12")
+    pp12_l1 = pplus.interacting(pplus.edges.separation(ngate.edges.and(ncomp.edges), 0.32.um, euclidian).polygons(0.001))
+    pp12_l1.output("PP.12", "PP.12 : Overlap with N-channel Poly2 gate extension is forbidden within 0.32um of N-channel gate.")
+    pp12_l1.forget
+
+end #FEOL
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/pres.drc b/tapeout/outputs/drc/pres.drc
new file mode 100644
index 0000000..675f475
--- /dev/null
+++ b/tapeout/outputs/drc/pres.drc
@@ -0,0 +1,1150 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if FEOL
+    #================================================
+    #----------------P+ POLY RESISTOR----------------
+    #================================================
+
+    pres_poly = poly2.and(pplus).interacting(sab).interacting(res_mk).not_interacting(resistor)
+    # Rule PRES.1: Minimum width of Poly2 resistor. is 0.8µm
+    logger.info("Executing rule PRES.1")
+    pres1_l1  = pres_poly.width(0.8.um, euclidian).polygons(0.001)
+    pres1_l1.output("PRES.1", "PRES.1 : Minimum width of Poly2 resistor. : 0.8µm")
+    pres1_l1.forget
+
+    # Rule PRES.2: Minimum space between Poly2 resistors. is 0.4µm
+    logger.info("Executing rule PRES.2")
+    pres2_l1  = pres_poly.isolated(0.4.um, euclidian).polygons(0.001)
+    pres2_l1.output("PRES.2", "PRES.2 : Minimum space between Poly2 resistors. : 0.4µm")
+    pres2_l1.forget
+
+    # Rule PRES.3: Minimum space from Poly2 resistor to COMP.
+    logger.info("Executing rule PRES.3")
+    pres3_l1 = pres_poly.separation(comp, 0.6.um, euclidian).polygons(0.001).or(comp.not_outside(pres_poly))
+    pres3_l1.output("PRES.3", "PRES.3 : Minimum space from Poly2 resistor to COMP.")
+    pres3_l1.forget
+
+    # Rule PRES.4: Minimum space from Poly2 resistor to unrelated Poly2. is 0.6µm
+    logger.info("Executing rule PRES.4")
+    pres4_l1  = pres_poly.separation(poly2.not_interacting(sab), 0.6.um, euclidian).polygons(0.001)
+    pres4_l1.output("PRES.4", "PRES.4 : Minimum space from Poly2 resistor to unrelated Poly2. : 0.6µm")
+    pres4_l1.forget
+
+    # Rule PRES.5: Minimum Plus implant overlap of Poly2 resistor. is 0.3µm
+    logger.info("Executing rule PRES.5")
+    pres5_l1 = pplus.enclosing(pres_poly, 0.3.um, euclidian).polygons(0.001)
+    pres5_l2 = pres_poly.not_outside(pplus).not(pplus)
+    pres5_l  = pres5_l1.or(pres5_l2)
+    pres5_l.output("PRES.5", "PRES.5 : Minimum Plus implant overlap of Poly2 resistor. : 0.3µm")
+    pres5_l1.forget
+    pres5_l2.forget
+    pres5_l.forget
+
+    # Rule PRES.6: Minimum salicide block overlap of Poly2 resistor in width direction. is 0.28µm
+    logger.info("Executing rule PRES.6")
+    pres6_l1 = sab.enclosing(pres_poly,0.28.um).polygons(0.001)
+    pres6_l1.output("PRES.6", "PRES.6 : Minimum salicide block overlap of Poly2 resistor in width direction. : 0.28µm")
+    pres6_l1.forget
+
+    # Rule PRES.7: Space from salicide block to contact on Poly2 resistor.
+    logger.info("Executing rule PRES.7")
+    pres7_l1 = contact.inside(pres_poly).separation(sab,0.22.um).polygons(0.001).or(contact.inside(pres_poly).interacting(sab))
+    pres7_l1.output("PRES.7", "PRES.7 : Space from salicide block to contact on Poly2 resistor.")
+    pres7_l1.forget
+
+    # rule PRES.8 is not a DRC check
+
+    mk_pres9a = res_mk.edges.not(poly2.and(pplus).and(sab).edges).inside_part(poly2)
+    # Rule PRES.9a: Pplus Poly2 resistor shall be covered by RES_MK marking. RES_MK length shall be coincide with resistor length (Defined by SAB length) and width covering the width of Poly2.
+    logger.info("Executing rule PRES.9a")
+    pres9a_l1 = res_mk.interacting(pres_poly).interacting(mk_pres9a)
+    pres9a_l1.output("PRES.9a", "PRES.9a : Pplus Poly2 resistor shall be covered by RES_MK marking. RES_MK length shall be coincide with resistor length (Defined by SAB length) and width covering the width of Poly2.")
+    pres9a_l1.forget
+
+    mk_pres9a.forget
+
+    pres9b = res_mk.with_area(15000.01.um,nil).in(res_mk.interacting(res_mk.edges.with_length(80.01.um,nil)))
+    # Rule PRES.9b: If the size of single RES_MK mark layer is greater than 15000um2 and both side (X and Y) are greater than 80um. then the minimum spacing to adjacent RES_MK layer. is 20µm
+    logger.info("Executing rule PRES.9b")
+    pres9b_l1 = pres9b.interacting(pres_poly).drc(separation(pres9b) < 20.um).polygons(0.001)
+    pres9b_l1.output("PRES.9b", "PRES.9b : If the size of single RES_MK mark layer is greater than 15000um2 and both side (X and Y) are greater than 80um. then the minimum spacing to adjacent RES_MK layer. : 20µm")
+    pres9b_l1.forget
+
+    pres9b.forget
+
+    pres_poly.forget
+
+end #PRES
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/sab.drc b/tapeout/outputs/drc/sab.drc
new file mode 100644
index 0000000..19629b8
--- /dev/null
+++ b/tapeout/outputs/drc/sab.drc
@@ -0,0 +1,1201 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if FEOL
+    #================================================
+    #----------------------SAB-----------------------
+    #================================================
+
+    # Rule SB.1: min. sab width is 0.42µm
+    logger.info("Executing rule SB.1")
+    sb1_l1  = sab.width(0.42.um, euclidian).polygons(0.001)
+    sb1_l1.output("SB.1", "SB.1 : min. sab width : 0.42µm")
+    sb1_l1.forget
+
+    # Rule SB.2: min. sab spacing is 0.42µm
+    logger.info("Executing rule SB.2")
+    sb2_l1  = sab.outside(otp_mk).space(0.42.um, euclidian).polygons(0.001)
+    sb2_l1.output("SB.2", "SB.2 : min. sab spacing : 0.42µm")
+    sb2_l1.forget
+
+    # Rule SB.3: Space from salicide block to unrelated COMP. is 0.22µm
+    logger.info("Executing rule SB.3")
+    sb3_l1  = sab.outside(comp).outside(otp_mk).separation(comp.outside(sab), 0.22.um, euclidian).polygons(0.001)
+    sb3_l1.output("SB.3", "SB.3 : Space from salicide block to unrelated COMP. : 0.22µm")
+    sb3_l1.forget
+
+    # Rule SB.4: Space from salicide block to contact.
+    logger.info("Executing rule SB.4")
+    sb4_l1 = sab.outside(otp_mk).separation(contact, 0.15.um, euclidian).polygons(0.001).or(sab.outside(otp_mk).and(contact))
+    sb4_l1.output("SB.4", "SB.4 : Space from salicide block to contact.")
+    sb4_l1.forget
+
+    # Rule SB.5a: Space from salicide block to unrelated Poly2 on field. is 0.3µm
+    logger.info("Executing rule SB.5a")
+    sb5a_l1  = sab.outside(poly2.not(comp)).outside(otp_mk).separation(poly2.not(comp).outside(sab), 0.3.um, euclidian).polygons(0.001)
+    sb5a_l1.output("SB.5a", "SB.5a : Space from salicide block to unrelated Poly2 on field. : 0.3µm")
+    sb5a_l1.forget
+
+    # Rule SB.5b: Space from salicide block to unrelated Poly2 on COMP. is 0.28µm
+    logger.info("Executing rule SB.5b")
+    sb5b_l1  = sab.outside(tgate).outside(otp_mk).separation(tgate.outside(sab), 0.28.um, euclidian).polygons(0.001)
+    sb5b_l1.output("SB.5b", "SB.5b : Space from salicide block to unrelated Poly2 on COMP. : 0.28µm")
+    sb5b_l1.forget
+
+    # Rule SB.6: Salicide block extension beyond related COMP. is 0.22µm
+    logger.info("Executing rule SB.6")
+    sb6_l1 = sab.enclosing(comp, 0.22.um, euclidian).polygons(0.001)
+    sb6_l1.output("SB.6", "SB.6 : Salicide block extension beyond related COMP. : 0.22µm")
+    sb6_l1.forget
+
+    # Rule SB.7: COMP extension beyond related salicide block. is 0.22µm
+    logger.info("Executing rule SB.7")
+    sb7_l1 = comp.enclosing(sab, 0.22.um, euclidian).polygons
+    sb7_l1.output("SB.7", "SB.7 : COMP extension beyond related salicide block. : 0.22µm")
+    sb7_l1.forget
+
+    # Rule SB.8: Non-salicided contacts are forbidden.
+    logger.info("Executing rule SB.8")
+    sb8_l1 = contact.inside(sab)
+    sb8_l1.output("SB.8", "SB.8 : Non-salicided contacts are forbidden.")
+    sb8_l1.forget
+
+    # Rule SB.9: Salicide block extension beyond unsalicided Poly2. is 0.22µm
+    logger.info("Executing rule SB.9")
+    sb9_l1 = sab.outside(otp_mk).enclosing(poly2.and(sab), 0.22.um, euclidian).polygons
+    sb9_l1.output("SB.9", "SB.9 : Salicide block extension beyond unsalicided Poly2. : 0.22µm")
+    sb9_l1.forget
+
+    # Rule SB.10: Poly2 extension beyond related salicide block. is 0.22µm
+    logger.info("Executing rule SB.10")
+    sb10_l1 = poly2.enclosing(sab, 0.22.um, euclidian).polygons(0.001)
+    sb10_l1.output("SB.10", "SB.10 : Poly2 extension beyond related salicide block. : 0.22µm")
+    sb10_l1.forget
+
+    # Rule SB.11: Overlap with COMP. is 0.22µm
+    logger.info("Executing rule SB.11")
+    sb11_l1 = sab.outside(otp_mk).overlap(comp, 0.22.um, euclidian).polygons
+    sb11_l1.output("SB.11", "SB.11 : Overlap with COMP. : 0.22µm")
+    sb11_l1.forget
+
+    # Rule SB.12: Overlap with Poly2 outside ESD_MK. is 0.22µm
+    logger.info("Executing rule SB.12")
+    sb12_l1 = sab.outside(otp_mk).outside(esd_mk).overlap(poly2.outside(otp_mk).outside(esd_mk), 0.22.um, euclidian).polygons
+    sb12_l1.output("SB.12", "SB.12 : Overlap with Poly2 outside ESD_MK. : 0.22µm")
+    sb12_l1.forget
+
+    # Rule SB.13: Min. area (um2). is 2µm²
+    logger.info("Executing rule SB.13")
+    sb13_l1  = sab.outside(otp_mk).with_area(nil, 2.um)
+    sb13_l1.output("SB.13", "SB.13 : Min. area (um2). : 2µm²")
+    sb13_l1.forget
+
+    # Rule SB.14a: Space from unsalicided Nplus Poly2 to unsalicided Pplus Poly2. (Unsalicided Nplus Poly2 must not fall within a square of 0.56um x 0.56um at unsalicided Pplus Poly2 corners). is 0.56µm
+    logger.info("Executing rule SB.14a")
+    sb14a_l1 = poly2.and(nplus).and(sab).separation(poly2.and(pplus).and(sab), 0.56.um, square).polygons
+    sb14a_l1.output("SB.14a", "SB.14a : Space from unsalicided Nplus Poly2 to unsalicided Pplus Poly2. (Unsalicided Nplus Poly2 must not fall within a square of 0.56um x 0.56um at unsalicided Pplus Poly2 corners). : 0.56µm")
+    sb14a_l1.forget
+
+    # Rule SB.14b: Space from unsalicided Nplus Poly2 to P-channel gate. (Unsalicided Nplus Poly2 must not fall within a square of 0.56um x 0.56um at P-channel gate corners). is 0.56µm
+    logger.info("Executing rule SB.14b")
+    sb14b_l1 = poly2.and(nplus).and(sab).separation(pgate, 0.56.um, square).polygons
+    sb14b_l1.output("SB.14b", "SB.14b : Space from unsalicided Nplus Poly2 to P-channel gate. (Unsalicided Nplus Poly2 must not fall within a square of 0.56um x 0.56um at P-channel gate corners). : 0.56µm")
+    sb14b_l1.forget
+
+    # Rule SB.15a: Space from unsalicided Poly2 to unrelated Nplus/Pplus. is 0.18µm
+    logger.info("Executing rule SB.15a")
+    sb15a_l1  = poly2.and(sab).separation(nplus.or(pplus), 0.18.um, euclidian).polygons(0.001)
+    sb15a_l1.output("SB.15a", "SB.15a : Space from unsalicided Poly2 to unrelated Nplus/Pplus. : 0.18µm")
+    sb15a_l1.forget
+
+    sb_15b_1 = poly2.interacting(nplus.or(pplus)).and(sab).edges.not(poly2.edges.and(sab)).separation(nplus.or(pplus).edges, 0.32.um, projection).polygons(0.001)
+    sb_15b_2 = poly2.interacting(nplus.or(pplus)).and(sab).separation(nplus.or(pplus), 0.32.um, projection).polygons(0.001)
+    # Rule SB.15b: Space from unsalicided Poly2 to unrelated Nplus/Pplus along Poly2 line. is 0.32µm
+    logger.info("Executing rule SB.15b")
+    sb15b_l1 = sb_15b_1.and(sb_15b_2).outside(otp_mk)
+    sb15b_l1.output("SB.15b", "SB.15b : Space from unsalicided Poly2 to unrelated Nplus/Pplus along Poly2 line. : 0.32µm")
+    sb15b_l1.forget
+
+    sb_15b_1.forget
+
+    sb_15b_2.forget
+
+    # Rule SB.16: SAB layer cannot exist on 3.3V and 5V/6V CMOS transistors' Poly and COMP area of the core circuit (Excluding the transistors used for ESD purpose). It can only exist on CMOS transistors marked by LVS_IO, OTP_MK, ESD_MK layers.
+    logger.info("Executing rule SB.16")
+    sb16_l1 = sab.outside(otp_mk).outside(otp_mk.or(lvs_io).or(esd_mk)).not_outside(ngate.or(pgate.and(nwell)))
+    sb16_l1.output("SB.16", "SB.16 : SAB layer cannot exist on 3.3V and 5V/6V CMOS transistors' Poly and COMP area of the core circuit (Excluding the transistors used for ESD purpose). It can only exist on CMOS transistors marked by LVS_IO, OTP_MK, ESD_MK layers.")
+    sb16_l1.forget
+
+end #FEOL
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/sram.drc b/tapeout/outputs/drc/sram.drc
new file mode 100644
index 0000000..de54a83
--- /dev/null
+++ b/tapeout/outputs/drc/sram.drc
@@ -0,0 +1,1194 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if FEOL
+    #================================================
+    #--------------------5V SRAM---------------------
+    #================================================
+
+    # Rule S.DF.4c_MV: Min. (Nwell overlap of PCOMP) outside DNWELL. is 0.45µm
+    logger.info("Executing rule S.DF.4c_MV")
+    sdf4c_l1 = nwell.outside(dnwell).inside(sramcore).enclosing(pcomp.outside(dnwell).inside(sramcore), 0.45.um, euclidian).polygons(0.001)
+    sdf4c_l2 = pcomp.outside(dnwell).inside(sramcore).not_outside(nwell.outside(dnwell).inside(sramcore)).not(nwell.outside(dnwell).inside(sramcore))
+    sdf4c_l  = sdf4c_l1.or(sdf4c_l2).overlapping(v5_xtor).overlapping(dualgate)
+    sdf4c_l.output("S.DF.4c_MV", "S.DF.4c_MV : Min. (Nwell overlap of PCOMP) outside DNWELL. : 0.45µm")
+    sdf4c_l1.forget
+    sdf4c_l2.forget
+    sdf4c_l.forget
+
+    # Rule S.DF.6_MV: Min. COMP extend beyond gate (it also means source/drain overhang). is 0.32µm
+    logger.info("Executing rule S.DF.6_MV")
+    sdf6_l1 = comp.inside(sramcore).enclosing(poly2.inside(sramcore), 0.32.um, euclidian).polygons(0.001).overlapping(v5_xtor).overlapping(dualgate)
+    sdf6_l1.output("S.DF.6_MV", "S.DF.6_MV : Min. COMP extend beyond gate (it also means source/drain overhang). : 0.32µm")
+    sdf6_l1.forget
+
+    # Rule S.DF.7_MV: Min. (LVPWELL Spacer to PCOMP) inside DNWELL. is 0.45µm
+    logger.info("Executing rule S.DF.7_MV")
+    sdf7_l1  = pcomp.inside(dnwell).inside(sramcore).separation(lvpwell.inside(dnwell).inside(sramcore), 0.45.um, euclidian).polygons(0.001).overlapping(v5_xtor).overlapping(dualgate)
+    sdf7_l1.output("S.DF.7_MV", "S.DF.7_MV : Min. (LVPWELL Spacer to PCOMP) inside DNWELL. : 0.45µm")
+    sdf7_l1.forget
+
+    # Rule S.DF.8_MV: Min. (LVPWELL overlap of NCOMP) Inside DNWELL. is 0.45µm
+    logger.info("Executing rule S.DF.8_MV")
+    sdf8_l1 = lvpwell.inside(dnwell).inside(sramcore).enclosing(ncomp.inside(dnwell).inside(sramcore), 0.45.um, euclidian).polygons(0.001)
+    sdf8_l2 = ncomp.inside(dnwell).inside(sramcore).not_outside(lvpwell.inside(dnwell).inside(sramcore)).not(lvpwell.inside(dnwell).inside(sramcore))
+    sdf8_l  = sdf8_l1.or(sdf8_l2).overlapping(v5_xtor).overlapping(dualgate)
+    sdf8_l.output("S.DF.8_MV", "S.DF.8_MV : Min. (LVPWELL overlap of NCOMP) Inside DNWELL. : 0.45µm")
+    sdf8_l1.forget
+    sdf8_l2.forget
+    sdf8_l.forget
+
+    # Rule S.DF.16_MV: Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). is 0.45µm
+    logger.info("Executing rule S.DF.16_MV")
+    sdf16_l1  = ncomp.outside(nwell).outside(dnwell).inside(sramcore).separation(nwell.outside(dnwell).inside(sramcore), 0.45.um, euclidian).polygons(0.001).overlapping(v5_xtor).overlapping(dualgate)
+    sdf16_l1.output("S.DF.16_MV", "S.DF.16_MV : Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). : 0.45µm")
+    sdf16_l1.forget
+
+    # Rule S.PL.5a_MV: Space from field Poly2 to unrelated COMP Spacer from field Poly2 to Guard-ring. is 0.12µm
+    logger.info("Executing rule S.PL.5a_MV")
+    spl5a_l1  = poly2.inside(sramcore).separation(comp.inside(sramcore), 0.12.um, euclidian).polygons(0.001).overlapping(v5_xtor).overlapping(dualgate)
+    spl5a_l1.output("S.PL.5a_MV", "S.PL.5a_MV : Space from field Poly2 to unrelated COMP Spacer from field Poly2 to Guard-ring. : 0.12µm")
+    spl5a_l1.forget
+
+    # Rule S.PL.5b_MV: Space from field Poly2 to related COMP. is 0.12µm
+    logger.info("Executing rule S.PL.5b_MV")
+    spl5b_l1  = poly2.inside(sramcore).separation(comp.inside(sramcore), 0.12.um, euclidian).polygons(0.001).overlapping(v5_xtor).overlapping(dualgate)
+    spl5b_l1.output("S.PL.5b_MV", "S.PL.5b_MV : Space from field Poly2 to related COMP. : 0.12µm")
+    spl5b_l1.forget
+
+    # Rule S.CO.4_MV: COMP overlap of contact. is 0.04µm
+    logger.info("Executing rule S.CO.4_MV")
+    sco4_l1 = comp.inside(sramcore).and(v5_xtor).enclosing(contact.inside(sramcore).and(v5_xtor), 0.04.um, euclidian).polygons(0.001)
+    sco4_l2 = contact.inside(sramcore).and(v5_xtor).not_outside(comp.inside(sramcore).and(v5_xtor)).not(comp.inside(sramcore).and(v5_xtor))
+    sco4_l  = sco4_l1.or(sco4_l2)
+    sco4_l.output("S.CO.4_MV", "S.CO.4_MV : COMP overlap of contact. : 0.04µm")
+    sco4_l1.forget
+    sco4_l2.forget
+    sco4_l.forget
+
+    #================================================
+    #-------------------3.3V SRAM--------------------
+    #================================================
+
+    # Rule S.DF.4c_LV: Min. (Nwell overlap of PCOMP) outside DNWELL. is 0.4µm
+    logger.info("Executing rule S.DF.4c_LV")
+    sdf4c_l1 = nwell.outside(dnwell).inside(sramcore).enclosing(pcomp.outside(dnwell).inside(sramcore), 0.4.um, euclidian).polygons(0.001)
+    sdf4c_l2 = pcomp.outside(dnwell).inside(sramcore).not_outside(nwell.outside(dnwell).inside(sramcore)).not(nwell.outside(dnwell).inside(sramcore))
+    sdf4c_l  = sdf4c_l1.or(sdf4c_l2).not_interacting(v5_xtor).not_interacting(dualgate)
+    sdf4c_l.output("S.DF.4c_LV", "S.DF.4c_LV : Min. (Nwell overlap of PCOMP) outside DNWELL. : 0.4µm")
+    sdf4c_l1.forget
+    sdf4c_l2.forget
+    sdf4c_l.forget
+
+    # Rule S.DF.16_LV: Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). is 0.4µm
+    logger.info("Executing rule S.DF.16_LV")
+    sdf16_l1  = ncomp.outside(nwell).outside(dnwell).inside(sramcore).separation(nwell.outside(dnwell).inside(sramcore), 0.4.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    sdf16_l1.output("S.DF.16_LV", "S.DF.16_LV : Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). : 0.4µm")
+    sdf16_l1.forget
+
+    # Rule S.CO.3_LV: Poly2 overlap of contact. is 0.04µm
+    logger.info("Executing rule S.CO.3_LV")
+    sco3_l1 = poly2.inside(sramcore).enclosing(contact.inside(sramcore), 0.04.um, euclidian).polygons(0.001)
+    sco3_l2 = contact.inside(sramcore).not_outside(poly2.inside(sramcore)).not(poly2.inside(sramcore))
+    sco3_l  = sco3_l1.or(sco3_l2).not_interacting(v5_xtor).not_interacting(dualgate)
+    sco3_l.output("S.CO.3_LV", "S.CO.3_LV : Poly2 overlap of contact. : 0.04µm")
+    sco3_l1.forget
+    sco3_l2.forget
+    sco3_l.forget
+
+    # Rule S.CO.4_LV: COMP overlap of contact. is 0.03µm
+    logger.info("Executing rule S.CO.4_LV")
+    sco4_l1 = comp.inside(sramcore).enclosing(contact.inside(sramcore), 0.03.um, euclidian).polygons(0.001)
+    sco4_l2 = contact.inside(sramcore).not_outside(comp.inside(sramcore)).not(comp.inside(sramcore))
+    sco4_l  = sco4_l1.or(sco4_l2).not_interacting(v5_xtor).not_interacting(dualgate)
+    sco4_l.output("S.CO.4_LV", "S.CO.4_LV : COMP overlap of contact. : 0.03µm")
+    sco4_l1.forget
+    sco4_l2.forget
+    sco4_l.forget
+
+    # Rule S.CO.6_ii_LV: (ii) If Metal1 overlaps contact by < 0.04um on one side, adjacent metal1 edges overlap
+    logger.info("Executing rule S.CO.6_ii_LV")
+    sco6_l1 = metal1.and(sramcore).enclosing(contact.inside(sramcore), 0.02.um, euclidian).polygons(0.001).or(contact.inside(sramcore).not_inside(metal1.inside(sramcore)).not(metal1.inside(sramcore))).not_interacting(v5_xtor).not_interacting(dualgate)
+    sco6_l1.output("S.CO.6_ii_LV", "S.CO.6_ii_LV : (ii) If Metal1 overlaps contact by < 0.04um on one side, adjacent metal1 edges overlap")
+    sco6_l1.forget
+
+    # Rule S.M1.1_LV: min. metal1 width is 0.22µm
+    logger.info("Executing rule S.M1.1_LV")
+    sm11_l1  = metal1.and(sramcore).width(0.22.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    sm11_l1.output("S.M1.1_LV", "S.M1.1_LV : min. metal1 width : 0.22µm")
+    sm11_l1.forget
+
+end #FEOL
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/tail.drc b/tapeout/outputs/drc/tail.drc
new file mode 100644
index 0000000..4738735
--- /dev/null
+++ b/tapeout/outputs/drc/tail.drc
@@ -0,0 +1,1082 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/via1.drc b/tapeout/outputs/drc/via1.drc
new file mode 100644
index 0000000..7ba2c88
--- /dev/null
+++ b/tapeout/outputs/drc/via1.drc
@@ -0,0 +1,1182 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if BEOL
+    #================================================
+    #----------------------via1----------------------
+    #================================================
+
+    # Rule V1.1: Min/max Via1 size . is 0.26µm
+    logger.info("Executing rule V1.1")
+    v11_l1 = via1.edges.without_length(0.26.um).extended(0, 0, 0.001, 0.001)
+    v11_l1.output("V1.1", "V1.1 : Min/max Via1 size . : 0.26µm")
+    v11_l1.forget
+
+    # Rule V1.2a: min. via1 spacing is 0.26µm
+    logger.info("Executing rule V1.2a")
+    v12a_l1  = via1.space(0.26.um, euclidian)
+    v12a_l1.output("V1.2a", "V1.2a : min. via1 spacing : 0.26µm")
+    v12a_l1.forget
+
+   
+    # Rule V1.2b: Via1 Space in 4x4 or larger via1 array is 0.36µm
+    logger.info("Executing rule V1.2b")
+    poss_4_4_via1 = via1.sized(0.18, "square_limit").merged.sized(-0.18, "square_limit")
+    via1_4x4_loc = poss_4_4_via1.not_interacting(poss_4_4_via1.edges.with_length(nil, 2.115))
+    selected_via1 = via1.interacting(via1_4x4_loc)
+    via1b_l1  = selected_via1.space(0.36.um, euclidian)
+    via1b_l1.output("V1.2b", "V1.2b : Via1 Space in 4x4 or larger via1 array : 0.36µm")
+    via1b_l1.forget
+    poss_4_4_via1.forget
+    via1_4x4_loc.forget
+    selected_via1.forget
+
+    
+    # Rule V1.3a: metal1  overlap of via1.
+    logger.info("Executing rule V1.3a")
+    v13a_l1 = via1.not(metal1)
+    v13a_l1.output("V1.3a", "V1.3a : metal1 overlap of via1 >= 0.0")
+    v13a_l1.forget
+    
+    
+
+    # rule V1.3b is not a DRC check
+    # Rule V1.3c: metal1 (< 0.34um) end-of-line overlap. is 0.06µm
+    logger.info("Executing rule V1.3c")
+    v1p3c_cond = metal1.width(0.34.um + 1.dbu).with_length(0.28.um,nil,both)
+    v1p3c_eol = metal1.edges.with_length(nil, 0.34.um).interacting(v1p3c_cond.first_edges).interacting(v1p3c_cond.second_edges).not(v1p3c_cond.first_edges).not(v1p3c_cond.second_edges)
+    v1p3c_l1 = via1.edges.enclosed(v1p3c_eol, 0.06.um, projection)
+    v1p3c_l1.output("V1.3c", "V1.3c : metal1 (< 0.34um) end-of-line overlap. : 0.06µm")
+    v1p3c_l1.forget
+    v1p3c_cond.forget
+    v1p3c_eol.forget
+        
+    logger.info("Executing rule V1.3d")
+    via1_3d_cond_edges = via1.edges.not_outside(via1.enclosed(metal1, 0.04.um, projection).edges)
+    via1_3d_check_corner = via1_3d_cond_edges.extended_in(0.002.um)
+    via1_3d_check = via1.edges.interacting(via1_3d_check_corner).not(via1_3d_cond_edges)
+    via1_cond_corner = via1_3d_cond_edges.width(0.002.um, angle_limit(135)).polygons
+    via1_3d_l1 = via1_3d_check.enclosed(metal1.edges, 0.06.um, projection).polygons
+    via1_3d_l2 = via1.interacting(via1_cond_corner)
+    via1_3d_l = via1_3d_l1.or(via1_3d_l2)
+    via1_3d_l.output("V1.3d", "V1.3d : If metal1 overlap via1 by < 0.04um on one side, adjacent metal1 edges overlap. : 0.06µm")
+    via1_3d_l.forget
+    via1_3d_l2.forget
+    via1_3d_l1.forget
+    via1_3d_cond_edges.forget
+    via1_3d_check_corner.forget
+    via1_cond_corner.forget
+    via1_3d_check.forget
+
+    # rule V1.3e is not a DRC check
+
+    # Rule V1.4a: metal2 overlap of via1.
+    logger.info("Executing rule V1.4a")
+    via1_4a_l1 = via1.enclosed(metal2, 0.01.um, euclidian).polygons(0.001)
+    via1_4a_l2 = via1.not(metal2)
+    via1_4a_l = via1_4a_l1.or(via1_4a_l2)
+    via1_4a_l.output("V1.4a", "V1.4a : metal2 overlap of via1 >= 0.01 um")
+    via1_4a_l1.forget
+    via1_4a_l2.forget
+    via1_4a_l.forget
+
+    # Rule V1.4b: metal2 (< 0.34um) end-of-line overlap. is 0.06µm
+    logger.info("Executing rule V1.4b")
+    v1p4b_cond = metal2.width(0.34.um + 1.dbu).with_length(0.28.um,nil,both)
+    v1p4b_eol = metal2.edges.with_length(nil, 0.34.um).interacting(v1p4b_cond.first_edges).interacting(v1p4b_cond.second_edges).not(v1p4b_cond.first_edges).not(v1p4b_cond.second_edges)
+    v1p4b_l1 = via1.edges.enclosed(v1p4b_eol, 0.06.um, projection)
+    v1p4b_l1.output("V1.4b", "V1.4p : metal2 (< 0.34um) end-of-line overlap. : 0.06µm")
+    v1p4b_l1.forget
+    v1p4b_cond.forget
+    v1p4b_eol.forget
+        
+    logger.info("Executing rule V1.4c")
+    via1_4c_cond_edges = via1.edges.not_outside(via1.enclosed(metal2, 0.04.um, projection).edges)
+    via1_4c_check_corner = via1_4c_cond_edges.extended_in(0.002.um)
+    via1_4c_check = via1.edges.interacting(via1_4c_check_corner).not(via1_4c_cond_edges)
+    via1_4c_cond_corner = via1_4c_cond_edges.width(0.002.um, angle_limit(135)).polygons
+    via1_4c_l1 = via1_4c_check.enclosed(metal2.edges, 0.06.um, projection).polygons
+    via1_4c_l2 = via1.interacting(via1_4c_cond_corner)
+    via1_4c_l = via1_4c_l1.or(via1_4c_l2)
+    via1_4c_l.output("V1.3d", "V1.3d : If metal2 overlap via1 by < 0.04um on one side, adjacent metal2 edges overlap. : 0.06µm")
+    via1_4c_l.forget
+    via1_4c_l2.forget
+    via1_4c_l1.forget
+    via1_4c_cond_edges.forget
+    via1_4c_check_corner.forget
+    via1_4c_cond_corner.forget
+    via1_4c_check.forget
+    
+end #BEOL
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/via2.drc b/tapeout/outputs/drc/via2.drc
new file mode 100644
index 0000000..fe2b12e
--- /dev/null
+++ b/tapeout/outputs/drc/via2.drc
@@ -0,0 +1,1187 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if BEOL
+    if METAL_LEVEL == "3LM" || METAL_LEVEL == "4LM" || METAL_LEVEL == "5LM" || METAL_LEVEL == "6LM"
+        #================================================
+        #----------------------via2----------------------
+        #================================================
+
+        # Rule V2.1: Min/max Via1 size . is 0.26µm
+        logger.info("Executing rule V2.1")
+        v21_l1 = via2.edges.without_length(0.26.um).extended(0, 0, 0.001, 0.001)
+        v21_l1.output("V2.1", "V2.1 : Min/max Via1 size . : 0.26µm")
+        v21_l1.forget
+
+        # Rule V2.2a: min. via2 spacing is 0.26µm
+        logger.info("Executing rule V2.2a")
+        v22a_l1  = via2.space(0.26.um, euclidian)
+        v22a_l1.output("V2.2a", "V2.2a : min. via2 spacing : 0.26µm")
+        v22a_l1.forget
+
+    
+        # Rule V2.2b: Via1 Space in 4x4 or larger via2 array is 0.36µm
+        logger.info("Executing rule V2.2b")
+        poss_4_4_via2 = via2.sized(0.18, "square_limit").merged.sized(-0.18, "square_limit")
+        via2_4x4_loc = poss_4_4_via2.not_interacting(poss_4_4_via2.edges.with_length(nil, 2.115))
+        selected_via2 = via2.interacting(via2_4x4_loc)
+        via2b_l1  = selected_via2.space(0.36.um, euclidian)
+        via2b_l1.output("V2.2b", "V2.2b : Via1 Space in 4x4 or larger via2 array : 0.36µm")
+        via2b_l1.forget
+        poss_4_4_via2.forget
+        via2_4x4_loc.forget
+        selected_via2.forget
+
+        
+        # Rule V2.3a: metal2  overlap of via2.
+        logger.info("Executing rule V2.3a")
+        v23a_l1 = via2.not(metal2)
+        v23a_l2 = via2.enclosed(metal2, 0.01.um, euclidian).polygons(0.001)
+        v23a_l = v23a_l1.or(v23a_l2)
+        v23a_l1.output("V2.3a", "V2.3a : metal2 overlap of via2 >= 0.01")
+        v23a_l1.forget
+        v23a_l2.forget
+        v23a_l.forget
+        
+        
+
+        # rule V2.3b is not a DRC check
+        # Rule V2.3c: metal2 (< 0.34um) end-of-line overlap. is 0.06µm
+        logger.info("Executing rule V2.3c")
+        v2p3c_cond = metal2.width(0.34.um + 1.dbu).with_length(0.28.um,nil,both)
+        v2p3c_eol = metal2.edges.with_length(nil, 0.34.um).interacting(v2p3c_cond.first_edges).interacting(v2p3c_cond.second_edges).not(v2p3c_cond.first_edges).not(v2p3c_cond.second_edges)
+        v2p3c_l1 = via2.edges.enclosed(v2p3c_eol, 0.06.um, projection)
+        v2p3c_l1.output("V2.3c", "V2.3c : metal2 (< 0.34um) end-of-line overlap. : 0.06µm")
+        v2p3c_l1.forget
+        v2p3c_cond.forget
+        v2p3c_eol.forget
+            
+        logger.info("Executing rule V2.3d")
+        via2_3d_cond_edges = via2.edges.not_outside(via2.enclosed(metal2, 0.04.um, projection).edges)
+        via2_3d_check_corner = via2_3d_cond_edges.extended_in(0.002.um)
+        via2_3d_check = via2.edges.interacting(via2_3d_check_corner).not(via2_3d_cond_edges)
+        via2_cond_corner = via2_3d_cond_edges.width(0.002.um, angle_limit(135)).polygons
+        via2_3d_l1 = via2_3d_check.enclosed(metal2.edges, 0.06.um, projection).polygons
+        via2_3d_l2 = via2.interacting(via2_cond_corner)
+        via2_3d_l = via2_3d_l1.or(via2_3d_l2)
+        via2_3d_l.output("V2.3d", "V2.3d : If metal2 overlap via2 by < 0.04um on one side, adjacent metal2 edges overlap. : 0.06µm")
+        via2_3d_l.forget
+        via2_3d_l2.forget
+        via2_3d_l1.forget
+        via2_3d_cond_edges.forget
+        via2_3d_check_corner.forget
+        via2_cond_corner.forget
+        via2_3d_check.forget
+
+        # rule V2.3e is not a DRC check
+
+        # Rule V2.4a: metal3 overlap of via2.
+        logger.info("Executing rule V2.4a")
+        via2_4a_l1 = via2.enclosed(metal3, 0.01.um, euclidian).polygons(0.001)
+        via2_4a_l2 = via2.not(metal3)
+        via2_4a_l = via2_4a_l1.or(via2_4a_l2)
+        via2_4a_l.output("V2.4a", "V2.4a : metal3 overlap of via2 >= 0.01 um")
+        via2_4a_l1.forget
+        via2_4a_l2.forget
+        via2_4a_l.forget
+
+        # Rule V2.4b: metal3 (< 0.34um) end-of-line overlap. is 0.06µm
+        logger.info("Executing rule V2.4b")
+        v2p4b_cond = metal3.width(0.34.um + 1.dbu).with_length(0.28.um,nil,both)
+        v2p4b_eol = metal3.edges.with_length(nil, 0.34.um).interacting(v2p4b_cond.first_edges).interacting(v2p4b_cond.second_edges).not(v2p4b_cond.first_edges).not(v2p4b_cond.second_edges)
+        v2p4b_l1 = via2.edges.enclosed(v2p4b_eol, 0.06.um, projection)
+        v2p4b_l1.output("V2.4b", "V2.4p : metal3 (< 0.34um) end-of-line overlap. : 0.06µm")
+        v2p4b_l1.forget
+        v2p4b_cond.forget
+        v2p4b_eol.forget
+            
+        logger.info("Executing rule V2.4c")
+        via2_4c_cond_edges = via2.edges.not_outside(via2.enclosed(metal3, 0.04.um, projection).edges)
+        via2_4c_check_corner = via2_4c_cond_edges.extended_in(0.002.um)
+        via2_4c_check = via2.edges.interacting(via2_4c_check_corner).not(via2_4c_cond_edges)
+        via2_4c_cond_corner = via2_4c_cond_edges.width(0.002.um, angle_limit(135)).polygons
+        via2_4c_l1 = via2_4c_check.enclosed(metal3.edges, 0.06.um, projection).polygons
+        via2_4c_l2 = via2.interacting(via2_4c_cond_corner)
+        via2_4c_l = via2_4c_l1.or(via2_4c_l2)
+        via2_4c_l.output("V2.3d", "V2.3d : If metal3 overlap via2 by < 0.04um on one side, adjacent metal3 edges overlap. : 0.06µm")
+        via2_4c_l.forget
+        via2_4c_l2.forget
+        via2_4c_l1.forget
+        via2_4c_cond_edges.forget
+        via2_4c_check_corner.forget
+        via2_4c_cond_corner.forget
+        via2_4c_check.forget
+    end # Metalstack
+end #BEOL
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/via3.drc b/tapeout/outputs/drc/via3.drc
new file mode 100644
index 0000000..b6ee283
--- /dev/null
+++ b/tapeout/outputs/drc/via3.drc
@@ -0,0 +1,1188 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if BEOL
+    if METAL_LEVEL == "4LM" || METAL_LEVEL == "5LM" || METAL_LEVEL == "6LM"
+        #================================================
+        #----------------------via3----------------------
+        #================================================
+
+        # Rule V3.1: Min/max Via1 size . is 0.26µm
+        logger.info("Executing rule V3.1")
+        v31_l1 = via3.edges.without_length(0.26.um).extended(0, 0, 0.001, 0.001)
+        v31_l1.output("V3.1", "V3.1 : Min/max Via1 size . : 0.26µm")
+        v31_l1.forget
+
+        # Rule V3.2a: min. via3 spacing is 0.26µm
+        logger.info("Executing rule V3.2a")
+        v32a_l1  = via3.space(0.26.um, euclidian)
+        v32a_l1.output("V3.2a", "V3.2a : min. via3 spacing : 0.26µm")
+        v32a_l1.forget
+
+    
+        # Rule V3.2b: Via1 Space in 4x4 or larger via3 array is 0.36µm
+        logger.info("Executing rule V3.2b")
+        poss_4_4_via3 = via3.sized(0.18, "square_limit").merged.sized(-0.18, "square_limit")
+        via3_4x4_loc = poss_4_4_via3.not_interacting(poss_4_4_via3.edges.with_length(nil, 2.115))
+        selected_via3 = via3.interacting(via3_4x4_loc)
+        via3b_l1  = selected_via3.space(0.36.um, euclidian)
+        via3b_l1.output("V3.2b", "V3.2b : Via1 Space in 4x4 or larger via3 array : 0.36µm")
+        via3b_l1.forget
+        poss_4_4_via3.forget
+        via3_4x4_loc.forget
+        selected_via3.forget
+
+        
+        # Rule V3.3a: metal3  overlap of via3.
+        logger.info("Executing rule V3.3a")
+        v33a_l1 = via3.not(metal3)
+        v33a_l2 = via3.enclosed(metal3, 0.01.um, euclidian).polygons(0.001)
+        v33a_l = v33a_l1.or(v33a_l2)
+        v33a_l1.output("V3.3a", "V3.3a : metal3 overlap of via3 >= 0.01")
+        v33a_l1.forget
+        v33a_l2.forget
+        v33a_l.forget
+        
+        
+
+        # rule V3.3b is not a DRC check
+        # Rule V3.3c: metal3 (< 0.34um) end-of-line overlap. is 0.06µm
+        logger.info("Executing rule V3.3c")
+        v3p3c_cond = metal3.width(0.34.um + 1.dbu).with_length(0.28.um,nil,both)
+        v3p3c_eol = metal3.edges.with_length(nil, 0.34.um).interacting(v3p3c_cond.first_edges).interacting(v3p3c_cond.second_edges).not(v3p3c_cond.first_edges).not(v3p3c_cond.second_edges)
+        v3p3c_l1 = via3.edges.enclosed(v3p3c_eol, 0.06.um, projection)
+        v3p3c_l1.output("V3.3c", "V3.3c : metal3 (< 0.34um) end-of-line overlap. : 0.06µm")
+        v3p3c_l1.forget
+        v3p3c_cond.forget
+        v3p3c_eol.forget
+            
+        logger.info("Executing rule V3.3d")
+        via3_3d_cond_edges = via3.edges.not_outside(via3.enclosed(metal3, 0.04.um, projection).edges)
+        via3_3d_check_corner = via3_3d_cond_edges.extended_in(0.002.um)
+        via3_3d_check = via3.edges.interacting(via3_3d_check_corner).not(via3_3d_cond_edges)
+        via3_cond_corner = via3_3d_cond_edges.width(0.002.um, angle_limit(135)).polygons
+        via3_3d_l1 = via3_3d_check.enclosed(metal3.edges, 0.06.um, projection).polygons
+        via3_3d_l2 = via3.interacting(via3_cond_corner)
+        via3_3d_l = via3_3d_l1.or(via3_3d_l2)
+        via3_3d_l.output("V3.3d", "V3.3d : If metal3 overlap via3 by < 0.04um on one side, adjacent metal3 edges overlap. : 0.06µm")
+        via3_3d_l.forget
+        via3_3d_l2.forget
+        via3_3d_l1.forget
+        via3_3d_cond_edges.forget
+        via3_3d_check_corner.forget
+        via3_cond_corner.forget
+        via3_3d_check.forget
+
+        # rule V3.3e is not a DRC check
+
+        # Rule V3.4a: metal4 overlap of via3.
+        logger.info("Executing rule V3.4a")
+        via3_4a_l1 = via3.enclosed(metal4, 0.01.um, euclidian).polygons(0.001)
+        via3_4a_l2 = via3.not(metal4)
+        via3_4a_l = via3_4a_l1.or(via3_4a_l2)
+        via3_4a_l.output("V3.4a", "V3.4a : metal4 overlap of via3 >= 0.01 um")
+        via3_4a_l1.forget
+        via3_4a_l2.forget
+        via3_4a_l.forget
+
+        # Rule V3.4b: metal4 (< 0.34um) end-of-line overlap. is 0.06µm
+        logger.info("Executing rule V3.4b")
+        v3p4b_cond = metal4.width(0.34.um + 1.dbu).with_length(0.28.um,nil,both)
+        v3p4b_eol = metal4.edges.with_length(nil, 0.34.um).interacting(v3p4b_cond.first_edges).interacting(v3p4b_cond.second_edges).not(v3p4b_cond.first_edges).not(v3p4b_cond.second_edges)
+        v3p4b_l1 = via3.edges.enclosed(v3p4b_eol, 0.06.um, projection)
+        v3p4b_l1.output("V3.4b", "V3.4p : metal4 (< 0.34um) end-of-line overlap. : 0.06µm")
+        v3p4b_l1.forget
+        v3p4b_cond.forget
+        v3p4b_eol.forget
+            
+        logger.info("Executing rule V3.4c")
+        via3_4c_cond_edges = via3.edges.not_outside(via3.enclosed(metal4, 0.04.um, projection).edges)
+        via3_4c_check_corner = via3_4c_cond_edges.extended_in(0.002.um)
+        via3_4c_check = via3.edges.interacting(via3_4c_check_corner).not(via3_4c_cond_edges)
+        via3_4c_cond_corner = via3_4c_cond_edges.width(0.002.um, angle_limit(135)).polygons
+        via3_4c_l1 = via3_4c_check.enclosed(metal4.edges, 0.06.um, projection).polygons
+        via3_4c_l2 = via3.interacting(via3_4c_cond_corner)
+        via3_4c_l = via3_4c_l1.or(via3_4c_l2)
+        via3_4c_l.output("V3.3d", "V3.3d : If metal4 overlap via3 by < 0.04um on one side, adjacent metal4 edges overlap. : 0.06µm")
+        via3_4c_l.forget
+        via3_4c_l2.forget
+        via3_4c_l1.forget
+        via3_4c_cond_edges.forget
+        via3_4c_check_corner.forget
+        via3_4c_cond_corner.forget
+        via3_4c_check.forget
+    end #Metal stack
+    
+end #BEOL
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/via4.drc b/tapeout/outputs/drc/via4.drc
new file mode 100644
index 0000000..744df70
--- /dev/null
+++ b/tapeout/outputs/drc/via4.drc
@@ -0,0 +1,1187 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if BEOL
+    if METAL_LEVEL == "5LM" || METAL_LEVEL == "6LM"
+        #================================================
+        #----------------------via4----------------------
+        #================================================
+
+        # Rule V4.1: Min/max Via1 size . is 0.26µm
+        logger.info("Executing rule V4.1")
+        v41_l1 = via4.edges.without_length(0.26.um).extended(0, 0, 0.001, 0.001)
+        v41_l1.output("V4.1", "V4.1 : Min/max Via1 size . : 0.26µm")
+        v41_l1.forget
+
+        # Rule V4.2a: min. via4 spacing is 0.26µm
+        logger.info("Executing rule V4.2a")
+        v42a_l1  = via4.space(0.26.um, euclidian)
+        v42a_l1.output("V4.2a", "V4.2a : min. via4 spacing : 0.26µm")
+        v42a_l1.forget
+
+    
+        # Rule V4.2b: Via1 Space in 4x4 or larger via4 array is 0.36µm
+        logger.info("Executing rule V4.2b")
+        poss_4_4_via4 = via4.sized(0.18, "square_limit").merged.sized(-0.18, "square_limit")
+        via4_4x4_loc = poss_4_4_via4.not_interacting(poss_4_4_via4.edges.with_length(nil, 2.115))
+        selected_via4 = via4.interacting(via4_4x4_loc)
+        via4b_l1  = selected_via4.space(0.36.um, euclidian)
+        via4b_l1.output("V4.2b", "V4.2b : Via1 Space in 4x4 or larger via4 array : 0.36µm")
+        via4b_l1.forget
+        poss_4_4_via4.forget
+        via4_4x4_loc.forget
+        selected_via4.forget
+
+        
+        # Rule V4.3a: metal4  overlap of via4.
+        logger.info("Executing rule V4.3a")
+        v43a_l1 = via4.not(metal4)
+        v43a_l2 = via4.enclosed(metal4, 0.01.um, euclidian).polygons(0.001)
+        v43a_l = v43a_l1.or(v43a_l2)
+        v43a_l1.output("V4.3a", "V4.3a : metal4 overlap of via4 >= 0.01")
+        v43a_l1.forget
+        v43a_l2.forget
+        v43a_l.forget
+        
+        
+
+        # rule V4.3b is not a DRC check
+        # Rule V4.3c: metal4 (< 0.34um) end-of-line overlap. is 0.06µm
+        logger.info("Executing rule V4.3c")
+        v4p3c_cond = metal4.width(0.34.um + 1.dbu).with_length(0.28.um,nil,both)
+        v4p3c_eol = metal4.edges.with_length(nil, 0.34.um).interacting(v4p3c_cond.first_edges).interacting(v4p3c_cond.second_edges).not(v4p3c_cond.first_edges).not(v4p3c_cond.second_edges)
+        v4p3c_l1 = via4.edges.enclosed(v4p3c_eol, 0.06.um, projection)
+        v4p3c_l1.output("V4.3c", "V4.3c : metal4 (< 0.34um) end-of-line overlap. : 0.06µm")
+        v4p3c_l1.forget
+        v4p3c_cond.forget
+        v4p3c_eol.forget
+            
+        logger.info("Executing rule V4.3d")
+        via4_3d_cond_edges = via4.edges.not_outside(via4.enclosed(metal4, 0.04.um, projection).edges)
+        via4_3d_check_corner = via4_3d_cond_edges.extended_in(0.002.um)
+        via4_3d_check = via4.edges.interacting(via4_3d_check_corner).not(via4_3d_cond_edges)
+        via4_cond_corner = via4_3d_cond_edges.width(0.002.um, angle_limit(135)).polygons
+        via4_3d_l1 = via4_3d_check.enclosed(metal4.edges, 0.06.um, projection).polygons
+        via4_3d_l2 = via4.interacting(via4_cond_corner)
+        via4_3d_l = via4_3d_l1.or(via4_3d_l2)
+        via4_3d_l.output("V4.3d", "V4.3d : If metal4 overlap via4 by < 0.04um on one side, adjacent metal4 edges overlap. : 0.06µm")
+        via4_3d_l.forget
+        via4_3d_l2.forget
+        via4_3d_l1.forget
+        via4_3d_cond_edges.forget
+        via4_3d_check_corner.forget
+        via4_cond_corner.forget
+        via4_3d_check.forget
+
+        # rule V4.3e is not a DRC check
+
+        # Rule V4.4a: metal5 overlap of via4.
+        logger.info("Executing rule V4.4a")
+        via4_4a_l1 = via4.enclosed(metal5, 0.01.um, euclidian).polygons(0.001)
+        via4_4a_l2 = via4.not(metal5)
+        via4_4a_l = via4_4a_l1.or(via4_4a_l2)
+        via4_4a_l.output("V4.4a", "V4.4a : metal5 overlap of via4 >= 0.01 um")
+        via4_4a_l1.forget
+        via4_4a_l2.forget
+        via4_4a_l.forget
+
+        # Rule V4.4b: metal5 (< 0.34um) end-of-line overlap. is 0.06µm
+        logger.info("Executing rule V4.4b")
+        v4p4b_cond = metal5.width(0.34.um + 1.dbu).with_length(0.28.um,nil,both)
+        v4p4b_eol = metal5.edges.with_length(nil, 0.34.um).interacting(v4p4b_cond.first_edges).interacting(v4p4b_cond.second_edges).not(v4p4b_cond.first_edges).not(v4p4b_cond.second_edges)
+        v4p4b_l1 = via4.edges.enclosed(v4p4b_eol, 0.06.um, projection)
+        v4p4b_l1.output("V4.4b", "V4.4p : metal5 (< 0.34um) end-of-line overlap. : 0.06µm")
+        v4p4b_l1.forget
+        v4p4b_cond.forget
+        v4p4b_eol.forget
+            
+        logger.info("Executing rule V4.4c")
+        via4_4c_cond_edges = via4.edges.not_outside(via4.enclosed(metal5, 0.04.um, projection).edges)
+        via4_4c_check_corner = via4_4c_cond_edges.extended_in(0.002.um)
+        via4_4c_check = via4.edges.interacting(via4_4c_check_corner).not(via4_4c_cond_edges)
+        via4_4c_cond_corner = via4_4c_cond_edges.width(0.002.um, angle_limit(135)).polygons
+        via4_4c_l1 = via4_4c_check.enclosed(metal5.edges, 0.06.um, projection).polygons
+        via4_4c_l2 = via4.interacting(via4_4c_cond_corner)
+        via4_4c_l = via4_4c_l1.or(via4_4c_l2)
+        via4_4c_l.output("V4.3d", "V4.3d : If metal5 overlap via4 by < 0.04um on one side, adjacent metal5 edges overlap. : 0.06µm")
+        via4_4c_l.forget
+        via4_4c_l2.forget
+        via4_4c_l1.forget
+        via4_4c_cond_edges.forget
+        via4_4c_check_corner.forget
+        via4_4c_cond_corner.forget
+        via4_4c_check.forget
+    end # metal stack    
+end #BEOL
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/via5.drc b/tapeout/outputs/drc/via5.drc
new file mode 100644
index 0000000..223f987
--- /dev/null
+++ b/tapeout/outputs/drc/via5.drc
@@ -0,0 +1,1187 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+if BEOL
+    if METAL_LEVEL == "6LM"
+        #================================================
+        #----------------------via5----------------------
+        #================================================
+
+        # Rule V5.1: Min/max Via1 size . is 0.26µm
+        logger.info("Executing rule V5.1")
+        v51_l1 = via5.edges.without_length(0.26.um).extended(0, 0, 0.001, 0.001)
+        v51_l1.output("V5.1", "V5.1 : Min/max Via1 size . : 0.26µm")
+        v51_l1.forget
+
+        # Rule V5.2a: min. via5 spacing is 0.26µm
+        logger.info("Executing rule V5.2a")
+        v52a_l1  = via5.space(0.26.um, euclidian)
+        v52a_l1.output("V5.2a", "V5.2a : min. via5 spacing : 0.26µm")
+        v52a_l1.forget
+
+    
+        # Rule V5.2b: Via1 Space in 4x4 or larger via5 array is 0.36µm
+        logger.info("Executing rule V5.2b")
+        poss_4_4_via5 = via5.sized(0.18, "square_limit").merged.sized(-0.18, "square_limit")
+        via5_4x4_loc = poss_4_4_via5.not_interacting(poss_4_4_via5.edges.with_length(nil, 2.115))
+        selected_via5 = via5.interacting(via5_4x4_loc)
+        via5b_l1  = selected_via5.space(0.36.um, euclidian)
+        via5b_l1.output("V5.2b", "V5.2b : Via1 Space in 4x4 or larger via5 array : 0.36µm")
+        via5b_l1.forget
+        poss_4_4_via5.forget
+        via5_4x4_loc.forget
+        selected_via5.forget
+
+        
+        # Rule V5.3a: metal5  overlap of via5.
+        logger.info("Executing rule V5.3a")
+        v53a_l1 = via5.not(metal5)
+        v53a_l2 = via5.enclosed(metal5, 0.01.um, euclidian).polygons(0.001)
+        v53a_l = v53a_l1.or(v53a_l2)
+        v53a_l1.output("V5.3a", "V5.3a : metal5 overlap of via5 >= 0.01")
+        v53a_l1.forget
+        v53a_l2.forget
+        v53a_l.forget
+        
+        
+
+        # rule V5.3b is not a DRC check
+        # Rule V5.3c: metal5 (< 0.34um) end-of-line overlap. is 0.06µm
+        logger.info("Executing rule V5.3c")
+        v5p3c_cond = metal5.width(0.34.um + 1.dbu).with_length(0.28.um,nil,both)
+        v5p3c_eol = metal5.edges.with_length(nil, 0.34.um).interacting(v5p3c_cond.first_edges).interacting(v5p3c_cond.second_edges).not(v5p3c_cond.first_edges).not(v5p3c_cond.second_edges)
+        v5p3c_l1 = via5.edges.enclosed(v5p3c_eol, 0.06.um, projection)
+        v5p3c_l1.output("V5.3c", "V5.3c : metal5 (< 0.34um) end-of-line overlap. : 0.06µm")
+        v5p3c_l1.forget
+        v5p3c_cond.forget
+        v5p3c_eol.forget
+            
+        logger.info("Executing rule V5.3d")
+        via5_3d_cond_edges = via5.edges.not_outside(via5.enclosed(metal5, 0.04.um, projection).edges)
+        via5_3d_check_corner = via5_3d_cond_edges.extended_in(0.002.um)
+        via5_3d_check = via5.edges.interacting(via5_3d_check_corner).not(via5_3d_cond_edges)
+        via5_cond_corner = via5_3d_cond_edges.width(0.002.um, angle_limit(135)).polygons
+        via5_3d_l1 = via5_3d_check.enclosed(metal5.edges, 0.06.um, projection).polygons
+        via5_3d_l2 = via5.interacting(via5_cond_corner)
+        via5_3d_l = via5_3d_l1.or(via5_3d_l2)
+        via5_3d_l.output("V5.3d", "V5.3d : If metal5 overlap via5 by < 0.04um on one side, adjacent metal5 edges overlap. : 0.06µm")
+        via5_3d_l.forget
+        via5_3d_l2.forget
+        via5_3d_l1.forget
+        via5_3d_cond_edges.forget
+        via5_3d_check_corner.forget
+        via5_cond_corner.forget
+        via5_3d_check.forget
+
+        # rule V5.3e is not a DRC check
+
+        # Rule V5.4a: metaltop overlap of via5.
+        logger.info("Executing rule V5.4a")
+        via5_4a_l1 = via5.enclosed(metaltop, 0.01.um, euclidian).polygons(0.001)
+        via5_4a_l2 = via5.not(metaltop)
+        via5_4a_l = via5_4a_l1.or(via5_4a_l2)
+        via5_4a_l.output("V5.4a", "V5.4a : metaltop overlap of via5 >= 0.01 um")
+        via5_4a_l1.forget
+        via5_4a_l2.forget
+        via5_4a_l.forget
+
+        # Rule V5.4b: metaltop (< 0.34um) end-of-line overlap. is 0.06µm
+        logger.info("Executing rule V5.4b")
+        v5p4b_cond = metaltop.width(0.34.um + 1.dbu).with_length(0.28.um,nil,both)
+        v5p4b_eol = metaltop.edges.with_length(nil, 0.34.um).interacting(v5p4b_cond.first_edges).interacting(v5p4b_cond.second_edges).not(v5p4b_cond.first_edges).not(v5p4b_cond.second_edges)
+        v5p4b_l1 = via5.edges.enclosed(v5p4b_eol, 0.06.um, projection)
+        v5p4b_l1.output("V5.4b", "V5.4p : metaltop (< 0.34um) end-of-line overlap. : 0.06µm")
+        v5p4b_l1.forget
+        v5p4b_cond.forget
+        v5p4b_eol.forget
+            
+        logger.info("Executing rule V5.4c")
+        via5_4c_cond_edges = via5.edges.not_outside(via5.enclosed(metaltop, 0.04.um, projection).edges)
+        via5_4c_check_corner = via5_4c_cond_edges.extended_in(0.002.um)
+        via5_4c_check = via5.edges.interacting(via5_4c_check_corner).not(via5_4c_cond_edges)
+        via5_4c_cond_corner = via5_4c_cond_edges.width(0.002.um, angle_limit(135)).polygons
+        via5_4c_l1 = via5_4c_check.enclosed(metaltop.edges, 0.06.um, projection).polygons
+        via5_4c_l2 = via5.interacting(via5_4c_cond_corner)
+        via5_4c_l = via5_4c_l1.or(via5_4c_l2)
+        via5_4c_l.output("V5.3d", "V5.3d : If metaltop overlap via5 by < 0.04um on one side, adjacent metaltop edges overlap. : 0.06µm")
+        via5_4c_l.forget
+        via5_4c_l2.forget
+        via5_4c_l1.forget
+        via5_4c_cond_edges.forget
+        via5_4c_check_corner.forget
+        via5_4c_cond_corner.forget
+        via5_4c_check.forget
+    end # metal stack
+end #BEOL
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/drc/ymtp_mk.drc b/tapeout/outputs/drc/ymtp_mk.drc
new file mode 100644
index 0000000..0fd8e5d
--- /dev/null
+++ b/tapeout/outputs/drc/ymtp_mk.drc
@@ -0,0 +1,1180 @@
+################################################################################################
+# 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.18um 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 -------------------
+#================================================
+
+# optional for a batch launch :   klayout -b -r gf_018mcu.drc -rd input=design.gds -rd report=gp180_drc.lyrdb
+
+logger.info("Starting running GF180MCU Klayout DRC runset on %s" % [$input])
+logger.info("Ruby Version for klayout: %s" % [RUBY_VERSION])
+
+if $input
+    if $topcell
+        source($input, $topcell)
+    else
+        source($input)
+    end
+end
+
+if $table_name
+  table_name = $table_name
+else
+  table_name = "main"
+end
+
+
+logger.info("Loading database to memory is complete.")
+
+if $report
+    logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
+    report("DRC Run Report at", $report)
+else
+    logger.info("GF180MCU Klayout DRC runset output at default location." % [File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb")])
+    report("DRC Run Report at", File.join(File.dirname(RBA::CellView::active.filename), "gf180_drc.lyrdb"))
+end
+
+#================================================
+#------------------ SWITCHES --------------------
+#================================================
+logger.info("Evaluate switches.")
+
+# connectivity rules
+if $conn_drc == "true"
+  CONNECTIVITY_RULES = $conn_drc
+  logger.info("connectivity rules are enabled.")
+else
+  CONNECTIVITY_RULES = false
+  logger.info("connectivity rules are disabled.")
+end # connectivity rules
+
+# WEDGE
+if $wedge == "false"
+  WEDGE = $wedge
+else
+  WEDGE = "true"
+end # WEDGE
+
+logger.info("Wedge enabled  %s" % [WEDGE])
+
+# BALL
+if $ball == "false"
+  BALL = $ball
+else
+  BALL = "true"
+end # BALL
+
+logger.info("Ball enabled  %s" % [BALL])
+
+# GOLD
+if $gold == "false"
+  GOLD = $gold
+else
+  GOLD = "true"
+end # GOLD
+
+logger.info("Gold enabled  %s" % [GOLD])
+
+if $mim_option
+  MIM_OPTION = $mim_option
+else
+  MIM_OPTION = "B"
+end
+
+logger.info("MIM Option selected %s" % [MIM_OPTION])
+
+# OFFGRID
+if $offgrid == "false"
+  OFFGRID = false
+else
+  OFFGRID = true
+end # OFFGRID
+
+logger.info("Offgrid enabled  %s" % [OFFGRID])
+
+if $thr
+    threads($thr)
+    logger.info("Number of threads to use %s" % [$thr])
+else
+    threads(%x("nproc"))
+    logger.info("Number of threads to use #{%x("nproc")}")
+end
+
+#=== PRINT DETAILS ===
+if $verbose == "true"
+  logger.info("Verbose mode: #{$verbose}")
+  verbose(true)
+else
+  verbose(false)
+  logger.info("Verbose mode: false")
+end
+
+# === TILING MODE ===
+if $run_mode == "tiling"
+  tiles(500.um)
+  tile_borders(10.um)
+  logger.info("Tiling  mode is enabled.")
+
+elsif $run_mode == "deep"
+  #=== HIER MODE ===
+  deep
+  logger.info("deep  mode is enabled.")
+else
+  #=== FLAT MODE ===
+  flat
+  logger.info("flat  mode is enabled.")
+end # run_mode
+
+# METAL_TOP
+if $metal_top
+  METAL_TOP = $metal_top
+else
+  METAL_TOP = "9K"
+end # METAL_TOP
+
+logger.info("METAL_TOP Selected is %s" % [METAL_TOP])
+
+# METAL_LEVEL
+if $metal_level
+  METAL_LEVEL = $metal_level
+else
+  METAL_LEVEL = "5LM"
+end # METAL_LEVEL
+
+logger.info("METAL_STACK Selected is %s" % [METAL_LEVEL])
+
+# FEOL
+if $feol == "false"
+  FEOL = $feol
+  logger.info("FEOL is disabled.")
+else
+  FEOL = "true"
+  logger.info("FEOL is enabled.")
+end # FEOL
+
+# BEOL
+if $beol == "false"
+  BEOL = $beol
+  logger.info("BEOL is disabled.")
+else
+  BEOL = "true"
+  logger.info("BEOL is enabled.")
+end # BEOL
+
+#================================================
+#------------- LAYERS DEFINITIONS ---------------
+#================================================
+polygons_count = 0
+logger.info("Read in polygons from layers.")
+
+def get_polygons(l, d)
+  if $run_mode == "deep"
+    polygons(l, d)
+  else
+    polygons(l, d).merged
+  end
+end
+
+comp           = get_polygons(22 , 0 )
+count = comp.count()
+logger.info("comp has %d polygons" % [count])
+polygons_count += count
+
+dnwell         = get_polygons(12 , 0 )
+count   = dnwell.count()
+logger.info("dnwell has %d polygons" % [count])
+polygons_count  += count
+
+nwell          = get_polygons(21 , 0 )
+count   = nwell.count()
+logger.info("nwell has %d polygons" % [count])
+polygons_count  += count
+
+lvpwell        = get_polygons(204, 0 )
+count   = lvpwell.count()
+logger.info("lvpwell has %d polygons" % [count])
+polygons_count  += count
+
+dualgate       = get_polygons(55 , 0 )
+count   = dualgate.count()
+logger.info("dualgate has %d polygons" % [count])
+polygons_count  += count
+
+poly2          = get_polygons(30 , 0 )
+count   = poly2.count()
+logger.info("poly2 has %d polygons" % [count])
+polygons_count  += count
+
+nplus          = get_polygons(32 , 0 )
+count   = nplus.count()
+logger.info("nplus has %d polygons" % [count])
+polygons_count  += count
+
+pplus          = get_polygons(31 , 0 )
+count   = pplus.count()
+logger.info("pplus has %d polygons" % [count])
+polygons_count  += count
+
+sab            = get_polygons(49 , 0 )
+count   = sab.count()
+logger.info("sab has %d polygons" % [count])
+polygons_count  += count
+
+esd            = get_polygons(24 , 0 )
+count   = esd.count()
+logger.info("esd has %d polygons" % [count])
+polygons_count  += count
+
+resistor       = get_polygons(62 , 0 )
+count   = resistor.count()
+logger.info("resistor has %d polygons" % [count])
+polygons_count  += count
+
+fhres          = get_polygons(227, 0 )
+count   = fhres.count()
+logger.info("fhres has %d polygons" % [count])
+polygons_count  += count
+
+fusetop        = get_polygons(75 , 0 )
+count   = fusetop.count()
+logger.info("fusetop has %d polygons" % [count])
+polygons_count  += count
+
+fusewindow_d   = get_polygons(96 , 1 )
+count   = fusewindow_d.count()
+logger.info("fusewindow_d has %d polygons" % [count])
+polygons_count  += count
+
+polyfuse       = get_polygons(220, 0 )
+count   = polyfuse.count()
+logger.info("polyfuse has %d polygons" % [count])
+polygons_count  += count
+
+mvsd           = get_polygons(210, 0 )
+count   = mvsd.count()
+logger.info("mvsd has %d polygons" % [count])
+polygons_count  += count
+
+mvpsd          = get_polygons(11 , 39)
+count   = mvpsd.count()
+logger.info("mvpsd has %d polygons" % [count])
+polygons_count  += count
+
+nat            = get_polygons(5  , 0 )
+count   = nat.count()
+logger.info("nat has %d polygons" % [count])
+polygons_count  += count
+
+comp_dummy     = get_polygons(22 , 4 )
+count   = comp_dummy.count()
+logger.info("comp_dummy has %d polygons" % [count])
+polygons_count  += count
+
+poly2_dummy    = get_polygons(30 , 4 )
+count   = poly2_dummy.count()
+logger.info("poly2_dummy has %d polygons" % [count])
+polygons_count  += count
+
+schottky_diode = get_polygons(241, 0 )
+count   = schottky_diode.count()
+logger.info("schottky_diode has %d polygons" % [count])
+polygons_count  += count
+
+zener          = get_polygons(178, 0 )
+count   = zener.count()
+logger.info("zener has %d polygons" % [count])
+polygons_count  += count
+
+res_mk         = get_polygons(110, 5 )
+count   = res_mk.count()
+logger.info("res_mk has %d polygons" % [count])
+polygons_count  += count
+
+opc_drc        = get_polygons(124, 5 )
+count   = opc_drc.count()
+logger.info("opc_drc has %d polygons" % [count])
+polygons_count  += count
+
+ndmy           = get_polygons(111, 5 )
+count   = ndmy.count()
+logger.info("ndmy has %d polygons" % [count])
+polygons_count  += count
+
+pmndmy         = get_polygons(152, 5 )
+count   = pmndmy.count()
+logger.info("pmndmy has %d polygons" % [count])
+polygons_count  += count
+
+v5_xtor        = get_polygons(112, 1 )
+count   = v5_xtor.count()
+logger.info("v5_xtor has %d polygons" % [count])
+polygons_count  += count
+
+cap_mk         = get_polygons(117, 5 )
+count   = cap_mk.count()
+logger.info("cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+mos_cap_mk     = get_polygons(166, 5 )
+count   = mos_cap_mk.count()
+logger.info("mos_cap_mk has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+diode_mk       = get_polygons(115, 5 )
+count   = diode_mk.count()
+logger.info("diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+drc_bjt        = get_polygons(127, 5 )
+count   = drc_bjt.count()
+logger.info("drc_bjt has %d polygons" % [count])
+polygons_count  += count
+
+lvs_bjt        = get_polygons(118, 5 )
+count   = lvs_bjt.count()
+logger.info("lvs_bjt has %d polygons" % [count])
+polygons_count  += count
+
+mim_l_mk       = get_polygons(117, 10)
+count   = mim_l_mk.count()
+logger.info("mim_l_mk has %d polygons" % [count])
+polygons_count  += count
+
+latchup_mk     = get_polygons(137, 5 )
+count   = latchup_mk.count()
+logger.info("latchup_mk has %d polygons" % [count])
+polygons_count  += count
+
+guard_ring_mk  = get_polygons(167, 5 )
+count   = guard_ring_mk.count()
+logger.info("guard_ring_mk has %d polygons" % [count])
+polygons_count  += count
+
+otp_mk         = get_polygons(173, 5 )
+count   = otp_mk.count()
+logger.info("otp_mk has %d polygons" % [count])
+polygons_count  += count
+
+mtpmark        = get_polygons(122, 5 )
+count   = mtpmark.count()
+logger.info("mtpmark has %d polygons" % [count])
+polygons_count  += count
+
+neo_ee_mk      = get_polygons(88 , 17)
+count   = neo_ee_mk.count()
+logger.info("neo_ee_mk has %d polygons" % [count])
+polygons_count  += count
+
+sramcore       = get_polygons(108, 5 )
+count   = sramcore.count()
+logger.info("sramcore has %d polygons" % [count])
+polygons_count  += count
+
+lvs_rf         = get_polygons(100, 5 )
+count   = lvs_rf.count()
+logger.info("lvs_rf has %d polygons" % [count])
+polygons_count  += count
+
+lvs_drain      = get_polygons(100, 7 )
+count   = lvs_drain.count()
+logger.info("lvs_drain has %d polygons" % [count])
+polygons_count  += count
+
+ind_mk         = get_polygons(151, 5 )
+count   = ind_mk.count()
+logger.info("ind_mk has %d polygons" % [count])
+polygons_count  += count
+
+hvpolyrs       = get_polygons(123, 5 )
+count   = hvpolyrs.count()
+logger.info("hvpolyrs has %d polygons" % [count])
+polygons_count  += count
+
+lvs_io         = get_polygons(119, 5 )
+count   = lvs_io.count()
+logger.info("lvs_io has %d polygons" % [count])
+polygons_count  += count
+
+probe_mk       = get_polygons(13 , 17)
+count   = probe_mk.count()
+logger.info("probe_mk has %d polygons" % [count])
+polygons_count  += count
+
+esd_mk         = get_polygons(24 , 5 )
+count   = esd_mk.count()
+logger.info("esd_mk has %d polygons" % [count])
+polygons_count  += count
+
+lvs_source     = get_polygons(100, 8 )
+count   = lvs_source.count()
+logger.info("lvs_source has %d polygons" % [count])
+polygons_count  += count
+
+well_diode_mk  = get_polygons(153, 51)
+count   = well_diode_mk.count()
+logger.info("well_diode_mk has %d polygons" % [count])
+polygons_count  += count
+
+ldmos_xtor     = get_polygons(226, 0 )
+count   = ldmos_xtor.count()
+logger.info("ldmos_xtor has %d polygons" % [count])
+polygons_count  += count
+
+plfuse         = get_polygons(125, 5 )
+count   = plfuse.count()
+logger.info("plfuse has %d polygons" % [count])
+polygons_count  += count
+
+efuse_mk       = get_polygons(80 , 5 )
+count   = efuse_mk.count()
+logger.info("efuse_mk has %d polygons" % [count])
+polygons_count  += count
+
+mcell_feol_mk  = get_polygons(11 , 17)
+count   = mcell_feol_mk.count()
+logger.info("mcell_feol_mk has %d polygons" % [count])
+polygons_count  += count
+
+ymtp_mk        = get_polygons(86 , 17)
+count   = ymtp_mk.count()
+logger.info("ymtp_mk has %d polygons" % [count])
+polygons_count  += count
+
+dev_wf_mk      = get_polygons(128, 17)
+count   = dev_wf_mk.count()
+logger.info("dev_wf_mk has %d polygons" % [count])
+polygons_count  += count
+
+comp_label     = get_polygons(22 , 10)
+count   = comp_label.count()
+logger.info("comp_label has %d polygons" % [count])
+polygons_count  += count
+
+poly2_label    = get_polygons(30 , 10)
+count   = poly2_label.count()
+logger.info("poly2_label has %d polygons" % [count])
+polygons_count  += count
+
+mdiode         = get_polygons(116, 5 )
+count   = mdiode.count()
+logger.info("mdiode has %d polygons" % [count])
+polygons_count  += count
+
+contact        = get_polygons(33 , 0 )
+count   = contact.count()
+logger.info("contact has %d polygons" % [count])
+polygons_count  += count
+
+metal1_drawn   = get_polygons(34 , 0 )
+count   = metal1_drawn.count()
+logger.info("metal1_drawn has %d polygons" % [count])
+polygons_count  += count
+
+metal1_dummy   = get_polygons(34 , 4 )
+count   = metal1_dummy.count()
+logger.info("metal1_dummy has %d polygons" % [count])
+polygons_count  += count
+
+metal1         = metal1_drawn + metal1_dummy
+
+metal1_label   = get_polygons(34 , 10)
+count   = metal1_label.count()
+logger.info("metal1_label has %d polygons" % [count])
+polygons_count  += count
+
+metal1_slot    = get_polygons(34 , 3 )
+count   = metal1_slot.count()
+logger.info("metal1_slot has %d polygons" % [count])
+polygons_count  += count
+
+metal1_blk     = get_polygons(34 , 5 )
+count   = metal1_blk.count()
+logger.info("metal1_blk has %d polygons" % [count])
+polygons_count  += count
+
+via1           = get_polygons(35 , 0 )
+count   = via1.count()
+logger.info("via1 has %d polygons" % [count])
+polygons_count  += count
+
+
+if METAL_LEVEL == "2LM"
+  metal2_drawn  = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy  = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2        = metal2_drawn + metal2_drawn
+
+  metal2_label  = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot   = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk    = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  top_via       = via1
+  topmin1_via   = contact
+  top_metal     = metal2
+  topmin1_metal = metal1
+  
+else
+  metal2_drawn   = get_polygons(36 , 0 )
+  count   = metal2_drawn.count()
+  logger.info("metal2_drawn has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_dummy   = get_polygons(36 , 4 )
+  count   = metal2_dummy.count()
+  logger.info("metal2_dummy has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2         = metal2_drawn + metal2_dummy
+
+  metal2_label   = get_polygons(36 , 10)
+  count   = metal2_label.count()
+  logger.info("metal2_label has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_slot    = get_polygons(36 , 3 )
+  count   = metal2_slot.count()
+  logger.info("metal2_slot has %d polygons" % [count])
+  polygons_count  += count
+
+  metal2_blk     = get_polygons(36 , 5 )
+  count   = metal2_blk.count()
+  logger.info("metal2_blk has %d polygons" % [count])
+  polygons_count  += count
+  
+  via2           = get_polygons(38 , 0 )
+  count   = via2.count()
+  logger.info("via2 has %d polygons" % [count])
+  polygons_count  += count
+  
+  if METAL_LEVEL == "3LM"
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+    
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+    
+    top_via       = via2
+    topmin1_via   = via1
+    top_metal     = metal3
+    topmin1_metal = metal2
+  else
+    metal3_drawn  = get_polygons(42 , 0 )
+    count   = metal3_drawn.count()
+    logger.info("metal3_drawn has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_dummy  = get_polygons(42 , 4 )
+    count   = metal3_dummy.count()
+    logger.info("metal3_dummy has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3        = metal3_drawn + metal3_dummy
+
+    metal3_label  = get_polygons(42 , 10)
+    count   = metal3_label.count()
+    logger.info("metal3_label has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_slot   = get_polygons(42 , 3 )
+    count   = metal3_slot.count()
+    logger.info("metal3_slot has %d polygons" % [count])
+    polygons_count  += count
+
+    metal3_blk    = get_polygons(42 , 5 )
+    count   = metal3_blk.count()
+    logger.info("metal3_blk has %d polygons" % [count])
+    polygons_count  += count
+
+    via3           = get_polygons(40 , 0 )
+
+    if METAL_LEVEL == "4LM"
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+      
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+      
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+      
+      top_via       = via3
+      topmin1_via   = via2
+      top_metal     = metal4
+      topmin1_metal = metal3
+    else
+      metal4_drawn  = get_polygons(46 , 0 )
+      count   = metal4_drawn.count()
+      logger.info("metal4_drawn has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_dummy  = get_polygons(46 , 4 )
+      count   = metal4_dummy.count()
+      logger.info("metal4_dummy has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4        = metal4_drawn + metal4_dummy
+
+      metal4_label  = get_polygons(46 , 10)
+      count   = metal4_label.count()
+      logger.info("metal4_label has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_slot   = get_polygons(46 , 3 )
+      count   = metal4_slot.count()
+      logger.info("metal4_slot has %d polygons" % [count])
+      polygons_count  += count
+
+      metal4_blk    = get_polygons(46 , 5 )
+      count   = metal4_blk.count()
+      logger.info("metal4_blk has %d polygons" % [count])
+      polygons_count  += count
+
+      via4          = get_polygons(41 , 0 )
+      count   = via4.count()
+      logger.info("via4 has %d polygons" % [count])
+      polygons_count  += count
+
+      if METAL_LEVEL == "5LM"
+        metal5_drawn  = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy  = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5        = metal5_drawn + metal5_dummy
+
+        metal5_label  = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+      
+        metal5_slot   = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk    = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via4
+        topmin1_via   = via3
+        top_metal     = metal5
+        topmin1_metal = metal4
+      else 
+        ## 6LM
+        metal5_drawn   = get_polygons(81 , 0 )
+        count   = metal5_drawn.count()
+        logger.info("metal5_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_dummy   = get_polygons(81 , 4 )
+        count   = metal5_dummy.count()
+        logger.info("metal5_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5         = metal5_drawn + metal5_dummy
+
+        metal5_label   = get_polygons(81 , 10)
+        count   = metal5_label.count()
+        logger.info("metal5_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_slot    = get_polygons(81 , 3 )
+        count   = metal5_slot.count()
+        logger.info("metal5_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metal5_blk     = get_polygons(81 , 5 )
+        count   = metal5_blk.count()
+        logger.info("metal5_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        via5           = get_polygons(82 , 0 )
+        count   = via5.count()
+        logger.info("via5 has %d polygons" % [count])
+        polygons_count  += count
+
+
+        metaltop_drawn = get_polygons(53 , 0 )
+        count   = metaltop_drawn.count()
+        logger.info("metaltop_drawn has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_dummy = get_polygons(53 , 4 )
+        count   = metaltop_dummy.count()
+        logger.info("metaltop_dummy has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop       = metaltop_drawn + metaltop_dummy
+
+        metaltop_label = get_polygons(53 , 10)
+        count   = metaltop_label.count()
+        logger.info("metaltop_label has %d polygons" % [count])
+        polygons_count  += count
+
+        metaltop_slot  = get_polygons(53 , 3 )
+        count   = metaltop_slot.count()
+        logger.info("metaltop_slot has %d polygons" % [count])
+        polygons_count  += count
+
+        metalt_blk     = get_polygons(53 , 5 )
+        count   = metalt_blk.count()
+        logger.info("metalt_blk has %d polygons" % [count])
+        polygons_count  += count
+
+        top_via       = via5
+        topmin1_via   = via4
+        top_metal     = metaltop
+        topmin1_metal = metal5
+      end
+    end
+  end
+end
+
+pad            = get_polygons(37 , 0 )
+count   = pad.count()
+logger.info("pad has %d polygons" % [count])
+polygons_count  += count
+
+ubmpperi       = get_polygons(183, 0 )
+count   = ubmpperi.count()
+logger.info("ubmpperi has %d polygons" % [count])
+polygons_count  += count
+
+ubmparray      = get_polygons(184, 0 )
+count   = ubmparray.count()
+logger.info("ubmparray has %d polygons" % [count])
+polygons_count  += count
+
+ubmeplate      = get_polygons(185, 0 )
+count   = ubmeplate.count()
+logger.info("ubmeplate has %d polygons" % [count])
+polygons_count  += count
+
+metal1_res     = get_polygons(110, 11)
+count   = metal1_res.count()
+logger.info("metal1_res has %d polygons" % [count])
+polygons_count  += count
+
+metal2_res     = get_polygons(110, 12)
+count   = metal2_res.count()
+logger.info("metal2_res has %d polygons" % [count])
+polygons_count  += count
+
+metal3_res     = get_polygons(110, 13)
+count   = metal3_res.count()
+logger.info("metal3_res has %d polygons" % [count])
+polygons_count  += count
+
+metal4_res     = get_polygons(110, 14)
+count   = metal4_res.count()
+logger.info("metal4_res has %d polygons" % [count])
+polygons_count  += count
+
+metal5_res     = get_polygons(110, 15)
+count   = metal5_res.count()
+logger.info("metal5_res has %d polygons" % [count])
+polygons_count  += count
+
+metal6_res     = get_polygons(110, 16)
+count   = metal6_res.count()
+logger.info("metal6_res has %d polygons" % [count])
+polygons_count  += count
+
+pr_bndry       = get_polygons(0  , 0 )
+count   = pr_bndry.count()
+logger.info("pr_bndry has %d polygons" % [count])
+polygons_count  += count
+
+border         = get_polygons(63 , 0 )
+count   = border.count()
+logger.info("border has %d polygons" % [count])
+polygons_count  += count
+logger.info("Total no. of polygons in the design is #{polygons_count}")
+
+logger.info("Starting deriving base layers.")
+#=====================================================
+#------------- BASE LAYERS DERIVATIONS ---------------
+#=====================================================
+
+ncomp      =  comp      & nplus
+pcomp      =  comp      & pplus
+tgate      =  poly2     & comp
+ngate      =  nplus     & tgate
+pgate      =  pplus     & tgate
+natcompsd	 = (nat       & comp.interacting(poly2)) - tgate
+
+nom_gate = tgate.not(dualgate)
+thick_gate = tgate.and(dualgate)
+
+ngate_56V = ngate.and(dualgate)
+pgate_56V = pgate.and(dualgate)
+
+ngate_5V = ngate_56V.and(v5_xtor)
+pgate_5V = pgate_56V.and(v5_xtor)
+
+ngate_6V = ngate_56V.not(v5_xtor)
+pgate_6V = pgate_56V.not(v5_xtor)
+
+lvpwell_dn = lvpwell.interacting(dnwell)
+lvpwell_out = lvpwell.not_interacting(dnwell)
+
+
+#================================================
+#------------- LAYERS CONNECTIONS ---------------
+#================================================
+
+if CONNECTIVITY_RULES
+
+  logger.info("Construct connectivity for the design.")
+
+  connect(dnwell,  ncomp)
+  connect(ncomp,  contact)
+  connect(pcomp,  contact)
+
+  connect(lvpwell_out,  pcomp)
+  connect(lvpwell_dn, pcomp)
+
+  connect(nwell,  ncomp)
+  connect(natcompsd,  contact)
+  connect(mvsd,  ncomp)
+  connect(mvpsd,  pcomp)
+  connect(contact,  metal1)
+  connect(metal1,  via1)
+  connect(via1,    metal2)
+  if METAL_LEVEL != "2LM"
+    connect(metal2,  via2)
+    connect(via2,    metal3)
+
+    if METAL_LEVEL != "3LM"
+      connect(metal3,  via3)
+      connect(via3,    metal4)
+      
+      if METAL_LEVEL != "4LM"
+        connect(metal4,  via4)
+        connect(via4,    metal5)
+
+        if METAL_LEVEL != "5LM"
+          connect(metal5,  via5)
+          connect(via5,    metaltop)
+        end
+      end
+    end
+  end
+
+end #CONNECTIVITY_RULES
+
+#================================================
+#------------ PRE-DEFINED FUNCTIONS -------------
+#================================================
+
+def conn_space(layer,conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer.space(conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer.space(not_conn_val.um, mode)
+  singularity_errors = layer.space(0.001.um)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
+  return connected_output, unconnected_output
+end
+
+def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
+  if conn_val > not_conn_val
+    raise "ERROR : Wrong connectivity implementation"
+  end
+  connected_output = layer1.separation(layer2, conn_val.um, mode).polygons(0.001)
+  unconnected_errors_unfiltered = layer1.separation(layer2, not_conn_val.um, mode)
+  # Filter out the errors arising from the same net
+  unconnected_errors = DRC::DRCLayer::new(self, RBA::EdgePairs::new)
+  unconnected_errors_unfiltered.data.each do |ep|
+    net1 = l2n_data.probe_net(layer1.data, ep.first.p1)
+    net2 = l2n_data.probe_net(layer2.data, ep.second.p1)
+    if !net1 || !net2
+      puts "Should not happen ..."
+    elsif net1.circuit != net2.circuit || net1.cluster_id != net2.cluster_id
+      # unconnected
+      unconnected_errors.data.insert(ep)
+    end
+  end
+  unconnected_output = unconnected_errors.polygons(0.001)
+  return connected_output, unconnected_output
+end
+
+# === IMPLICIT EXTRACTION ===
+if CONNECTIVITY_RULES
+  logger.info("Connectivity rules enabled, Netlist object will be generated.")
+  netlist
+end #CONNECTIVITY_RULES
+
+# === LAYOUT EXTENT ===
+CHIP = extent.sized(0.0)
+logger.info("Total area of the design is #{CHIP.area()} um^2.")
+
+#================================================
+#----------------- MAIN RUNSET ------------------
+#================================================
+
+logger.info("Starting GF180MCU DRC rules.")
+if FEOL
+  logger.info("Running all FEOL rules")
+end #FEOL
+
+if BEOL
+  logger.info("Running all BEOL rules")
+end #BEOL
+
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+if FEOL
+
+    #================================================
+    #--------------------YMTP_MK---------------------
+    #================================================
+
+    # Rule Y.NW.2b_3.3V: Min. Nwell Space (Outside DNWELL, Inside YMTP_MK) [Different potential]. is 1µm
+    logger.info("Executing rule Y.NW.2b_3.3V")
+    ynw2b_l1  = nwell.outside(dnwell).inside(ymtp_mk).space(1.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    ynw2b_l1.output("Y.NW.2b_3.3V", "Y.NW.2b_3.3V : Min. Nwell Space (Outside DNWELL, Inside YMTP_MK) [Different potential]. : 1µm")
+    ynw2b_l1.forget
+
+    # Rule Y.NW.2b_5V: Min. Nwell Space (Outside DNWELL, Inside YMTP_MK) [Different potential]. is 1µm
+    logger.info("Executing rule Y.NW.2b_5V")
+    ynw2b_l1  = nwell.outside(dnwell).inside(ymtp_mk).space(1.um, euclidian).polygons(0.001).overlapping(dualgate)
+    ynw2b_l1.output("Y.NW.2b_5V", "Y.NW.2b_5V : Min. Nwell Space (Outside DNWELL, Inside YMTP_MK) [Different potential]. : 1µm")
+    ynw2b_l1.forget
+
+    # rule Y.DF.4d_3.3V is not a DRC check
+
+    # rule Y.DF.4d_5V is not a DRC check
+
+    # Rule Y.DF.6_5V: Min. COMP extend beyond gate (it also means source/drain overhang) inside YMTP_MK. is 0.15µm
+    logger.info("Executing rule Y.DF.6_5V")
+    ydf6_l1 = comp.not(otp_mk).inside(ymtp_mk).enclosing(poly2.inside(ymtp_mk), 0.15.um, euclidian).polygons(0.001).overlapping(dualgate)
+    ydf6_l1.output("Y.DF.6_5V", "Y.DF.6_5V : Min. COMP extend beyond gate (it also means source/drain overhang) inside YMTP_MK. : 0.15µm")
+    ydf6_l1.forget
+
+    # Rule Y.DF.16_3.3V: Min. space from (Nwell outside DNWELL) to (unrelated NCOMP outside Nwell and DNWELL) (inside YMTP_MK). is 0.27µm
+    logger.info("Executing rule Y.DF.16_3.3V")
+    ydf16_l1  = ncomp.outside(nwell).outside(dnwell).separation(nwell.outside(dnwell), 0.27.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    ydf16_l1.output("Y.DF.16_3.3V", "Y.DF.16_3.3V : Min. space from (Nwell outside DNWELL) to (unrelated NCOMP outside Nwell and DNWELL) (inside YMTP_MK). : 0.27µm")
+    ydf16_l1.forget
+
+    # Rule Y.DF.16_5V: Min. space from (Nwell outside DNWELL) to (unrelated NCOMP outside Nwell and DNWELL) (inside YMTP_MK). is 0.23µm
+    logger.info("Executing rule Y.DF.16_5V")
+    ydf16_l1  = ncomp.outside(nwell).outside(dnwell).separation(nwell.outside(dnwell), 0.23.um, euclidian).polygons(0.001).overlapping(dualgate)
+    ydf16_l1.output("Y.DF.16_5V", "Y.DF.16_5V : Min. space from (Nwell outside DNWELL) to (unrelated NCOMP outside Nwell and DNWELL) (inside YMTP_MK). : 0.23µm")
+    ydf16_l1.forget
+
+    # Rule Y.PL.1_3.3V: Interconnect Width (inside YMTP_MK). is 0.13µm
+    logger.info("Executing rule Y.PL.1_3.3V")
+    ypl1_l1  = poly2.outside(plfuse).and(ymtp_mk).width(0.13.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    ypl1_l1.output("Y.PL.1_3.3V", "Y.PL.1_3.3V : Interconnect Width (inside YMTP_MK). : 0.13µm")
+    ypl1_l1.forget
+
+    # Rule Y.PL.1_5V: Interconnect Width (inside YMTP_MK). This rule is currently not applicable for 5V.
+    logger.info("Executing rule Y.PL.1_5V")
+    ypl1_l1 = poly2.outside(plfuse).and(ymtp_mk).overlapping(dualgate)
+    ypl1_l1.output("Y.PL.1_5V", "Y.PL.1_5V : Interconnect Width (inside YMTP_MK). This rule is currently not applicable for 5V.")
+    ypl1_l1.forget
+
+    # Rule Y.PL.2_3.3V: Gate Width (Channel Length) (inside YMTP_MK). is 0.13µm
+    logger.info("Executing rule Y.PL.2_3.3V")
+    ypl2_l1  = poly2.edges.and(tgate.edges).not(otp_mk).and(ymtp_mk).width(0.13.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    ypl2_l1.output("Y.PL.2_3.3V", "Y.PL.2_3.3V : Gate Width (Channel Length) (inside YMTP_MK). : 0.13µm")
+    ypl2_l1.forget
+
+    # Rule Y.PL.2_5V: Gate Width (Channel Length) (inside YMTP_MK). is 0.47µm
+    logger.info("Executing rule Y.PL.2_5V")
+    ypl2_l1  = poly2.edges.and(tgate.edges).not(otp_mk).and(ymtp_mk).width(0.47.um, euclidian).polygons(0.001).overlapping(dualgate)
+    ypl2_l1.output("Y.PL.2_5V", "Y.PL.2_5V : Gate Width (Channel Length) (inside YMTP_MK). : 0.47µm")
+    ypl2_l1.forget
+
+    # Rule Y.PL.4_5V: Poly2 extension beyond COMP to form Poly2 end cap (inside YMTP_MK). is 0.16µm
+    logger.info("Executing rule Y.PL.4_5V")
+    ypl4_l1 = poly2.and(ymtp_mk).enclosing(comp.and(ymtp_mk), 0.16.um, euclidian).polygons(0.001).overlapping(dualgate)
+    ypl4_l1.output("Y.PL.4_5V", "Y.PL.4_5V : Poly2 extension beyond COMP to form Poly2 end cap (inside YMTP_MK). : 0.16µm")
+    ypl4_l1.forget
+
+    # Rule Y.PL.5a_3.3V: Space from field Poly2 to unrelated COMP (inside YMTP_MK). Space from field Poly2 to Guard-ring (inside YMTP_MK). is 0.04µm
+    logger.info("Executing rule Y.PL.5a_3.3V")
+    ypl5a_l1  = poly2.and(ymtp_mk).separation(comp.and(ymtp_mk), 0.04.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    ypl5a_l1.output("Y.PL.5a_3.3V", "Y.PL.5a_3.3V : Space from field Poly2 to unrelated COMP (inside YMTP_MK). Space from field Poly2 to Guard-ring (inside YMTP_MK). : 0.04µm")
+    ypl5a_l1.forget
+
+    # Rule Y.PL.5a_5V: Space from field Poly2 to unrelated COMP (inside YMTP_MK). Space from field Poly2 to Guard-ring (inside YMTP_MK). is 0.2µm
+    logger.info("Executing rule Y.PL.5a_5V")
+    ypl5a_l1  = poly2.and(ymtp_mk).separation(comp.and(ymtp_mk), 0.2.um, euclidian).polygons(0.001).overlapping(dualgate)
+    ypl5a_l1.output("Y.PL.5a_5V", "Y.PL.5a_5V : Space from field Poly2 to unrelated COMP (inside YMTP_MK). Space from field Poly2 to Guard-ring (inside YMTP_MK). : 0.2µm")
+    ypl5a_l1.forget
+
+    # Rule Y.PL.5b_3.3V: Space from field Poly2 to related COMP (inside YMTP_MK). is 0.04µm
+    logger.info("Executing rule Y.PL.5b_3.3V")
+    ypl5b_l1  = poly2.and(ymtp_mk).separation(comp.and(ymtp_mk), 0.04.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
+    ypl5b_l1.output("Y.PL.5b_3.3V", "Y.PL.5b_3.3V : Space from field Poly2 to related COMP (inside YMTP_MK). : 0.04µm")
+    ypl5b_l1.forget
+
+    # Rule Y.PL.5b_5V: Space from field Poly2 to related COMP (inside YMTP_MK). is 0.2µm
+    logger.info("Executing rule Y.PL.5b_5V")
+    ypl5b_l1  = poly2.and(ymtp_mk).separation(comp.and(ymtp_mk), 0.2.um, euclidian).polygons(0.001).overlapping(dualgate)
+    ypl5b_l1.output("Y.PL.5b_5V", "Y.PL.5b_5V : Space from field Poly2 to related COMP (inside YMTP_MK). : 0.2µm")
+    ypl5b_l1.forget
+
+    # rule Y.PL.6_3.3V is not a DRC check
+
+    # rule Y.PL.6_5V is not a DRC check
+
+    # rule Y.LU.3_3.3V is not yet implemented
+
+    # rule Y.LU.3_5V is not yet implemented
+
+end #FEOL
+
+################################################################################################
+# 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.
+################################################################################################
+
+
+
+exec_end_time = Time.now
+run_time = exec_end_time - exec_start_time
+logger.info("%s DRC Total Run time %f seconds" % [table_name, run_time])
+
+
diff --git a/tapeout/outputs/oas/caravel_18000abd.oas b/tapeout/outputs/oas/caravel_18000abd.oas
index 82f6e25..7d17274 100644
--- a/tapeout/outputs/oas/caravel_18000abd.oas
+++ b/tapeout/outputs/oas/caravel_18000abd.oas
Binary files differ