MOM capacitor extraction

I found in the manual that it can extract vertical capacitors. However, I wonder if it is possible to extract MOM capacitor which constructs capacitor in the same metal layer by using multi-finger structural.

Comments

  • That's going to be tricker because it's a 3D problem (vertical and lateral fringing dominates). An extractor -could- handle it but whether this one does, I do not know. Would be some more elaborate code than a vertical only, plate-plate capacitance extraction.

    I imagine that if two parallel lines extract with a mutual C, the extractor can handle the larger bundle. Might take that test case to the mat and see?

    If you find the extractor as-is unworkable, and are willing to make a PCell, a workaround could be to embed recognition features that declare this line-pile as a "device", and the PCell places along with the metal geometries a "param reflection feature" that returns the figured terminal-terminal and bottom-"plates"-substrate capacitances by a geometry value.

    As an example, "back in the day" we would not write extraction scripts to get the emitter dimensions (L, W) from N+ polygon data - we would instead make the PCell lay down a "width/drawing" rectangle with X=1, Y=WE and a "length/drawing" box with Y=1, X-LE; extractor had only to find that "width" rectangle and take its area (so orientation does not matter) and there you go. Presuming you did not molest the PCell "guts".

    This all goes to PDK architecture and use of adjunct (non-printing) layers to ease the pain of verification script coding.
    It may be noble and heroic to extract everything from plain printed layer data. But who's got the spare time for heroics?

    Well, open source coders, obviously. But there's never enough heroes when you wanted it yesterday.

  • edited March 2022

    @dick_freebird Thanks, this is exactly what I have in mind too (I do not feel heroic enough to extract these things from plain metal polygons).

    @William1 You really need a kind of marker layer which allows you to recognize the capacitor. Recognizing a specific comb structure as a capacitor without marker layers is tedious to code and likely to give you false devices in the end.

    Here is a proposal how to do that:

    1. this is my layout:

    The dashed white line is the cap area marker. Note that is covers the comb area, but does not reach into the metal connecting the fingers. This is important for this scheme to work.

    1. and this is the extraction script:
    report_netlist("extracted")
    
    m1 = input(1, 0)
    v1 = input(1, 1)
    m2 = input(2, 0)
    v2 = input(2, 1)
    m3 = input(3, 0)
    v3 = input(3, 1)
    m4 = input(4, 0)
    
    cap = input(10, 0)
    
    delta = 10.nm  # "a little"
    
    # creates small patches (which is use as terminals) at the left, bottom ... sides
    cap_left   = cap.moved(-delta, 0) - cap
    cap_top    = cap.moved(0, delta)  - cap
    cap_right  = cap.moved(delta, 0)  - cap
    cap_bottom = cap.moved(0, -delta) - cap
    
    # we create one cap device per metal layer
    [m1, m2, m3, m4].each do |mx|
    
      # "a" pins are left or bottom and "b" pins are right and top  
      cap_pin_a = cap_left.overlapping(mx) + cap_bottom.overlapping(mx)
      cap_pin_b = cap_right.overlapping(mx) + cap_top.overlapping(mx)
    
      # prepare two sheet cap layers from the original cap marker
      # NOTE: it's important to create a copy ("dup") because we need separate ones
      # for the connect statements later
      cap_a = cap.dup
      cap_b = cap.dup
    
      # extract the cap area as a pseudo sheet cap for each metal individually
      area_cap = 1e-15  # 1fF / µm²
      model_name = "CAP"  
      extract_devices(capacitor(model_name, area_cap), { "P1" => cap_a, "P2" => cap_b })
    
      # make the connections between the "sheets", the pins and the metal
      connect(cap_a, cap_pin_a)
      connect(cap_pin_a, mx)
      connect(cap_b, cap_pin_b)
      connect(cap_pin_b, mx)
    
    end
    
    # the standard metal stack connections
    connect(m1, v1)
    connect(v1, m2)
    connect(m2, v2)
    connect(v2, m3)
    connect(m3, v3)
    connect(v3, m4)
    
    # extract
    netlist
    
    # combine the M1..M4 caps into one
    netlist.combine_devices
    

    The script is written with a loop to keep it compact. I hope the comments explain the idea.

    And here is my output:

    The idea is that the capacitance scales with the cap area which is roughly true for a given width and space. As this is just the nominal value, I think this assumption is valid. In my case the area of the cap layer was 33µm² which corresponds to 33fF because I used 1fF/µm². Times four (because of the four layers) gives 132fF.

    Matthias

  • On the note of marker layers, you might like to take a dive into
    the mainstream foundry PDK (if this is meant to get real) and
    look for these kinds of layers ("capacitor/drawing"?) and also
    see if there's a multifinger MOM cap already drawn in their cell
    libraries - it might hold style-cues and clues about what your
    eventual tape-in will be looking for.

Sign In or Register to comment.