From 5c09768e9ebe6d21b22787d4dd69f405b6172f04 Mon Sep 17 00:00:00 2001 From: Tobias Reiter <44025882+tobre1@users.noreply.github.com> Date: Thu, 21 Mar 2024 10:53:18 +0100 Subject: [PATCH] SF6O2 model parameters refactor (#73) * Add SF6O2 parameter struct * Remove model parameters * SF6O2 parameters Python wrapper * Update SF6O2 example --- examples/holeEtching/config.txt | 2 +- examples/holeEtching/holeEtching.cpp | 1 + examples/holeEtching/holeEtching.py | 2 + include/models/psModelParameters.hpp | 75 -------- include/models/psSF6O2Etching.hpp | 275 +++++++++++++++++---------- python/pyWrap.cpp | 194 ++++++++++++++----- 6 files changed, 324 insertions(+), 225 deletions(-) delete mode 100644 include/models/psModelParameters.hpp diff --git a/examples/holeEtching/config.txt b/examples/holeEtching/config.txt index df55af34..134b89e7 100644 --- a/examples/holeEtching/config.txt +++ b/examples/holeEtching/config.txt @@ -2,7 +2,7 @@ # all length units are in micrometers (um) # Domain -gridDelta=5.0 # um +gridDelta=4.0 # um xExtent=100.0 # um yExtent=100.0 # um diff --git a/examples/holeEtching/holeEtching.cpp b/examples/holeEtching/holeEtching.cpp index 1d4feca7..1722023e 100644 --- a/examples/holeEtching/holeEtching.cpp +++ b/examples/holeEtching/holeEtching.cpp @@ -12,6 +12,7 @@ int main(int argc, char *argv[]) { constexpr int D = 3; psLogger::setLogLevel(psLogLevel::INTERMEDIATE); + omp_set_num_threads(16); // Parse the parameters Parameters params; diff --git a/examples/holeEtching/holeEtching.py b/examples/holeEtching/holeEtching.py index d96124ba..081b265b 100644 --- a/examples/holeEtching/holeEtching.py +++ b/examples/holeEtching/holeEtching.py @@ -43,6 +43,8 @@ oxySputterYield=params["A_O"], etchStopDepth=params["etchStopDepth"], ) +parameters = model.getParameters() +parameters.Mask.rho = 100. # process setup process = vps.Process() diff --git a/include/models/psModelParameters.hpp b/include/models/psModelParameters.hpp deleted file mode 100644 index a161d26d..00000000 --- a/include/models/psModelParameters.hpp +++ /dev/null @@ -1,75 +0,0 @@ -#pragma once - -#include - -namespace psParameters { - -constexpr double kB = 8.617333262 * 1e-5; // eV / K -constexpr double roomTemperature = 300.; // K - -namespace Si { - -// sputtering coefficients in Ar -constexpr double Eth_sp_Ar = 20.; // eV -constexpr double Eth_sp_Ar_sqrt = 4.47213595499958; -constexpr double A_sp = 0.0337; -constexpr double B_sp = 9.3; - -// chemical etching -constexpr double K = 0.029997010728956663; -constexpr double E_a = 0.108; // eV - -// density -constexpr double rho = 5.02; // 1e22 atoms/cm³ - -} // namespace Si - -namespace SiO2 { - -// sputtering coefficients in Ar -constexpr double Eth_sp_Ar = 18.; // eV -constexpr double Eth_sp_Ar_sqrt = 4.242640687119285; -constexpr double A_sp = 0.0139; - -// chemical etching -constexpr double K = 0.002789491704544977; -constexpr double E_a = 0.168; // eV - -// density -constexpr double rho = 2.3; // 1e22 atoms/cm³ - -} // namespace SiO2 - -namespace Polymer { -// density -static constexpr double rho = 2; // 1e22 atoms/cm³ -} // namespace Polymer - -namespace Si3N4 { -// density -static constexpr double rho = 2.3; // 1e22 atoms/cm³ -} // namespace Si3N4 - -namespace TiN { -// density -static constexpr double rho = 5.0804; // 1e22 atoms/cm³ -} // namespace TiN - -namespace Cl { -// density -static constexpr double rho = 0.0042399; // 1e22 atoms/cm³ -} // namespace Cl - -namespace Mask { -// density -static constexpr double rho = 500.; // 1e22 atoms/cm³ -} // namespace Mask - -namespace Ion { -constexpr double inflectAngle = 1.55334303; -constexpr double n_l = 10.; -constexpr double A = 1. / (1. + n_l * (M_PI_2 / inflectAngle - 1.)); -constexpr double minAngle = 1.3962634; -} // namespace Ion - -} // namespace psParameters \ No newline at end of file diff --git a/include/models/psSF6O2Etching.hpp b/include/models/psSF6O2Etching.hpp index 8422d90b..fa79c94e 100644 --- a/include/models/psSF6O2Etching.hpp +++ b/include/models/psSF6O2Etching.hpp @@ -1,7 +1,5 @@ #pragma once -#include - #include #include #include @@ -13,31 +11,71 @@ namespace SF6O2Implementation { -// sticking probabilities -constexpr double beta_F = 0.7; -constexpr double beta_O = 1.; +template struct Parameters { + // fluxes in (1e15 /cm² /s) + NumericType ionFlux = 12.; + NumericType etchantFlux = 1.8e3; + NumericType oxygenFlux = 1.0e2; + + NumericType etchStopDepth = std::numeric_limits::lowest(); + + // sticking probabilities + NumericType beta_F = 0.7; + NumericType beta_O = 1.; + + // Mask + struct MaskType { + NumericType rho = 500.; // 1e22 atoms/cm³ + NumericType beta_F = 0.01; + NumericType beta_O = 0.1; + + NumericType Eth_sp = 20.; // eV + NumericType A_sp = 0.0139; + NumericType B_sp = 9.3; + } Mask; + + // Si + struct SiType { + // density + NumericType rho = 5.02; // 1e22 atoms/cm³ + + // sputtering coefficients + NumericType Eth_sp = 20.; // eV + NumericType Eth_ie = 4.; // eV + NumericType A_sp = 0.0337; + NumericType B_sp = 9.3; + NumericType A_ie = 0.0361; + + // chemical etching + NumericType k_sigma = 3.0e2; // in (1e15 cm⁻²s⁻¹) + NumericType beta_sigma = 5.0e-2; // in (1e15 cm⁻²s⁻¹) + } Si; + + // Passivation + struct PassivationType { + // sputtering coefficients + NumericType Eth_ie = 4.; // eV + NumericType A_ie = 0.0361; + } Passivation; + + struct IonType { + NumericType meanEnergy = 100.; // eV + NumericType sigmaEnergy = 10.; // eV + NumericType exponent = 500.; + + NumericType inflectAngle = 1.55334303; + NumericType n_l = 10.; + NumericType minAngle = 1.3962634; + } Ions; +}; template class SurfaceModel : public psSurfaceModel { using psSurfaceModel::coverages; - - // fluxes in (1e15 /cm²) - const NumericType totalIonFlux = 12.; - const NumericType totalEtchantFlux = 1.8e3; - const NumericType totalOxygenFlux = 1.0e2; - static constexpr NumericType k_sigma_Si = 3.0e2; // in (1e15 cm⁻²s⁻¹) - static constexpr NumericType beta_sigma_Si = 5.0e-2; // in (1e15 cm⁻²s⁻¹) - - const NumericType maskRate = 1.; - const NumericType etchStop; + const Parameters ¶ms; public: - SurfaceModel(const double ionFlux, const double etchantFlux, - const double oxygenFlux, const NumericType passedMaskRate, - const NumericType etchStopDepth) - : totalIonFlux(ionFlux), totalEtchantFlux(etchantFlux), - totalOxygenFlux(oxygenFlux), maskRate(passedMaskRate), - etchStop(etchStopDepth) {} + SurfaceModel(const Parameters &pParams) : params(pParams) {} void initializeCoverages(unsigned numGeometryPoints) override { if (coverages == nullptr) { @@ -67,20 +105,20 @@ class SurfaceModel : public psSurfaceModel { bool stop = false; for (size_t i = 0; i < numPoints; ++i) { - if (coordinates[i][D - 1] < etchStop) { + if (coordinates[i][D - 1] < params.etchStopDepth) { stop = true; break; } if (psMaterialMap::isMaterial(materialIds[i], psMaterial::Mask)) { - etchRate[i] = -(maskRate / psParameters::Mask::rho) * - ionSputteringRate->at(i) * totalIonFlux; + etchRate[i] = + -(1 / params.Mask.rho) * ionSputteringRate->at(i) * params.ionFlux; } else { - etchRate[i] = -(1 / psParameters::Si::rho) * - (k_sigma_Si * eCoverage->at(i) / 4. + - ionSputteringRate->at(i) * totalIonFlux + - eCoverage->at(i) * ionEnhancedRate->at(i) * - totalIonFlux); // in um / s + etchRate[i] = + -(1 / params.Si.rho) * (params.Si.k_sigma * eCoverage->at(i) / 4. + + ionSputteringRate->at(i) * params.ionFlux + + eCoverage->at(i) * ionEnhancedRate->at(i) * + params.ionFlux); // in um / s } } @@ -114,24 +152,26 @@ class SurfaceModel : public psSurfaceModel { eCoverage->at(i) = 0; } else { eCoverage->at(i) = - etchantRate->at(i) * totalEtchantFlux * beta_F / - (etchantRate->at(i) * totalEtchantFlux * beta_F + - (k_sigma_Si + 2 * ionEnhancedRate->at(i) * totalIonFlux) * - (1 + (oxygenRate->at(i) * totalOxygenFlux * beta_O) / - (beta_sigma_Si + - oxygenSputteringRate->at(i) * totalIonFlux))); + etchantRate->at(i) * params.etchantFlux * params.beta_F / + (etchantRate->at(i) * params.etchantFlux * params.beta_F + + (params.Si.k_sigma + 2 * ionEnhancedRate->at(i) * params.ionFlux) * + (1 + (oxygenRate->at(i) * params.oxygenFlux * params.beta_O) / + (params.Si.beta_sigma + + oxygenSputteringRate->at(i) * params.ionFlux))); } if (oxygenRate->at(i) < 1e-6) { oCoverage->at(i) = 0; } else { oCoverage->at(i) = - oxygenRate->at(i) * totalOxygenFlux * beta_O / - (oxygenRate->at(i) * totalOxygenFlux * beta_O + - (beta_sigma_Si + oxygenSputteringRate->at(i) * totalIonFlux) * - (1 + (etchantRate->at(i) * totalEtchantFlux * beta_F) / - (k_sigma_Si + - 2 * ionEnhancedRate->at(i) * totalIonFlux))); + oxygenRate->at(i) * params.oxygenFlux * params.beta_O / + (oxygenRate->at(i) * params.oxygenFlux * params.beta_O + + (params.Si.beta_sigma + + oxygenSputteringRate->at(i) * params.ionFlux) * + (1 + + (etchantRate->at(i) * params.etchantFlux * params.beta_F) / + (params.Si.k_sigma + + 2 * ionEnhancedRate->at(i) * params.ionFlux))); } } } @@ -140,10 +180,10 @@ class SurfaceModel : public psSurfaceModel { template class Ion : public rayParticle, NumericType> { public: - Ion(const NumericType passedMeanEnergy, const NumericType passedSigmaEnergy, - const NumericType passedPower, const NumericType oxySputterYield) - : meanEnergy(passedMeanEnergy), sigmaEnergy(passedSigmaEnergy), - power(passedPower), A_O(oxySputterYield) {} + Ion(const Parameters &pParams) + : params(pParams), + A(1. / + (1. + params.Ions.n_l * (M_PI_2 / params.Ions.inflectAngle - 1.))) {} void surfaceCollision(NumericType rayWeight, const rayTriple &rayDir, @@ -164,36 +204,45 @@ class Ion : public rayParticle, NumericType> { const double angle = std::acos(std::max(std::min(cosTheta, 1.), 0.)); - NumericType f_Si_theta; + NumericType f_ie_theta; if (cosTheta > 0.5) { - f_Si_theta = 1.; + f_ie_theta = 1.; } else { - f_Si_theta = 3. - 6. * angle / rayInternal::PI; + f_ie_theta = 3. - 6. * angle / M_PI; + } + NumericType A_sp = params.Si.A_sp; + NumericType B_sp = params.Si.B_sp; + NumericType Eth_sp = params.Si.Eth_sp; + if (psMaterialMap::isMaterial(materialId, psMaterial::Mask)) { + A_sp = params.Mask.A_sp; + B_sp = params.Mask.B_sp; + Eth_sp = params.Mask.Eth_sp; } - NumericType f_O_theta = f_Si_theta; - NumericType f_sp_theta = - (1 + psParameters::Si::B_sp * (1 - cosTheta * cosTheta)) * cosTheta; + + NumericType f_sp_theta = (1 + B_sp * (1 - cosTheta * cosTheta)) * cosTheta; double sqrtE = std::sqrt(E); - NumericType Y_sp = psParameters::Si::A_sp * - std::max(sqrtE - psParameters::Si::Eth_sp_Ar_sqrt, 0.) * - f_sp_theta; - NumericType Y_Si = - A_Si * std::max(sqrtE - std::sqrt(Eth_Si), 0.) * f_Si_theta; - NumericType Y_O = A_O * std::max(sqrtE - std::sqrt(Eth_O), 0.) * f_O_theta; + NumericType Y_sp = + params.Si.A_sp * std::max(sqrtE - std::sqrt(Eth_sp), 0.) * f_sp_theta; + NumericType Y_Si = params.Si.A_ie * + std::max(sqrtE - std::sqrt(params.Si.Eth_ie), 0.) * + f_ie_theta; + NumericType Y_O = + params.Passivation.A_ie * + std::max(sqrtE - std::sqrt(params.Passivation.Eth_ie), 0.) * f_ie_theta; assert(Y_sp >= 0. && "Invalid yield"); assert(Y_Si >= 0. && "Invalid yield"); assert(Y_O >= 0. && "Invalid yield"); // sputtering yield Y_sp ionSputteringRate - localData.getVectorData(0)[primID] += rayWeight * Y_sp; + localData.getVectorData(0)[primID] += Y_sp; // ion enhanced etching yield Y_Si ionEnhancedRate - localData.getVectorData(1)[primID] += rayWeight * Y_Si; + localData.getVectorData(1)[primID] += Y_Si; // ion enhanced O sputtering yield Y_O oxygenSputteringRate - localData.getVectorData(2)[primID] += rayWeight * Y_O; + localData.getVectorData(2)[primID] += Y_O; } std::pair> @@ -214,13 +263,12 @@ class Ion : public rayParticle, NumericType> { // Small incident angles are reflected with the energy fraction centered at // 0 NumericType Eref_peak; - if (incAngle >= psParameters::Ion::inflectAngle) { - Eref_peak = (1 - (1 - psParameters::Ion::A) * (M_PI_2 - incAngle) / - (M_PI_2 - psParameters::Ion::inflectAngle)); + if (incAngle >= params.Ions.inflectAngle) { + Eref_peak = (1 - (1 - A) * (M_PI_2 - incAngle) / + (M_PI_2 - params.Ions.inflectAngle)); } else { - Eref_peak = psParameters::Ion::A * - std::pow(incAngle / psParameters::Ion::inflectAngle, - psParameters::Ion::n_l); + Eref_peak = + A * std::pow(incAngle / params.Ions.inflectAngle, params.Ions.n_l); } // Gaussian distribution around the Eref_peak scaled by the particle energy NumericType NewEnergy; @@ -230,52 +278,43 @@ class Ion : public rayParticle, NumericType> { } while (NewEnergy > E || NewEnergy < 0.); // Set the flag to stop tracing if the energy is below the threshold - if (NewEnergy > minEnergy) { + if (NewEnergy > params.Si.Eth_ie) { E = NewEnergy; - // auto direction = rayReflectionConedCosine( - // M_PI_2 - std::min(incAngle, minAngle), rayDir, geomNormal, Rng); - auto direction = rayReflectionSpecular(rayDir, geomNormal); - - return std::pair>{1. - Eref_peak, - direction}; + auto direction = rayReflectionConedCosine( + rayDir, geomNormal, Rng, std::max(incAngle, params.Ions.minAngle)); + return std::pair>{0., direction}; } else { return std::pair>{ 1., rayTriple{0., 0., 0.}}; } } void initNew(rayRNG &RNG) override final { - std::normal_distribution normalDist{meanEnergy, sigmaEnergy}; + std::normal_distribution normalDist{params.Ions.meanEnergy, + params.Ions.sigmaEnergy}; do { E = normalDist(RNG); - } while (E < minEnergy); + } while (E <= 0.); } NumericType getSourceDistributionPower() const override final { - return power; + return params.Ions.exponent; } std::vector getLocalDataLabels() const override final { return {"ionSputteringRate", "ionEnhancedRate", "oxygenSputteringRate"}; } private: - static constexpr NumericType A_Si = 7.; - static constexpr NumericType B_sp = 9.3; - const NumericType A_O; - - static constexpr NumericType Eth_Si = 15.; // eV - static constexpr NumericType Eth_O = 10.; // eV - - // ion energy - static constexpr NumericType minEnergy = - 4.; // Discard particles with energy < 1eV - const NumericType meanEnergy; - const NumericType sigmaEnergy; - const NumericType power; + const Parameters ¶ms; + const NumericType A; NumericType E; }; template class Etchant : public rayParticle, NumericType> { + const Parameters ¶ms; + public: + Etchant(const Parameters &pParams) : params(pParams) {} + void surfaceCollision(NumericType rayWeight, const rayTriple &rayDir, const rayTriple &geomNormal, @@ -297,7 +336,10 @@ class Etchant : public rayParticle, NumericType> { // O surface coverage const auto &phi_O = globalData->getVectorData(1)[primID]; // Obtain the sticking probability - NumericType S_eff = beta_F * std::max(1. - phi_F - phi_O, 0.); + NumericType beta = params.beta_F; + if (psMaterialMap::isMaterial(materialId, psMaterial::Mask)) + beta = params.Mask.beta_F; + NumericType S_eff = beta * std::max(1. - phi_F - phi_O, 0.); auto direction = rayReflectionDiffuse(geomNormal, Rng); return std::pair>{S_eff, direction}; @@ -310,7 +352,11 @@ class Etchant : public rayParticle, NumericType> { template class Oxygen : public rayParticle, NumericType> { + const Parameters ¶ms; + public: + Oxygen(const Parameters &pParams) : params(pParams) {} + void surfaceCollision(NumericType rayWeight, const rayTriple &rayDir, const rayTriple &geomNormal, @@ -331,7 +377,10 @@ class Oxygen : public rayParticle, NumericType> { NumericType S_eff; const auto &phi_F = globalData->getVectorData(0)[primID]; const auto &phi_O = globalData->getVectorData(1)[primID]; - S_eff = beta_O * std::max(1. - phi_O - phi_F, 0.); + NumericType beta = params.beta_O; + if (psMaterialMap::isMaterial(materialId, psMaterial::Mask)) + beta = params.Mask.beta_O; + S_eff = beta * std::max(1. - phi_O - phi_F, 0.); auto direction = rayReflectionDiffuse(geomNormal, Rng); return std::pair>{S_eff, direction}; @@ -350,27 +399,55 @@ class Oxygen : public rayParticle, NumericType> { template class psSF6O2Etching : public psProcessModel { public: + psSF6O2Etching() { initializeModel(); } + // All flux values are in units 1e16 / cm² psSF6O2Etching(const double ionFlux, const double etchantFlux, const double oxygenFlux, const NumericType meanEnergy /* eV */, const NumericType sigmaEnergy /* eV */, // 5 parameters - const NumericType ionExponent = 100., + const NumericType ionExponent = 300., const NumericType oxySputterYield = 2., - const NumericType maskRate = 1., const NumericType etchStopDepth = std::numeric_limits::lowest()) { + params.ionFlux = ionFlux; + params.etchantFlux = etchantFlux; + params.oxygenFlux = oxygenFlux; + params.Ions.meanEnergy = meanEnergy; + params.Ions.sigmaEnergy = sigmaEnergy; + params.Ions.exponent = ionExponent; + params.Passivation.A_ie = oxySputterYield; + params.etchStopDepth = etchStopDepth; + initializeModel(); + } + + psSF6O2Etching(const SF6O2Implementation::Parameters &pParams) + : params(pParams) { + initializeModel(); + } + + void + setParameters(const SF6O2Implementation::Parameters &pParams) { + params = pParams; + } + + SF6O2Implementation::Parameters &getParameters() { + return params; + } + +private: + void initializeModel() { // particles - auto ion = std::make_unique>( - meanEnergy, sigmaEnergy, ionExponent, oxySputterYield); + auto ion = + std::make_unique>(params); auto etchant = - std::make_unique>(); + std::make_unique>(params); auto oxygen = - std::make_unique>(); + std::make_unique>(params); // surface model auto surfModel = psSmartPointer>::New( - ionFlux, etchantFlux, oxygenFlux, maskRate, etchStopDepth); + params); // velocity field auto velField = psSmartPointer>::New(2); @@ -382,4 +459,6 @@ class psSF6O2Etching : public psProcessModel { this->insertNextParticleType(etchant); this->insertNextParticleType(oxygen); } + + SF6O2Implementation::Parameters params; }; \ No newline at end of file diff --git a/python/pyWrap.cpp b/python/pyWrap.cpp index 1345aa2b..bf9f9c4f 100644 --- a/python/pyWrap.cpp +++ b/python/pyWrap.cpp @@ -571,9 +571,84 @@ PYBIND11_MODULE(VIENNAPS_MODULE_NAME, module) { pybind11::arg("stickingProbabilityP2") = 0., pybind11::arg("rateP2") = 0., pybind11::arg("orderP2") = 0.); + // SF6O2 Parameters + pybind11::class_::MaskType>( + module, "SF6O2ParametersMask") + .def(pybind11::init<>()) + .def_readwrite("rho", &SF6O2Implementation::Parameters::MaskType::rho) + .def_readwrite("beta_F", + &SF6O2Implementation::Parameters::MaskType::beta_F) + .def_readwrite("beta_O", + &SF6O2Implementation::Parameters::MaskType::beta_O) + .def_readwrite("A_sp", + &SF6O2Implementation::Parameters::MaskType::A_sp) + .def_readwrite("B_sp", + &SF6O2Implementation::Parameters::MaskType::B_sp) + .def_readwrite("Eth_sp", + &SF6O2Implementation::Parameters::MaskType::Eth_sp); + + pybind11::class_::SiType>( + module, "SF6O2ParametersSi") + .def(pybind11::init<>()) + .def_readwrite("rho", &SF6O2Implementation::Parameters::SiType::rho) + .def_readwrite("k_sigma", + &SF6O2Implementation::Parameters::SiType::k_sigma) + .def_readwrite("beta_sigma", + &SF6O2Implementation::Parameters::SiType::beta_sigma) + .def_readwrite("A_sp", &SF6O2Implementation::Parameters::SiType::A_sp) + .def_readwrite("B_sp", &SF6O2Implementation::Parameters::SiType::B_sp) + .def_readwrite("Eth_ie", + &SF6O2Implementation::Parameters::SiType::Eth_ie) + .def_readwrite("Eth_sp", + &SF6O2Implementation::Parameters::SiType::Eth_sp) + .def_readwrite("A_ie", &SF6O2Implementation::Parameters::SiType::A_ie); + + pybind11::class_::PassivationType>( + module, "SF6O2ParametersPassivation") + .def(pybind11::init<>()) + .def_readwrite( + "Eth_ie", + &SF6O2Implementation::Parameters::PassivationType::Eth_ie) + .def_readwrite( + "A_ie", &SF6O2Implementation::Parameters::PassivationType::A_ie); + + pybind11::class_::IonType>( + module, "SF6O2ParametersIons") + .def(pybind11::init<>()) + .def_readwrite("meanEnergy", + &SF6O2Implementation::Parameters::IonType::meanEnergy) + .def_readwrite("sigmaEnergy", + &SF6O2Implementation::Parameters::IonType::sigmaEnergy) + .def_readwrite("exponent", + &SF6O2Implementation::Parameters::IonType::exponent) + .def_readwrite("inflectAngle", + &SF6O2Implementation::Parameters::IonType::inflectAngle) + .def_readwrite("n_l", &SF6O2Implementation::Parameters::IonType::n_l) + .def_readwrite("minAngle", + &SF6O2Implementation::Parameters::IonType::minAngle); + + pybind11::class_>(module, + "SF6O2Parameters") + .def(pybind11::init<>()) + .def_readwrite("ionFlux", &SF6O2Implementation::Parameters::ionFlux) + .def_readwrite("etchantFlux", + &SF6O2Implementation::Parameters::etchantFlux) + .def_readwrite("oxygenFlux", + &SF6O2Implementation::Parameters::oxygenFlux) + .def_readwrite("etchStopDepth", + &SF6O2Implementation::Parameters::etchStopDepth) + .def_readwrite("beta_F", &SF6O2Implementation::Parameters::beta_F) + .def_readwrite("beta_O", &SF6O2Implementation::Parameters::beta_O) + .def_readwrite("Mask", &SF6O2Implementation::Parameters::Mask) + .def_readwrite("Si", &SF6O2Implementation::Parameters::Si) + .def_readwrite("Polymer", + &SF6O2Implementation::Parameters::Passivation) + .def_readwrite("Ions", &SF6O2Implementation::Parameters::Ions); + // SF6O2 Etching pybind11::class_, psSmartPointer>>( module, "SF6O2Etching", processModel) + .def(pybind11::init<>()) .def(pybind11::init( &psSmartPointer>::New< const double /*ionFlux*/, const double /*etchantFlux*/, @@ -585,29 +660,12 @@ PYBIND11_MODULE(VIENNAPS_MODULE_NAME, module) { pybind11::arg("sigmaIonEnergy") = 10., pybind11::arg("ionExponent") = 100., pybind11::arg("oxySputterYield") = 3., - pybind11::arg("etchStopDepth") = std::numeric_limits::lowest()); - - // Fluorocarbon Etching - pybind11::class_, - psSmartPointer>>( - module, "FluorocarbonEtching", processModel) - .def(pybind11::init<>()) - .def( - pybind11::init(&psSmartPointer>::New< - const double /*ionFlux*/, const double /*etchantFlux*/, - const double /*polyFlux*/, T /*meanEnergy*/, - const T /*sigmaEnergy*/, const T /*ionExponent*/, - const T /*deltaP*/, const T /*etchStopDepth*/>), - pybind11::arg("ionFlux"), pybind11::arg("etchantFlux"), - pybind11::arg("polyFlux"), pybind11::arg("meanIonEnergy") = 100., - pybind11::arg("sigmaIonEnergy") = 10., - pybind11::arg("ionExponent") = 100., pybind11::arg("deltaP") = 0., - pybind11::arg("etchStopDepth") = std::numeric_limits::lowest()) - .def(pybind11::init(&psSmartPointer>::New< - const FluorocarbonImplementation::Parameters &>), + pybind11::arg("etchStopDepth") = std::numeric_limits::lowest()) + .def(pybind11::init(&psSmartPointer>::New< + const SF6O2Implementation::Parameters &>), pybind11::arg("parameters")) - .def("setParameters", &psFluorocarbonEtching::setParameters) - .def("getParameters", &psFluorocarbonEtching::getParameters, + .def("setParameters", &psSF6O2Etching::setParameters) + .def("getParameters", &psSF6O2Etching::getParameters, pybind11::return_value_policy::reference); // Fluorocarbon Parameters @@ -616,16 +674,19 @@ PYBIND11_MODULE(VIENNAPS_MODULE_NAME, module) { .def(pybind11::init<>()) .def_readwrite("rho", &FluorocarbonImplementation::Parameters::MaskType::rho) - .def_readwrite("beta_p", - &FluorocarbonImplementation::Parameters::MaskType::beta_p) - .def_readwrite("beta_e", - &FluorocarbonImplementation::Parameters::MaskType::beta_e) + .def_readwrite( + "beta_p", + &FluorocarbonImplementation::Parameters::MaskType::beta_p) + .def_readwrite( + "beta_e", + &FluorocarbonImplementation::Parameters::MaskType::beta_e) .def_readwrite("A_sp", &FluorocarbonImplementation::Parameters::MaskType::A_sp) .def_readwrite("B_sp", &FluorocarbonImplementation::Parameters::MaskType::B_sp) - .def_readwrite("Eth_sp", - &FluorocarbonImplementation::Parameters::MaskType::Eth_sp); + .def_readwrite( + "Eth_sp", + &FluorocarbonImplementation::Parameters::MaskType::Eth_sp); pybind11::class_::SiO2Type>( module, "FluorocarbonParametersSiO2") @@ -634,17 +695,20 @@ PYBIND11_MODULE(VIENNAPS_MODULE_NAME, module) { &FluorocarbonImplementation::Parameters::SiO2Type::rho) .def_readwrite("E_a", &FluorocarbonImplementation::Parameters::SiO2Type::E_a) - .def_readwrite("K", &FluorocarbonImplementation::Parameters::SiO2Type::K) + .def_readwrite("K", + &FluorocarbonImplementation::Parameters::SiO2Type::K) .def_readwrite("A_sp", &FluorocarbonImplementation::Parameters::SiO2Type::A_sp) .def_readwrite("B_sp", &FluorocarbonImplementation::Parameters::SiO2Type::B_sp) - .def_readwrite("Eth_ie", - &FluorocarbonImplementation::Parameters::SiO2Type::Eth_ie) - .def_readwrite("Eth_sp", - &FluorocarbonImplementation::Parameters::SiO2Type::Eth_sp) - .def_readwrite("A_ie", - &FluorocarbonImplementation::Parameters::SiO2Type::A_ie); + .def_readwrite( + "Eth_ie", + &FluorocarbonImplementation::Parameters::SiO2Type::Eth_ie) + .def_readwrite( + "Eth_sp", + &FluorocarbonImplementation::Parameters::SiO2Type::Eth_sp) + .def_readwrite( + "A_ie", &FluorocarbonImplementation::Parameters::SiO2Type::A_ie); pybind11::class_::Si3N4Type>( module, "FluorocarbonParametersSi3N4") @@ -653,17 +717,20 @@ PYBIND11_MODULE(VIENNAPS_MODULE_NAME, module) { &FluorocarbonImplementation::Parameters::Si3N4Type::rho) .def_readwrite("E_a", &FluorocarbonImplementation::Parameters::Si3N4Type::E_a) - .def_readwrite("K", &FluorocarbonImplementation::Parameters::Si3N4Type::K) - .def_readwrite("A_sp", - &FluorocarbonImplementation::Parameters::Si3N4Type::A_sp) - .def_readwrite("B_sp", - &FluorocarbonImplementation::Parameters::Si3N4Type::B_sp) - .def_readwrite("Eth_ie", - &FluorocarbonImplementation::Parameters::Si3N4Type::Eth_ie) - .def_readwrite("Eth_sp", - &FluorocarbonImplementation::Parameters::Si3N4Type::Eth_sp) - .def_readwrite("A_ie", - &FluorocarbonImplementation::Parameters::Si3N4Type::A_ie); + .def_readwrite("K", + &FluorocarbonImplementation::Parameters::Si3N4Type::K) + .def_readwrite( + "A_sp", &FluorocarbonImplementation::Parameters::Si3N4Type::A_sp) + .def_readwrite( + "B_sp", &FluorocarbonImplementation::Parameters::Si3N4Type::B_sp) + .def_readwrite( + "Eth_ie", + &FluorocarbonImplementation::Parameters::Si3N4Type::Eth_ie) + .def_readwrite( + "Eth_sp", + &FluorocarbonImplementation::Parameters::Si3N4Type::Eth_sp) + .def_readwrite( + "A_ie", &FluorocarbonImplementation::Parameters::Si3N4Type::A_ie); pybind11::class_::SiType>( module, "FluorocarbonParametersSi") @@ -687,13 +754,14 @@ PYBIND11_MODULE(VIENNAPS_MODULE_NAME, module) { pybind11::class_::PolymerType>( module, "FluorocarbonParametersPolymer") .def(pybind11::init<>()) - .def_readwrite("rho", - &FluorocarbonImplementation::Parameters::PolymerType::rho) + .def_readwrite( + "rho", &FluorocarbonImplementation::Parameters::PolymerType::rho) .def_readwrite( "Eth_ie", &FluorocarbonImplementation::Parameters::PolymerType::Eth_ie) .def_readwrite( - "A_ie", &FluorocarbonImplementation::Parameters::PolymerType::A_ie); + "A_ie", + &FluorocarbonImplementation::Parameters::PolymerType::A_ie); pybind11::class_::IonType>( module, "FluorocarbonParametersIons") @@ -704,8 +772,9 @@ PYBIND11_MODULE(VIENNAPS_MODULE_NAME, module) { .def_readwrite( "sigmaEnergy", &FluorocarbonImplementation::Parameters::IonType::sigmaEnergy) - .def_readwrite("exponent", - &FluorocarbonImplementation::Parameters::IonType::exponent) + .def_readwrite( + "exponent", + &FluorocarbonImplementation::Parameters::IonType::exponent) .def_readwrite( "inflectAngle", &FluorocarbonImplementation::Parameters::IonType::inflectAngle) @@ -736,6 +805,29 @@ PYBIND11_MODULE(VIENNAPS_MODULE_NAME, module) { &FluorocarbonImplementation::Parameters::Polymer) .def_readwrite("Ions", &FluorocarbonImplementation::Parameters::Ions); + // Fluorocarbon Etching + pybind11::class_, + psSmartPointer>>( + module, "FluorocarbonEtching", processModel) + .def(pybind11::init<>()) + .def( + pybind11::init(&psSmartPointer>::New< + const double /*ionFlux*/, const double /*etchantFlux*/, + const double /*polyFlux*/, T /*meanEnergy*/, + const T /*sigmaEnergy*/, const T /*ionExponent*/, + const T /*deltaP*/, const T /*etchStopDepth*/>), + pybind11::arg("ionFlux"), pybind11::arg("etchantFlux"), + pybind11::arg("polyFlux"), pybind11::arg("meanIonEnergy") = 100., + pybind11::arg("sigmaIonEnergy") = 10., + pybind11::arg("ionExponent") = 100., pybind11::arg("deltaP") = 0., + pybind11::arg("etchStopDepth") = std::numeric_limits::lowest()) + .def(pybind11::init(&psSmartPointer>::New< + const FluorocarbonImplementation::Parameters &>), + pybind11::arg("parameters")) + .def("setParameters", &psFluorocarbonEtching::setParameters) + .def("getParameters", &psFluorocarbonEtching::getParameters, + pybind11::return_value_policy::reference); + // Isotropic Process pybind11::class_, psSmartPointer>>(