From 74c2e73cd3e311d2ace98d0734991d7db95ea96f Mon Sep 17 00:00:00 2001 From: FaragElsayed2 Date: Mon, 3 Apr 2023 17:04:51 +0200 Subject: [PATCH] Adding PRES table for GF180MCU DRC --- klayout/drc/rule_decks/pres.drc | 110 ++++ klayout/drc/testing/testcases/unit/pres.gds | Bin 0 -> 70460 bytes klayout/drc/testing/testcases/unit/pres.svg | 658 ++++++++++++++++++++ 3 files changed, 768 insertions(+) create mode 100644 klayout/drc/rule_decks/pres.drc create mode 100644 klayout/drc/testing/testcases/unit/pres.gds create mode 100644 klayout/drc/testing/testcases/unit/pres.svg diff --git a/klayout/drc/rule_decks/pres.drc b/klayout/drc/rule_decks/pres.drc new file mode 100644 index 00000000..e823d885 --- /dev/null +++ b/klayout/drc/rule_decks/pres.drc @@ -0,0 +1,110 @@ +# 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 FEOL + #================================================ + #----------------P+ POLY RESISTOR---------------- + #================================================ + + logger.info('Starting PRES derivations') + 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) + 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) + 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.um) + pres3_l2 = comp.not_outside(pres_poly) + pres3_l = pres3_l1.or(pres3_l2) + pres3_l.output('PRES.3', 'PRES.3 : Minimum space from Poly2 resistor to COMP.') + pres3_l.forget + pres3_l1.forget + pres3_l2.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) + 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 = pres_poly.enclosed(pplus, 0.3.um, euclidian).polygons(0.001.um) + 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 = pres_poly.enclosed(sab, 0.28.um) + 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.and(pres_poly).separation(sab, 0.22.um).polygons(0.001.um) + pres7_l2 = contact.and(pres_poly).interacting(sab) + pres7_l = pres7_l1.or(pres7_l2) + pres7_l.output('PRES.7', 'PRES.7 : Space from salicide block to contact on Poly2 resistor.') + pres7_l1.forget + pres7_l2.forget + + # Rule PRES.8 is not a DRC check + ## Please refer to https://gf180mcu-pdk.readthedocs.io/en/latest/physical_verification/design_manual/drm_10_01.html#p-poly-resistor-pres + + # 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') + mk_pres9a = res_mk.edges.not(poly2.and(pplus).and(sab).edges).inside_part(poly2) + 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 + + # 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 = res_mk.with_area(15_000.001.um, nil).edges.with_length(80.001.um, nil) + pres9b_l1 = pres9b.separation(res_mk.edges, 20.um) + 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 diff --git a/klayout/drc/testing/testcases/unit/pres.gds b/klayout/drc/testing/testcases/unit/pres.gds new file mode 100644 index 0000000000000000000000000000000000000000..6a3a528975d5db643fa72d1100f24f5f3ed45de2 GIT binary patch literal 70460 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 literal 0 HcmV?d00001 diff --git a/klayout/drc/testing/testcases/unit/pres.svg b/klayout/drc/testing/testcases/unit/pres.svg new file mode 100644 index 00000000..703e3877 --- /dev/null +++ b/klayout/drc/testing/testcases/unit/pres.svg @@ -0,0 +1,658 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +PRES.9a +PRES.9a +PRES.9a +PRES.9a +PRES.9b +PRES.9b +PRES.9b +PRES.9b +PRES.9b +PRES.1 +PRES.1 +PRES.9a +PRES.9a +PRES.9a +PRES.9a +PRES.9a +PRES.9a +PRES.9a +PRES.1 +PRES.1 +PRES.1 +PRES.1 +PRES.1 +PRES.9a +PRES.7 +PRES.7 +PRES.1 +PRES.7 +PRES.7 +PRES.7 +PRES.7 +PRES.7 +PRES.7 +PRES.7 +PRES.1 +PRES.1 +PRES.1 +PRES.1 +PRES.1 +PRES.7 +PRES.7 +PRES.6 +PRES.6 +PRES.6 +PRES.6 +PRES.6 +PRES.6 +PRES.6 +PRES.6 +PRES.5 +PRES.5 +PRES.5 +PRES.5 +PRES.5 +PRES.5 +PRES.5 +PRES.5 +PRES.5 +PRES.5 +PRES.5 +PRES.2 +PRES.2 +PRES.2 +PRES.2 +PRES.2 +PRES.2 +PRES.2 +PRES.2 +PRES.2 +PRES.2 +PRES.2 +PRES.3 +PRES.3 +PRES.5 +PRES.5 +PRES.5 +PRES.4 +PRES.4 +PRES.4 +PRES.4 +PRES.4 +PRES.4 +PRES.3 +PRES.3 +PRES.3 +PRES.3 +PRES.3 +PRES.4 +PRES.4 +PRES.4 +PRES.4 +PRES.4 +PRES.3 +PRES.3 +PRES.3 +PRES.3 +PRES.3 +PRES.3 +PRES.3 +PRES.3 + + \ No newline at end of file