Incomplete Ionization

From Flooxs
Jump to navigation Jump to search

Referece: R. C. Jaeger and F. H. Gaensslen, “Simulation of Impurity Freezeout through Numerical Solution of Poisson’s Equation and Application to MOS Device Behavior,” IEEE Trans. Electron Devices, Vol. ED-27, pp. 914-920, May 1980.

Call this procedure to model incomplete ionization

#MUST CALL WITH ALL DOPANTS AT ONCE i.e.: IncompleteIonization "Boron Arsenic"
#ONLY 1 N-TYPE AND 1 P-TYPE EACH ALLOWED
proc IncompleteIonization {dopants} {
    #think about: don't really need "Na" or "Nd", bc Doping=Na or Doping=Nd in most cases
    pdbSetBoolean Silicon IncIon 1
    set nloop_yn 0
    set ploop_yn 0
    foreach dopant $dopants { 
        if {[pdbGetString $dopant Type] == "Ntype"} {
            set nloop_yn 1
            set Ed0 [pdbGetDouble $dopant Ed0]
            #solution add name=deltaEd solve const val =   ($Ed0-(3.100e-8)*((Nd)^(1.0/3.0))+(200.0*((T)^(-(1.00)))-(0.66)));# the units are wrong here
           set deltaEd $Ed0
           solution add name=Ndplus solve const val = "(Nd/(1.0+2.0*exp((nQFL-(Ec)+$deltaEd)/Vt)))"
           #solution name=Doping solve const val = "((Doping)-(Nd)+(Ndplus))"
       }
       if {[pdbGetString $dopant Type] == "Ptype"} {
           set ploop_yn 1
           set Ea0 [pdbGetDouble $dopant Ea0]
           #solution add name=deltaEa solve const val =  ($Ea0-(3.037e-8)*((Na)^(1.0/3.0))+(200.0*((T)^(-(0.95)))-(0.88)))
           set deltaEa $Ea0
           solution add name=Naplus solve const val = "(Na/(1.0+4.0*exp((Ev+$deltaEa-(pQFL))/Vt)))"
           #solution name=Doping solve const val = "((Doping)-(-(Na)+(Naplus)))"
       }
       puts "Incomplete Ionization of $dopant Complete."
   }
   if {($nloop_yn && $ploop_yn)} {
       puts "GOOD. YOU HAVE CODED FOR 1 PTYPE AND 1 NTYPE"
       solution name=Doping solve const val = "((Ndplus) - (Naplus))"
       #SetContacts
   } else {puts "error: YOU HAVE NOT CODED FOR THIS DOPING SITUATION!!!"}
}


warnings

You must have Na and Nd defined as solution variables, i.e.:

solution add name=Na const val="1.0e15"
solution add name=Nd const val="1.0e21*exp(-x*x/1e-6)

You must have your band terms defined

solution add name=Ec, Ev, nQFL, pQFL...

You must have these dopant-dependent properties defined in the pdb:

proc AddArsenic {} {
   mater add name = Arsenic
   pdbSetString Arsenic Type  "Ntype"
   #For Incomplete Ionization (ref: Sze)
   pdbSetDouble Arsenic Ed0    0.049;#donor impurity level
}
proc AddBoron {} {
   mater add name = Boron
   pdbSetString Boron Type   "Ptype"
   #For Incomplete Ionization (ref: Sze)
   pdbSetDouble Boron   Ea0   0.045;#acceptor impurity level
}
AddBoron; Add Arsenic

You must have Vt defined as a solution variable, and also T, if you want to use the T-dependent impurity level option (units are messed up right now).

solution add name=Vt,T const

You must call this procedure with all dopants at once, i.e.:

IncompleteIonization "Boron Arsenic"

Only 1 n-type and 1 p-type dopant each work in this procedure. i.e do NOT do:

IncompleteIonization "Boron Arsenic Phosphorus";#THIS IS BAD