Gate / Diffusion extension in MOSFET

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?

• Hello @atika11

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.

``````Gate = poly and diffusion

check_L { @ Mos channel length min value: minvalue_l
L_edge =   COINCIDENT EDGE GATE diffusion
LENGTH  L_edge < minvalue_l
}
``````

For the transistor Width, we check the length of the edge coincident between gate and poly:

``````check_W { @ Mos width min value: minvalue_w
L_W =   COINCIDENT EDGE GATE poly
LENGTH  L_W < minvalue_w
}
``````

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.

``````check_Ext { @ min extension of poly on the gate: minvalue_ext
poly_ext  = poly NOT diffusion
poly_ext_EDGE_small = EXTERNAL [poly_ext] diffusion < 0.001  ABUT==90
poly_ext_EDGE = touch EDGE poly_ext poly_ext_EDGE_small
LENGTH poly_ext_EDGE  < minvalue_ext
}
``````

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.

Regards

• 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.

• Hi @akita11,

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.

Regards,

• 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.

• Hi,

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:

``````a_errors = diffusion.enclosing(poly, ...)
b_errors = poly.enclosing(diffusion, ...)
``````

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

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)?

• Hi @kita11,

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