48 lines
2.2 KiB
Python
48 lines
2.2 KiB
Python
# physics/pcad_physics.py
|
|
# Process simulation database for Ion Implantation and Thermal Diffusion in Silicon
|
|
|
|
import numpy as np
|
|
|
|
# Implant Range & Straggle in Silicon (Energy in keV, Rp and dRp in microns)
|
|
IMPLANT_DB = {
|
|
'Boron': {
|
|
'energy': np.array([10.0, 20.0, 30.0, 50.0, 80.0, 100.0, 150.0, 200.0, 300.0, 400.0, 500.0, 800.0, 1000.0, 1500.0, 2000.0]),
|
|
'Rp': np.array([0.04, 0.07, 0.10, 0.16, 0.24, 0.30, 0.42, 0.55, 0.75, 0.95, 1.15, 1.65, 1.95, 2.70, 3.20]),
|
|
'dRp': np.array([0.015, 0.025, 0.035, 0.050, 0.063, 0.070, 0.085, 0.100, 0.115, 0.125, 0.135, 0.155, 0.165, 0.185, 0.200])
|
|
},
|
|
'Phosphorus': {
|
|
'energy': np.array([10.0, 20.0, 30.0, 50.0, 80.0, 100.0, 150.0, 200.0, 300.0, 400.0, 500.0, 1000.0, 2000.0]),
|
|
'Rp': np.array([0.015, 0.028, 0.040, 0.065, 0.100, 0.120, 0.180, 0.240, 0.360, 0.480, 0.600, 1.100, 1.900]),
|
|
'dRp': np.array([0.007, 0.012, 0.016, 0.025, 0.038, 0.045, 0.060, 0.075, 0.095, 0.110, 0.120, 0.150, 0.180])
|
|
},
|
|
'Arsenic': {
|
|
'energy': np.array([10.0, 20.0, 30.0, 50.0, 80.0, 100.0, 150.0, 200.0, 300.0, 400.0, 500.0, 1000.0]),
|
|
'Rp': np.array([0.010, 0.018, 0.025, 0.038, 0.058, 0.070, 0.100, 0.130, 0.190, 0.250, 0.310, 0.580]),
|
|
'dRp': np.array([0.004, 0.007, 0.009, 0.014, 0.020, 0.025, 0.035, 0.045, 0.060, 0.075, 0.088, 0.135])
|
|
}
|
|
}
|
|
|
|
# Diffusion Arrhenius parameters in Silicon (D0 in cm^2/s, Ea in eV)
|
|
DIFFUSION_DB = {
|
|
'Boron': {'D0': 1.0, 'Ea': 3.46},
|
|
'Phosphorus': {'D0': 10.5, 'Ea': 3.69},
|
|
'Arsenic': {'D0': 0.32, 'Ea': 3.56}
|
|
}
|
|
|
|
def get_implant_params(dopant, energy_kev):
|
|
"""Interpolate Rp and dRp from database for a given energy in keV. Returns values in cm."""
|
|
db = IMPLANT_DB.get(dopant, IMPLANT_DB['Boron'])
|
|
e = np.clip(energy_kev, db['energy'][0], db['energy'][-1])
|
|
Rp_um = np.interp(e, db['energy'], db['Rp'])
|
|
dRp_um = np.interp(e, db['energy'], db['dRp'])
|
|
return Rp_um * 1e-4, dRp_um * 1e-4
|
|
|
|
def get_diffusion_coefficient(dopant, temp_c):
|
|
"""Calculate the diffusion coefficient D in cm^2/s at temperature temp_c in Celsius."""
|
|
db = DIFFUSION_DB.get(dopant, DIFFUSION_DB['Boron'])
|
|
T_k = temp_c + 273.15
|
|
k_B = 8.617333262145e-5 # eV/K
|
|
D0 = db['D0']
|
|
Ea = db['Ea']
|
|
return D0 * np.exp(-Ea / (k_B * T_k))
|