Xyce  6.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
N_DEV_MOSFET_B3SOI.h
Go to the documentation of this file.
1 //-----------------------------------------------------------------------------
2 // Copyright Notice
3 //
4 // Copyright 2002 Sandia Corporation. Under the terms
5 // of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S.
6 // Government retains certain rights in this software.
7 //
8 // Xyce(TM) Parallel Electrical Simulator
9 // Copyright (C) 2002-2014 Sandia Corporation
10 //
11 // This program is free software: you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation, either version 3 of the License, or
14 // (at your option) any later version.
15 //
16 // This program is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 // GNU General Public License for more details.
20 //
21 // You should have received a copy of the GNU General Public License
22 // along with this program. If not, see <http://www.gnu.org/licenses/>.
23 //-----------------------------------------------------------------------------
24 
25 //-----------------------------------------------------------------------------
26 // Filename : $RCSfile: N_DEV_MOSFET_B3SOI.h,v $
27 //
28 // Purpose :
29 //
30 // Special Notes :
31 //
32 // Creator : Dave Shirley
33 //
34 // Creation Date : 05/20/04
35 //
36 // Revision Information:
37 // ---------------------
38 //
39 // Revision Number: $Revision: 1.142.2.1 $
40 //
41 // Revision Date : $Date: 2014/02/26 20:16:30 $
42 //
43 // Current Owner : $Author: tvrusso $
44 //-----------------------------------------------------------------------------
45 
46 #ifndef Xyce_N_DEV_MOSFET_B3SOI_h
47 #define Xyce_N_DEV_MOSFET_B3SOI_h
48 
49 // ---------- Standard Includes ----------
50 #include <N_DEV_Configuration.h>
51 #include <map>
52 
53 // ---------- Xyce Includes ----------
54 #include <N_DEV_DeviceMaster.h>
55 #include <N_DEV_DeviceInstance.h>
56 #include <N_DEV_DeviceModel.h>
57 #include <N_DEV_DeviceBlock.h>
58 
59 #include <N_DEV_MOSFET1.h>
60 
61 namespace Xyce {
62 namespace Device {
63 namespace MOSFET_B3SOI {
64 
65 // ---------- Forward Declarations -------
66 class Model;
67 class Instance;
68 
69 struct Traits : public DeviceTraits<Model, Instance, MOSFET1::Traits>
70 {
71  static const char *name() {return "BSIM3 SOI";}
72  static const char *deviceTypeName() {return "M level 10";}
73  static const int numNodes() {return 4;}
74  static const int numOptionalNodes() {return 3;}
75  static const bool modelRequired() {return true;}
76  static const bool isLinearDevice() {return false;}
77 
78  static Device *factory(const Configuration &configuration, const FactoryBlock &factory_block);
79  static void loadModelParameters(ParametricData<Model> &model_parameters);
80  static void loadInstanceParameters(ParametricData<Instance> &instance_parameters);
81 };
82 
83 //-----------------------------------------------------------------------------
84 // Struct : SizeDependParam
85 // Purpose : copied over from the 3f5 code. Almost no changes.
86 // Special Notes :
87 // Creator : Dave Shirley
88 // Creation Date : 05/20/04
89 //-----------------------------------------------------------------------------
91 {
92  friend class Model;
93  friend class Instance;
94  friend class Master;
95 
96 private:
97  double Width;
98  double Length;
99  double Rth0;
100  double Cth0;
101 
102  double ntrecf;
103  double ndif;
104  double betaGB1;
105  double betaGB2;
106  double alphaGB1;
107  double alphaGB2;
108  double ahli;
109  double aely;
110  double vabjt;
111  double lbjt0;
112  double nbjt;
113  double vtun0;
114  double vrec0;
115  double istun;
116  double isrec;
117  double isdif;
118  double isbjt;
119  double nrecr0;
120  double nrecf0;
121  double ndiode;
122  double ntun;
123  double ngidl;
124  double bgidl;
125  double agidl;
126  double siid;
127  double sii2;
128  double sii1;
129  double sii0;
130  double esatii;
131  double lii;
132  double vdsatii0;
133  double beta2;
134  double beta1;
135  double fbjtii;
136  double ketas;
137  double kb1;
138  double k1w1;
139  double k1w2;
140  double vsdfb;
141  double vfbb;
142  double jtun;
143  double xtun;
144  double jrec;
145  double jdif;
146  double jbjt;
147  double ahli0;
148  double xrec;
149  double xdif;
150  double xbjt;
151  double cgeo;
152  double wdiosCV;
153  double wdiodCV;
154  double oxideRatio;
155  double rbody;
156  double cth;
157  double rth;
158  double rds0denom;
159  double uctemp;
160  double ubtemp;
161  double uatemp;
162  double delvt;
163  double vsdth;
164  double xrcrg2;
165  double xrcrg1;
166  double poxedge;
167  double pigcd;
168  double cigsd;
169  double bigsd;
170  double aigsd;
171  double cigc;
172  double bigc;
173  double aigc;
174  double nigc;
175  double dt3;
176  double dt2;
177  double st3;
178  double st2;
179  double sdt1;
180  double k1eff;
181  double Bechvb;
182  double ToxRatio;
183  double Aechvb;
184  double BechvbEdge;
185  double ToxRatioEdge;
186  double dlcig;
187  double AechvbEdge;
188  double qsi;
189  double vearly;
190  double lratiodif;
191  double lratio;
192  double arfabjt;
193  double leffCVbg;
194  double ntrecr;
195  double leffCVb;
196  double wdios;
197  double wdiod;
198  double vfbsd;
199 
200  double cdsc;
201  double cdscb;
202  double cdscd;
203  double cit;
204  double nfactor;
205  double xj;
206  double vsat;
207  double at;
208  double a0;
209  double ags;
210  double a1;
211  double a2;
212  double keta;
213  double nsub;
214  double npeak;
215  double ngate;
216  double gamma1;
217  double gamma2;
218  double vbx;
219  double vbi;
220  double vbm;
221  double vbsc;
222  double xt;
223  double phi;
224  double litl;
225  double k1;
226  double kt1;
227  double kt1l;
228  double kt2;
229  double k2;
230  double k3;
231  double k3b;
232  double w0;
233  double nlx;
234  double dvt0;
235  double dvt1;
236  double dvt2;
237  double dvt0w;
238  double dvt1w;
239  double dvt2w;
240  double drout;
241  double dsub;
242  double vth0;
243  double ua;
244  double ua1;
245  double ub;
246  double ub1;
247  double uc;
248  double uc1;
249  double u0;
250  double ute;
251  double voff;
252  double vfb;
253  double delta;
254  double rdsw;
255  double rds0;
256  double prwg;
257  double prwb;
258  double prt;
259  double eta0;
260  double etab;
261  double pclm;
262  double pdibl1;
263  double pdibl2;
264  double pdiblb;
265  double pvag;
266  double wr;
267  double dwg;
268  double dwb;
269  double b0;
270  double b1;
271  double alpha0;
272  double beta0;
273 
274  // CV model
275  double cgsl;
276  double cgdl;
277  double ckappa;
278  double cf;
279  double clc;
280  double cle;
281  double noff;
282  double acde;
283  double moin;
284 
285  // Pre-calculated constants
286  double dw;
287  double dl;
288  double leff;
289  double weff;
290 
291  double dwc;
292  double dlc;
293  double leffCV;
294  double weffCV;
296  double cgso;
297  double cgdo;
298 
299  double u0temp;
300  double vsattemp;
301  double sqrtPhi;
302  double phis3;
303  double Xdep0;
304  double sqrtXdep0;
305  double theta0vb0;
306  double thetaRout;
307 
308  double cdep0;
309  double vfbzb;
310  double ldeb;
311 
312  // ERK. I added this to make temperature sweeps work.
314 };
315 
316 
317 //-----------------------------------------------------------------------------
318 // Class : Instance
319 // Purpose :
320 // Special Notes :
321 // Creator : Dave Shirley
322 // Creation Date : 05/20/04
323 //-----------------------------------------------------------------------------
324 class Instance : public DeviceInstance
325 {
326  friend class ParametricData<Instance>;
327  friend class Model;
328  friend class Traits;friend class Master;
329 
330  // functions
331 public:
332 
333  Instance(
334  const Configuration & configuration,
335  const InstanceBlock & IB,
336  Model & Miter,
337  const FactoryBlock & factory_block);
338 
339  ~Instance();
340 
341 private:
342  Instance(const Instance &);
343  Instance &operator=(const Instance &);
344 
345 public:
346  void registerLIDs( const std::vector<int> & intLIDVecRef,
347  const std::vector<int> & extLIDVecRef );
348  void registerStateLIDs( const std::vector<int> & staLIDVecRef);
349  void registerStoreLIDs( const std::vector<int> & stoLIDVecRef);
350 
351  std::map<int,std::string> & getIntNameMap ();
352  std::map<int,std::string> & getStoreNameMap ();
353 
354  const std::vector< std::vector<int> > & jacobianStamp() const;
355  void registerJacLIDs( const std::vector< std::vector<int> > & jacLIDVec );
356 
357  bool processParams ();
358 
359  bool updateTemperature(const double & temp_tmp);
360  bool updateIntermediateVars ();
361  bool updatePrimaryState ();
362 
363  bool loadMatrix (N_LAS_Matrix & JMat);
364  bool checkModel ();
365  double B3SOIlimit(double vnew, double vold, double limit, int *check);
366 
367  // load functions, residual:
368  bool loadDAEQVector ();
369  bool loadDAEFVector ();
370 
371  // load functions, Jacobian:
372  bool loadDAEdQdx ();
373  bool loadDAEdFdx ();
374 
375  void setupJacStamp ();
376 #ifdef Xyce_DEBUG_DEVICE
377  void debugOutputModelParams();
378 #endif
379 
380  bool auxChargeCalculations ();
381  bool setupCapacitors_newDAE ();
382 
383  void setupPointers ();
384 
385  bool setupCapacitors_oldDAE ();
386 
387  bool setIC ();
388 
389  // Beginning of 3f5 stuff:
390  // attributes:
391 public:
392  // Getters and setters
394  {
395  return model_;
396  }
397 
398 private:
399  static std::vector< std::vector< std::vector<int> > > jacStamp_v;
400  static std::vector< std::vector<int> > jacMap_v;
401  static std::vector< std::vector< std::vector<int> > > jacMap2_v;
402 
403 
404  Model & model_; //< Owning model
405 
406  int dNode;
407  int gNode;
408  int sNode;
409  int eNode;
410  int pNode;
412  int bNode;
413  int tNode;
417  int gNodeMid;
418  int P_index;
419  int B_index;
420  int T_index;
421  int jacID;
422 
423  double ueff;
424  double thetavth;
425  double von;
426  double vdsat;
427  double cgdo;
428  double cgso;
429 
430  double l;
431  double w;
433  double drainArea;
434  double sourceArea;
435  double drainSquares;
439 
440  //3f5 bsimsoi varaibles used in creating jacobian:
442  double FwdSum;
443  double gbbb;
444  double gbbdp;
445  double gbbe;
446  double gbbg;
447  double gbbsp;
448  double gbbT;
449  double gcbdb;
450  double gcbeb;
451  double gcbgb;
452  double gcbsb;
453  double gcbT;
454  double gcddb;
455  double gcdeb;
456  double gcdgb;
457  double gcdgmb;
458  double gcdsb;
459  double gcdT;
460  double gcedb;
461  double gceeb;
462  double gcegb;
463  double gcegmb;
464  double gcesb;
465  double gceT;
466  double gcgbb;
467  double gcgdb;
468  double gcgeb;
469  double gcggb;
470  double gcgmdb;
471  double gcgmeb;
472  double gcgmgmb;
473  double gcgmsb;
474  double gcgsb;
475  double gcgT;
476  double gcrg;
477  double gcrgb;
478  double gcrgd;
479  double gcrgg;
480  double gcrgs;
481  double gcrg_jac;
482  double gcrgb_jac;
483  double gcrgd_jac;
484  double gcrgg_jac;
485  double gcrgs_jac;
486  double gcsdb;
487  double gcseb;
488  double gcsgb;
489  double gcsgmb;
490  double gcssb;
491  double gcsT;
492  double gcTt;
493  double gddpb;
494  double gddpdp;
495  double gddpe;
496  double gddpg;
497  double gddpsp;
498  double gddpT;
499  double gds;
500  double geltd;
501  double gigb;
502  double gigd;
503  double gige;
504  double gigg;
505  double gigs;
506  double gigT;
507  double gigb_jac;
508  double gigd_jac;
509  double gige_jac;
510  double gigg_jac;
511  double gigs_jac;
512  double gigT_jac;
513  double gIdtotb;
514  double gIgtotb;
515  double gIgtotd;
516  double gIgtotg;
517  double gIgtots;
518  double gIstotb;
519  double gIstotd;
520  double gIstotg;
521  double gIstots;
522  double gppb;
523  double gppp;
524  double gsspb;
525  double gsspdp;
526  double gsspe;
527  double gsspg;
528  double gsspsp;
529  double gsspT;
530  double gTtb;
531  double gTtdp;
532  double gTte;
533  double gTtg;
534  double gTtsp;
535  double gTtt;
536  double Gm;
537  double Gmbs;
538  double Gme;
539  double Gmin;
540  double GmT;
541  double RevSum;
543  double gIdtotg;
544  double gIdtotd;
545  double gIdtots;
546 
547  // new variable from updateTempreature
548  double rbodyext;
549  double csesw;
550  double dt4;
551  double st4;
552  double cdmin;
553  double cdbox;
554  double csbox;
555  double csmin;
556  double grgeltd;
557  double phi;
558  double cdesw;
559 
560  int mode;
561  int bjtoff;
562  int debugMod;
563  bool OFF;
564  double rth0;
565  double cth0;
566  double bodySquares;
567  double frbody;
568  int soiMod;
569  double nbc;
570  double nseg;
571  double pdbcp;
572  double psbcp;
573  double agbcp;
574  double aebcp;
575  double vbsusr;
576  int tnodeout;
577  int rgateMod;
578 
579  double cdrain;
580  double gIgsg;
581  double gIgss;
582  double gIgcdg;
583  double gIgcds;
584  double gIgcdd;
585  double gIgcdb;
586  double Igs;
587  double Igcd;
588  double gIgdg;
589  double gIgcsg;
590  double gIgdd;
591  double gIgcss;
592  double gIgcsd;
593  double gIgcsb;
594  double Igd;
595  double Igcs;
596 
597  // OP point
598  double qinv;
599  double cb;
600  double cd;
601  double cbd;
602  double gm;
603  double gmbs;
604 
605  double gbbs;
606  double gbgs;
607  double gbds;
608 
609  double cggb;
610  double cgdb;
611  double cgsb;
612  double cbgb;
613  double cbdb;
614  double cbsb;
615  double cdgb;
616  double cddb;
617  double cdsb;
618 
619  double qbulk;
620 
621  // initial condition variables
622  double icVDS;
623  double icVGS;
624  double icVBS;
625  double icVES;
626  double icVPS;
627 
633 
635 
636  // end of original 3f5 stuff
637 
638  // Variables from the 3f5 b3ld function, which were local to that
639  // function but are more appropriate as instance variables:
641 
642  bool selfheat;
643  int bodyMod;
644  int floating;
645 
646  double dxpart;
647  double sxpart;
648 
649  double cdreq;
650  double ceqbd;
651  double ceqbs;
652 
653  double qgdo;
654  double qgso;
655  double qgd;
656  double qgs;
657  double qge;
658  double qgme;
659  double qgate;
660  double qbody;
661  double qdrn;
662  double qsub;
663  double qsrc;
664 
665  // added for soi:
666  double ceqbody;
667  double ceqgate;
668  double ceqgcrg;
669  double ceqqe;
670  double ceqqgmid;
671  double ceqbodcon;
672  double ceqth;
673  double ceqqth;
674  double Igtoteq;
675  double Idtoteq;
676  double Istoteq;
677 
678 
679  double dVgst_dVg;
680  double dVgst_dVb;
681  double dVgs_eff_dVg;
682 
686 
687  double cqdrn;
688  double cqgate;
689  double cqsub;
690  double cqbody;
691  double cqtemp;
692 
693  // Variables which were model variables in the 3f5 version of the B3SOI,
694  // but are temperature dependent and should be instance variables (as
695  // temperature is an instance-level quantity.
696  double vtm;
697 
698  // end of 3f5 stuff
699 
700  double temp;
701 
702  // solution variables, and intermediate quantities.
703  //double mode;
704  double Vd;
705  double Vg;
706  double Vs;
707  double Ve;
708  double Vp;
709  double Vb;
710  double Vsp;
711  double Vdp;
712  double Vgp;
713  double Vgm;
714 
715  double Qtotal;
716 
717  // resistor currents:
718  double Idrain;
719  double Isource;
720 
721  double Igate;
722  double IgateMid;
723  double Ith;
724 
725  double vgb;
726  double vgd;
727  double ceqqd;
728  double ceqqb;
729  double ceqqg;
730 
731  double ceqqg_Jdxp;
732  double ceqqb_Jdxp;
733  double ceqqd_Jdxp;
734  double ceqqe_Jdxp;
735  double ceqqth_Jdxp;
736  double ceqgcrg_Jdxp;
738  double cth_Jdxp;
739  double cjs_Jdxp;
740  double cjd_Jdxp;
741  double cdreq_Jdxp;
742  double cbody_Jdxp;
743  double cgate_Jdxp;
744  double Idtoteq_Jdxp;
745  double Istoteq_Jdxp;
746  double Igtoteq_Jdxp;
747 
748  double cbodcon_Jdxp;
749  double ceqbody_Jdxp;
750  double ceqgate_Jdxp;
751  double ceqbs_Jdxp;
752  double ceqbd_Jdxp;
754 
755  double Idrain_Jdxp;
756  double Isource_Jdxp;
757  double Igate_Jdxp;
759 
760  double ceqth_Jdxp;
761 
762  // state variables, voltage drops
763  double vbd;
764  double vbs;
765  double vps;
766  double vpd;
767  double ved;
768  double veb;
769  double ves;
770  double vgs;
771  double vge;
772  double vds;
773  double vged;
774  double vgmd;
775  double vgme;
776  double vgmb;
777 
778  double vg;
779  double vd;
780  double vs;
781  double vp;
782  double ve;
783  double deltemp;
784  double delTemp;
786 
787  double vges;
788  double vgms;
789  double vgge;
790  double vggm;
791 
792  // "original" versions of various voltage drop variables:
793  // original refers to the beginning of the newton iterations,
794  // before any limits are imposed on the change in voltage drop.
795  double vbd_orig;
796  double vbs_orig;
797  double vps_orig;
798  double vpd_orig;
799  double ves_orig;
800  double ved_orig;
801  double vgs_orig;
802  double vds_orig;
803 
804  // and these are "mode-aware" versions of voltage drops. If vds is
805  // negative then drain and source are reversed and one needs to
806  // use them differently.
807  double Vds, Vgs, Vbs;
808  double Vbd, Ves, Vps;
811 
812  double delTemp_orig;
813 
814  double vges_orig;
815  double vgms_orig;
816 
817  // "orig" variables that are node-based, rather than junction.
818  double Vg_orig;
819  double Vd_orig;
820  double Vs_orig;
821  double Ve_orig;
822  double Vb_orig;
823  double Vp_orig;
824  double Vsp_orig;
825  double Vdp_orig;
826  double Vgp_orig;
827  double Vgm_orig;
828 
829  // These two are added to allow loadRHS to compile
830  double vgd_orig;
831 
832  //PMC: global variables needed in intermediateVars
833  double Vgsteff;
834  double Vdseff;
835  double ni;
836  double Abulk;
837  double vbseff;
838  double nstar;
839  double rds;
840  double AbovVgst2Vtm;
841  double ids;
842  double igidl;
843  double ic;
844  double ig;
845  double itun;
846  double ibs;
847  double ibd;
848  double iii;
849  double ibp;
850  double gbpbs;
851  double gbpps;
852  double gbpT;
853  double cbodcon;
854 
855  double gme;
856  double gmT;
857  double gtempg;
858  double gtempb;
859  double gtempe;
860  double gtempT;
861  double gtempd;
862  double cth;
863  double cjs;
864  double cjd;
865  double cbody;
866  double cgate;
867  double gjdb;
868  double gjdd;
869  double gjdg;
870  double gjde;
871  double gjdT;
872  double gjsb;
873  double gjsd;
874  double gjsg;
875  double gjsT;
876  double gbes;
877  double gbps;
878  double gbT;
879 
880  double cgT;
881  double cbT;
882  double ceT;
883  double cdT;
884  double cbeb;
885  double ceeb;
886  double cdeb;
887  double qse;
888  double qde;
889  double qbf;
890  double qjs;
891  double qjd;
892  double cbb;
893  double cbg;
894  double gcse;
895  double gcde;
896 
897  // state variables, intrinsic capacitors
898  double qb;
899  double qg;
900  double qd;
901  double qe;
902  double qgmid;
903  double qth;
904 
907 
908  double CAPcgmgmb;
909  double CAPcgmdb;
910  double CAPcgmsb;
911  double CAPcgmeb;
912  double CAPcdgmb;
913  double CAPcsgmb;
914  double CAPcegmb;
915  double CAPcggb;
916  double CAPcgdb;
917  double CAPcgsb;
918  double CAPcgeb;
919  double CAPcgbb;
920  double CAPcdgb;
921  double CAPcegb;
922  double CAPcsgb;
923  double CAPcbgb;
924  double CAPcddb;
925  double CAPcdsb;
926  double CAPcdeb;
927  double CAPcdT;
928  double CAPcsdb;
929  double CAPcssb;
930  double CAPcseb;
931  double CAPcsT;
932  double CAPcgT;
933  double CAPcbdb;
934  double CAPcbsb;
935  double CAPcbeb;
936  double CAPcbT;
937  double CAPcedb;
938  double CAPcesb;
939  double CAPceeb;
940  double CAPceT;
941  double CAPcTt;
942 
943  double Qeqqg;
944  double Qeqqb;
945  double Qeqqd;
946  double Qeqqe;
947  double Qeqqth;
948  double Qeqqgmid;
949 
950  double Qeqqg_Jdxp;
951  double Qeqqb_Jdxp;
952  double Qeqqd_Jdxp;
953  double Qeqqe_Jdxp;
954  double Qeqqth_Jdxp;
956 
957  // Indices into the state vector:
958 
959  // state variables, voltage drops
966 
975 
978 
979  // lead current vars if needed
985 
986  // state variables, intrinsic capacitors
993 
994  ////////////////////////////////////////////////////////////////////
995  // Local variable indices
996  int li_Drain;
997  int li_Gate;
1001  int li_Body;
1007 
1008  // local indies for currents on voltages sources used for initial conditions
1009  int li_Ids;
1010  int li_Igs;
1011  int li_Ibs;
1012  int li_Ies;
1013  int li_Ips;
1014 
1015 
1016  ////////////////////////////////////////////////////////////////////
1017  // Offset variables corresponding to the above declared indices.
1018 
1019  // Jacobian Matrix Offsets:
1020 
1021  // drain row:
1025 
1026  // gate row:
1034 
1035  // source row:
1043 
1044  // substrate row:
1053 
1054  // external body row:
1058 
1059  // body row:
1068 
1069  // temperature row:
1076 
1077  // drain' row:
1086 
1087  // source' row:
1096 
1097  // gate' row:
1106 
1107  // gate mid row:
1115 
1116  // These offset are for the voltage sources that represent initial
1117  // conditions on Vds, Vgs, Vbs, Ves and Vps
1118 
1119  // icVDS
1123 
1124  // icVGS
1128 
1129  // icVBS
1133 
1134  // icVES
1138 
1139  // icVPS
1143 
1144 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
1145  // Jacobian Matrix f-Ptrs:
1146 
1147  // drain row:
1151 
1152  // gate row:
1160 
1161  // source row:
1169 
1170  // substrate row:
1179 
1180  // external body row:
1184 
1185  // body row:
1194 
1195  // temperature row:
1202 
1203  // drain' row:
1212 
1213  // source' row:
1222 
1223  // gate' row:
1232 
1233  // gate mid row:
1241 
1242  // These offset are for the voltage sources that represent initial
1243  // conditions on Vds, Vgs, Vbs, Ves and Vps
1244 
1245  // f_icVDS
1249 
1250  // f_icVGS
1254 
1255  // f_icVBS
1259 
1260  // f_icVES
1264 
1265  // f_icVPS
1269 
1270  // Jacobian Matrix q-Ptrs:
1271 
1272  // drain row:
1276 
1277  // gate row:
1285 
1286  // source row:
1294 
1295  // substrate row:
1304 
1305  // external body row:
1309 
1310  // body row:
1319 
1320  // temperature row:
1327 
1328  // drain' row:
1337 
1338  // source' row:
1347 
1348  // gate' row:
1357 
1358  // gate mid row:
1366 
1367  // These offset are for the voltage sources that represent initial
1368  // conditions on Vds, Vgs, Vbs, Ves and Vps
1369 
1370  // q_icVDS
1374 
1375  // q_icVGS
1379 
1380  // q_icVBS
1384 
1385  // q_icVES
1389 
1390  // q_icVPS
1394 
1395  // end of matrix pointer section
1396 #endif
1397 
1398  // Most versions of this device will use one of the jacobian's defined
1399  // as static above. However, if any of the five initial conditions are
1400  // specified (icVDS, icVGS, icVBS, icVES or icVPS), then the number of
1401  // jacobian permutations goes way up. Rather than enumerate all of
1402  // these as static vectors, we'll make non-static, member variables of
1403  // the jacStamp for those few devices that specify initial conditoins.
1404 
1405  std::vector< std::vector< int > > jacStampIC;
1406  std::vector<int> jacMapIC;
1407  std::vector< std::vector<int> > jacMapIC2;
1408 
1409  // boolean for new voltlim debugging:
1410  bool vlDebug;
1411 
1412  int blockHomotopyID; // For homotopy
1413  double randomPerturb; // For homotopy
1414 };
1415 
1416 //-----------------------------------------------------------------------------
1417 // Class : Model
1418 // Purpose :
1419 // Special Notes :
1420 // Creator : Dave Shirley
1421 // Creation Date : 05/20/04
1422 //-----------------------------------------------------------------------------
1423 class Model : public DeviceModel
1424 {
1425  typedef std::vector<Instance *> InstanceVector;
1426 
1427  friend class ParametricData<Model>;
1428  friend class Instance;
1429  friend class Traits;friend class Master;
1430 
1431 public:
1432  Model(
1433  const Configuration & configuration,
1434  const ModelBlock & MB,
1435  const FactoryBlock & factory_block);
1436  ~Model();
1437 
1438 private:
1439  Model();
1440  Model(const Model &);
1441  Model &operator=(const Model &);
1442 
1443 public:
1444  virtual void forEachInstance(DeviceInstanceOp &op) const /* override */;
1445 
1446  virtual std::ostream &printOutInstances(std::ostream &os) const;
1447 
1448  bool processParams ();
1449  bool processInstanceParams ();
1450 
1451  bool clearTemperatureData ();
1452 
1453 
1454 public:
1455  void addInstance(Instance *instance)
1456  {
1457  instanceContainer.push_back(instance);
1458  }
1459 
1461  {
1462  return instanceContainer;
1463  }
1464 
1466  {
1467  return instanceContainer;
1468  }
1469 
1470 private:
1471  std::vector<Instance*> instanceContainer;
1472 
1473 private:
1474 
1475  int dtype;
1476 
1477  double cbox;
1478  double csi;
1479 
1480  int mobMod;
1481  int capMod;
1482  int binUnit;
1484  std::string version;
1485  // Bogus PSpice-y thing where you can set L and W on the model *or* the
1486  // instance line, with instance overriding model
1487  double model_l;
1488  double model_w;
1489  // range of channel dimensions for which model is valid
1490  double Lmax;
1491  double Lmin;
1492  double Wmax;
1493  double Wmin;
1494  //
1495  //soi specific variables:
1496  double dtoxcv;
1497  double npeak;
1498  double pdibl1;
1499  double pdibl2;
1500  double pdiblb;
1501  double shMod;
1502  double tbox;
1503  double tsi;
1504  double rth0;
1505  double cth0;
1506  double ngidl;
1507  double agidl;
1508  double bgidl;
1509  double ndiode;
1510  double xbjt;
1511  double xdif;
1512  double xrec;
1513  double xtun;
1515  double fnoiMod;
1516  double tnoiMod;
1517  double tnoia;
1518  double tnoib;
1519  double rnoia;
1520  double rnoib;
1521  double ntnoi;
1522  double noif;
1523  double k1w1;
1524  double k1w2;
1525  double ketas;
1526  double dwbc;
1527  double beta1;
1528  double beta2;
1529  double vdsatii0;
1530  double tii;
1531  double lii;
1532  double sii0;
1533  double sii1;
1534  double sii2;
1535  double siid;
1536  double fbjtii;
1537  double esatii;
1538  double ntun;
1539  double nrecf0;
1540  double nrecr0;
1541  double isbjt;
1542  double isdif;
1543  double isrec;
1544  double istun;
1545  double ln;
1546  double vrec0;
1547  double vtun0;
1548  double nbjt;
1549  double lbjt0;
1550  double ldif0;
1551  double vabjt;
1552  double aely;
1553  double ahli;
1554  double rbody;
1555  double rbsh;
1556  double cgeo;
1557  double tt;
1558  double ndif;
1559  double vsdfb;
1560  double vsdth;
1561  double csdmin;
1562  double asd;
1563  double csdesw;
1564  double ntrecf;
1565  double ntrecr;
1566  double dlcb;
1567  double fbody;
1568  double delvt;
1569  double kb1;
1570  double dlbg;
1571  double igbMod;
1572  double igcMod;
1573  double toxqm;
1574  double wth0;
1575  double rhalo;
1576  double ntox;
1577  double toxref;
1578  double ebg;
1579  double vevb;
1580  double alphaGB1;
1581  double betaGB1;
1582  double vgb1;
1583  double vecb;
1584  double alphaGB2;
1585  double betaGB2;
1586  double vgb2;
1587  double voxh;
1588  double deltavox;
1589  double aigc;
1590  double bigc;
1591  double cigc;
1592  double aigsd;
1593  double bigsd;
1594  double cigsd;
1595  double nigc;
1596  double pigcd;
1597  double poxedge;
1598  double dlcig;
1599  int soiMod;
1600  double vbs0pd;
1601  double vbs0fd;
1602  double vbsa;
1603  double nofffd;
1604  double vofffd;
1605  double k1b;
1606  double k2b;
1607  double dk2b;
1608  double dvbd0;
1609  double dvbd1;
1610  double moinFD;
1613 
1614  double xrcrg1;
1615  double xrcrg2;
1616  double rshg;
1617  double ngcon;
1618  double xgw;
1619  double xgl;
1620  double lalphaGB1;
1621  double lbetaGB1;
1622  double lalphaGB2;
1623  double lbetaGB2;
1624  double lndif;
1625  double lntrecf;
1626  double lntrecr;
1627  double lxbjt;
1628  double lxdif;
1629  double lxrec;
1630  double lxtun;
1631  double laigc;
1632  double lbigc;
1633  double lcigc;
1634  double laigsd;
1635  double lbigsd;
1636  double lcigsd;
1637  double lnigc;
1638  double lpigcd;
1639  double lpoxedge;
1640  double lnpeak;
1641  double lk1w1;
1642  double lk1w2;
1643  double lketas;
1644  double lpdibl1;
1645  double lpdibl2;
1646  double lpdiblb;
1647  double lfbjtii;
1648  double lbeta1;
1649  double lbeta2;
1650  double lvdsatii0;
1651  double llii;
1652  double lesatii;
1653  double lsii0;
1654  double lsii1;
1655  double lsii2;
1656  double lsiid;
1657  double lkb1;
1658  double lagidl;
1659  double lbgidl;
1660  double lngidl;
1661  double lntun;
1662  double lndiode;
1663  double lnrecf0;
1664  double lnrecr0;
1665  double lisbjt;
1666  double lisdif;
1667  double lisrec;
1668  double listun;
1669  double lvrec0;
1670  double lvtun0;
1671  double lnbjt;
1672  double llbjt0;
1673  double lvabjt;
1674  double laely;
1675  double lahli;
1676  double lvsdfb;
1677  double lvsdth;
1678  double ldelvt;
1679  double lxrcrg1;
1680  double lxrcrg2;
1681  double walphaGB1;
1682  double wbetaGB1;
1683  double walphaGB2;
1684  double wbetaGB2;
1685  double wndif;
1686  double wntrecf;
1687  double wntrecr;
1688  double wxbjt;
1689  double wxdif;
1690  double wxrec;
1691  double wxtun;
1692  double waigc;
1693  double wbigc;
1694  double wcigc;
1695  double waigsd;
1696  double wbigsd;
1697  double wcigsd;
1698  double wnigc;
1699  double wpigcd;
1700  double wpoxedge;
1701  double wnpeak;
1702  double wk1w1;
1703  double wk1w2;
1704  double wkb1;
1705  double wketas;
1706  double wpdibl1;
1707  double wpdibl2;
1708  double wpdiblb;
1709  double wfbjtii;
1710  double wbeta1;
1711  double wbeta2;
1712  double wvdsatii0;
1713  double wlii;
1714  double wesatii;
1715  double wsii0;
1716  double wsii1;
1717  double wsii2;
1718  double wsiid;
1719  double wagidl;
1720  double wbgidl;
1721  double wngidl;
1722  double wntun;
1723  double wndiode;
1724  double wnrecf0;
1725  double wnrecr0;
1726  double wisbjt;
1727  double wisdif;
1728  double wisrec;
1729  double wistun;
1730  double wvrec0;
1731  double wvtun0;
1732  double wnbjt;
1733  double wlbjt0;
1734  double wvabjt;
1735  double waely;
1736  double wahli;
1737  double wvsdfb;
1738  double wvsdth;
1739  double wdelvt;
1740  double wxrcrg1;
1741  double wxrcrg2;
1742  double palphaGB1;
1743  double pbetaGB1;
1744  double palphaGB2;
1745  double pbetaGB2;
1746  double pndif;
1747  double pntrecf;
1748  double pntrecr;
1749  double pxbjt;
1750  double pxdif;
1751  double pxrec;
1752  double pxtun;
1753  double paigc;
1754  double pbigc;
1755  double pcigc;
1756  double paigsd;
1757  double pbigsd;
1758  double pcigsd;
1759  double pnigc;
1760  double ppigcd;
1761  double ppoxedge;
1762  double pnpeak;
1763  double pk1w1;
1764  double pk1w2;
1765  double pkb1;
1766  double pketas;
1767  double ppdibl1;
1768  double ppdibl2;
1769  double ppdiblb;
1770  double pfbjtii;
1771  double pbeta1;
1772  double pbeta2;
1773  double pvdsatii0;
1774  double plii;
1775  double pesatii;
1776  double psii0;
1777  double psii1;
1778  double psii2;
1779  double psiid;
1780  double pagidl;
1781  double pbgidl;
1782  double pngidl;
1783  double pntun;
1784  double pndiode;
1785  double pnrecf0;
1786  double pnrecr0;
1787  double pisbjt;
1788  double pisdif;
1789  double pisrec;
1790  double pistun;
1791  double pvrec0;
1792  double pvtun0;
1793  double pnbjt;
1794  double plbjt0;
1795  double pvabjt;
1796  double paely;
1797  double pahli;
1798  double pvsdfb;
1799  double pvsdth;
1800  double pdelvt;
1801  double pxrcrg1;
1802  double pxrcrg2;
1803 
1810  bool vbxGiven;
1811  bool vbmGiven;
1812  bool xtGiven;
1813  bool k1Given;
1814  bool k2Given;
1815 
1816  double vcrit;
1817  double vtm;
1818 
1819  double tox;
1820  double toxm;
1821  double cdsc;
1822  double cdscb;
1823  double cdscd;
1824  double cit;
1825  double nfactor;
1826  double xj;
1827  double vsat;
1828  double at;
1829  double a0;
1830  double ags;
1831  double a1;
1832  double a2;
1833  double keta;
1834  double nsub;
1835  double ngate;
1836  double gamma1;
1837  double gamma2;
1838  double vbx;
1839  double vbm;
1840  double xt;
1841  double k1;
1842  double kt1;
1843  double kt1l;
1844  double kt2;
1845  double k2;
1846  double k3;
1847  double k3b;
1848  double w0;
1849  double nlx;
1850  double dvt0;
1851  double dvt1;
1852  double dvt2;
1853  double dvt0w;
1854  double dvt1w;
1855  double dvt2w;
1856  double drout;
1857  double dsub;
1858  double vth0;
1859  double ua;
1860  double ua1;
1861  double ub;
1862  double ub1;
1863  double uc;
1864  double uc1;
1865  double u0;
1866  double ute;
1867  double voff;
1868  double delta;
1869  double rdsw;
1870  double prwg;
1871  double prwb;
1872  double prt;
1873  double eta0;
1874  double etab;
1875  double pclm;
1876  double pvag;
1877  double wr;
1878  double dwg;
1879  double dwb;
1880  double b0;
1881  double b1;
1882  double alpha0;
1883  double beta0;
1884 
1885  // CV model
1886  double cgsl;
1887  double cgdl;
1888  double ckappa;
1889  double cf;
1890  double clc;
1891  double cle;
1892  double dwc;
1893  double dlc;
1894  double noff;
1895  double acde;
1896  double moin;
1897  double tcjswg;
1898  double tpbswg;
1899 
1900  // Length Dependence
1901  double lcdsc;
1902  double lcdscb;
1903  double lcdscd;
1904  double lcit;
1905  double lnfactor;
1906  double lxj;
1907  double lvsat;
1908  double lat;
1909  double la0;
1910  double lags;
1911  double la1;
1912  double la2;
1913  double lketa;
1914  double lnsub;
1915  double lngate;
1916  double lk1;
1917  double lkt1;
1918  double lkt1l;
1919  double lkt2;
1920  double lk2;
1921  double lk3;
1922  double lk3b;
1923  double lw0;
1924  double lnlx;
1925  double ldvt0;
1926  double ldvt1;
1927  double ldvt2;
1928  double ldvt0w;
1929  double ldvt1w;
1930  double ldvt2w;
1931  double ldrout;
1932  double ldsub;
1933  double lvth0;
1934  double lua;
1935  double lua1;
1936  double lub;
1937  double lub1;
1938  double luc;
1939  double luc1;
1940  double lu0;
1941  double lute;
1942  double lvoff;
1943  double ldelta;
1944  double lrdsw;
1945  double lprwg;
1946  double lprwb;
1947  double lprt;
1948  double leta0;
1949  double letab;
1950  double lpclm;
1951  double lpvag;
1952  double lwr;
1953  double ldwg;
1954  double ldwb;
1955  double lb0;
1956  double lb1;
1957  double lalpha0;
1958  double lbeta0;
1959 
1960  // CV model
1961  double lcgsl;
1962  double lcgdl;
1963  double lckappa;
1964  double lnoff;
1965  double lacde;
1966  double lmoin;
1967 
1968  // Width Dependence
1969  double wcdsc;
1970  double wcdscb;
1971  double wcdscd;
1972  double wcit;
1973  double wnfactor;
1974  double wxj;
1975  double wvsat;
1976  double wat;
1977  double wa0;
1978  double wags;
1979  double wa1;
1980  double wa2;
1981  double wketa;
1982  double wnsub;
1983  double wngate;
1984  double wk1;
1985  double wkt1;
1986  double wkt1l;
1987  double wkt2;
1988  double wk2;
1989  double wk3;
1990  double wk3b;
1991  double ww0;
1992  double wnlx;
1993  double wdvt0;
1994  double wdvt1;
1995  double wdvt2;
1996  double wdvt0w;
1997  double wdvt1w;
1998  double wdvt2w;
1999  double wdrout;
2000  double wdsub;
2001  double wvth0;
2002  double wua;
2003  double wua1;
2004  double wub;
2005  double wub1;
2006  double wuc;
2007  double wuc1;
2008  double wu0;
2009  double wute;
2010  double wvoff;
2011  double wdelta;
2012  double wrdsw;
2013  double wprwg;
2014  double wprwb;
2015  double wprt;
2016  double weta0;
2017  double wetab;
2018  double wpclm;
2019  double wpvag;
2020  double wwr;
2021  double wdwg;
2022  double wdwb;
2023  double wb0;
2024  double wb1;
2025  double walpha0;
2026  double wbeta0;
2027 
2028  // CV model
2029  double wcgsl;
2030  double wcgdl;
2031  double wckappa;
2032  double wnoff;
2033  double wacde;
2034  double wmoin;
2035 
2036  // Cross-term Dependence
2037  double pcdsc;
2038  double pcdscb;
2039  double pcdscd;
2040  double pcit;
2041  double pnfactor;
2042  double pxj;
2043  double pvsat;
2044  double pat;
2045  double pa0;
2046  double pags;
2047  double pa1;
2048  double pa2;
2049  double pketa;
2050  double pnsub;
2051  double pngate;
2052  double pk1;
2053  double pkt1;
2054  double pkt1l;
2055  double pkt2;
2056  double pk2;
2057  double pk3;
2058  double pk3b;
2059  double pw0;
2060  double pnlx;
2061  double pdvt0;
2062  double pdvt1;
2063  double pdvt2;
2064  double pdvt0w;
2065  double pdvt1w;
2066  double pdvt2w;
2067  double pdrout;
2068  double pdsub;
2069  double pvth0;
2070  double pua;
2071  double pua1;
2072  double pub;
2073  double pub1;
2074  double puc;
2075  double puc1;
2076  double pu0;
2077  double pute;
2078  double pvoff;
2079  double pdelta;
2080  double prdsw;
2081  double pprwg;
2082  double pprwb;
2083  double pprt;
2084  double peta0;
2085  double petab;
2086  double ppclm;
2087  double ppvag;
2088  double pwr;
2089  double pdwg;
2090  double pdwb;
2091  double pb0;
2092  double pb1;
2093  double palpha0;
2094  double pbeta0;
2095 
2096  // CV model
2097  double pcgsl;
2098  double pcgdl;
2099  double pckappa;
2100  double pnoff;
2101  double pacde;
2102  double pmoin;
2103 
2104  double tnom;
2105  double cgso;
2106  double cgdo;
2107  double xpart;
2108 
2112 
2113  double Lint;
2114  double Ll;
2115  double Llc;
2116  double Lln;
2117  double Lw;
2118  double Lwc;
2119  double Lwn;
2120  double Lwl;
2121  double Lwlc;
2122 
2123  double Wint;
2124  double Wl;
2125  double Wlc;
2126  double Wln;
2127  double Ww;
2128  double Wwc;
2129  double Wwn;
2130  double Wwl;
2131  double Wwlc;
2132 
2133  // Pre-calculated constants
2134  // MCJ: move to size-dependent param.
2135  double cox;
2136  double factor1;
2137 
2141  double em;
2142  double ef;
2143  double af;
2144  double kf;
2145 
2146  std::list<SizeDependParam*> sizeDependParamList;
2147 
2150  // end of original 3f5 stuff.
2151 
2152  // Variables from the 3f5 B3SOI function b3soitemp, but are more
2153  // appropriate as model variables.
2154  double Vtm0;
2155  double Eg0;
2156  double ni;
2157 };
2158 
2159 //-----------------------------------------------------------------------------
2160 // Class : Master
2161 // Purpose :
2162 // Special Notes :
2163 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
2164 // Creation Date : 11/26/08
2165 //-----------------------------------------------------------------------------
2166 class Master : public DeviceMaster<Traits>
2167 {
2168  friend class Instance;
2169  friend class Model;
2170 
2171 public:
2173  const Configuration & configuration,
2174  const FactoryBlock & factory_block,
2175  const SolverState & ss1,
2176  const DeviceOptions & do1)
2177  : DeviceMaster<Traits>(configuration, factory_block, ss1, do1)
2178  {}
2179 
2180  virtual bool updateState (double * solVec, double * staVec, double * stoVec);
2181 
2182  // load functions:
2183  virtual bool loadDAEVectors (double * solVec, double * fVec, double * qVec, double * storeLeadF, double * storeLeadQ);
2184  virtual bool loadDAEMatrices (N_LAS_Matrix & dFdx, N_LAS_Matrix & dQdx);
2185 };
2186 
2187 void registerDevice();
2188 
2189 } // namespace MOSFET_B3SOI
2190 } // namespace Device
2191 } // namespace Xyce
2192 
2196 
2197 #endif // Xyce_N_DEV_MOSFET_B3SOI_h
2198