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_Philips
: public PMIS_Mobility
30 // parameters for Philips mobility
48 PetscScalar me_over_m0
;
49 PetscScalar mh_over_m0
;
50 PetscScalar me_over_mh
;
53 // parameters for high field modification
56 void Mob_Philips_Init()
58 MMNN_UM
= 5.220000E+01*cm
*cm
/V
/s
;
59 MMXN_UM
= 1.417000E+03*cm
*cm
/V
/s
;
60 NRFN_UM
= 9.680000E+16*pow(cm
,-3);
61 ALPN_UM
= 6.800000E-01;
62 TETN_UM
= 2.285000E+00;
63 NRFD_UM
= 4.000000E+20*pow(cm
,-3);
64 CRFD_UM
= 2.100000E-01;
66 MMNP_UM
= 4.490000E+01*cm
*cm
/V
/s
;
67 MMXP_UM
= 4.705000E+02*cm
*cm
/V
/s
;
68 NRFP_UM
= 2.230000E+17*pow(cm
,-3);
69 ALPP_UM
= 7.190000E-01;
70 TETP_UM
= 2.247000E+00;
71 NRFA_UM
= 7.200000E+20*pow(cm
,-3);
72 CRFA_UM
= 5.000000E-01;
74 NSC_REF
= 3.97e13
*pow(cm
,-2);
75 CAR_REF
= 1.36e20
*pow(cm
,-3);
78 me_over_mh
= 1.0/1.258;
85 //---------------------------------------------------------------------------
86 // Electron low field mobility
87 PetscScalar
ElecMobPhilips(const PetscScalar
&p
,const PetscScalar
&n
,const PetscScalar
&Tl
) const
89 PetscScalar mu_lattice
= MMXN_UM
*pow(Tl
/T300
,-TETN_UM
);
90 PetscScalar mu1
= MMXN_UM
*MMXN_UM
/(MMXN_UM
-MMNN_UM
)*pow(Tl
/T300
,3*ALPN_UM
-1.5);
91 PetscScalar mu2
= MMXN_UM
*MMNN_UM
/(MMXN_UM
-MMNN_UM
)*sqrt(T300
/Tl
);
92 PetscScalar Na
= ReadDopingNa()+1e0
*pow(cm
,-3);
93 PetscScalar Nd
= ReadDopingNd()+1e0
*pow(cm
,-3);
94 PetscScalar Nds
= Nd
*(1.0+1.0/(CRFD_UM
+(NRFD_UM
/Nd
)*(NRFD_UM
/Nd
)));
95 PetscScalar Nas
= Na
*(1.0+1.0/(CRFA_UM
+(NRFA_UM
/Na
)*(NRFA_UM
/Na
)));
96 PetscScalar Nsc
= Nds
+Nas
+fabs(p
);
98 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
);
99 PetscScalar pp1
= pow(P
,PetscScalar(0.6478));
100 PetscScalar F
= (0.7643*pp1
+2.2999+6.5502*me_over_mh
)/(pp1
+2.3670-0.8552*me_over_mh
);
101 //PetscScalar G = 1-0.89233/pow(0.41372+P*pow(Tl/T300/me_over_m0,0.28227),0.19778)+0.005978/pow(P*pow(Tl/T300/me_over_m0,0.72169),1.80618);
102 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));
103 PetscScalar Nsce
= Nds
+Nas
*G
+fabs(p
)/F
;
104 PetscScalar mu_scatt
= mu1
*(Nsc
/Nsce
)*pow(NRFN_UM
/Nsc
,ALPN_UM
)+mu2
*(fabs(n
+p
)/Nsce
);
105 return 1.0/(1.0/mu_lattice
+1.0/mu_scatt
);
107 AutoDScalar
ElecMobPhilips(const AutoDScalar
&p
,const AutoDScalar
&n
,const AutoDScalar
&Tl
) const
109 AutoDScalar mu_lattice
= MMXN_UM
*pow(Tl
/T300
,-TETN_UM
);
110 AutoDScalar mu1
= MMXN_UM
*MMXN_UM
/(MMXN_UM
-MMNN_UM
)*pow(Tl
/T300
,3*ALPN_UM
-1.5);
111 AutoDScalar mu2
= MMXN_UM
*MMNN_UM
/(MMXN_UM
-MMNN_UM
)*sqrt(T300
/Tl
);
112 PetscScalar Na
= ReadDopingNa()+1e0
*pow(cm
,-3);
113 PetscScalar Nd
= ReadDopingNd()+1e0
*pow(cm
,-3);
114 PetscScalar Nds
= Nd
*(1.0+1.0/(CRFD_UM
+(NRFD_UM
/Nd
)*(NRFD_UM
/Nd
)));
115 PetscScalar Nas
= Na
*(1.0+1.0/(CRFA_UM
+(NRFA_UM
/Na
)*(NRFA_UM
/Na
)));
116 AutoDScalar Nsc
= Nds
+Nas
+fabs(p
);
118 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
);
119 AutoDScalar pp1
= pow(P
,PetscScalar(0.6478));
120 AutoDScalar F
= (0.7643*pp1
+2.2999+6.5502*me_over_mh
)/(pp1
+2.3670-0.8552*me_over_mh
);
121 //PetscScalar G = 1-0.89233/pow(0.41372+P*pow(Tl/T300/me_over_m0,0.28227),0.19778)+0.005978/pow(P*pow(Tl/T300/me_over_m0,0.72169),1.80618);
122 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));
123 AutoDScalar Nsce
= Nds
+Nas
*G
+fabs(p
)/F
;
124 AutoDScalar mu_scatt
= mu1
*(Nsc
/Nsce
)*pow(NRFN_UM
/Nsc
,ALPN_UM
)+mu2
*(fabs(n
+p
)/Nsce
);
125 return 1.0/(1.0/mu_lattice
+1.0/mu_scatt
);
128 //---------------------------------------------------------------------------
129 // Hole low field mobility
130 PetscScalar
HoleMobPhilips(const PetscScalar
&p
,const PetscScalar
&n
,const PetscScalar
&Tl
) const
132 PetscScalar mu_lattice
= MMXP_UM
*pow(Tl
/T300
,-TETP_UM
);
133 PetscScalar mu1
= MMXP_UM
*MMXP_UM
/(MMXP_UM
-MMNP_UM
)*pow(Tl
/T300
,3*ALPP_UM
-1.5);
134 PetscScalar mu2
= MMXP_UM
*MMNP_UM
/(MMXP_UM
-MMNP_UM
)*sqrt(T300
/Tl
);
135 PetscScalar Na
= ReadDopingNa()+1e0
*pow(cm
,-3);
136 PetscScalar Nd
= ReadDopingNd()+1e0
*pow(cm
,-3);
137 PetscScalar Nds
= Nd
*(1.0+1.0/(CRFD_UM
+(NRFD_UM
/Nd
)*(NRFD_UM
/Nd
)));
138 PetscScalar Nas
= Na
*(1.0+1.0/(CRFA_UM
+(NRFA_UM
/Na
)*(NRFA_UM
/Na
)));
139 PetscScalar Nsc
= Nds
+Nas
+fabs(n
);
141 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
);
142 PetscScalar pp1
= pow(P
,PetscScalar(0.6478));
143 PetscScalar F
= (0.7643*pp1
+2.2999+6.5502/me_over_mh
)/(pp1
+2.3670-0.8552/me_over_mh
);
144 //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);
145 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));
146 PetscScalar Nsce
= Nas
+Nds
*G
+fabs(n
)/F
;
147 PetscScalar mu_scatt
= mu1
*(Nsc
/Nsce
)*pow(NRFP_UM
/Nsc
,ALPP_UM
)+mu2
*(fabs(n
+p
)/Nsce
);
148 return 1.0/(1.0/mu_lattice
+1.0/mu_scatt
);
150 AutoDScalar
HoleMobPhilips(const AutoDScalar
&p
,const AutoDScalar
&n
,const AutoDScalar
&Tl
) const
152 AutoDScalar mu_lattice
= MMXP_UM
*pow(Tl
/T300
,-TETP_UM
);
153 AutoDScalar mu1
= MMXP_UM
*MMXP_UM
/(MMXP_UM
-MMNP_UM
)*pow(Tl
/T300
,3*ALPP_UM
-1.5);
154 AutoDScalar mu2
= MMXP_UM
*MMNP_UM
/(MMXP_UM
-MMNP_UM
)*sqrt(T300
/Tl
);
155 PetscScalar Na
= ReadDopingNa()+1e0
*pow(cm
,-3);
156 PetscScalar Nd
= ReadDopingNd()+1e0
*pow(cm
,-3);
157 PetscScalar Nds
= Nd
*(1.0+1.0/(CRFD_UM
+(NRFD_UM
/Nd
)*(NRFD_UM
/Nd
)));
158 PetscScalar Nas
= Na
*(1.0+1.0/(CRFA_UM
+(NRFA_UM
/Na
)*(NRFA_UM
/Na
)));
159 AutoDScalar Nsc
= Nds
+Nas
+fabs(n
);
161 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
);
162 AutoDScalar pp1
= pow(P
,PetscScalar(0.6478));
163 AutoDScalar F
= (0.7643*pp1
+2.2999+6.5502/me_over_mh
)/(pp1
+2.3670-0.8552/me_over_mh
);
164 //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);
165 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));
166 AutoDScalar Nsce
= Nas
+Nds
*G
+fabs(n
)/F
;
167 AutoDScalar mu_scatt
= mu1
*(Nsc
/Nsce
)*pow(NRFP_UM
/Nsc
,ALPP_UM
)+mu2
*(fabs(n
+p
)/Nsce
);
168 return 1.0/(1.0/mu_lattice
+1.0/mu_scatt
);
172 //---------------------------------------------------------------------------
174 PetscScalar
ElecMob(const PetscScalar
&p
, const PetscScalar
&n
, const PetscScalar
&Tl
,
175 const PetscScalar
&Ep
, const PetscScalar
&Et
, const PetscScalar
&Tn
) const
177 PetscScalar vsat
= (2.4e7
*cm
/s
)/(1+0.8*exp(Tl
/(2*T300
)));
178 PetscScalar mu0
= ElecMobPhilips(p
,n
,Tl
);
179 return mu0
/pow(1+pow(mu0
*fabs(Ep
)/vsat
,BETAN
),1.0/BETAN
);
181 AutoDScalar
ElecMob(const AutoDScalar
&p
, const AutoDScalar
&n
, const AutoDScalar
&Tl
,
182 const AutoDScalar
&Ep
, const AutoDScalar
&Et
, const AutoDScalar
&Tn
) const
184 AutoDScalar vsat
= (2.4e7
*cm
/s
)/(1+0.8*exp(Tl
/(2*T300
)));
185 AutoDScalar mu0
= ElecMobPhilips(p
,n
,Tl
);
186 return mu0
/pow(1+pow(mu0
*fabs(Ep
)/vsat
,BETAN
),1.0/BETAN
);
189 //---------------------------------------------------------------------------
191 PetscScalar
HoleMob (const PetscScalar
&p
, const PetscScalar
&n
, const PetscScalar
&Tl
,
192 const PetscScalar
&Ep
, const PetscScalar
&Et
, const PetscScalar
&Tp
) const
194 PetscScalar vsat
= (2.4e7
*cm
/s
)/(1+0.8*exp(Tl
/(2*T300
)));
195 PetscScalar mu0
= HoleMobPhilips(p
,n
,Tl
);
196 return mu0
/pow(1+pow(mu0
*fabs(Ep
)/vsat
,BETAP
),1.0/BETAP
);
198 AutoDScalar
HoleMob(const AutoDScalar
&p
, const AutoDScalar
&n
, const AutoDScalar
&Tl
,
199 const AutoDScalar
&Ep
, const AutoDScalar
&Et
, const AutoDScalar
&Tp
) const
201 AutoDScalar vsat
= (2.4e7
*cm
/s
)/(1+0.8*exp(Tl
/(2*T300
)));
202 AutoDScalar mu0
= HoleMobPhilips(p
,n
,Tl
);
203 return mu0
/pow(1+pow(mu0
*fabs(Ep
)/vsat
,BETAP
),1.0/BETAP
);
208 GSS_Mob_Philips(const PMIS_Environment
&env
):PMIS_Mobility(env
)
216 /*---------------------------------------------------------------
217 * the interface function called by material databse controller
218 * and it setup Philips mobility model
222 PMIS_Mobility
* PMIS_SiGe_Mob_Philips (const PMIS_Environment
& env
)
224 return new GSS_Mob_Philips(env
);