From 653ffb66e876022cabb73e96d4a7995332452ad5 Mon Sep 17 00:00:00 2001 From: FaragElsayed2 Date: Wed, 26 Apr 2023 09:41:51 +0200 Subject: [PATCH 1/2] Adding MIM-B table for GF180MCU DRC --- klayout/drc/rule_decks/mim_b.drc | 149 + klayout/drc/testing/testcases/unit/mim_b.gds | Bin 0 -> 210514 bytes klayout/drc/testing/testcases/unit/mim_b.svg | 3076 ++++++++++++++++++ 3 files changed, 3225 insertions(+) create mode 100644 klayout/drc/rule_decks/mim_b.drc create mode 100644 klayout/drc/testing/testcases/unit/mim_b.gds create mode 100644 klayout/drc/testing/testcases/unit/mim_b.svg diff --git a/klayout/drc/rule_decks/mim_b.drc b/klayout/drc/rule_decks/mim_b.drc new file mode 100644 index 00000000..4dc3435f --- /dev/null +++ b/klayout/drc/rule_decks/mim_b.drc @@ -0,0 +1,149 @@ +# frozen_string_literal: true + +################################################################################################ +# 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 MIM_OPTION == 'B' + #================================================ + #-------------MIM CAPACITOR OPTION B------------- + #================================================ + + logger.info('Starting MIM Capacitor Option B derivations') + + topmin1_metal_fusetop = topmin1_metal.interacting(fusetop) + mimtm_virtual = fusetop.sized(1.06.um).and(topmin1_metal_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) + 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') + mimtm_via = top_via.overlapping(mimtm_virtual) + mimtm2_l1 = mimtm_via.enclosed(topmin1_metal, 0.4.um, euclidian).polygons(0.001.um) + mimtm2_l2 = mimtm_via.not_outside(topmin1_metal).not(topmin1_metal) + mimtm2_l = mimtm2_l1.join(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 + mimtm_via.forget + + # Rule MIMTM.3: Minimum MiM bottom plate overlap of Top plate is 0.6um. + logger.info('Executing rule MIMTM.3') + mimtm3_l1 = fusetop.enclosed(mimtm_virtual, 0.6.um).polygons(0.001.um) + mimtm3_l2 = fusetop.not_inside(mimtm_virtual) + mimtm3_l = mimtm3_l1.join(mimtm3_l2) + mimtm3_l.output('MIMTM.3', 'MIMTM.3 : Minimum MiM bottom plate overlap of Top plate: 0.6um') + mimtm3_l.forget + mimtm3_l1.forget + mimtm3_l2.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.um) + mimtm4_l2 = top_via.not_outside(fusetop).not(fusetop) + mimtm4_l = mimtm4_l1.join(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) + 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) + 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 is 0um. + logger.info('Executing rule MIMTM.7') + mimtm7_l1 = fusetop.not(cap_mk) + mimtm7_l1.output('MIMTM.7', 'MIMTM.7 : Min FuseTop enclosure by CAP_MK: 0um') + mimtm7_l1.forget + + # Rule MIMTM.8a: Minimum MIM cap area (defined by FuseTop area) 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): 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(10_000.um, nil).not_in(fusetop.with_area(10_000.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) + 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_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 + + # 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. + logger.info('Executing rule MIMTM.11') + mimtm11_large_topmin1_metal = topmin1_metal_fusetop.with_area(10_000, 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) + next unless fuse_in_polygon.area > 10_000 + + 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.positive? && mimtm11_large_topmin1_metal_violation.data.insert(b) + end + end + 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.') + mimtm11_l1.forget + mimtm11_large_topmin1_metal.forget + mimtm11_large_topmin1_metal_violation.forget + topmin1_metal_fusetop.forget + + # Rule MIMTM.12 is not a DRC check + # Please refer to https://gf180mcu-pdk.readthedocs.io/en/latest/physical_verification/design_manual/drm_10_4_2.html + +end diff --git a/klayout/drc/testing/testcases/unit/mim_b.gds b/klayout/drc/testing/testcases/unit/mim_b.gds new file mode 100644 index 0000000000000000000000000000000000000000..bdd089f5a66e9e9b2d0e3e7ea97e4ff4ec5db377 GIT binary patch literal 210514 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 DfQ9U& literal 0 HcmV?d00001 diff --git a/klayout/drc/testing/testcases/unit/mim_b.svg b/klayout/drc/testing/testcases/unit/mim_b.svg new file mode 100644 index 00000000..e64a8979 --- /dev/null +++ b/klayout/drc/testing/testcases/unit/mim_b.svg @@ -0,0 +1,3076 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +MIMTM.8b +BASIC +This case will be PASS or FAIL depend on whether interconnect of diff layer be treated as COMMON. Would require full connectivity in the deck if YES. +CONNECT BY SAME COMMON PLATE METAL +vt1b +vt1a +CONNECT BY SAME COMMON PLATE METAL +No offset being used for this. +This case will be PASS or FAIL depend on whether interconnect of same layer be treated as COMMON +No offset being used for this. +Recommend to use Fuse size of 1um x 1um for ease of calculation +MIMTM.11 +MIMTM.8a +MIMTM.8a +MIMTM.2 +MIMTM.2 +MIMTM.10 +MIMTM.10 +MIMTM.9 +MIMTM.9 +MIMTM.9 +MIMTM.9 +MIMTM.9 +MIMTM.9 +MIMTM.9 +MIMTM.9 +MIMTM.9 +MIMTM.9 +MIMTM.7 +MIMTM.7 +MIMTM.7 +MIMTM.7 +MIMTM.7 +MIMTM.7 +MIMTM.7 +MIMTM.6 +MIMTM.6 +MIMTM.6 +MIMTM.6 +MIMTM.6 +MIMTM.6 +MIMTM.6 +MIMTM.6 +MIMTM.6 +MIMTM.6 +MIMTM.5 +MIMTM.5 +MIMTM.5 +MIMTM.5 +MIMTM.5 +MIMTM.5 +MIMTM.5 +MIMTM.5 +MIMTM.5 +MIMTM.5 +MIMTM.5 +MIMTM.4 +MIMTM.4 +MIMTM.4 +MIMTM.4 +MIMTM.4 +MIMTM.4 +MIMTM.4 +MIMTM.4 +MIMTM.4 +MIMTM.4 +MIMTM.4 +MIMTM.3 +MIMTM.3 +MIMTM.3 +MIMTM.3 +MIMTM.3 +MIMTM.3 +MIMTM.3 +MIMTM.3 +MIMTM.3 +MIMTM.3 +MIMTM.3 +MIMTM.3 +MIMTM.1 +MIMTM.1 +MIMTM.1 +MIMTM.1 +MIMTM.1 +MIMTM.1 +MIMTM.1 +MIMTM.1 +MIMTM.1 +MIMTM.11 +MIMTM.11 +MIMTM.11 +MIMTM.11 +MIMTM.8b +MIMTM.8b +MIMTM.8b +Basic +MIMTM.8a +Basic +v_t3 +v_t2 +v_t1 +v_b3 +Target layer remove for Pass case. No error allowed. +v2 +v_l4 +v1 +v_l1 +v_b1 +v3 +v_l3 +Via space is (conSize * conSpaceFactor) +To locate alignment, see the text on each via +For Pass, offset = 0.0. For Fail, offset = -minGrid +v_b2 +Fuse size should be large enough to handle the number of vias +v_l2 +v_t3 +v_t2 +v_t1 +v_b3 +Target layer remove for Pass case. No error allowed. +v2 +v_l4 +v1 +v_l1 +v_b1 +v3 +v_l3 +Via space is (conSize * conSpaceFactor) +To locate alignment, see the text on each via +For Pass, offset = 0.0. For Fail, offset = -minGrid +v_b2 +Fuse size should be large enough to handle the number of vias +v_l2 +MIMTM.2 +P7 +P6 +P4 +P3 +P1 +P2 +P7 +P6 +P4 +P3 +P1 +P2 +MIMTM.10 +Using offset*2 +Cor2Cor_45Deg +Space +MIMTM.9 +Using offset*2 +Cor2Cor_45Deg +Singular +Space +Using offset*2 +Cor2Cor_45Deg +Space +MIMTM.9 +Using offset*2 +Cor2Cor_45Deg +Singular +Space +LIMITATION DEPENDENCIES: priWidth > secOvlpPriSide, priWidth>secOvlpPriTopBot, +Touch +Basic +MIMTM.7 +LIMITATION DEPENDENCIES: priWidth > secOvlpPriSide, priWidth>secOvlpPriTopBot, +PriEnclSec +Outside +Basic +Intersect +Hole +Enclose +Corner2Corner +Corner2Edge +Singular +Overlap +Touch +Space +MIMTM.6 +Cor2Cor_90Deg +Notch +45deg +Enclose +Corner2Corner +Corner2Edge +Singular +Overlap +Touch +Space +Enclose +Corner2Corner +Corner2Edge +Singular +Overlap +Touch +Space +MIMTM.5 +Cor2Cor_90Deg +Notch +45deg +Enclose +Corner2Corner +Corner2Edge +Singular +Overlap +Touch +Space +Cor2Cor_90Deg +Notch +45deg +Cor2Cor_90Deg +Notch +45deg +LIMITATION DEPENDENCIES: priWidth > secOvlpPriSide, priWidth>secOvlpPriTopBot, +Angle45 +Basic +Cor2Edge +MIMTM.4 +LIMITATION DEPENDENCIES: priWidth > secOvlpPriSide, priWidth>secOvlpPriTopBot, +PriEnclSec +Angle45 +Touch +Basic +Intersect +Cor2Edge +Singular +Hole +LIMITATION DEPENDENCIES: priWidth > secOvlpPriSide, priWidth>secOvlpPriTopBot, +Angle45 +Basic +Cor2Edge +MIMTM.3 +LIMITATION DEPENDENCIES: priWidth > secOvlpPriSide, priWidth>secOvlpPriTopBot, +PriEnclSec +Outside +Angle45 +Touch +Basic +Intersect +Cor2Edge +Singular +Hole +When metalplate smaller/equal to virtual, follow MIM spacing +Connected +Metal Plate to Routing (MetalPlate2Metal) +MetalPlate equal Virtual +Basic Same Potential (Pass case only) +Basic DIff Potential +Virtual should be larger than MetalPlate +Virtual and MetalPlate same size +Metal Plate to Routing (MetalPlate2Metal + offset) +Metal Plate to Routing (MetalPlate2Metal + offset) +Diff Metal Plate (MetalPlate2Metal + offset) +Same Metal Plate (small gap between Virtual) +When metalplate smaller/equal to virtual, follow MIM spacing +Connected +Metal Plate to Routing (MetalPlate2Metal) +MetalPlate equal Virtual +Basic Same Potential (Pass case only) +Basic DIff Potential +Virtual should be larger than MetalPlate +Virtual and MetalPlate same size +Metal Plate to Routing (MetalPlate2Metal + offset) +Metal Plate to Routing (MetalPlate2Metal + offset) +Diff Metal Plate (MetalPlate2Metal + offset) +Same Metal Plate (small gap between Virtual) +MIMTM.1 +No offset being used for this. +This case will be PASS or FAIL depend on whether interconnect of same layer be treated as COMMON +No offset being used for this. +CONNECT BY SAME COMMON PLATE METAL +CONNECT BY SAME COMMON PLATE METAL +This case will be PASS or FAIL depend on whether interconnect of diff layer be treated as COMMON. Would require full connectivity in the deck if YES. +BASIC +Recommend to use Fuse size of 1um x 1um for ease of calculation + + \ No newline at end of file From 0aa7f09650051af7c23fe11e89fb8670c1cd9781 Mon Sep 17 00:00:00 2001 From: FaragElsayed2 Date: Mon, 12 Jun 2023 11:03:23 +0300 Subject: [PATCH 2/2] Adding comment for MIM-B general deriv --- klayout/drc/rule_decks/mim_b.drc | 1 + 1 file changed, 1 insertion(+) diff --git a/klayout/drc/rule_decks/mim_b.drc b/klayout/drc/rule_decks/mim_b.drc index 4dc3435f..7e4188b3 100644 --- a/klayout/drc/rule_decks/mim_b.drc +++ b/klayout/drc/rule_decks/mim_b.drc @@ -24,6 +24,7 @@ if MIM_OPTION == 'B' logger.info('Starting MIM Capacitor Option B derivations') topmin1_metal_fusetop = topmin1_metal.interacting(fusetop) + # mimtm_virtual: Used for MIMTM.1,2,3 mimtm_virtual = fusetop.sized(1.06.um).and(topmin1_metal_fusetop) # Rule MIMTM.1: Minimum MiM bottom plate spacing to the bottom plate metal