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.
%overridesmay setthickness,temperature,feature_cd,mask,mask_thickness,substrate,overetch,uniformity,time,etchant(to pick a specific chemistry), and any rate parameter such asrate,Ea,power,pressure,bias, oranisotropy. 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.
recipesacceptsmaterial,processand/oretchantfilters and returns matching recipe hashrefs.find_recipereturns 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/AREFhierarchies 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).
toneselects clear vs dark field.Physics::Etch::Chamber - reactor geometry to electrode
area_ratio,power_density,residence_time,mean_free_path,knudsen, and a heuristic DCself_bias/ion_energy.process_conditionsreturns pressure and bias ready to pass to the dry etch.Physics::Etch::Loading - macro loading
R/R0 = 1/(1+kappa*A_open), micro loading1/(1+k_micro*density), and ARDE / RIE-lag1/(1+AR/AR0)(narrow features etch slower and taper).from_chamberestimateskappafrom 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.