1 /*****************************************************************************/
3 /* 8888888 88888888 88888888 */
6 /* 8 88888888 88888888 */
9 /* 888888 888888888 888888888 */
11 /* A Two-Dimensional General Purpose Semiconductor Simulator. */
13 /* GSS material database Version 0.4 */
14 /* Last update: Feb 17, 2006 */
18 /* NINT, No.69 P.O.Box, Xi'an City, China */
20 /*****************************************************************************/
22 // Material Type: Si(1-x)Ge(x). (in fact, use parameters for Si instead.)
27 class GSS_Mob_Lucent
: public PMIS_Mobility
30 // parameters for Lucent mobility
48 PetscScalar me_over_m0
;
49 PetscScalar mh_over_m0
;
50 PetscScalar me_over_mh
;
53 // parameters for transvers field modification
70 // parameters for parallel field modification
74 void Mob_Lucent_Init()
76 MMNN_UM
= 5.220000E+01*cm
*cm
/V
/s
;
77 MMXN_UM
= 1.417000E+03*cm
*cm
/V
/s
;
78 NRFN_UM
= 9.680000E+16*pow(cm
,-3);
79 ALPN_UM
= 6.800000E-01;
80 TETN_UM
= 2.285000E+00;
81 NRFD_UM
= 4.000000E+20*pow(cm
,-3);
82 CRFD_UM
= 2.100000E-01;
84 MMNP_UM
= 4.490000E+01*cm
*cm
/V
/s
;
85 MMXP_UM
= 4.705000E+02*cm
*cm
/V
/s
;
86 NRFP_UM
= 2.230000E+17*pow(cm
,-3);
87 ALPP_UM
= 7.190000E-01;
88 TETP_UM
= 2.247000E+00;
89 NRFA_UM
= 7.200000E+20*pow(cm
,-3);
90 CRFA_UM
= 5.000000E-01;
92 NSC_REF
= 3.97e13
*pow(cm
,-2);
93 CAR_REF
= 1.36e20
*pow(cm
,-3);
96 me_over_mh
= 1.0/1.258;
99 EXN4_LUC
= 2.330000E-02;
100 EXP4_LUC
= 1.190000E-02;
101 EXN9_LUC
= 7.670000E-02;
102 EXP9_LUC
= 1.230000E-01;
103 AN_LUC
= 2.580000E+00;
104 AP_LUC
= 2.180000E+00;
105 BN_LUC
= 3.610000E+07*cm
/s
;
106 BP_LUC
= 1.510000E+07*cm
/s
;
107 CN_LUC
= 1.700000E+04*cm
*cm
/V
/s
*pow(V
/cm
,PetscScalar(1.0/3.0))*pow(cm
,3*EXN4_LUC
);
108 CP_LUC
= 4.180000E+03*cm
*cm
/V
/s
*pow(V
/cm
,PetscScalar(1.0/3.0))*pow(cm
,3*EXP4_LUC
);
109 //DN_LUC=3.580000E+18*cm*cm/V/s*pow(V/cm,rn);
110 //DP_LUC=4.100000E+15*cm*cm/V/s*pow(V/cm,rp);
111 FN_LUC
= 6.850000E-21*pow(cm
,3*(1-EXN9_LUC
));
112 FP_LUC
= 7.820000E-21*pow(cm
,3*(1-EXP9_LUC
));
113 KN_LUC
= 1.700000E+00;
114 KP_LUC
= 9.000000E-01;
116 BETAN
= 2.000000E+00;
117 BETAP
= 1.000000E+00;
120 //---------------------------------------------------------------------------
121 // Electron low field bulk mobility
122 PetscScalar
ElecMobPhilips(const PetscScalar
&p
,const PetscScalar
&n
,const PetscScalar
&Tl
) const
124 PetscScalar mu_lattice
= MMXN_UM
*pow(Tl
/T300
,-TETN_UM
);
125 PetscScalar mu1
= MMXN_UM
*MMXN_UM
/(MMXN_UM
-MMNN_UM
)*pow(Tl
/T300
,3*ALPN_UM
-1.5);
126 PetscScalar mu2
= MMXN_UM
*MMNN_UM
/(MMXN_UM
-MMNN_UM
)*sqrt(T300
/Tl
);
127 PetscScalar Na
= ReadDopingNa()+1e0
*pow(cm
,-3);
128 PetscScalar Nd
= ReadDopingNd()+1e0
*pow(cm
,-3);
129 PetscScalar Nds
= Nd
*(1.0+1.0/(CRFD_UM
+(NRFD_UM
/Nd
)*(NRFD_UM
/Nd
)));
130 PetscScalar Nas
= Na
*(1.0+1.0/(CRFA_UM
+(NRFA_UM
/Na
)*(NRFA_UM
/Na
)));
131 PetscScalar Nsc
= Nds
+Nas
+fabs(p
);
133 PetscScalar P
= 1.0/(2.459/(NSC_REF
/pow(Nsc
,PetscScalar(2.0/3.0)))+3.828/(CAR_REF
/fabs(n
+p
)*me_over_m0
))*(Tl
/T300
)*(Tl
/T300
);
134 PetscScalar pp1
= pow(P
,PetscScalar(0.6478));
135 PetscScalar F
= (0.7643*pp1
+2.2999+6.5502*me_over_mh
)/(pp1
+2.3670-0.8552*me_over_mh
);
136 //PetscScalar G = 1-0.89233/pow(0.41372+P*pow(Tl/T300/me_over_m0,PetscScalar(0.28227)),PetscScalar(0.19778))+0.005978/pow(P*pow(Tl/T300/me_over_m0,PetscScalar(0.72169)),PetscScalar(1.80618));
137 PetscScalar G
= 1-4.41804/pow(39.9014+P
*pow(Tl
/T300
/me_over_m0
,PetscScalar(0.0001)),PetscScalar(0.38297))+0.52896/pow(P
*pow(T300
/Tl
*me_over_m0
,PetscScalar(1.595787)),PetscScalar(0.25948));
138 PetscScalar Nsce
= Nds
+Nas
*G
+fabs(p
)/F
;
139 PetscScalar mu_scatt
= mu1
*(Nsc
/Nsce
)*pow(NRFN_UM
/Nsc
,ALPN_UM
)+mu2
*(fabs(n
+p
)/Nsce
);
140 return 1.0/(1.0/mu_lattice
+1.0/mu_scatt
);
142 AutoDScalar
ElecMobPhilips(const AutoDScalar
&p
,const AutoDScalar
&n
,const AutoDScalar
&Tl
) const
144 AutoDScalar mu_lattice
= MMXN_UM
*pow(Tl
/T300
,-TETN_UM
);
145 AutoDScalar mu1
= MMXN_UM
*MMXN_UM
/(MMXN_UM
-MMNN_UM
)*pow(Tl
/T300
,3*ALPN_UM
-1.5);
146 AutoDScalar mu2
= MMXN_UM
*MMNN_UM
/(MMXN_UM
-MMNN_UM
)*sqrt(T300
/Tl
);
147 PetscScalar Na
= ReadDopingNa()+1e0
*pow(cm
,-3);
148 PetscScalar Nd
= ReadDopingNd()+1e0
*pow(cm
,-3);
149 PetscScalar Nds
= Nd
*(1.0+1.0/(CRFD_UM
+(NRFD_UM
/Nd
)*(NRFD_UM
/Nd
)));
150 PetscScalar Nas
= Na
*(1.0+1.0/(CRFA_UM
+(NRFA_UM
/Na
)*(NRFA_UM
/Na
)));
151 AutoDScalar Nsc
= Nds
+Nas
+fabs(p
);
153 AutoDScalar P
= 1.0/(2.459/(NSC_REF
/pow(Nsc
,PetscScalar(2.0/3.0)))+3.828/(CAR_REF
/fabs(n
+p
)*me_over_m0
))*(Tl
/T300
)*(Tl
/T300
);
154 AutoDScalar pp1
= pow(P
,PetscScalar(0.6478));
155 AutoDScalar F
= (0.7643*pp1
+2.2999+6.5502*me_over_mh
)/(pp1
+2.3670-0.8552*me_over_mh
);
156 //PetscScalar G = 1-0.89233/pow(0.41372+P*pow(Tl/T300/me_over_m0,PetscScalar(0.28227)),PetscScalar(0.19778))+0.005978/pow(P*pow(Tl/T300/me_over_m0,PetscScalar(0.72169)),PetscScalar(1.80618));
157 AutoDScalar G
= 1-4.41804/pow(39.9014+P
*pow(Tl
/T300
/me_over_m0
,PetscScalar(0.0001)),PetscScalar(0.38297))+0.52896/pow(P
*pow(T300
/Tl
*me_over_m0
,PetscScalar(1.595787)),PetscScalar(0.25948));
158 AutoDScalar Nsce
= Nds
+Nas
*G
+fabs(p
)/F
;
159 AutoDScalar mu_scatt
= mu1
*(Nsc
/Nsce
)*pow(NRFN_UM
/Nsc
,ALPN_UM
)+mu2
*(fabs(n
+p
)/Nsce
);
160 return 1.0/(1.0/mu_lattice
+1.0/mu_scatt
);
163 //---------------------------------------------------------------------------
164 // Hole low field bulk mobility
165 PetscScalar
HoleMobPhilips(const PetscScalar
&p
,const PetscScalar
&n
,const PetscScalar
&Tl
) const
167 PetscScalar mu_lattice
= MMXP_UM
*pow(Tl
/T300
,-TETP_UM
);
168 PetscScalar mu1
= MMXP_UM
*MMXP_UM
/(MMXP_UM
-MMNP_UM
)*pow(Tl
/T300
,3*ALPP_UM
-1.5);
169 PetscScalar mu2
= MMXP_UM
*MMNP_UM
/(MMXP_UM
-MMNP_UM
)*sqrt(T300
/Tl
);
170 PetscScalar Na
= ReadDopingNa()+1e0
*pow(cm
,-3);
171 PetscScalar Nd
= ReadDopingNd()+1e0
*pow(cm
,-3);
172 PetscScalar Nds
= Nd
*(1.0+1.0/(CRFD_UM
+(NRFD_UM
/Nd
)*(NRFD_UM
/Nd
)));
173 PetscScalar Nas
= Na
*(1.0+1.0/(CRFA_UM
+(NRFA_UM
/Na
)*(NRFA_UM
/Na
)));
174 PetscScalar Nsc
= Nds
+Nas
+fabs(n
);
176 PetscScalar P
= 1.0/(2.459/(NSC_REF
/pow(Nsc
,PetscScalar(2.0/3.0)))+3.828/(CAR_REF
/fabs(n
+p
)*mh_over_m0
))*(Tl
/T300
)*(Tl
/T300
);
177 PetscScalar pp1
= pow(P
,PetscScalar(0.6478));
178 PetscScalar F
= (0.7643*pp1
+2.2999+6.5502/me_over_mh
)/(pp1
+2.3670-0.8552/me_over_mh
);
179 //PetscScalar G = 1-0.89233/pow(0.41372+P*pow(Tl/T300/mh_over_m0,0.28227),0.19778)+0.005978/pow(P*pow(Tl/T300/mh_over_m0,0.72169),1.80618);
180 PetscScalar G
= 1-4.41804/pow(39.9014+P
*pow(Tl
/T300
/mh_over_m0
,PetscScalar(0.0001)),PetscScalar(0.38297))+0.52896/pow(P
*pow(T300
/Tl
*mh_over_m0
,PetscScalar(1.595787)),PetscScalar(0.25948));
181 PetscScalar Nsce
= Nas
+Nds
*G
+fabs(n
)/F
;
182 PetscScalar mu_scatt
= mu1
*(Nsc
/Nsce
)*pow(NRFP_UM
/Nsc
,ALPP_UM
)+mu2
*(fabs(n
+p
)/Nsce
);
183 return 1.0/(1.0/mu_lattice
+1.0/mu_scatt
);
185 AutoDScalar
HoleMobPhilips(const AutoDScalar
&p
,const AutoDScalar
&n
,const AutoDScalar
&Tl
) const
187 AutoDScalar mu_lattice
= MMXP_UM
*pow(Tl
/T300
,-TETP_UM
);
188 AutoDScalar mu1
= MMXP_UM
*MMXP_UM
/(MMXP_UM
-MMNP_UM
)*pow(Tl
/T300
,3*ALPP_UM
-1.5);
189 AutoDScalar mu2
= MMXP_UM
*MMNP_UM
/(MMXP_UM
-MMNP_UM
)*sqrt(T300
/Tl
);
190 PetscScalar Na
= ReadDopingNa()+1e0
*pow(cm
,-3);
191 PetscScalar Nd
= ReadDopingNd()+1e0
*pow(cm
,-3);
192 PetscScalar Nds
= Nd
*(1.0+1.0/(CRFD_UM
+(NRFD_UM
/Nd
)*(NRFD_UM
/Nd
)));
193 PetscScalar Nas
= Na
*(1.0+1.0/(CRFA_UM
+(NRFA_UM
/Na
)*(NRFA_UM
/Na
)));
194 AutoDScalar Nsc
= Nds
+Nas
+fabs(n
);
196 AutoDScalar P
= 1.0/(2.459/(NSC_REF
/pow(Nsc
,PetscScalar(2.0/3.0)))+3.828/(CAR_REF
/fabs(n
+p
)*mh_over_m0
))*(Tl
/T300
)*(Tl
/T300
);
197 AutoDScalar pp1
= pow(P
,PetscScalar(0.6478));
198 AutoDScalar F
= (0.7643*pp1
+2.2999+6.5502/me_over_mh
)/(pp1
+2.3670-0.8552/me_over_mh
);
199 //PetscScalar G = 1-0.89233/pow(0.41372+P*pow(Tl/T300/mh_over_m0,0.28227),0.19778)+0.005978/pow(P*pow(Tl/T300/mh_over_m0,0.72169),1.80618);
200 AutoDScalar G
= 1-4.41804/pow(39.9014+P
*pow(Tl
/T300
/mh_over_m0
,PetscScalar(0.0001)),PetscScalar(0.38297))+0.52896/pow(P
*pow(T300
/Tl
*mh_over_m0
,PetscScalar(1.595787)),PetscScalar(0.25948));
201 AutoDScalar Nsce
= Nas
+Nds
*G
+fabs(n
)/F
;
202 AutoDScalar mu_scatt
= mu1
*(Nsc
/Nsce
)*pow(NRFP_UM
/Nsc
,ALPP_UM
)+mu2
*(fabs(n
+p
)/Nsce
);
203 return 1.0/(1.0/mu_lattice
+1.0/mu_scatt
);
206 //---------------------------------------------------------------------------
207 //the surface acoustical phono scattering and roughness scattering for electron
208 PetscScalar
ElecMobLombardi(const PetscScalar
&p
,const PetscScalar
&n
,const PetscScalar
&Tl
,const PetscScalar
&Et
) const
210 PetscScalar Na
= ReadDopingNa();
211 PetscScalar Nd
= ReadDopingNd();
212 PetscScalar N_total
= Na
+Nd
+1e0
*pow(cm
,-3);
213 PetscScalar ET
= Et
+1.0*V
/cm
;
214 PetscScalar mu_ac
= BN_LUC
/ET
+ CN_LUC
*pow(N_total
,EXN4_LUC
)*pow(Tl
/T300
,-KN_LUC
)*pow(ET
,PetscScalar(-1.0/3.0));
215 PetscScalar r
= AN_LUC
+ FN_LUC
*fabs(n
+p
)/pow(N_total
,EXN9_LUC
);
216 PetscScalar DN_LUC
=3.580000E+18*cm
*cm
/V
/s
*pow(V
/cm
,r
);
217 PetscScalar mu_sr
= DN_LUC
*pow(ET
,-r
);
218 return 1.0/(1.0/mu_ac
+1.0/mu_sr
);
220 AutoDScalar
ElecMobLombardi(const AutoDScalar
&p
,const AutoDScalar
&n
,const AutoDScalar
&Tl
,const AutoDScalar
&Et
) const
222 PetscScalar Na
= ReadDopingNa();
223 PetscScalar Nd
= ReadDopingNd();
224 PetscScalar N_total
= Na
+Nd
+1e0
*pow(cm
,-3);
225 AutoDScalar ET
= Et
+1.0*V
/cm
;
226 AutoDScalar mu_ac
= BN_LUC
/ET
+ CN_LUC
*pow(N_total
,EXN4_LUC
)*pow(Tl
/T300
,-KN_LUC
)*pow(ET
,PetscScalar(-1.0/3.0));
227 AutoDScalar r
= AN_LUC
+ FN_LUC
*fabs(n
+p
)/pow(N_total
,EXN9_LUC
);
228 AutoDScalar DN_LUC
=3.580000E+18*cm
*cm
/V
/s
*pow(V
/cm
,r
);
229 AutoDScalar mu_sr
= DN_LUC
*pow(ET
,-r
);
230 return 1.0/(1.0/mu_ac
+1.0/mu_sr
);
233 //---------------------------------------------------------------------------
234 //the surface acoustical phono scattering and roughness scattering for hole
235 PetscScalar
HoleMobLombardi(const PetscScalar
&p
,const PetscScalar
&n
,const PetscScalar
&Tl
,const PetscScalar
&Et
) const
237 PetscScalar Na
= ReadDopingNa();
238 PetscScalar Nd
= ReadDopingNd();
239 PetscScalar N_total
= Na
+Nd
+1e0
*pow(cm
,-3);
240 PetscScalar ET
= Et
+1.0*V
/cm
;
241 PetscScalar mu_ac
= BP_LUC
/ET
+ CP_LUC
*pow(N_total
,EXP4_LUC
)*pow(Tl
/T300
,-KP_LUC
)*pow(ET
,PetscScalar(-1.0/3.0));
242 PetscScalar r
= AP_LUC
+ FP_LUC
*fabs(n
+p
)/pow(N_total
,EXP9_LUC
);
243 PetscScalar DP_LUC
=4.100000E+15*cm
*cm
/V
/s
*pow(V
/cm
,r
);
244 PetscScalar mu_sr
= DP_LUC
*pow(ET
,-r
);
245 return 1.0/(1.0/mu_ac
+1.0/mu_sr
);
247 AutoDScalar
HoleMobLombardi(const AutoDScalar
&p
,const AutoDScalar
&n
,const AutoDScalar
&Tl
,const AutoDScalar
&Et
) const
249 PetscScalar Na
= ReadDopingNa();
250 PetscScalar Nd
= ReadDopingNd();
251 PetscScalar N_total
= Na
+Nd
+1e0
*pow(cm
,-3);
252 AutoDScalar ET
= Et
+1.0*V
/cm
;
253 AutoDScalar mu_ac
= BP_LUC
/ET
+ CP_LUC
*pow(N_total
,EXP4_LUC
)*pow(Tl
/T300
,-KP_LUC
)*pow(ET
,PetscScalar(-1.0/3.0));
254 AutoDScalar r
= AP_LUC
+ FP_LUC
*fabs(n
+p
)/pow(N_total
,EXP9_LUC
);
255 AutoDScalar DP_LUC
=4.100000E+15*cm
*cm
/V
/s
*pow(V
/cm
,r
);
256 AutoDScalar mu_sr
= DP_LUC
*pow(ET
,-r
);
257 return 1.0/(1.0/mu_ac
+1.0/mu_sr
);
262 //---------------------------------------------------------------------------
264 PetscScalar
ElecMob(const PetscScalar
&p
, const PetscScalar
&n
, const PetscScalar
&Tl
,
265 const PetscScalar
&Ep
, const PetscScalar
&Et
, const PetscScalar
&Tn
) const
267 PetscScalar vsat
= (2.4e7
*cm
/s
)/(1+0.8*exp(Tl
/(2*T300
)));
268 PetscScalar mu0
= 1.0/(1.0/ElecMobPhilips(p
,n
,Tl
)+1.0/ElecMobLombardi(p
,n
,Tl
,Et
));
269 PetscScalar mu
= 2*mu0
/(1+pow(1+pow(2*mu0
*fabs(Ep
)/vsat
,BETAN
),1.0/BETAN
));
272 AutoDScalar
ElecMob(const AutoDScalar
&p
, const AutoDScalar
&n
, const AutoDScalar
&Tl
,
273 const AutoDScalar
&Ep
, const AutoDScalar
&Et
, const AutoDScalar
&Tn
) const
275 AutoDScalar vsat
= (2.4e7
*cm
/s
)/(1+0.8*exp(Tl
/(2*T300
)));
276 AutoDScalar mu0
= 1.0/(1.0/ElecMobPhilips(p
,n
,Tl
)+1.0/ElecMobLombardi(p
,n
,Tl
,Et
));
277 AutoDScalar mu
= 2*mu0
/(1+pow(1+pow(2*mu0
*fabs(Ep
)/vsat
,BETAN
),1.0/BETAN
));
281 //---------------------------------------------------------------------------
283 PetscScalar
HoleMob (const PetscScalar
&p
, const PetscScalar
&n
, const PetscScalar
&Tl
,
284 const PetscScalar
&Ep
, const PetscScalar
&Et
, const PetscScalar
&Tp
) const
286 PetscScalar vsat
= (2.4e7
*cm
/s
)/(1+0.8*exp(Tl
/(2*T300
)));
287 PetscScalar mu0
= 1.0/(1.0/HoleMobPhilips(p
,n
,Tl
)+1.0/HoleMobLombardi(p
,n
,Tl
,Et
));
288 PetscScalar mu
= 2*mu0
/(1+pow(1+pow(2*mu0
*fabs(Ep
)/vsat
,BETAP
),1.0/BETAP
));
291 AutoDScalar
HoleMob(const AutoDScalar
&p
, const AutoDScalar
&n
, const AutoDScalar
&Tl
,
292 const AutoDScalar
&Ep
, const AutoDScalar
&Et
, const AutoDScalar
&Tp
) const
294 AutoDScalar vsat
= (2.4e7
*cm
/s
)/(1+0.8*exp(Tl
/(2*T300
)));
295 AutoDScalar mu0
= 1.0/(1.0/HoleMobPhilips(p
,n
,Tl
)+1.0/HoleMobLombardi(p
,n
,Tl
,Et
));
296 AutoDScalar mu
= 2*mu0
/(1+pow(1+pow(2*mu0
*fabs(Ep
)/vsat
,BETAP
),1.0/BETAP
));
303 GSS_Mob_Lucent(const PMIS_Environment
&env
):PMIS_Mobility(env
)
311 /*---------------------------------------------------------------
312 * the interface function called by material databse controller
313 * and it setup Lucent mobility model
317 PMIS_Mobility
* PMIS_SiGe_Mob_Lucent (const PMIS_Environment
& env
)
319 return new GSS_Mob_Lucent(env
);