Layout sanity checks for IHP submission system

During our submission we have detected some issues related mainly to zero length path/polygons, what crushes our internal tools.
We would like to develop some kind of layout sanity check in order to detect these cases and give the opportunity to the designer to correctly fix them. Right now we heave this script;

dry_run = true
eps = 1.dbu

layers.each do |spec, name|
  l = input(spec)
  l.raw.with_area(0).output("Zero-area polygon on #{name} (#{spec})")
  l.raw.edges.with_length(0).output("Zero-length edge on #{name} (#{spec})")
  l.raw.width(eps).output("Zero/near-zero width spike on #{name} (#{spec})")
  l.raw.notch(eps).output("Zero/near-zero gap notch on #{name} (#{spec})")
end

Unfortunately it does not detect this two cases:
1. Path spike Spike in path at location (2221.925,2907.7) in cell SoC7610 on layer 50 datatype 0.

Path of width 1.02  on metal4 50/0 
2271.28000 2901.51500
2271.28000 2907.70000
2221.92500 2907.70000
2222.02500 2907.70000
  1. Metal polygon
99.78500    12.30000
99.78500    43.46000
84.50500    43.46000
103.03500   43.46000
103.03500   43.26000
100.08000   43.26000
100.08000   12.30000

with the problematic point 84.50500 43.46000

image

We suggest to save the layout with the option "Eliminate zero-length paths (conver to BOUNDARY)" but still it does not filter out all cases.
Any suggestion on how we could proceed ?

Comments

  • edited April 27

    Hi @Krzysztof,

    The reflecting edge from 2. can be found with a "corner with angle" check:

    layer.raw.drc(corners(absolute) == 180.0)
    

    This will both find inner and outer reflecting edges.

    If you want to run this in deep mode, make sure you turn off polygon splitting:

    max_vertex_count(0)
    max_area_ratio(0)
    deep
    

    For finding the reflecting path, I'd suggest a more generic check - the "odd_polygons" check. This finds polygons that are non-orientable or self-overlapping. Such polygons are bad in the broadest sense as their "inner" area depends on the wrap rule. Self-reflecting paths also create such self-overlapping polygons and also paths that reflect back in an acute angle (something worth flagging as well).

    Following the documentation, this check does not work in deep mode, but that is only because with polygons splitting in place, this check does not make much sense. But it can be used when reverting to Region#strange_polygon_check.

    Here are both checks combined in deep mode on layer 1/0:

    max_vertex_count(0)
    max_area_ratio(0)
    deep
    
    report("Discussion 2689")
    
    layer = input(1, 0)
    
    layer_raw = layer.raw
    
    # detects self-overlapping polygons and reflecting paths
    self_overlapping = DRC::DRCLayer::new(self, layer_raw.data.strange_polygon_check)
    self_overlapping.output("strange polygons")
    
    # detects reflecting edges
    layer_raw.drc(corners(absolute) == 180.0).output("reflecting edges")
    

    Matthias

Sign In or Register to comment.