@@ -629,16 +629,34 @@ def _strap_m3_merge_width(self, vert, from_layers, strap_layer):
629629 return c .first_layer_width if vert else c .first_layer_height
630630
631631 def _strap_merge_minsep_seg (self , rail_layer , w_fb ):
632+ """Merge spacing: max over ``supply_stack`` of ``minwidth_L+L_to_L`` and adjacent ``L0_to_L1`` if in DRC; else rail-only."""
632633 pw = self ._pwr_stack ()
633634 if pw :
634- m = pw [0 ]
635- mn = drc ("minwidth_{}" .format (m ))
636- same = "{}_to_{}" .format (m , m )
637- sp = drc (same ) if same in drc else 0.0
638- return m , max (self .supply_rail_pitch , mn + sp )
639- same = "{}_to_{}" .format (rail_layer , rail_layer )
640- sp = drc (same ) if same in drc else 0.0
641- return rail_layer , max (self .supply_rail_pitch , w_fb + sp )
635+ ms = 0.0
636+ for lyr in pw :
637+ wkey = "minwidth_{}" .format (lyr )
638+ if wkey not in drc :
639+ continue
640+ skey = "{}_to_{}" .format (lyr , lyr )
641+ sp = drc (skey ) if skey in drc else 0.0
642+ ms = max (ms , drc (wkey ) + sp )
643+ for i in range (len (pw ) - 1 ):
644+ a , b = pw [i ], pw [i + 1 ]
645+ for pair in ("{}_to_{}" .format (a , b ), "{}_to_{}" .format (b , a )):
646+ if pair in drc :
647+ ms = max (ms , drc (pair ))
648+ break
649+ if ms <= 0 :
650+ wkey = "minwidth_{}" .format (pw [0 ])
651+ if wkey in drc :
652+ sk = "{}_to_{}" .format (pw [0 ], pw [0 ])
653+ ms = drc (wkey ) + (drc (sk ) if sk in drc else 0.0 )
654+ return pw [0 ], ms
655+ wkey = "minwidth_{}" .format (rail_layer )
656+ mw = drc (wkey ) if wkey in drc else w_fb
657+ skey = "{}_to_{}" .format (rail_layer , rail_layer )
658+ sp = drc (skey ) if skey in drc else 0.0
659+ return rail_layer , mw + sp
642660
643661 def _bridge_close_strap_taps (self ):
644662 """Close strap taps: m3 bars (min-area width) on too-close centers; m4 too when rail is stack top; ends at outer m3 along rail."""
0 commit comments