DRC: radius checking of bends

Hi,
I'm writing a DRC script and I want to see if someone can help with this design rule.

Basically, I want to be able to check to see if the bend has a radius less than some value "x". The image I have attached should give you an example of what I'm talking about when I say a bend and the radius that I'm looking to measure.

Any help is greatly appreciated, and I appreciate all help that has been given so far on these forums,
Much appreciated,
Tristian

Comments

  • @Tristian I'm afraid this time there is no simple DRC function available. You could go for a maximum bend angle criterion between two edges. But that converts to a minimum radius only for a fixed edge length.

    Matthias

  • @Matthias thanks for the help, at the moment, my thinking is to get the distance between two points on the bend that are close together and using this as the arclength, the radius can be assumed to be some max value and then I can get an angle that fits the equation:

    radius = arclength / angle

    Thanks for the help,
    Tristian

  • To continue on this without making a new post.

    To try measure the arc length, I'm just measuring the length of smaller segments in the bend but I understand that there is no way to measure the length in the DRC but I'm trying to work around it. I was thinking of using layer.perimeter to get the perimeter, I know the width and so I should be able to get lengths from that, but there is no way to loop through the different segments.

    I guess the question I'm asking is, is there a way to loop through all of the polygons within a layer or if there is another way to find the lengths of segments in the bend with different lenghts?

    Tristian

  • @Tristian You can loop through the polygons of a layer like this:

    layer.data.each_merged do |polygon|
      ...
    end
    

    "polygon" will be a RBA::Polygon object that you can analyse further. But I think this solution will be awfully slow.

    Matthias

  • JSSJSS
    edited December 2024

    Hi there!

    I was looking for a way to check the minimum radius of bends and then I found this post. B)
    I was wondering if there is a DRC function to check the minimum radius now.

    Thanks so much!

  • edited December 2024

    Hi @JSS,

    no, this check is still not available yet.

    Roadmap didn't change, but time is an issue.

    Matthias

  • There is a kind of workaround using the "unround" feature provided by "extract_rad":


    report("Radius check, maybe") l1 = input(1, 0) inp = l1.merged ur = polygons ur_error = polygons # Applies "unrounding" - see "extract_rad" documentation inp.each do |poly| x = poly.extract_rad if ! x.empty? ur.insert(x[0]) else ur_error.insert(poly) end end # the min. radius to check rmin = 2.um # some tolerance to account for segmentation tol = 10.nm # compute rounding variants: # both inner and outer corners rounded rounded = ur.rounded_corners(rmin, rmin, 64) # outer corners rounded rounded_outer = ur.rounded_corners(0, rmin, 64) # inner corners rounded rounded_inner = ur.rounded_corners(rmin, 0.um, 64) # General checks: # unrounding failed - this can happen for polygons # of irregular shape. ur_error.output("Unrounding failed") # short edges indicate semicircles with r < rmin for example ur.edges.with_length(0.0, 2 * rmin).output("Short edges, indicating radius < #{rmin}") # detect inner corners between unrounded and rounded with rmin # -> reported as radius < rmin inner_corners = rounded - rounded_outer (inner_corners - inp).sized(-tol).output("Inner corner radius < #{rmin}") # detect outer corners between unrounded and rounded with rmin # -> reported as radius < rmin outer_corners = rounded_inner - rounded (outer_corners & inp).sized(-tol).output("Outer corner radius < #{rmin}")

    (this implementation is flat, hence maybe slow)

    It reports several classes of errors:

    It's not super safe, but maybe useful.

    Matthias

Sign In or Register to comment.