From 73e7029238dfa3787864203a08a3fef56221c30a Mon Sep 17 00:00:00 2001 From: FaragElsayed2 Date: Mon, 3 Apr 2023 17:03:22 +0200 Subject: [PATCH 1/5] Adding HRES table for GF180MCU DRC --- klayout/drc/rule_decks/hres.drc | 150 ++++ klayout/drc/testing/testcases/unit/hres.gds | Bin 0 -> 78832 bytes klayout/drc/testing/testcases/unit/hres.svg | 935 ++++++++++++++++++++ 3 files changed, 1085 insertions(+) create mode 100644 klayout/drc/rule_decks/hres.drc create mode 100644 klayout/drc/testing/testcases/unit/hres.gds create mode 100644 klayout/drc/testing/testcases/unit/hres.svg diff --git a/klayout/drc/rule_decks/hres.drc b/klayout/drc/rule_decks/hres.drc new file mode 100644 index 00000000..5d422d8c --- /dev/null +++ b/klayout/drc/rule_decks/hres.drc @@ -0,0 +1,150 @@ +# 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 + #================================================ + #----------------H POLY RESISTOR----------------- + #================================================ + + logger.info('Starting HRES derivations') + 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) + 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) + 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) + 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 = hres_poly.enclosed(resistor, 0.4.um, euclidian).polygons(0.001.um) + 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) + 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.um) + hres6_l2 = comp.not_outside(resistor.interacting(hres1_poly)) + hres6_l = hres6_l1.or(hres6_l2) + hres6_l.output('HRES.6', 'HRES.6 : Minimum RESISTOR space to COMP.') + hres6_l.forget + hres6_l1.forget + hres6_l2.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 = contact.and(hres_poly).enclosed(pplus, 0.2.um, euclidian).polygons(0.001.um) + hres7_l2 = contact.and(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.and(hres_poly).separation(sab, + 0.22.um).polygons(0.001.um).or(contact.and(hres_poly).interacting(sab)) + hres8_l1.output('HRES.8', 'HRES.8 : Space from salicide block to contact on Poly2 resistor.') + hres8_l1.forget + + # Rule HRES.9: Minimum salicide block overlap of Poly2 resistor in width direction. + logger.info('Executing rule HRES.9') + 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.um, 0.001.um).interacting( + hres9_clear_sab, 1, 1 + ) + hres9_sab_hole = hres9_sab.holes.and(hres_poly) + hres9_l1 = hres_poly.enclosed(hres9_sab, 0.28.um, euclidian).polygons(0.001.um) + hres9_l2 = hres9_bad_inside_edge.or(hres9_sab_hole) + hres9_l = hres9_l1.or(hres9_l2) + hres9_l.output('HRES.9', 'HRES.9 : Minimum salicide block overlap of Poly2 resistor in width direction.') + hres9_l.forget + hres9_l1.forget + hres9_l2.forget + hres9_sab.forget + hres9_clear_sab.forget + hres9_bad_inside_edge.forget + hres9_sab_hole.forget + + # Rule HRES.10: Minimum & maximum Pplus overlap of SAB. + logger.info('Executing rule HRES.10') + pplus1_hres10 = pplus.and(sab).drc(width != 0.1.um) + pplus2_hres10 = pplus.not_overlapping(sab).edges + hres10_l1 = pplus1_hres10.or(pplus2_hres10).extended(0, 0, 0.001.um, 0.001.um).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 + ## Please refer to https://gf180mcu-pdk.readthedocs.io/en/latest/physical_verification/design_manual/drm_10_03.html#hres-poly-resistor-phres-optional-with-one-additional-mask + + # 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') + mk_hres12a = res_mk.edges.not(poly2.not(pplus).and(sab).edges).inside_part(poly2) + 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 + + # 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 = res_mk.with_area(15_000.001.um, nil).edges.with_length(80.001.um, nil) + hres12b_l1 = hres12b.separation(res_mk.edges, 20.um) + 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 diff --git a/klayout/drc/testing/testcases/unit/hres.gds b/klayout/drc/testing/testcases/unit/hres.gds new file mode 100644 index 0000000000000000000000000000000000000000..9418f5b5e9a30e7dd1699bfba0b248425975dda8 GIT binary patch literal 78832 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 Qf@*6Tt + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +HRES.12a +HRES.12a +HRES.12a +HRES.12a +HRES.12a +HRES.12a +HRES.12a +HRES.12a +HRES.12a +HRES.12a +HRES.12a +HRES.12a +HRES.10 +HRES.10 +HRES.10 +HRES.10 +HRES.10 +HRES.12b +HRES.12b +HRES.1 +HRES.1 +HRES.1 +HRES.1 +HRES.1 +45deg +Corner2Corner +Corner2Edge +Space +HRES.1 +HRES.1 +HRES.1 +HRES.1 +HRES.1 +HRES.1 +HRES.1 +HRES.1 +Cor2Cor_90Deg +45deg +Corner2Corner +Corner2Edge +Singular +Space +HRES.2 +HRES.2 +HRES.2 +HRES.2 +HRES.2 +HRES.2 +HRES.2 +HRES.2 +HRES.2 +HRES.2 +Width_45deg +Corner_45Deg +Corner2Corner +Width +Default Pass. Minus 2xMinGrid to Fail +HRES.2 +Width_45deg +Corner_45Deg +Corner2Corner +Width +Default Pass. Minus 2xMinGrid to Fail +HRES.3 +HRES.3 +HRES.3 +HRES.3 +HRES.3 +HRES.3 +Notch +45deg +Corner2Corner +Corner2Edge +Space +HRES.3 +HRES.3 +HRES.3 +HRES.3 +HRES.3 +HRES.3 +HRES.3 +HRES.3 +HRES.3 +Cor2Cor_90Deg +Notch +45deg +Corner2Corner +Corner2Edge +Singular +Space +HRES.4 +Basic +Angle45 +HRES.4 +HRES.4 +HRES.4 +HRES.4 +Touch +Basic +Intersect +Angle45 +Singular +HRES.4 +HRES.4 +HRES.4 +HRES.4 +HRES.4 +HRES.5 +HRES.5 +HRES.5 +HRES.5 +HRES.5 +HRES.5 +HRES.5 +HRES.5 +HRES.5 +HRES.5 +HRES.5 +HRES.5 +45deg +Corner2Corner +Corner2Edge +Space +HRES.5 +Cor2Cor_90Deg +45deg +Corner2Corner +Corner2Edge +Singular +Space +HRES.6 +HRES.6 +HRES.6 +HRES.6 +HRES.6 +HRES.6 +HRES.6 +HRES.6 +HRES.6 +HRES.6 +HRES.6 +HRES.6 +45deg +Corner2Corner +Corner2Edge +Space +HRES.6 +Cor2Cor_90Deg +45deg +Corner2Corner +Corner2Edge +Singular +Space +HRES.7 +Basic +Angle45 +HRES.7 +HRES.7 +HRES.7 +HRES.7 +Touch +Basic +Intersect +Angle45 +Singular +HRES.7 +HRES.7 +HRES.7 +HRES.7 +HRES.7 +HRES.8 +HRES.8 +Space +HRES.8 +HRES.8 +HRES.8 +HRES.8 +Touch +Space +HRES.9 +Basic +HRES.9 +HRES.9 +HRES.9 +Touch +Basic +Intersect +Angle45 +Singular +Hole +HRES.9 +HRES.9 +HRES.9 +HRES.9 +HRES.9 +HRES.9 +HRES.10 +HRES.10 +HRES.10 +HRES.10 +HRES.10 +HRES.10 +HRES.10 +HRES.10 +HRES.10 +HRES.10 +HRES.10 + + \ No newline at end of file From 4158bc132202c5df3d0891a24f21553fdc896fca Mon Sep 17 00:00:00 2001 From: FaragElsayed2 Date: Wed, 5 Apr 2023 14:41:02 +0200 Subject: [PATCH 2/5] Updating comments for DRC rules --- klayout/drc/rule_decks/hres.drc | 49 ++++++++++++++++----------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/klayout/drc/rule_decks/hres.drc b/klayout/drc/rule_decks/hres.drc index 5d422d8c..fcf6c880 100644 --- a/klayout/drc/rule_decks/hres.drc +++ b/klayout/drc/rule_decks/hres.drc @@ -25,80 +25,79 @@ if FEOL 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 + # Rule HRES.1: Minimum space is 0.4µm. Note: Merge if the spacing is less than 0.4 um. logger.info('Executing rule HRES.1') hres1_l1 = resistor.interacting(hres1_poly).space(0.4.um, euclidian) - 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.output('HRES.1', 'HRES.1 : Minimum space: 0.4µm. Note: Merge if the spacing is less than 0.4 um.') hres1_l1.forget - # Rule HRES.2: Minimum width of Poly2 resistor. is 1µm + # 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) - hres2_l1.output('HRES.2', 'HRES.2 : Minimum width of Poly2 resistor. : 1µm') + 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 + # 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) - hres3_l1.output('HRES.3', 'HRES.3 : Minimum space between Poly2 resistors. : 0.4µm') + 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 + # Rule HRES.4: Minimum RESISTOR overlap of Poly2 resistor is 0.4µm. logger.info('Executing rule HRES.4') hres4_l1 = hres_poly.enclosed(resistor, 0.4.um, euclidian).polygons(0.001.um) 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_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 + # 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) - hres5_l1.output('HRES.5', 'HRES.5 : Minimum RESISTOR space to unrelated Poly2. : 0.3µm') + 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. + # Rule HRES.6: Minimum RESISTOR space to COMP is 0.3.um. logger.info('Executing rule HRES.6') hres6_l1 = resistor.interacting(hres1_poly).separation(comp, 0.3.um, euclidian).polygons(0.001.um) hres6_l2 = comp.not_outside(resistor.interacting(hres1_poly)) hres6_l = hres6_l1.or(hres6_l2) - hres6_l.output('HRES.6', 'HRES.6 : Minimum RESISTOR space to COMP.') + hres6_l.output('HRES.6', 'HRES.6 : Minimum RESISTOR space to COMP: 0.3um') hres6_l.forget hres6_l1.forget hres6_l2.forget hres1_poly.forget - # Rule HRES.7: Minimum Pplus overlap of contact on Poly2 resistor. is 0.2µm + # Rule HRES.7: Minimum Pplus overlap of contact on Poly2 resistor is 0.2µm. logger.info('Executing rule HRES.7') hres7_l1 = contact.and(hres_poly).enclosed(pplus, 0.2.um, euclidian).polygons(0.001.um) hres7_l2 = contact.and(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_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. + # Rule HRES.8: Minimum space from salicide block to contact on Poly2 resistor is 0.22.um. logger.info('Executing rule HRES.8') hres8_l1 = contact.and(hres_poly).separation(sab, 0.22.um).polygons(0.001.um).or(contact.and(hres_poly).interacting(sab)) - hres8_l1.output('HRES.8', 'HRES.8 : Space from salicide block to contact on Poly2 resistor.') + hres8_l1.output('HRES.8', 'HRES.8 : Minimum space from salicide block to contact on Poly2 resistor: 0.22.um') hres8_l1.forget - # Rule HRES.9: Minimum salicide block overlap of Poly2 resistor in width direction. + # Rule HRES.9: Minimum salicide block overlap of Poly2 resistor in width direction is 0.28.um. logger.info('Executing rule HRES.9') 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.um, 0.001.um).interacting( - hres9_clear_sab, 1, 1 - ) + hres9_bad_inside_edge = hres9_sab.edges.inside_part(hres_poly).extended(0, 0, 0.001.um, 0.001.um) + .interacting(hres9_clear_sab, 1, 1) hres9_sab_hole = hres9_sab.holes.and(hres_poly) hres9_l1 = hres_poly.enclosed(hres9_sab, 0.28.um, euclidian).polygons(0.001.um) hres9_l2 = hres9_bad_inside_edge.or(hres9_sab_hole) hres9_l = hres9_l1.or(hres9_l2) - hres9_l.output('HRES.9', 'HRES.9 : Minimum salicide block overlap of Poly2 resistor in width direction.') + hres9_l.output('HRES.9', 'HRES.9 : Minimum salicide block overlap of Poly2 resistor in width direction: 0.28.um') hres9_l.forget hres9_l1.forget hres9_l2.forget @@ -107,12 +106,12 @@ if FEOL hres9_bad_inside_edge.forget hres9_sab_hole.forget - # Rule HRES.10: Minimum & maximum Pplus overlap of SAB. + # Rule HRES.10: Minimum & maximum Pplus overlap of SAB is 0.1.um logger.info('Executing rule HRES.10') pplus1_hres10 = pplus.and(sab).drc(width != 0.1.um) pplus2_hres10 = pplus.not_overlapping(sab).edges hres10_l1 = pplus1_hres10.or(pplus2_hres10).extended(0, 0, 0.001.um, 0.001.um).interacting(hres_poly) - hres10_l1.output('HRES.10', 'HRES.10 : Minimum & maximum Pplus overlap of SAB.') + hres10_l1.output('HRES.10', 'HRES.10 : Minimum & maximum Pplus overlap of SAB: 0.1.um') hres10_l1.forget pplus1_hres10.forget pplus2_hres10.forget @@ -135,14 +134,14 @@ if FEOL # 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 + ## Then the minimum spacing to adjacent RES_MK layer is 20µm. logger.info('Executing rule HRES.12b') hres12b = res_mk.with_area(15_000.001.um, nil).edges.with_length(80.001.um, nil) hres12b_l1 = hres12b.separation(res_mk.edges, 20.um) 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') + Then the minimum spacing to adjacent RES_MK layer: 20µm') hres12b_l1.forget hres12b.forget hres_poly.forget From f54052606f46e4a734f5aa6564e52dcab4a24781 Mon Sep 17 00:00:00 2001 From: FaragElsayed2 Date: Wed, 5 Apr 2023 14:57:05 +0200 Subject: [PATCH 3/5] Optimizing some derivations for HRES --- klayout/drc/rule_decks/hres.drc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/klayout/drc/rule_decks/hres.drc b/klayout/drc/rule_decks/hres.drc index fcf6c880..32df9327 100644 --- a/klayout/drc/rule_decks/hres.drc +++ b/klayout/drc/rule_decks/hres.drc @@ -22,8 +22,8 @@ if FEOL #================================================ logger.info('Starting HRES derivations') - hres_poly = poly2.interacting(pplus).interacting(sab).interacting(res_mk).interacting(resistor) hres1_poly = poly2.interacting(pplus).interacting(sab).interacting(res_mk) + hres_poly = hres1_poly.interacting(resistor) # Rule HRES.1: Minimum space is 0.4µm. Note: Merge if the spacing is less than 0.4 um. logger.info('Executing rule HRES.1') From 1e8918334624d24b802a2cdc816cd5abbcfc7adf Mon Sep 17 00:00:00 2001 From: FaragElsayed2 Date: Wed, 5 Apr 2023 15:45:05 +0200 Subject: [PATCH 4/5] Adding intermediate var for HRES table --- klayout/drc/rule_decks/hres.drc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/klayout/drc/rule_decks/hres.drc b/klayout/drc/rule_decks/hres.drc index 32df9327..d3812e45 100644 --- a/klayout/drc/rule_decks/hres.drc +++ b/klayout/drc/rule_decks/hres.drc @@ -24,10 +24,11 @@ if FEOL logger.info('Starting HRES derivations') hres1_poly = poly2.interacting(pplus).interacting(sab).interacting(res_mk) hres_poly = hres1_poly.interacting(resistor) + hres_resistor = resistor.interacting(hres1_poly) # Rule HRES.1: Minimum space is 0.4µm. Note: Merge if the spacing is less than 0.4 um. logger.info('Executing rule HRES.1') - hres1_l1 = resistor.interacting(hres1_poly).space(0.4.um, euclidian) + hres1_l1 = hres_resistor.space(0.4.um, euclidian) hres1_l1.output('HRES.1', 'HRES.1 : Minimum space: 0.4µm. Note: Merge if the spacing is less than 0.4 um.') hres1_l1.forget @@ -55,20 +56,21 @@ if FEOL # 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) + hres5_l1 = hres_resistor.separation(poly2.not_interacting(sab), 0.3.um, euclidian) 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 is 0.3.um. logger.info('Executing rule HRES.6') - hres6_l1 = resistor.interacting(hres1_poly).separation(comp, 0.3.um, euclidian).polygons(0.001.um) - hres6_l2 = comp.not_outside(resistor.interacting(hres1_poly)) + hres6_l1 = hres_resistor.separation(comp, 0.3.um, euclidian).polygons(0.001.um) + hres6_l2 = comp.not_outside(hres_resistor) hres6_l = hres6_l1.or(hres6_l2) hres6_l.output('HRES.6', 'HRES.6 : Minimum RESISTOR space to COMP: 0.3um') hres6_l.forget hres6_l1.forget hres6_l2.forget hres1_poly.forget + hres_resistor.forget # Rule HRES.7: Minimum Pplus overlap of contact on Poly2 resistor is 0.2µm. logger.info('Executing rule HRES.7') From cf9bc6ab75bd6be348b679676915ff30649f4788 Mon Sep 17 00:00:00 2001 From: FaragElsayed2 Date: Wed, 5 Apr 2023 15:48:13 +0200 Subject: [PATCH 5/5] Adding intermediate var for HRES table --- klayout/drc/rule_decks/hres.drc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/klayout/drc/rule_decks/hres.drc b/klayout/drc/rule_decks/hres.drc index d3812e45..3cbd8b88 100644 --- a/klayout/drc/rule_decks/hres.drc +++ b/klayout/drc/rule_decks/hres.drc @@ -25,6 +25,7 @@ if FEOL hres1_poly = poly2.interacting(pplus).interacting(sab).interacting(res_mk) hres_poly = hres1_poly.interacting(resistor) hres_resistor = resistor.interacting(hres1_poly) + hres_contact = contact.and(hres_poly) # Rule HRES.1: Minimum space is 0.4µm. Note: Merge if the spacing is less than 0.4 um. logger.info('Executing rule HRES.1') @@ -74,8 +75,8 @@ if FEOL # Rule HRES.7: Minimum Pplus overlap of contact on Poly2 resistor is 0.2µm. logger.info('Executing rule HRES.7') - hres7_l1 = contact.and(hres_poly).enclosed(pplus, 0.2.um, euclidian).polygons(0.001.um) - hres7_l2 = contact.and(hres_poly).not_outside(pplus).not(pplus) + hres7_l1 = hres_contact.enclosed(pplus, 0.2.um, euclidian).polygons(0.001.um) + hres7_l2 = hres_contact.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 @@ -84,10 +85,11 @@ if FEOL # Rule HRES.8: Minimum space from salicide block to contact on Poly2 resistor is 0.22.um. logger.info('Executing rule HRES.8') - hres8_l1 = contact.and(hres_poly).separation(sab, - 0.22.um).polygons(0.001.um).or(contact.and(hres_poly).interacting(sab)) + hres8_l1 = hres_contact.separation(sab, + 0.22.um).polygons(0.001.um).or(hres_contact.interacting(sab)) hres8_l1.output('HRES.8', 'HRES.8 : Minimum space from salicide block to contact on Poly2 resistor: 0.22.um') hres8_l1.forget + hres_contact.forget # Rule HRES.9: Minimum salicide block overlap of Poly2 resistor in width direction is 0.28.um. logger.info('Executing rule HRES.9')