The grow() Method#

The grow() method is one of the basic methods for describing a process. It is called on a mask data object. The basic use case is:

l1 = layer("1/0")
metal = mask(l1).grow(0.3)
output("1/0", metal)

This simple case deposits a material where the layer is drawn with a rectangular profile.

The grow() method has up to two arguments and a couple of options which have to be put after the arguments in the usual Python keyword notation name=value:

grow(height, lateral=0, option=value...)

The height argument is mandatory and specifies the thickness of the layer grown. The lateral parameter specifies the lateral extension (overgrow, diffusion). The lateral extension is optional and defaults to 0. The lateral extension can be negative. In that case, the profile will be aligned with the mask at the bottom. Otherwise it is aligned at the top.

There are several options:

Option

Value

mode

The profile mode. Can be 'round', 'square' and
'octagon'. The default is ‘square’.

taper

The taper angle. This option specifies tapered mode and cannot
be combined with 'mode'.

bias

Adjusts the profile by shifting it to the interior of the
figure. Positive values will reduce the line width by twice
the value.

on

A material or an array of materials onto which the material
is deposited (selective grow). The default is 'all'. This
option cannot be combined with "into". With "into",
"through" has the same effect than "on".

into

Specifies a material or an array of materials that the new
material should consume instead of growing upwards. This
will make “grow” a “conversion” process like an implant step.

through

To be used together with “into”. Specifies a material or an
array of materials to be used for selecting grow. Grow will
happen starting on the interface of that material with air,
pass through the through material (hence the name) and
consume and convert the into material below.

buried

Applies the conversion of material at the given depth below
the mask level. This is intended to be used together with
into and allows modeling of deep implants. The value is
the depth below the surface.

mode, taper and bias#

The effect of the mode and bias interaction is best illustrated with some examples.

The initial layout is always this in all following examples:

_images/g1.png

The first example if the effect of the plain grow with a thickness of 0.3 um. It will deposit a rectangular material profile at the mask:

grow(0.3)
_images/g1_xs.png

The next example illustrates the effect of a lateral extension on a square profile. The 0.1 um extension will add material left and right of the main patch:

grow(0.3, 0.1)
_images/g2_xs.png

In 'round' mode, the material will be deposited with an elliptical profile. The vertical axis will be 0.3 um, the horizontal 0.1 um representing the laternal extension. The patch will become bigger than the mask by the lateral extension at the bottom:

grow(0.3, 0.1, mode='round')
_images/g3_xs.png

To avoid overgrow, a negative lateral extension can be specified, resulting in a alignment of patch and mask at the bottom:

grow(0.3, -0.1, mode='round')
_images/g4_xs.png

Another mode is 'octagon' which is basically a coarse approximation of the ellipse and computationally less expensive:

grow(0.3, 0.1, mode='octagon')
_images/g5_xs.png

A bias value can be specified to fine-tune the position of the bottom edge of the patch. A positive bias value will shrink the figure:

grow(0.3, 0.1, mode='round', bias=0.05)
_images/g6_xs.png

A special profile can be specified with the taper option. This option specifies a taper angle and a conical patch will be created. The taper angle will be the sidewall angle of the patch. This option cannot be combined with mode and the lateral extension should be omitted. It can be combined with bias however:

grow(0.3, taper=10)
_images/g7_xs.png
grow(0.3, taper=10, bias=-0.1)
_images/g8_xs.png

Step coverage#

The following image shows the step coverage of a 30° slope and a vertical step by a material deposited in round mode with thickness of 0.3 um and lateral extension of 0.1 um. The sidewall of the step will be covered with a thickness of 0.1 um corresponding to the lateral extension:

grow(0.3, 0.1, mode='round')
_images/g10_xs.png

on - growing on specific material#

The on option allows to select growth on a material surface in addition to selection by a mask. To do so, specify the array of materials or the single material on which the new material will be deposited. The surface of these substrate materials will form the seed of the growth process.

An array of materials is written as a list of material data objects in square brackets.

# Prepare input layers
m1 = layer("1/0")
m2 = layer("2/0")

# Grow a stop layer
stop = mask(m2).grow(0.05)

# Grow with mask m1, but only where there is a substrate surface
metal = mask(m1).grow(0.3, 0.1, mode='round', on=bulk())

# output the material data to the target layout
output("0/0", bulk())
output("1/0", metal)
output("2/0", stop)

Here is the input data:

_images/g12.png

And this is the result:

_images/g12_xs.png

into - converting material#

With the into option it is possible to convert material below the mask rather than growing upwards. into specifies a single material or an array of materials in square brackets. In effect, the direction is reversed and the material given by into is consumed and replaced by the new material. Note: the etch operation is basically doing the same, replacing the material by “air”.

# Prepare input layers
m1 = layer("1/0")
m2 = layer("2/0")

substrate = bulk()

# Grow with mask m1 into the substrate
metal = mask(m1).grow(0.3, 0.1, mode='round', into=substrate)

# output the material data to the target layout
output("0/0", substrate)
output("1/0", metal)

This script gives the following result:

_images/g13_xs.png

through - selective conversion#

The same way that on will make the grow selective on the chosen materials, through will select seed materials for conversion with into. Conversion will start at the interface between through and air and consume the materials of into. It will not consume the through materials:

# Prepare input layers
m1 = layer("1/0")
m2 = layer("2/0")

substrate = bulk()

stop = mask(m2).grow(0.05, into=substrate)

# Grow with mask m1 into the substrate
metal = mask(m1).grow(0.3, 0.1, mode='round', through=stop, into=substrate)

# output the material data to the target layout
output("0/0", substrate)
output("1/0", metal)
output("2/0", stop)

With the following input:

_images/g14.png

This script gives the following result:

_images/g14_xs.png

buried - applies a conversion in a region below the surface#

If buried parameter is given, the process is not applied on the surface, but at the given depth below the surface. The main application is to model deep implants. In that case, into can be given to specify the material to convert and buried will specify the depth at which the material is converted. The region of conversion extends below and above that depth:

# Prepare input layers
m1 = layer("1/0")
m2 = layer("2/0")

substrate = bulk()

# Grow with mask m1 into the substrate
metal = mask(m1).grow(0.3, 0.1, mode='round', into=substrate, buried=0.4)

# output the material data to the target layout
output("0/0", substrate)
output("1/0", metal)

With the following input:

_images/g15.png

This script gives the following result:

_images/g15_xs.png