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.146 $
40 //
41 // Revision Date : $Date: 2014/05/22 17:40:29 $
42 //
43 // Current Owner : $Author: erkeite $
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 int numNodes() {return 4;}
74  static int numOptionalNodes() {return 3;}
75  static bool modelRequired() {return true;}
76  static 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 
1460 private:
1461  std::vector<Instance*> instanceContainer;
1462 
1463 private:
1464 
1465  int dtype;
1466 
1467  double cbox;
1468  double csi;
1469 
1470  int mobMod;
1471  int capMod;
1472  int binUnit;
1474  std::string version;
1475  // Bogus PSpice-y thing where you can set L and W on the model *or* the
1476  // instance line, with instance overriding model
1477  double model_l;
1478  double model_w;
1479  // range of channel dimensions for which model is valid
1480  double Lmax;
1481  double Lmin;
1482  double Wmax;
1483  double Wmin;
1484  //
1485  //soi specific variables:
1486  double dtoxcv;
1487  double npeak;
1488  double pdibl1;
1489  double pdibl2;
1490  double pdiblb;
1491  double shMod;
1492  double tbox;
1493  double tsi;
1494  double rth0;
1495  double cth0;
1496  double ngidl;
1497  double agidl;
1498  double bgidl;
1499  double ndiode;
1500  double xbjt;
1501  double xdif;
1502  double xrec;
1503  double xtun;
1505  double fnoiMod;
1506  double tnoiMod;
1507  double tnoia;
1508  double tnoib;
1509  double rnoia;
1510  double rnoib;
1511  double ntnoi;
1512  double noif;
1513  double k1w1;
1514  double k1w2;
1515  double ketas;
1516  double dwbc;
1517  double beta1;
1518  double beta2;
1519  double vdsatii0;
1520  double tii;
1521  double lii;
1522  double sii0;
1523  double sii1;
1524  double sii2;
1525  double siid;
1526  double fbjtii;
1527  double esatii;
1528  double ntun;
1529  double nrecf0;
1530  double nrecr0;
1531  double isbjt;
1532  double isdif;
1533  double isrec;
1534  double istun;
1535  double ln;
1536  double vrec0;
1537  double vtun0;
1538  double nbjt;
1539  double lbjt0;
1540  double ldif0;
1541  double vabjt;
1542  double aely;
1543  double ahli;
1544  double rbody;
1545  double rbsh;
1546  double cgeo;
1547  double tt;
1548  double ndif;
1549  double vsdfb;
1550  double vsdth;
1551  double csdmin;
1552  double asd;
1553  double csdesw;
1554  double ntrecf;
1555  double ntrecr;
1556  double dlcb;
1557  double fbody;
1558  double delvt;
1559  double kb1;
1560  double dlbg;
1561  double igbMod;
1562  double igcMod;
1563  double toxqm;
1564  double wth0;
1565  double rhalo;
1566  double ntox;
1567  double toxref;
1568  double ebg;
1569  double vevb;
1570  double alphaGB1;
1571  double betaGB1;
1572  double vgb1;
1573  double vecb;
1574  double alphaGB2;
1575  double betaGB2;
1576  double vgb2;
1577  double voxh;
1578  double deltavox;
1579  double aigc;
1580  double bigc;
1581  double cigc;
1582  double aigsd;
1583  double bigsd;
1584  double cigsd;
1585  double nigc;
1586  double pigcd;
1587  double poxedge;
1588  double dlcig;
1589  int soiMod;
1590  double vbs0pd;
1591  double vbs0fd;
1592  double vbsa;
1593  double nofffd;
1594  double vofffd;
1595  double k1b;
1596  double k2b;
1597  double dk2b;
1598  double dvbd0;
1599  double dvbd1;
1600  double moinFD;
1603 
1604  double xrcrg1;
1605  double xrcrg2;
1606  double rshg;
1607  double ngcon;
1608  double xgw;
1609  double xgl;
1610  double lalphaGB1;
1611  double lbetaGB1;
1612  double lalphaGB2;
1613  double lbetaGB2;
1614  double lndif;
1615  double lntrecf;
1616  double lntrecr;
1617  double lxbjt;
1618  double lxdif;
1619  double lxrec;
1620  double lxtun;
1621  double laigc;
1622  double lbigc;
1623  double lcigc;
1624  double laigsd;
1625  double lbigsd;
1626  double lcigsd;
1627  double lnigc;
1628  double lpigcd;
1629  double lpoxedge;
1630  double lnpeak;
1631  double lk1w1;
1632  double lk1w2;
1633  double lketas;
1634  double lpdibl1;
1635  double lpdibl2;
1636  double lpdiblb;
1637  double lfbjtii;
1638  double lbeta1;
1639  double lbeta2;
1640  double lvdsatii0;
1641  double llii;
1642  double lesatii;
1643  double lsii0;
1644  double lsii1;
1645  double lsii2;
1646  double lsiid;
1647  double lkb1;
1648  double lagidl;
1649  double lbgidl;
1650  double lngidl;
1651  double lntun;
1652  double lndiode;
1653  double lnrecf0;
1654  double lnrecr0;
1655  double lisbjt;
1656  double lisdif;
1657  double lisrec;
1658  double listun;
1659  double lvrec0;
1660  double lvtun0;
1661  double lnbjt;
1662  double llbjt0;
1663  double lvabjt;
1664  double laely;
1665  double lahli;
1666  double lvsdfb;
1667  double lvsdth;
1668  double ldelvt;
1669  double lxrcrg1;
1670  double lxrcrg2;
1671  double walphaGB1;
1672  double wbetaGB1;
1673  double walphaGB2;
1674  double wbetaGB2;
1675  double wndif;
1676  double wntrecf;
1677  double wntrecr;
1678  double wxbjt;
1679  double wxdif;
1680  double wxrec;
1681  double wxtun;
1682  double waigc;
1683  double wbigc;
1684  double wcigc;
1685  double waigsd;
1686  double wbigsd;
1687  double wcigsd;
1688  double wnigc;
1689  double wpigcd;
1690  double wpoxedge;
1691  double wnpeak;
1692  double wk1w1;
1693  double wk1w2;
1694  double wkb1;
1695  double wketas;
1696  double wpdibl1;
1697  double wpdibl2;
1698  double wpdiblb;
1699  double wfbjtii;
1700  double wbeta1;
1701  double wbeta2;
1702  double wvdsatii0;
1703  double wlii;
1704  double wesatii;
1705  double wsii0;
1706  double wsii1;
1707  double wsii2;
1708  double wsiid;
1709  double wagidl;
1710  double wbgidl;
1711  double wngidl;
1712  double wntun;
1713  double wndiode;
1714  double wnrecf0;
1715  double wnrecr0;
1716  double wisbjt;
1717  double wisdif;
1718  double wisrec;
1719  double wistun;
1720  double wvrec0;
1721  double wvtun0;
1722  double wnbjt;
1723  double wlbjt0;
1724  double wvabjt;
1725  double waely;
1726  double wahli;
1727  double wvsdfb;
1728  double wvsdth;
1729  double wdelvt;
1730  double wxrcrg1;
1731  double wxrcrg2;
1732  double palphaGB1;
1733  double pbetaGB1;
1734  double palphaGB2;
1735  double pbetaGB2;
1736  double pndif;
1737  double pntrecf;
1738  double pntrecr;
1739  double pxbjt;
1740  double pxdif;
1741  double pxrec;
1742  double pxtun;
1743  double paigc;
1744  double pbigc;
1745  double pcigc;
1746  double paigsd;
1747  double pbigsd;
1748  double pcigsd;
1749  double pnigc;
1750  double ppigcd;
1751  double ppoxedge;
1752  double pnpeak;
1753  double pk1w1;
1754  double pk1w2;
1755  double pkb1;
1756  double pketas;
1757  double ppdibl1;
1758  double ppdibl2;
1759  double ppdiblb;
1760  double pfbjtii;
1761  double pbeta1;
1762  double pbeta2;
1763  double pvdsatii0;
1764  double plii;
1765  double pesatii;
1766  double psii0;
1767  double psii1;
1768  double psii2;
1769  double psiid;
1770  double pagidl;
1771  double pbgidl;
1772  double pngidl;
1773  double pntun;
1774  double pndiode;
1775  double pnrecf0;
1776  double pnrecr0;
1777  double pisbjt;
1778  double pisdif;
1779  double pisrec;
1780  double pistun;
1781  double pvrec0;
1782  double pvtun0;
1783  double pnbjt;
1784  double plbjt0;
1785  double pvabjt;
1786  double paely;
1787  double pahli;
1788  double pvsdfb;
1789  double pvsdth;
1790  double pdelvt;
1791  double pxrcrg1;
1792  double pxrcrg2;
1793 
1800  bool vbxGiven;
1801  bool vbmGiven;
1802  bool xtGiven;
1803  bool k1Given;
1804  bool k2Given;
1805 
1806  double vcrit;
1807  double vtm;
1808 
1809  double tox;
1810  double toxm;
1811  double cdsc;
1812  double cdscb;
1813  double cdscd;
1814  double cit;
1815  double nfactor;
1816  double xj;
1817  double vsat;
1818  double at;
1819  double a0;
1820  double ags;
1821  double a1;
1822  double a2;
1823  double keta;
1824  double nsub;
1825  double ngate;
1826  double gamma1;
1827  double gamma2;
1828  double vbx;
1829  double vbm;
1830  double xt;
1831  double k1;
1832  double kt1;
1833  double kt1l;
1834  double kt2;
1835  double k2;
1836  double k3;
1837  double k3b;
1838  double w0;
1839  double nlx;
1840  double dvt0;
1841  double dvt1;
1842  double dvt2;
1843  double dvt0w;
1844  double dvt1w;
1845  double dvt2w;
1846  double drout;
1847  double dsub;
1848  double vth0;
1849  double ua;
1850  double ua1;
1851  double ub;
1852  double ub1;
1853  double uc;
1854  double uc1;
1855  double u0;
1856  double ute;
1857  double voff;
1858  double delta;
1859  double rdsw;
1860  double prwg;
1861  double prwb;
1862  double prt;
1863  double eta0;
1864  double etab;
1865  double pclm;
1866  double pvag;
1867  double wr;
1868  double dwg;
1869  double dwb;
1870  double b0;
1871  double b1;
1872  double alpha0;
1873  double beta0;
1874 
1875  // CV model
1876  double cgsl;
1877  double cgdl;
1878  double ckappa;
1879  double cf;
1880  double clc;
1881  double cle;
1882  double dwc;
1883  double dlc;
1884  double noff;
1885  double acde;
1886  double moin;
1887  double tcjswg;
1888  double tpbswg;
1889 
1890  // Length Dependence
1891  double lcdsc;
1892  double lcdscb;
1893  double lcdscd;
1894  double lcit;
1895  double lnfactor;
1896  double lxj;
1897  double lvsat;
1898  double lat;
1899  double la0;
1900  double lags;
1901  double la1;
1902  double la2;
1903  double lketa;
1904  double lnsub;
1905  double lngate;
1906  double lk1;
1907  double lkt1;
1908  double lkt1l;
1909  double lkt2;
1910  double lk2;
1911  double lk3;
1912  double lk3b;
1913  double lw0;
1914  double lnlx;
1915  double ldvt0;
1916  double ldvt1;
1917  double ldvt2;
1918  double ldvt0w;
1919  double ldvt1w;
1920  double ldvt2w;
1921  double ldrout;
1922  double ldsub;
1923  double lvth0;
1924  double lua;
1925  double lua1;
1926  double lub;
1927  double lub1;
1928  double luc;
1929  double luc1;
1930  double lu0;
1931  double lute;
1932  double lvoff;
1933  double ldelta;
1934  double lrdsw;
1935  double lprwg;
1936  double lprwb;
1937  double lprt;
1938  double leta0;
1939  double letab;
1940  double lpclm;
1941  double lpvag;
1942  double lwr;
1943  double ldwg;
1944  double ldwb;
1945  double lb0;
1946  double lb1;
1947  double lalpha0;
1948  double lbeta0;
1949 
1950  // CV model
1951  double lcgsl;
1952  double lcgdl;
1953  double lckappa;
1954  double lnoff;
1955  double lacde;
1956  double lmoin;
1957 
1958  // Width Dependence
1959  double wcdsc;
1960  double wcdscb;
1961  double wcdscd;
1962  double wcit;
1963  double wnfactor;
1964  double wxj;
1965  double wvsat;
1966  double wat;
1967  double wa0;
1968  double wags;
1969  double wa1;
1970  double wa2;
1971  double wketa;
1972  double wnsub;
1973  double wngate;
1974  double wk1;
1975  double wkt1;
1976  double wkt1l;
1977  double wkt2;
1978  double wk2;
1979  double wk3;
1980  double wk3b;
1981  double ww0;
1982  double wnlx;
1983  double wdvt0;
1984  double wdvt1;
1985  double wdvt2;
1986  double wdvt0w;
1987  double wdvt1w;
1988  double wdvt2w;
1989  double wdrout;
1990  double wdsub;
1991  double wvth0;
1992  double wua;
1993  double wua1;
1994  double wub;
1995  double wub1;
1996  double wuc;
1997  double wuc1;
1998  double wu0;
1999  double wute;
2000  double wvoff;
2001  double wdelta;
2002  double wrdsw;
2003  double wprwg;
2004  double wprwb;
2005  double wprt;
2006  double weta0;
2007  double wetab;
2008  double wpclm;
2009  double wpvag;
2010  double wwr;
2011  double wdwg;
2012  double wdwb;
2013  double wb0;
2014  double wb1;
2015  double walpha0;
2016  double wbeta0;
2017 
2018  // CV model
2019  double wcgsl;
2020  double wcgdl;
2021  double wckappa;
2022  double wnoff;
2023  double wacde;
2024  double wmoin;
2025 
2026  // Cross-term Dependence
2027  double pcdsc;
2028  double pcdscb;
2029  double pcdscd;
2030  double pcit;
2031  double pnfactor;
2032  double pxj;
2033  double pvsat;
2034  double pat;
2035  double pa0;
2036  double pags;
2037  double pa1;
2038  double pa2;
2039  double pketa;
2040  double pnsub;
2041  double pngate;
2042  double pk1;
2043  double pkt1;
2044  double pkt1l;
2045  double pkt2;
2046  double pk2;
2047  double pk3;
2048  double pk3b;
2049  double pw0;
2050  double pnlx;
2051  double pdvt0;
2052  double pdvt1;
2053  double pdvt2;
2054  double pdvt0w;
2055  double pdvt1w;
2056  double pdvt2w;
2057  double pdrout;
2058  double pdsub;
2059  double pvth0;
2060  double pua;
2061  double pua1;
2062  double pub;
2063  double pub1;
2064  double puc;
2065  double puc1;
2066  double pu0;
2067  double pute;
2068  double pvoff;
2069  double pdelta;
2070  double prdsw;
2071  double pprwg;
2072  double pprwb;
2073  double pprt;
2074  double peta0;
2075  double petab;
2076  double ppclm;
2077  double ppvag;
2078  double pwr;
2079  double pdwg;
2080  double pdwb;
2081  double pb0;
2082  double pb1;
2083  double palpha0;
2084  double pbeta0;
2085 
2086  // CV model
2087  double pcgsl;
2088  double pcgdl;
2089  double pckappa;
2090  double pnoff;
2091  double pacde;
2092  double pmoin;
2093 
2094  double tnom;
2095  double cgso;
2096  double cgdo;
2097  double xpart;
2098 
2102 
2103  double Lint;
2104  double Ll;
2105  double Llc;
2106  double Lln;
2107  double Lw;
2108  double Lwc;
2109  double Lwn;
2110  double Lwl;
2111  double Lwlc;
2112 
2113  double Wint;
2114  double Wl;
2115  double Wlc;
2116  double Wln;
2117  double Ww;
2118  double Wwc;
2119  double Wwn;
2120  double Wwl;
2121  double Wwlc;
2122 
2123  // Pre-calculated constants
2124  // MCJ: move to size-dependent param.
2125  double cox;
2126  double factor1;
2127 
2131  double em;
2132  double ef;
2133  double af;
2134  double kf;
2135 
2136  std::list<SizeDependParam*> sizeDependParamList;
2137 
2140  // end of original 3f5 stuff.
2141 
2142  // Variables from the 3f5 B3SOI function b3soitemp, but are more
2143  // appropriate as model variables.
2144  double Vtm0;
2145  double Eg0;
2146  double ni;
2147 };
2148 
2149 //-----------------------------------------------------------------------------
2150 // Class : Master
2151 // Purpose :
2152 // Special Notes :
2153 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
2154 // Creation Date : 11/26/08
2155 //-----------------------------------------------------------------------------
2156 class Master : public DeviceMaster<Traits>
2157 {
2158  friend class Instance;
2159  friend class Model;
2160 
2161 public:
2163  const Configuration & configuration,
2164  const FactoryBlock & factory_block,
2165  const SolverState & ss1,
2166  const DeviceOptions & do1)
2167  : DeviceMaster<Traits>(configuration, factory_block, ss1, do1)
2168  {}
2169 
2170  virtual bool updateState (double * solVec, double * staVec, double * stoVec);
2171 
2172  // load functions:
2173  virtual bool loadDAEVectors (double * solVec, double * fVec, double * qVec, double * bVec, double * storeLeadF, double * storeLeadQ);
2174  virtual bool loadDAEMatrices (N_LAS_Matrix & dFdx, N_LAS_Matrix & dQdx);
2175 };
2176 
2177 void registerDevice();
2178 
2179 } // namespace MOSFET_B3SOI
2180 } // namespace Device
2181 } // namespace Xyce
2182 
2186 
2187 #endif // Xyce_N_DEV_MOSFET_B3SOI_h
2188