From 9fa75894124d01f94c532af8347134980f860dea Mon Sep 17 00:00:00 2001 From: jeffdi Date: Fri, 21 Nov 2025 08:56:37 -0800 Subject: [PATCH 1/3] Update sky130A licon bar spacing for SP.15/16 - Updated MRW_licon.SP.15 spacing to 0.64um (0.25um width bars) - Updated MRW_licon.SP.16 spacing to 0.57um (0.19um width bars) - Updated release version to 2025.11.21_01.10 - Per feedback from Skywater Technology --- checks/tech-files/sky130A_mr.drc | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) mode change 100644 => 100755 checks/tech-files/sky130A_mr.drc diff --git a/checks/tech-files/sky130A_mr.drc b/checks/tech-files/sky130A_mr.drc old mode 100644 new mode 100755 index 248a024..8ae6f94 --- a/checks/tech-files/sky130A_mr.drc +++ b/checks/tech-files/sky130A_mr.drc @@ -32,8 +32,10 @@ # * Change the default of sram_exclude to false # 2025-10-29 : 2025.10.29_01.10 release # * Updated to be in line with the current Skywater required rules +# 2025-11-21 : licon bar spacing for SP.15/16 +# * Updated to 0.57 & 0.64 per feedback from SWT ########################################################################################## -release = "2025.10.29_01.10" +release = "2025.11.21_01.10" require "time" require "logger" @@ -884,11 +886,19 @@ if FEOL "MR_licon.SP.4 : licon bar minimum space to licon square : 0.51um" ) - # MRW_licon.SP.16: 0.19 width bar licons (post-maskgen) bar licon spacing < 0.51 - #licon_bars.space(0.51, euclidian).output( - # "MRW_licon.SP.16", - # "MRW_licon.SP.16 : 0.19 width bar licons (post-maskgen) bar licon spacing < 0.51" - #) + # MRW_licon.SP.15: 0.25 um width bar licons (post-maskgen) bar licon spacing < 0.58 + # 0.64 = (0.03 + 0.58 + 0.03) + licon_bars.space(0.64, euclidian).output( + "MRW_licon.SP.15", + "MRW_licon.SP.15 : 0.25 um width bar licons (post-maskgen) bar licon spacing < 0.64" + ) + + # MRW_licon.SP.16: 0.19 um width bar licons (post-maskgen) bar licon spacing < 0.51 + # 0.57 (0.03 + 0.51 + 0.03) + licon_bars.space(0.57, euclidian).output( + "MRW_licon.SP.16", + "MRW_licon.SP.16 : 0.19 um width bar licons (post-maskgen) bar licon spacing < 0.57" + ) # MR_licon.SP.5: tap_licon minimum space to tap edge abutting diff ≥ 0.06 tap_licon = licon.and(tap) From 71ab1ce656ac1d3683949789bd213985aeb99e3f Mon Sep 17 00:00:00 2001 From: jeffdi Date: Fri, 21 Nov 2025 12:00:57 -0800 Subject: [PATCH 2/3] Refine licon bar spacing logic for SP.15/16 - Implement proper mask generation logic: * Bar licons with spacing < 0.64 remain 0.19 um wide (sides not sized) * Bar licons with spacing >= 0.64 become 0.25 um wide (sized on all sides) - Update MRW_licon.SP.15 to check 0.25 um wide bars with spacing < 0.58um - Update MRW_licon.SP.16 to check 0.19 um wide bars with side-to-side spacing < 0.51um using projection mode --- checks/tech-files/sky130A_mr.drc | 43 ++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/checks/tech-files/sky130A_mr.drc b/checks/tech-files/sky130A_mr.drc index 8ae6f94..77c0855 100755 --- a/checks/tech-files/sky130A_mr.drc +++ b/checks/tech-files/sky130A_mr.drc @@ -32,10 +32,8 @@ # * Change the default of sram_exclude to false # 2025-10-29 : 2025.10.29_01.10 release # * Updated to be in line with the current Skywater required rules -# 2025-11-21 : licon bar spacing for SP.15/16 -# * Updated to 0.57 & 0.64 per feedback from SWT ########################################################################################## -release = "2025.11.21_01.10" +release = "2025.10.29_01.10" require "time" require "logger" @@ -886,18 +884,41 @@ if FEOL "MR_licon.SP.4 : licon bar minimum space to licon square : 0.51um" ) - # MRW_licon.SP.15: 0.25 um width bar licons (post-maskgen) bar licon spacing < 0.58 - # 0.64 = (0.03 + 0.58 + 0.03) - licon_bars.space(0.64, euclidian).output( + # - Bar licons with spacing < 0.64 get mask drop region on sides, remain 0.19 um wide + # (ends still sized by 0.03 um per side: 0.19 um × 2.06 um post-maskgen) + # - Bar licons with spacing >= 0.64 get sized by 0.03 on all sides, becoming 0.25 um wide + # (0.25 um × 2.06 um post-maskgen) + + # Find bar licons that are in close spacing (< 0.64) - these remain 0.19 um wide + # The space() method returns violations (edges/regions) where spacing < 0.64 + # We expand these violation regions slightly to capture the bar licons involved + licon_bars_close_spacing_violations = licon_bars.space(0.64, euclidian) + # Expand violations slightly to capture nearby bar licons + licon_bars_close_regions = licon_bars_close_spacing_violations.polygons.sized(0.1) + # Get bar licons that interact with close spacing regions + licon_bars_in_close_spacing = licon_bars.interacting(licon_bars_close_regions) + # These remain 0.19 um wide after mask generation (sides not sized, ends are sized) + # Note: For spacing checks, we use as-is since spacing is width-based + licon_bars_0p19_post_mg = licon_bars_in_close_spacing + + # Bar licons NOT in close spacing get sized to 0.25 um on all sides + licon_bars_not_close = licon_bars.not(licon_bars_in_close_spacing) + # Simulate post-maskgen: size by 0.03 on all sides (0.19 × 2.0 -> 0.25 × 2.06 um) + licon_bars_0p25_post_mg = licon_bars_not_close.sized(0.03) + + # MRW_licon.SP.15: 0.25 um width bar licons (post-maskgen) spacing < 0.58 + # Check spacing between 0.25 um wide bar licons after mask generation + licon_bars_0p25_post_mg.space(0.58, euclidian).output( "MRW_licon.SP.15", - "MRW_licon.SP.15 : 0.25 um width bar licons (post-maskgen) bar licon spacing < 0.64" + "MRW_licon.SP.15 : 0.25 um width bar licons (post-maskgen) spacing < 0.58um" ) - # MRW_licon.SP.16: 0.19 um width bar licons (post-maskgen) bar licon spacing < 0.51 - # 0.57 (0.03 + 0.51 + 0.03) - licon_bars.space(0.57, euclidian).output( + # MRW_licon.SP.16: 0.19 um width bar licons (post-maskgen) spacing < 0.51 + # Check side-to-side spacing (between long sides) for 0.19 um wide bar licons + # Use projection mode with parallel edges to check side-to-side spacing + licon_bars_0p19_post_mg.space(0.51, projection).with_internal_angle(0).output( "MRW_licon.SP.16", - "MRW_licon.SP.16 : 0.19 um width bar licons (post-maskgen) bar licon spacing < 0.57" + "MRW_licon.SP.16 : 0.19 um width bar licons (post-maskgen) side-to-side spacing < 0.51um" ) # MR_licon.SP.5: tap_licon minimum space to tap edge abutting diff ≥ 0.06 From 346ab7eccc7a5f3803e613d867a637983d281a7b Mon Sep 17 00:00:00 2001 From: jeffdi Date: Fri, 21 Nov 2025 14:18:09 -0800 Subject: [PATCH 3/3] Update release version and add changelog entry for licon bar spacing - Update release version to 2025.11.17_01.10 - Add changelog entry for 2025-11-21 licon bar spacing updates - Minor formatting improvements --- checks/tech-files/sky130A_mr.drc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/checks/tech-files/sky130A_mr.drc b/checks/tech-files/sky130A_mr.drc index 77c0855..f1bd1f5 100755 --- a/checks/tech-files/sky130A_mr.drc +++ b/checks/tech-files/sky130A_mr.drc @@ -32,8 +32,10 @@ # * Change the default of sram_exclude to false # 2025-10-29 : 2025.10.29_01.10 release # * Updated to be in line with the current Skywater required rules +# 2025-11-21 : licon bar spacing for SP.15/16 +# * Updated to 0.57 & 0.64 per feedback from SWT ########################################################################################## -release = "2025.10.29_01.10" +release = "2025.11.17_01.10" require "time" require "logger" @@ -893,16 +895,20 @@ if FEOL # The space() method returns violations (edges/regions) where spacing < 0.64 # We expand these violation regions slightly to capture the bar licons involved licon_bars_close_spacing_violations = licon_bars.space(0.64, euclidian) + # Expand violations slightly to capture nearby bar licons licon_bars_close_regions = licon_bars_close_spacing_violations.polygons.sized(0.1) + # Get bar licons that interact with close spacing regions licon_bars_in_close_spacing = licon_bars.interacting(licon_bars_close_regions) + # These remain 0.19 um wide after mask generation (sides not sized, ends are sized) # Note: For spacing checks, we use as-is since spacing is width-based licon_bars_0p19_post_mg = licon_bars_in_close_spacing # Bar licons NOT in close spacing get sized to 0.25 um on all sides licon_bars_not_close = licon_bars.not(licon_bars_in_close_spacing) + # Simulate post-maskgen: size by 0.03 on all sides (0.19 × 2.0 -> 0.25 × 2.06 um) licon_bars_0p25_post_mg = licon_bars_not_close.sized(0.03)