etch stop in xsection

Hi, I am using the etch function in xsection tool.
I would like to etch via holes across several material layers, and at various locations stop at specific metal layers.
mask(via).etch(1 :into => [material1, material2, material3], :taper => 10)

However, what happens is that this etch does not stop at metal layers, but just jumps over the metal layers. So I ended up with hanging metal bridges with if the metal layer is somewhere between material1, 2, 3. I cannot just specify a specific height because sometimes etching stops at metal layer between material1 and 2, sometimes between 2 and 3, sometimes at bottom of 3. It depends on the metal layout.

How can I make it so that the via etch process at specific locations stops when hitting specified metal materials in xsection drawing?




  • Punching through multiple metal layers would normally be a thing to avoid by process construction. You stop oxide etch on the first metal it hits and stop metal etch on oxide or silicon, in "normal" silicon processing.

    Vias normally are holes in insulator layers, not metal.

    In many modern technologies the vias are filled with tungsten plugs, and planarized before deposition of the overlayer. Many times the metal layer will be a composite, such as throwing down a TiW "adhesion layer" before the aluminum is deposited, but this is co-patterned (serial deps, single etch).

    Maybe you want to add some fake layers whose only purpose is to perform the etch stop where and when you say. klayout is not a process simulator, so do not expect the ability to faithfully emulate all processing (especially nonstandard series of events).

  • Hi,

    " stop oxide etch on the first metal it hits "
    Yes, that is my purpose.
    However, the first metals exist at different insulator layers. So hope the insulator etch stops whenever it hits the first metal. Was wondering if this can be done in klayout's xsection tool....

    "klayout is not a process simulator, so do not expect the ability to faithfully emulate all processing"
    If you happen to know any process simulator (preferably opensource/free) that can read GDS layout, and convert it to the final structure/profile, would you kindly share with me (and the folks on this forum)? Thanks!


  • Maybe this program I wrote to make 3D cross sections from a GDS layout is useful for you:

    Regards, Jan

  • Dear all,

    thanks for this discussion. Basically, XSection is a separate project and is hosted here:

    However, I do not actively maintain it right now. There is a good reason for this: the tool is incredibly useful and incredibly stupid. In other words, it's a maintenance nightmare. I see very fancy things being done with it, far beyond film deposition or etch. But it's very easy to cross the border to overdoing it and drawing entirely wrong conclusions from the pictures you get. In the wrong hands, the effect can be a disaster.

    So it's fine with me the project starves with a single-digit number of stars in a dark corner of GitHub. I guess this is where it belongs.


  • In my opinion the answer is to insist on simplicity,
    let it be stupid as long as it has the functions that
    are needed to start, stop and scale the vertical
    axis (would side-diffusion be out of the question?)
    to build the third dimension and slice it along some
    combination of the other two.

    My own use for this capability is so seldom, that I
    just do it by hand, flattening an X-Ystructure, ordering
    the planes and scaling their vertical-in-view dimension
    to match the process docs.

    But simplicity begets simplicity of maintenance
    (though nothing's simpler than benign neglect...).

  • Hi Jack,

    Here's a workaround that should work. The example below has 3 metal layers and 1 via layer which connects metal3 with both metal2 and metal1. Split the via layer in two layers, vias that stop on metal2 and vias that stop on metal1 using layer Boolean operations and define a "different etch" for both:

    mmetal1 = layer("1/0")
    mmetal2 = layer("2/0")
    mvia = layer("3/0")
    mvia_on_metal2 = mvia.and(mmetal2)
    mvia_on_metal1 = mvia.not(mmetal2)


    mask(mvia_on_metal1).etch(6.0, :into => [oxide1, oxide2])
    mask(mvia_on_metal2).etch(3.0, :into => oxide2)



    # FORUM test
    # Masks
    mmetal1 = layer("1/0")
    mmetal2 = layer("2/0")
    mvia = layer("3/0")
    mvia_on_metal2 = mvia.and(mmetal2)
    mvia_on_metal1 = mvia.not(mmetal2)
    mmetal3 = layer("4/0")
    # Substrate
    substrate = bulk
    # Process
    metal1 = mask(mmetal1).grow(1.0)
    oxide1 = deposit(3.0)
    planarize(:into => oxide1, :less => 1.0)
    metal2 = mask(mmetal2).grow(1.0)
    oxide2 = deposit(3.0)
    planarize(:into => oxide2, :less => 1.0)
    mask(mvia_on_metal1).etch(6.0, :into => [oxide1, oxide2])
    mask(mvia_on_metal2).etch(3.0, :into => oxide2)
    metal3 = mask(mmetal3).grow(6.0)
    planarize(:into => metal3, :less => 5.0)
    # Output
    output("0/0", substrate)
    output("1/0", metal1)
    output("1/1", oxide1)
    output("2/0", metal2)
    output("2/1", oxide2)
    output("3/0", metal3)
Sign In or Register to comment.