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.


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


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

  • Hi @kita11,

    No, "enclosing" is actually already is a check. "a.enclosing(b," 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!

Sign In or Register to comment.