From 4158bc132202c5df3d0891a24f21553fdc896fca Mon Sep 17 00:00:00 2001 From: FaragElsayed2 Date: Wed, 5 Apr 2023 14:41:02 +0200 Subject: [PATCH] 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