DRC : large metal separation


How to check large metal pattern separation to any same metal pattern?

Before version 0.25, I was using :

Mbig1 = Metal.sized(-5.0).sized(5.0)
Mbig1_interact = Mbig1.and(M1.interacting(Mbig1))
Mbig1_intercat.separation(Metal1, 1.5, euclidian).output("M1big_space", "Metal1 space if at least one metal1 line width is > 10um : 1.5um")

But it does not work anymore : what is wrong ?

I can check the separation of Mbig1_intercat to Metal2, but not to Metal1 : Why ?

Thank you,


  • Hi Laurent,

    There wasn't a change which should have modified the behaviour of these functions.
    So it should still work.

    There is an important point however: Metal1 is not given, so I don't know what it is. If Metal1 is identical to "Metal" (btw. what is M1?), then the separation won't work: as Mbig1_interact contains the shapes from Metal too, it will check separation vs. it's own shapes which does not render a result. The reason is "shielding": a layer does not look through itself for shapes from other layers.

    So you should split the check into a wide-wide check and a wide-narrow check:

    Mbig1_interact.separation(Metal - Mbig1_interact, 1.5).output("wide-narrow violations")
    Mbig1_interact.space(1.5).output("wide-wide violations")


  • Hi,

    I have a question about first part of "wide" metal check. I'm trying to implement under/over concept to get metals of 10u and more.
    Following expression returns me shapes which are 10.005 and more.
    metal1w = metal1.sized(-5.0).sized(5.0)
    I tried sizing by one grid less, by 4.995, and in thish case shpes of 9.995 are also picked up.
    I also tried sizing by parts of grid, but sizing is rounded. Then i tried changing Database unit in technology but it doesn't help either.

    Please advice

  • edited March 2019


    I'm using

    metal1 - metal1.width(1.0.um, projecting).polygons

    to select metal with width >= 1.0 µm.


  • edited March 2019


    "projecting" does not exist, I guess you mean : (projection does not make the job properly)

    metal1 - metal1.width(1.0.um, square).polygons


  • Hi Laurent,

    you're right, sorry. The line should be

    metal1 - metal1.width(1.0.um, projection).polygons

    'square' is also good, but it probably selects more from the metal as "narrow".

    In general the problem is what to define as "narrow" and what as wide, specifically at the locations where narrow turns into wide. This is where projecting and square make a difference.

    Best regards,


  • Thank you guys, it really helped

Sign In or Register to comment.