DRC : separation between shapes of a same layer

edited November 2014 in KLayout Support

Hi,

I tried this syntax, but it does not work.

Here I want to check the rule : "Space if at least one metal1 line width is > 10.0 um"

How to write it ?

Thanks, Regards,

Laurent

M1.space(0.23,euclidian).output("M1_space", "Min. Metal1 spacing : 0.23um")
Mbig = M1.interacting(M1.sized(-5.0).sized(5.0))
# Mbig.output("Mbig", "Mbig")
Mbig.separation(M1,0.6,euclidian).output("M1_big_space", "Space if at least one metal1 line width is > 10.0 um : 0.60")

Comments

  • edited November -1

    Hi Laurent,

    The separation won't work because of shielding. "Shielding" means that the measurement functions won't look through objects in the path of the distance measurement. Shielding is only effective for polygon layers and in your case it's the small M1 below the big M1 which shields the interaction between big and small.

    An obvious solution is to separate M1 into big and small. But then you'll need two checks since there can be big vs. small and big vs. big:

    M1.space(0.23,euclidian).output("M1_space", "Min. Metal1 spacing : 0.23um")
    Mbig = M1.interacting(M1.sized(-5.0).sized(5.0))
    Msmall = M1 - Mbig
    Mbig.separation(Msmall,0.6,euclidian).output("M1_big_big_space", "Space if both metal1 line widths are > 10.0 um : 0.60")
    Mbig.separation(Mbig,0.6,euclidian).output("M1_big_space", "Space if at least one metal1 line width is > 10.0 um : 0.60")
    

    Another way so solve that is to use edge input for which shielding is not enabled:

    Mbig.edges.separation(M1.edges,0.6,euclidian).output("...")
    

    The disadvantage of this approach is that big-big-interactions are counted twice since there is are left-big to right-small and right-big to left-small interactions.

    Allow me another note: I would not use "interact", since that way a big Pad with a think wire would make the thin wire "big" too. I guess this will work too:

    M1.space(0.23,euclidian).output("M1_space", "Min. Metal1 spacing : 0.23um")
    Mbig = M1.sized(-5.0).sized(5.0)
    Msmall = M1 - Mbig
    Mbig.separation(Msmall,0.6,euclidian).output("M1_big_big_space", "Space if both metal1 line widths are > 10.0 um : 0.60")
    Mbig.separation(Mbig,0.6,euclidian).output("M1_big_space", "Space if at least one metal1 line width is > 10.0 um : 0.60")
    

    Matthias

  • edited November 2014

    Thanks Matthias, the error was as usual a silly mistake.

    I tried your last method without interact as you are right, it should not take in account the whole wire.
    But, it highlights the edge Mbig-Msmall.

    So I modified it as follows, and now I got the same errors as Calibre :

    M1.space(0.23,euclidian).output("M1_space", "Min. Metal1 spacing : 0.23um")
    Mbig = M1.sized(-5.0).sized(5.0)
    Mbig_interact = Mbig.sized(0.6).and(M1.interacting(Mbig))
    Mbig_interact.space(0.6,euclidian).output("M1_big_space", "Space if metal1 line width is > 10.0 um : 0.60")
    M1.not(Mbig_interact).separation(Mbig,0.6,euclidian).output("M1_big_space", "Space if at least one metal1 line width is > 10.0 um : 0.60")
    

    Note that I need to code the 'space' check on Mbig_interact and not on Mbig to get the same errors as Calibre ... a bug of Calibre or at least of its foundry implementation :)

    Laurent

  • edited November 2014

    Hi Laurent,

    you're right - my mistake.

    You could also apply the idea of using the edge versions without the shielding and without the interacting:

    M1.space(0.23,euclidian).output("M1_space", "Min. Metal1 spacing : 0.23um")
    Mbig = M1.sized(-5.0).sized(5.0)
    Mbig.edges.separation(M1.edges,0.6,euclidian).output("M1_big_big_space", "Space if both metal1 line widths are > 10.0 um : 0.60")
    

    I have only tried for a simple case and for that it was working.

    Regards,

    Matthias

Sign In or Register to comment.