It looks like you're new here. If you want to get involved, click one of these buttons!
In most design rules, the gate and diffusion extension size are defined for MOSFET. For example, A and B are diffusion and gate extension, respectively.
I think these sizes can be checked by: "(diff - poly).wdith(A).output..." and "(poly - diff).width(B).output...", but I think these are correct.
Are there any better way to check these sizes?
What is usually checked in the transistor are: channel length (L), the transistor width and the poly extension on diffusion.
With Calibre, L is checked by looking the length the edge of the gate (poly AND diffusion) (klayout equivalent is (poly & diffusion)) with the diffusion.
For the transistor Width, we check the length of the edge coincident between gate and poly:
For the extension of the poly on the gate, it could be checked by considering the edge of the extension that is perpendicular to the diffusion. The length of this edge should be bigger to the min value.
I'm not familiar enough with klayout DRC to give you a code written in Ruby language. I have had a look at the documentation and I didn't see any command to select coincident/touch edge. Maybe that they exist but I'm not aware of any of them.
Hi, @ahmedo , thanks for your advise. Actually, I'm now converting Calibre's DRC script to KLayout, and looking for how to define these parameters (rules) in KLayout.
I have understood what you are trying to check. The code (diff - poly).wdith(A).output..." and "(poly - diff).width(B).output..." is not always correct if the width of the transistor (vertical edge of the diffusion -poly) is smaller than the distance A for the check 1) and when the channel length L is smaller than B.
Hi, @ahmedo , yes, I understand my method would be incorrect in some cases you mentioned, and wish to know how to correctly perform in KLayout.
SVRF is copyright protected, so please don't discuss SVRF to KLayout translation here.
And please don't try to literally translate Calibre decks to KLayout. KLayout isn't a Calibre clone.
In this example, I think you can simply consider A and B enclosures and check these rules by:
This works as "a.enclosing(b, ...)" is only checking edges with the proper relation (b "looking" at a and a "looking" away from b, thinking of edges "looking" to the outside of the polygon).
@Matthias , thank you for your advise.
Yes, actually, I'm not intend to formally translate Calibre rule to KLayout, but understanding what it means, and writing it in KLayout.
For using .enclosing() you mentioned, I'm still trying understand what occurs; how to check its size? Does "poly.enclosing(diffusion, ...).width()" work for checking gate extenion ("B" in my figure)?
No, "enclosing" is actually already is a check. "a.enclosing(b, 1.0.um)" requires "a" edges to be "in front of" "b" edges be not less than 1 micrometers. In addition, only edges satisfying this relation are checked, so "a" edges inside "b" for example are not considered.
@Matthias , thank you for your advise, oh, I understand.
I have been thinking that enclosing() is used for "checking inside box", but I understand it is also used for "extension" as this case, I see, thanks!