NAME

Physics::Etch - model wet and dry semiconductor etch processes

SYNOPSIS

use Physics::Etch;

# Patterned copper, wet ferric-chloride etch
my $cu = Physics::Etch->wet_etch( 'copper',
    thickness      => 500,          # nm
    temperature    => 40,           # degC
    feature_cd     => 3000,         # nm mask opening
    mask_thickness => 1500,         # nm resist
    overetch       => 0.30,
);
print $cu->report;

# Silicon-nitride RIE
my $sin = Physics::Etch->dry_etch( 'silicon_nitride',
    thickness  => 200, feature_cd => 250,
    power => 250, pressure => 25, bias => 300,
);
print $sin->report;

DESCRIPTION

Physics::Etch is a facade over the etch models Physics::Etch::WetEtch (isotropic, Arrhenius-activated) and Physics::Etch::DryEtch (anisotropic plasma / RIE). It ships a small built-in database of materials and etch recipes so a working process can be built with one call, then customised via overrides.

The module also exposes a pattern / reactor toolkit: a self-contained Physics::Etch::GDSII reader/writer for resist masks, Physics::Etch::Layout geometry analysis, a Physics::Etch::Chamber model, Physics::Etch::Loading (macro, micro and ARDE / RIE-lag), and Physics::Etch::Simulation to tie them together for per-feature results.

Physics

Wet etch (Physics::Etch::WetEtch) is a liquid-chemical, essentially isotropic process:

R(T) = rate * exp( (Ea/kB) * (1/Tref - 1/T) ) * concentration * agitation
lateral = R * isotropy            # isotropy defaults to 1.0

Isotropy makes the lateral rate roughly equal to the vertical rate, so undercut is comparable to etch depth and sidewalls are sloped/rounded. Strong temperature activation (the Arrhenius term) is the main rate knob.

Dry etch (Physics::Etch::DryEtch) is a directional plasma / RIE process:

Rv = rate * (P/Pnom)^0.8 * (p/pnom)^0.3 * (Vb/Vbnom)^0.5 * loading * arrhenius
A_eff  = 1 - (1 - A_nom) * (p/pnom) * (Vbnom/Vb)      # clamped to [0,1]
lateral = Rv * (1 - A_eff)

High DC bias and low pressure drive vertical etching and steep sidewalls; high pressure or low bias lets radicals attack laterally, lowering anisotropy and increasing undercut. An optional Arrhenius term models hot dry etches.

The Physics::Etch::Process base class derives time_to_clear, etch_time (clear time plus over-etch), etch_depth, undercut, anisotropy, profile (top/bottom width, etch bias, sidewall angle, aspect ratio), mask_loss / mask_survives, substrate_overetch, uniformity_report, and a formatted report().

Factory methods

Physics::Etch->wet_etch($material, %overrides)
Physics::Etch->dry_etch($material, %overrides)

Build a Physics::Etch::WetEtch or Physics::Etch::DryEtch process object from the recipe database. %overrides may set thickness, temperature, feature_cd, mask, mask_thickness, substrate, overetch, uniformity, time, etchant (to pick a specific chemistry), and any rate parameter such as rate, Ea, power, pressure, bias, or anisotropy.

Physics::Etch->material($name, thickness => $nm)

Return a Physics::Etch::Material from the built-in material database.

Physics::Etch->recipes(%filter)
Physics::Etch->find_recipe($material, $process, $etchant)
Physics::Etch->material_names()

Introspect the built-in material and recipe database. recipes accepts material, process and/or etchant filters and returns matching recipe hashrefs. find_recipe returns the first match.

Physics::Etch->chamber(%args)

Convenience constructor for Physics::Etch::Chamber.

Physics::Etch->loading(%args)

Convenience constructor for Physics::Etch::Loading.

Physics::Etch->layout(%args)

Convenience constructor for Physics::Etch::Layout.

Physics::Etch->read_gdsii($file)
Physics::Etch->new_gdsii(%args)

Convenience constructors for Physics::Etch::GDSII.

Physics::Etch->layout_from_gds($file, %args)

Read a GDSII file and return a Physics::Etch::Layout.

Physics::Etch->simulate(%args)

Convenience constructor for Physics::Etch::Simulation.

Pattern-dependent anisotropy, loading & chamber tools

use Physics::Etch;
use Physics::Etch::Loading;

my $etch    = Physics::Etch->dry_etch('silicon_nitride', thickness => 200);
my $chamber = Physics::Etch->chamber(
    wafer_diameter_mm => 200, gap_cm => 2.5,
    pressure_mtorr => 20, power_w => 300, flow_sccm => 80,
    gas => 'SF6', gas_mass_amu => 146, gas_diameter_m => 4.8e-10);
my $layout  = Physics::Etch->layout_from_gds('mask.gds',
    layer => 1, structure => 'TOP', tone => 'clear', field => [200,200]);
my $loading = Physics::Etch::Loading->from_chamber($chamber, arde_length => 5);

my $sim = Physics::Etch->simulate(
    process => $etch, chamber => $chamber,
    layout  => $layout, loading => $loading);
print $sim->report;               # per-CD anisotropy, undercut, RIE lag
  • Physics::Etch::GDSII - a dependency-free GDSII stream reader/writer; flattens SREF/AREF hierarchies with reflection, magnification and rotation into absolute polygons.

  • Physics::Etch::Layout - open area / open fraction (macro-loading input), per-feature CD from bounding boxes (ARDE input), and a local open-density grid (micro-loading input). tone selects clear vs dark field.

  • Physics::Etch::Chamber - reactor geometry to electrode area_ratio, power_density, residence_time, mean_free_path, knudsen, and a heuristic DC self_bias / ion_energy. process_conditions returns pressure and bias ready to pass to the dry etch.

  • Physics::Etch::Loading - macro loading R/R0 = 1/(1+kappa*A_open), micro loading 1/(1+k_micro*density), and ARDE / RIE-lag 1/(1+AR/AR0) (narrow features etch slower and taper). from_chamber estimates kappa from residence time.

  • Physics::Etch::Simulation - applies chamber conditions, macro loading from open area times wafer area, then per feature converts CD to aspect ratio, applies ARDE plus micro-loading, and reports local rate, depth, undercut, anisotropy, sidewall angle, and any features that fail to clear.

Examples

The examples/ directory contains one runnable script per material and several toolkit demos:

examples/etch_copper.pl              Cu, wet FeCl3 vs dry Ar ion-mill
examples/etch_photoresist_strip.pl   wet solvent / piranha strip
examples/etch_photoresist_ash.pl     dry O2 plasma ash + RIE trim
examples/etch_aluminum_silicide.pl   dry Cl2/BCl3 RIE vs wet PAN
examples/etch_tantalum.pl            dry SF6 RIE, pressure/bias tuning
examples/etch_titanium.pl            wet dilute-HF, SiO2 selectivity
examples/etch_silicon_nitride.pl     wet hot H3PO4 + CF4/O2 RIE
examples/etch_polyimide.pl           dry O2 RIE thick-film via etch
examples/make_sample_mask.pl         writes sample_mask.gds
examples/etch_gdsii_simulation.pl    GDSII-driven per-feature + RIE lag
examples/etch_loading_effect.pl      macro & micro loading
examples/etch_chamber_geometry.pl    reactor geometry -> bias / mfp

Run any example with:

perl -Ilib examples/etch_copper.pl

Installation

With ExtUtils::MakeMaker:

perl Makefile.PL
make
make test
make install

On Windows with Strawberry Perl, use gmake instead of make if needed.

To build a release tarball:

perl Makefile.PL
make dist

This creates Physics-Etch-0.02.tar.gz. Upload that tarball to PAUSE to publish it on CPAN; after indexing you can install with cpanm Physics::Etch.

EXTENDING THE DATABASE

The material and recipe databases are ordinary Perl data structures at the top of lib/Physics/Etch.pm. You can extend them by editing that file, or bypass them entirely by constructing Physics::Etch::WetEtch / Physics::Etch::DryEtch directly with your own parameters.

Adding a material

Add an entry to %MATERIAL:

my %MATERIAL = (
    # ... existing entries ...
    tungsten => {
        formula => 'W',
        pretty  => 'Tungsten',
        density => 19.25,          # g/cm^3, optional / illustrative
    },
);

Required fields:

  • pretty - human-readable name used in reports.

  • formula - chemical formula or identifier (may be empty).

  • density - density in g/cm^3, currently illustrative.

Adding a wet-etch recipe

Wet recipes live in @RECIPE and must contain at least material, process set to 'wet', etchant, mechanism, and rate (nm/min at ref_temp). Common additional fields:

{
    material  => 'tungsten',
    process   => 'wet',
    etchant   => 'H2O2/NH4OH',
    composition => 'Hydrogen peroxide / ammonium hydroxide',
    mechanism => 'chemical',
    rate      => 50,              # nm/min at ref_temp
    ref_temp  => 25,              # degC
    Ea        => 0.40,            # eV, Arrhenius activation energy
    isotropy  => 1.0,             # lateral/vertical ratio
    sel_mask       => 30,         # target:mask etch-rate selectivity
    sel_substrate  => 50,         # target:substrate selectivity
    default_mask   => 'photoresist',
    default_substrate => 'silicon_dioxide',
    notes => 'Brief description of the process.',
},

Adding a dry-etch recipe

Dry recipes set process to 'dry' and include plasma-specific knobs:

{
    material  => 'tungsten',
    process   => 'dry',
    etchant   => 'SF6',
    composition => 'SF6 plasma',
    mechanism => 'ion-assisted',
    rate      => 150,             # nm/min at nominal conditions
    anisotropy => 0.85,           # nominal anisotropy, 0..1
    power_nom    => 300,          # W
    pressure_nom => 20,           # mTorr
    bias_nom     => 250,          # V
    sel_mask       => 4,
    sel_substrate  => 8,
    default_mask   => 'photoresist',
    default_substrate => 'silicon',
    notes => 'Brief description of the process.',
},

Optional wet-style fields Ea and ref_temp may also be supplied for dry recipes if you want a temperature correction.

Using custom materials without editing the database

Anywhere a material name is accepted you may pass a Physics::Etch::Material object, or construct Physics::Etch::WetEtch / Physics::Etch::DryEtch directly:

use Physics::Etch::WetEtch;
use Physics::Etch::Material;
use Physics::Etch::Etchant;

my $etch = Physics::Etch::WetEtch->new(
    target    => Physics::Etch::Material->new(
        name => 'my_film', formula => 'X2Y', pretty => 'My Film', thickness => 300),
    etchant   => Physics::Etch::Etchant->new(
        name => 'custom', type => 'wet', composition => '...', mechanism => 'chemical'),
    rate      => 200,
    ref_temp  => 25,
    Ea        => 0.5,
    isotropy  => 0.9,
    feature_cd => 500,
);
print $etch->report;

DISCLAIMER

Rates, activation energies, selectivities and all other numeric values in the embedded databases are illustrative teaching values, not process specifications. Always calibrate against your own tool and chemistry.

SEE ALSO

Physics::Etch::WetEtch, Physics::Etch::DryEtch, Physics::Etch::Process, Physics::Etch::Material, Physics::Etch::Etchant, Physics::Etch::Chamber, Physics::Etch::Loading, Physics::Etch::Layout, Physics::Etch::GDSII, Physics::Etch::Simulation

AUTHOR

Jovan Trujillo <jtrujil43@users.noreply.github.com>

LICENSE

This software is licensed under the GPL-3.0-or-later license.