Richardson, Carey, and Mulvaney formulated the five species phosphorus diffusion model[46,33] described by the differential equation system in (5.4) - (5.8). In these equations , , , , and represent the concentrations of substitutional phosphorus, the silicon interstitials, vacancies, phosphorus-vacancy, and phosphorus-interstitial pairs, respectively.
The according MDL input deck can be structured into
// Parameters
Parameter<double> k_for_e = 1.0e-14; // [cm^3/s]
Parameter<double> k_for_f = 1.0e-14;
Parameter<double> k_bi = 1.0e-10;
Parameter<double> k_rev_e = 10.; // [1/s]
Parameter<double> k_rev_f = 12.;
Parameter<double> Dv = - 1.0e-10; // [cm^2/s]
Parameter<double> Di = - 1.0e-09;
Parameter<double> De = - 1.0e-13;
Parameter<double> Df = - 2.0e-13;
Parameter<double> Veq = 1.0e14; // [1/cm^3]
Parameter<double> Ieq = 1.0e14;
Parameter<double> VIeq = 1.0e14 * 1.0e14;
Example 5.2: Global parameter declarations
Instance PromisNTSetup = PairDiffInitModel;
NewModel PairDiffInitModel : PromisNTSetupModel {
evaluate {
:inputPBF = "$COMPILE";
:outputPBF = "$OUTPUT";
:endTime = "$ENDTIME";
:stepTime = "$STEPTIME";
:quantityList = "P_Pair_Quantities";
:chargeStateTable = "P_Pair_Charge_States";
:processTemperature = "PairDiffTemperatureModel";
:deviceSetup = "P_Pair_Diff_DeviceSetup";
:diffusionModel["Si"] = "Promis";
:diffusionModel["Ambient"] = "Promis";
:boundaryModel["Ambient"]["Si"] = "Promis";
}
}
NewModel PairDiffTemperatureModel : ProcessTemperatureModel {
evaluate {
:temp = 1173.0;
}
}
Example 5.3: Simulator setup for the five species pair diffusion model
NewModel P_Pair_Quantities : QuantityListModel {
evaluate {
:quantity["P"] = {{ P }};
:quantity["V"] = {{ V }};
:quantity["I"] = {{ I }};
:quantity["E"] = {{ E }};
:quantity["F"] = {{ F }};
}
}
NewModel P_Pair_Charge_States : ChargeStateTableModel {
evaluate {}
}
Example 5.4: Quantity setup for the five species pair diffusion model
NewModel P_Pair_Diff_DeviceSetup : DeviceSetupModel {
evaluate {
:segmentPreProcessingSetup ["Si"] = "SiSegmentPreProcessingSetup";
:segmentCoefficientSetup ["Si"] = "SiCoefficient";
:segmentPostProcessingSetup["Si"] = "SiSegmentPostProcessingSetup";
:segmentPreProcessingSetup ["Ambient"] = "AmbientPreprocessingSetup";
:segmentCoefficientSetup ["Ambient"] = "AmbientCoefficient";
:segmentPostProcessingSetup["Ambient"] = "AmbientPostprocessingSetup";
:boundaryCoefficientSetup["Ambient"]["Si"] = "P_Pair_BoundarySetup";
}
}
Example 5.5: Device setup for the five species pair diffusion model
NewModel SiSegmentPreProcessingSetup : SegmentPreProcessingSetupModel {
basicSetup {
:quantityInitialization["P"] = "Zero_Init";
:quantityInitialization["V"] = "Zero_Init";
:quantityInitialization["I"] = "Zero_Init";
:quantityInitialization["E"] = "Zero_Init";
:quantityInitialization["F"] = "Zero_Init";
}
evaluate {
call basicSetup;
:quantityInitialization["V"] = "VI_Init";
:quantityInitialization["I"] = "VI_Init";
}
}
NewModel AmbientPreprocessingSetup : SegmentPreProcessingSetupModel {
evaluate { call basicSetup; }
}
NewModel SiSegmentPostProcessingSetup : SegmentPostProcessingSetupModel {
setup {
:quantityPostprocessing["P"] = "No_Post";
:quantityPostprocessing["V"] = "No_Post";
:quantityPostprocessing["I"] = "No_Post";
:quantityPostprocessing["E"] = "No_Post";
:quantityPostprocessing["F"] = "No_Post";
}
evaluate { call setup; }
}
NewModel AmbientPostprocessingSetup : SiSegmentPostProcessingSetup {
evaluate { call setup; }
}
Example 5.6: Pre- and postprocessing setup
NewModel SiCoefficient : CoefficientSetupModel {
evaluate {
:alpha["P"]["P"] = "Uno_alpha"; :alpha["V"]["V"] = "Uno_alpha";
:alpha["I"]["I"] = "Uno_alpha"; :alpha["E"]["E"] = "Uno_alpha";
:alpha["F"]["F"] = "Uno_alpha";
:a["V"]["V"] = "V_a"; :a["I"]["I"] = "I_a";
:a["E"]["E"] = "E_a"; :a["F"]["F"] = "F_a";
:gamma["P"] = "P_gamma"; :gamma["V"] = "V_gamma";
:gamma["I"] = "I_gamma"; :gamma["E"] = "E_gamma";
:gamma["F"] = "F_gamma";
}
}
NewModel AmbientCoefficient : CoefficientSetupModel {
evaluate {
:alpha["P"]["P"] = "Uno_alpha"; :alpha["V"]["V"] = "Uno_alpha";
:alpha["I"]["I"] = "Uno_alpha"; :alpha["E"]["E"] = "Uno_alpha";
:alpha["F"]["F"] = "Uno_alpha";
}
}
NewModel P_Pair_BoundarySetup : BoundaryCoefficientSetupModel {
evaluate {
:dirichlet2["V"] = 1.0e14; :dirichlet2["I"] = 1.0e14;
:dirichlet2["P"] = 5.0e20; :dirichlet2["E"] = 5.0e19;
:dirichlet2["F"] = 4.16666e19;
}
}
Example 5.7: Coefficient setup
NewModel Zero_Init : QuantityInitializationModel {
evaluate {
:Cown = 0.0;
}
}
NewModel VI_Init : QuantityInitializationModel {
evaluate {
:Cown = 1.0e14;
}
}
NewModel No_Post : QuantityPostprocessingModel {}
Example 5.8: Quantity initialization and postprocessing
NewModel Uno_alpha : CoeffModel_alpha {
evaluate { :Coeff = 1.; }
}
// Coefficients for P related equation
NewModel P_gamma : CoeffModel_gamma {
evaluate {
:Coeff = - ::k_for_e * :P * :V + ::k_rev_e * :E -
::k_for_f * :P * :I + ::k_rev_f * :F;
:dCoeff d_P = - ::k_for_e * :V - ::k_for_f * :I;
:dCoeff d_V = - ::k_for_e * :P;
:dCoeff d_I = - ::k_for_f * :P;
:dCoeff d_E = ::k_rev_e;
:dCoeff d_F = ::k_rev_f;
}
}
// Coefficients for V related equation
NewModel V_a : CoeffModel_a {
evaluate { :Coeff = ::Dv; }
}
NewModel V_gamma : CoeffModel_gamma {
evaluate {
:Coeff = - ::k_for_e * :P * :V + ::k_rev_e * :E -
::k_bi * ( :V * :I - ::VIeq );
:dCoeff d_P = - ::k_for_e * :V;
:dCoeff d_V = - ::k_for_e * :P - ::k_bi * :I;
:dCoeff d_I = - ::k_bi * :V;
:dCoeff d_E = ::k_rev_e;
}
}
// Coefficients for I related equation
NewModel I_a : CoeffModel_a {
evaluate { :Coeff = ::Di; }
}
NewModel I_gamma : CoeffModel_gamma {
evaluate {
:Coeff = - ::k_for_f * :P * :I + ::k_rev_f * :F -
::k_bi * ( :V * :I - ::VIeq );
:dCoeff d_P = - ::k_for_f * :I;
:dCoeff d_V = - ::k_bi * :I;
:dCoeff d_I = - ::k_for_f * :P - ::k_bi * :V;
:dCoeff d_F = + ::k_rev_f;
}
}
Example 5.9: Coefficient Models (part 1)
// Coefficients for E related equation
NewModel E_a : CoeffModel_a {
evaluate { :Coeff = ::De; }
}
NewModel E_gamma : CoeffModel_gamma {
evaluate {
:Coeff = ::k_for_e * :P * :V - ::k_rev_e * :E;
:dCoeff d_P = ::k_for_e * :V;
:dCoeff d_V = ::k_for_e * :P;
:dCoeff d_E = - ::k_rev_e;
}
}
// Coefficients for F related equation
NewModel F_a : CoeffModel_a {
evaluate { :Coeff = ::Df; }
}
NewModel F_gamma : CoeffModel_gamma {
evaluate {
:Coeff = ::k_for_f * :P * :I - ::k_rev_f * :F;
:dCoeff d_P = ::k_for_f * :I;
:dCoeff d_I = ::k_for_f * :P;
:dCoeff d_F = - ::k_for_f;
}
}
Example 5.10: Coefficient Models (part 2)
The simulation results depicted in Fig. 5.3, Fig. 5.4, and Fig. 5.5 show the expected formation of the flat point defect profiles in the inner device regions determined by their reaction term in the according equations (5.4) and (5.5). The formation of the sharp gradients of the defect concentrations near the surface induced by the Dirichlet boundary conditions and the coupling with the equations for the phosphorus, phosphorus-interstitial, and phosphorus-vacancy pair profiles in term is responsible for the creation of the phosphorus plateau, kink, and tail. The resulting profiles perfectly coincide with the results obtained by the authors of this pair diffusion model.