Xyce  6.1
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-2015 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.153 $
40 //
41 // Revision Date : $Date: 2015/04/08 19:18:24 $
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 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  void loadNodeSymbols(Util::SymbolTable &symbol_table) const; // override
352 
353  const std::vector< std::vector<int> > & jacobianStamp() const;
354  void registerJacLIDs( const std::vector< std::vector<int> > & jacLIDVec );
355 
356  bool processParams ();
357 
358  bool updateTemperature(const double & temp_tmp);
359  bool updateIntermediateVars ();
360  bool updatePrimaryState ();
361 
362  double Eval1ovFNoise (double vds, double freq);
363 
364  int getNumNoiseSources () const;
365  void setupNoiseSources (Xyce::Analysis::NoiseData & noiseData);
366  void getNoiseSources (Xyce::Analysis::NoiseData & noiseData);
367 
368  bool loadMatrix (Linear::Matrix & JMat);
369  bool checkModel ();
370  double B3SOIlimit(double vnew, double vold, double limit, int *check);
371 
372  // load functions, residual:
373  bool loadDAEQVector ();
374  bool loadDAEFVector ();
375 
376  // load functions, Jacobian:
377  bool loadDAEdQdx ();
378  bool loadDAEdFdx ();
379 
380  void setupJacStamp ();
381  void debugOutputModelParams();
382 
383  bool auxChargeCalculations ();
384  bool setupCapacitors_newDAE ();
385 
386  void setupPointers ();
387 
388  bool setupCapacitors_oldDAE ();
389 
390  bool setIC ();
391 
392  // Beginning of 3f5 stuff:
393  // attributes:
394 public:
395  // Getters and setters
397  {
398  return model_;
399  }
400 
401 private:
402  static std::vector< std::vector< std::vector<int> > > jacStamp_v;
403  static std::vector< std::vector<int> > jacMap_v;
404  static std::vector< std::vector< std::vector<int> > > jacMap2_v;
405 
406 
407  Model & model_; //< Owning model
408 
409  int dNode;
410  int gNode;
411  int sNode;
412  int eNode;
413  int pNode;
415  int bNode;
416  int tNode;
420  int gNodeMid;
421  int P_index;
422  int B_index;
423  int T_index;
424  int jacID;
425 
426  double ueff;
427  double thetavth;
428  double von;
429  double vdsat;
430  double cgdo;
431  double cgso;
432 
433  double l;
434  double w;
436  double drainArea;
437  double sourceArea;
438  double drainSquares;
442 
443  //3f5 bsimsoi varaibles used in creating jacobian:
445  double FwdSum;
446  double gbbb;
447  double gbbdp;
448  double gbbe;
449  double gbbg;
450  double gbbsp;
451  double gbbT;
452  double gcbdb;
453  double gcbeb;
454  double gcbgb;
455  double gcbsb;
456  double gcbT;
457  double gcddb;
458  double gcdeb;
459  double gcdgb;
460  double gcdgmb;
461  double gcdsb;
462  double gcdT;
463  double gcedb;
464  double gceeb;
465  double gcegb;
466  double gcegmb;
467  double gcesb;
468  double gceT;
469  double gcgbb;
470  double gcgdb;
471  double gcgeb;
472  double gcggb;
473  double gcgmdb;
474  double gcgmeb;
475  double gcgmgmb;
476  double gcgmsb;
477  double gcgsb;
478  double gcgT;
479  double gcrg;
480  double gcrgb;
481  double gcrgd;
482  double gcrgg;
483  double gcrgs;
484  double gcrg_jac;
485  double gcrgb_jac;
486  double gcrgd_jac;
487  double gcrgg_jac;
488  double gcrgs_jac;
489  double gcsdb;
490  double gcseb;
491  double gcsgb;
492  double gcsgmb;
493  double gcssb;
494  double gcsT;
495  double gcTt;
496  double gddpb;
497  double gddpdp;
498  double gddpe;
499  double gddpg;
500  double gddpsp;
501  double gddpT;
502  double gds;
503  double geltd;
504  double gigb;
505  double gigd;
506  double gige;
507  double gigg;
508  double gigs;
509  double gigT;
510  double gigb_jac;
511  double gigd_jac;
512  double gige_jac;
513  double gigg_jac;
514  double gigs_jac;
515  double gigT_jac;
516  double gIdtotb;
517  double gIgtotb;
518  double gIgtotd;
519  double gIgtotg;
520  double gIgtots;
521  double gIstotb;
522  double gIstotd;
523  double gIstotg;
524  double gIstots;
525  double gppb;
526  double gppp;
527  double gsspb;
528  double gsspdp;
529  double gsspe;
530  double gsspg;
531  double gsspsp;
532  double gsspT;
533  double gTtb;
534  double gTtdp;
535  double gTte;
536  double gTtg;
537  double gTtsp;
538  double gTtt;
539  double Gm;
540  double Gmbs;
541  double Gme;
542  double Gmin;
543  double GmT;
544  double RevSum;
546  double gIdtotg;
547  double gIdtotd;
548  double gIdtots;
549 
550  // new variable from updateTempreature
551  double rbodyext;
552  double csesw;
553  double dt4;
554  double st4;
555  double cdmin;
556  double cdbox;
557  double csbox;
558  double csmin;
559  double grgeltd;
560  double phi;
561  double cdesw;
562 
563  int mode;
564  int bjtoff;
565  int debugMod;
566  bool OFF;
567  double rth0;
568  double cth0;
569  double bodySquares;
570  double frbody;
571  int soiMod;
572  double nbc;
573  double nseg;
574  double pdbcp;
575  double psbcp;
576  double agbcp;
577  double aebcp;
578  double vbsusr;
579  int tnodeout;
580  int rgateMod;
581 
582  double cdrain;
583  double gIgsg;
584  double gIgss;
585  double gIgcdg;
586  double gIgcds;
587  double gIgcdd;
588  double gIgcdb;
589  double Igs;
590  double Igcd;
591  double gIgdg;
592  double gIgcsg;
593  double gIgdd;
594  double gIgcss;
595  double gIgcsd;
596  double gIgcsb;
597  double Igd;
598  double Igcs;
599 
600  // OP point
601  double qinv;
602  double cb;
603  double cd;
604  double cbd;
605  double gm;
606  double gmbs;
607 
608  double gbbs;
609  double gbgs;
610  double gbds;
611 
612  double cggb;
613  double cgdb;
614  double cgsb;
615  double cbgb;
616  double cbdb;
617  double cbsb;
618  double cdgb;
619  double cddb;
620  double cdsb;
621 
622  double qbulk;
623 
624  // initial condition variables
625  double icVDS;
626  double icVGS;
627  double icVBS;
628  double icVES;
629  double icVPS;
630 
636 
638 
639  // end of original 3f5 stuff
640 
641  // Variables from the 3f5 b3ld function, which were local to that
642  // function but are more appropriate as instance variables:
644 
645  bool selfheat;
646  int bodyMod;
647  int floating;
648 
649  double dxpart;
650  double sxpart;
651 
652  double cdreq;
653  double ceqbd;
654  double ceqbs;
655 
656  double qgdo;
657  double qgso;
658  double qgd;
659  double qgs;
660  double qge;
661  double qgme;
662  double qgate;
663  double qbody;
664  double qdrn;
665  double qsub;
666  double qsrc;
667 
668  // added for soi:
669  double ceqbody;
670  double ceqgate;
671  double ceqgcrg;
672  double ceqqe;
673  double ceqqgmid;
674  double ceqbodcon;
675  double ceqth;
676  double ceqqth;
677  double Igtoteq;
678  double Idtoteq;
679  double Istoteq;
680 
681 
682  double dVgst_dVg;
683  double dVgst_dVb;
684  double dVgs_eff_dVg;
685 
689 
690  double cqdrn;
691  double cqgate;
692  double cqsub;
693  double cqbody;
694  double cqtemp;
695 
696  // Variables which were model variables in the 3f5 version of the B3SOI,
697  // but are temperature dependent and should be instance variables (as
698  // temperature is an instance-level quantity.
699  double vtm;
700 
701  // end of 3f5 stuff
702 
703  double temp;
704 
705  // solution variables, and intermediate quantities.
706  //double mode;
707  double Vd;
708  double Vg;
709  double Vs;
710  double Ve;
711  double Vp;
712  double Vb;
713  double Vsp;
714  double Vdp;
715  double Vgp;
716  double Vgm;
717 
718  double Qtotal;
719 
720  // resistor currents:
721  double Idrain;
722  double Isource;
723 
724  double Igate;
725  double IgateMid;
726  double Ith;
727 
728  double vgb;
729  double vgd;
730  double ceqqd;
731  double ceqqb;
732  double ceqqg;
733 
734  double ceqqg_Jdxp;
735  double ceqqb_Jdxp;
736  double ceqqd_Jdxp;
737  double ceqqe_Jdxp;
738  double ceqqth_Jdxp;
739  double ceqgcrg_Jdxp;
741  double cth_Jdxp;
742  double cjs_Jdxp;
743  double cjd_Jdxp;
744  double cdreq_Jdxp;
745  double cbody_Jdxp;
746  double cgate_Jdxp;
747  double Idtoteq_Jdxp;
748  double Istoteq_Jdxp;
749  double Igtoteq_Jdxp;
750 
751  double cbodcon_Jdxp;
752  double ceqbody_Jdxp;
753  double ceqgate_Jdxp;
754  double ceqbs_Jdxp;
755  double ceqbd_Jdxp;
757 
758  double Idrain_Jdxp;
759  double Isource_Jdxp;
760  double Igate_Jdxp;
762 
763  double ceqth_Jdxp;
764 
765  // state variables, voltage drops
766  double vbd;
767  double vbs;
768  double vps;
769  double vpd;
770  double ved;
771  double veb;
772  double ves;
773  double vgs;
774  double vge;
775  double vds;
776  double vged;
777  double vgmd;
778  double vgme;
779  double vgmb;
780 
781  double vg;
782  double vd;
783  double vs;
784  double vp;
785  double ve;
786  double deltemp;
787  double delTemp;
789 
790  double vges;
791  double vgms;
792  double vgge;
793  double vggm;
794 
795  // "original" versions of various voltage drop variables:
796  // original refers to the beginning of the newton iterations,
797  // before any limits are imposed on the change in voltage drop.
798  double vbd_orig;
799  double vbs_orig;
800  double vps_orig;
801  double vpd_orig;
802  double ves_orig;
803  double ved_orig;
804  double vgs_orig;
805  double vds_orig;
806 
807  // and these are "mode-aware" versions of voltage drops. If vds is
808  // negative then drain and source are reversed and one needs to
809  // use them differently.
810  double Vds, Vgs, Vbs;
811  double Vbd, Ves, Vps;
814 
815  double delTemp_orig;
816 
817  double vges_orig;
818  double vgms_orig;
819 
820  // "orig" variables that are node-based, rather than junction.
821  double Vg_orig;
822  double Vd_orig;
823  double Vs_orig;
824  double Ve_orig;
825  double Vb_orig;
826  double Vp_orig;
827  double Vsp_orig;
828  double Vdp_orig;
829  double Vgp_orig;
830  double Vgm_orig;
831 
832  // These two are added to allow loadRHS to compile
833  double vgd_orig;
834 
835  //PMC: global variables needed in intermediateVars
836  double Vgsteff;
837  double Vdseff;
838  double ni;
839  double Abulk;
840  double vbseff;
841  double nstar;
842  double rds;
843  double AbovVgst2Vtm;
844  double ids;
845  double igidl;
846  double ic;
847  double ig;
848  double itun;
849  double ibs;
850  double ibd;
851  double iii;
852  double ibp;
853  double gbpbs;
854  double gbpps;
855  double gbpT;
856  double cbodcon;
857 
858  double gme;
859  double gmT;
860  double gtempg;
861  double gtempb;
862  double gtempe;
863  double gtempT;
864  double gtempd;
865  double cth;
866  double cjs;
867  double cjd;
868  double cbody;
869  double cgate;
870  double gjdb;
871  double gjdd;
872  double gjdg;
873  double gjde;
874  double gjdT;
875  double gjsb;
876  double gjsd;
877  double gjsg;
878  double gjsT;
879  double gbes;
880  double gbps;
881  double gbT;
882 
883  double cgT;
884  double cbT;
885  double ceT;
886  double cdT;
887  double cbeb;
888  double ceeb;
889  double cdeb;
890  double qse;
891  double qde;
892  double qbf;
893  double qjs;
894  double qjd;
895  double cbb;
896  double cbg;
897  double gcse;
898  double gcde;
899 
900  // state variables, intrinsic capacitors
901  double qb;
902  double qg;
903  double qd;
904  double qe;
905  double qgmid;
906  double qth;
907 
910 
911  double CAPcgmgmb;
912  double CAPcgmdb;
913  double CAPcgmsb;
914  double CAPcgmeb;
915  double CAPcdgmb;
916  double CAPcsgmb;
917  double CAPcegmb;
918  double CAPcggb;
919  double CAPcgdb;
920  double CAPcgsb;
921  double CAPcgeb;
922  double CAPcgbb;
923  double CAPcdgb;
924  double CAPcegb;
925  double CAPcsgb;
926  double CAPcbgb;
927  double CAPcddb;
928  double CAPcdsb;
929  double CAPcdeb;
930  double CAPcdT;
931  double CAPcsdb;
932  double CAPcssb;
933  double CAPcseb;
934  double CAPcsT;
935  double CAPcgT;
936  double CAPcbdb;
937  double CAPcbsb;
938  double CAPcbeb;
939  double CAPcbT;
940  double CAPcedb;
941  double CAPcesb;
942  double CAPceeb;
943  double CAPceT;
944  double CAPcTt;
945 
946  double Qeqqg;
947  double Qeqqb;
948  double Qeqqd;
949  double Qeqqe;
950  double Qeqqth;
951  double Qeqqgmid;
952 
953  double Qeqqg_Jdxp;
954  double Qeqqb_Jdxp;
955  double Qeqqd_Jdxp;
956  double Qeqqe_Jdxp;
957  double Qeqqth_Jdxp;
959 
960  // Indices into the state vector:
961 
962  // state variables, voltage drops
969 
978 
981 
982  // lead current vars if needed
988 
989  // state variables, intrinsic capacitors
996 
997  ////////////////////////////////////////////////////////////////////
998  // Local variable indices
999  int li_Drain;
1000  int li_Gate;
1004  int li_Body;
1010 
1011  // local indies for currents on voltages sources used for initial conditions
1012  int li_Ids;
1013  int li_Igs;
1014  int li_Ibs;
1015  int li_Ies;
1016  int li_Ips;
1017 
1018 
1019  ////////////////////////////////////////////////////////////////////
1020  // Offset variables corresponding to the above declared indices.
1021 
1022  // Jacobian Matrix Offsets:
1023 
1024  // drain row:
1028 
1029  // gate row:
1037 
1038  // source row:
1046 
1047  // substrate row:
1056 
1057  // external body row:
1061 
1062  // body row:
1071 
1072  // temperature row:
1079 
1080  // drain' row:
1089 
1090  // source' row:
1099 
1100  // gate' row:
1109 
1110  // gate mid row:
1118 
1119  // These offset are for the voltage sources that represent initial
1120  // conditions on Vds, Vgs, Vbs, Ves and Vps
1121 
1122  // icVDS
1126 
1127  // icVGS
1131 
1132  // icVBS
1136 
1137  // icVES
1141 
1142  // icVPS
1146 
1147 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
1148  // Jacobian Matrix f-Ptrs:
1149 
1150  // drain row:
1154 
1155  // gate row:
1163 
1164  // source row:
1172 
1173  // substrate row:
1182 
1183  // external body row:
1187 
1188  // body row:
1197 
1198  // temperature row:
1205 
1206  // drain' row:
1215 
1216  // source' row:
1225 
1226  // gate' row:
1235 
1236  // gate mid row:
1244 
1245  // These offset are for the voltage sources that represent initial
1246  // conditions on Vds, Vgs, Vbs, Ves and Vps
1247 
1248  // f_icVDS
1252 
1253  // f_icVGS
1257 
1258  // f_icVBS
1262 
1263  // f_icVES
1267 
1268  // f_icVPS
1272 
1273  // Jacobian Matrix q-Ptrs:
1274 
1275  // drain row:
1279 
1280  // gate row:
1288 
1289  // source row:
1297 
1298  // substrate row:
1307 
1308  // external body row:
1312 
1313  // body row:
1322 
1323  // temperature row:
1330 
1331  // drain' row:
1340 
1341  // source' row:
1350 
1351  // gate' row:
1360 
1361  // gate mid row:
1369 
1370  // These offset are for the voltage sources that represent initial
1371  // conditions on Vds, Vgs, Vbs, Ves and Vps
1372 
1373  // q_icVDS
1377 
1378  // q_icVGS
1382 
1383  // q_icVBS
1387 
1388  // q_icVES
1392 
1393  // q_icVPS
1397 
1398  // end of matrix pointer section
1399 #endif
1400 
1401  // Most versions of this device will use one of the jacobian's defined
1402  // as static above. However, if any of the five initial conditions are
1403  // specified (icVDS, icVGS, icVBS, icVES or icVPS), then the number of
1404  // jacobian permutations goes way up. Rather than enumerate all of
1405  // these as static vectors, we'll make non-static, member variables of
1406  // the jacStamp for those few devices that specify initial conditoins.
1407 
1408  std::vector< std::vector< int > > jacStampIC;
1409  std::vector<int> jacMapIC;
1410  std::vector< std::vector<int> > jacMapIC2;
1411 
1412  // boolean for new voltlim debugging:
1413  bool vlDebug;
1414 
1415  int blockHomotopyID; // For homotopy
1416  double randomPerturb; // For homotopy
1417 };
1418 
1419 //-----------------------------------------------------------------------------
1420 // Class : Model
1421 // Purpose :
1422 // Special Notes :
1423 // Creator : Dave Shirley
1424 // Creation Date : 05/20/04
1425 //-----------------------------------------------------------------------------
1426 class Model : public DeviceModel
1427 {
1428  typedef std::vector<Instance *> InstanceVector;
1429 
1430  friend class ParametricData<Model>;
1431  friend class Instance;
1432  friend class Traits;friend class Master;
1433 
1434 public:
1435  Model(
1436  const Configuration & configuration,
1437  const ModelBlock & MB,
1438  const FactoryBlock & factory_block);
1439  ~Model();
1440 
1441 private:
1442  Model();
1443  Model(const Model &);
1444  Model &operator=(const Model &);
1445 
1446 public:
1447  virtual void forEachInstance(DeviceInstanceOp &op) const /* override */;
1448 
1449  virtual std::ostream &printOutInstances(std::ostream &os) const;
1450 
1451  bool processParams ();
1452  bool processInstanceParams ();
1453 
1454  bool clearTemperatureData ();
1455 
1456 
1457 public:
1458  void addInstance(Instance *instance)
1459  {
1460  instanceContainer.push_back(instance);
1461  }
1462 
1463 private:
1464  std::vector<Instance*> instanceContainer;
1465 
1466 private:
1467 
1468  int dtype;
1469 
1470  double cbox;
1471  double csi;
1472 
1473  int mobMod;
1474  int capMod;
1475  int binUnit;
1477  std::string version;
1478  // Bogus PSpice-y thing where you can set L and W on the model *or* the
1479  // instance line, with instance overriding model
1480  double model_l;
1481  double model_w;
1482  // range of channel dimensions for which model is valid
1483  double Lmax;
1484  double Lmin;
1485  double Wmax;
1486  double Wmin;
1487  //
1488  //soi specific variables:
1489  double dtoxcv;
1490  double npeak;
1491  double pdibl1;
1492  double pdibl2;
1493  double pdiblb;
1494  int shMod;
1495  double tbox;
1496  double tsi;
1497  double rth0;
1498  double cth0;
1499  double ngidl;
1500  double agidl;
1501  double bgidl;
1502  double ndiode;
1503  double xbjt;
1504  double xdif;
1505  double xrec;
1506  double xtun;
1508  int fnoiMod;
1509  int tnoiMod;
1510  double tnoia;
1511  double tnoib;
1512  double rnoia;
1513  double rnoib;
1514  double ntnoi;
1515  double noif;
1516  double k1w1;
1517  double k1w2;
1518  double ketas;
1519  double dwbc;
1520  double beta1;
1521  double beta2;
1522  double vdsatii0;
1523  double tii;
1524  double lii;
1525  double sii0;
1526  double sii1;
1527  double sii2;
1528  double siid;
1529  double fbjtii;
1530  double esatii;
1531  double ntun;
1532  double nrecf0;
1533  double nrecr0;
1534  double isbjt;
1535  double isdif;
1536  double isrec;
1537  double istun;
1538  double ln;
1539  double vrec0;
1540  double vtun0;
1541  double nbjt;
1542  double lbjt0;
1543  double ldif0;
1544  double vabjt;
1545  double aely;
1546  double ahli;
1547  double rbody;
1548  double rbsh;
1549  double cgeo;
1550  double tt;
1551  double ndif;
1552  double vsdfb;
1553  double vsdth;
1554  double csdmin;
1555  double asd;
1556  double csdesw;
1557  double ntrecf;
1558  double ntrecr;
1559  double dlcb;
1560  double fbody;
1561  double delvt;
1562  double kb1;
1563  double dlbg;
1564  int igbMod;
1565  int igcMod;
1566  double toxqm;
1567  double wth0;
1568  double rhalo;
1569  double ntox;
1570  double toxref;
1571  double ebg;
1572  double vevb;
1573  double alphaGB1;
1574  double betaGB1;
1575  double vgb1;
1576  double vecb;
1577  double alphaGB2;
1578  double betaGB2;
1579  double vgb2;
1580  double voxh;
1581  double deltavox;
1582  double aigc;
1583  double bigc;
1584  double cigc;
1585  double aigsd;
1586  double bigsd;
1587  double cigsd;
1588  double nigc;
1589  double pigcd;
1590  double poxedge;
1591  double dlcig;
1592  int soiMod;
1593  double vbs0pd;
1594  double vbs0fd;
1595  double vbsa;
1596  double nofffd;
1597  double vofffd;
1598  double k1b;
1599  double k2b;
1600  double dk2b;
1601  double dvbd0;
1602  double dvbd1;
1603  double moinFD;
1606 
1607  double xrcrg1;
1608  double xrcrg2;
1609  double rshg;
1610  double ngcon;
1611  double xgw;
1612  double xgl;
1613  double lalphaGB1;
1614  double lbetaGB1;
1615  double lalphaGB2;
1616  double lbetaGB2;
1617  double lndif;
1618  double lntrecf;
1619  double lntrecr;
1620  double lxbjt;
1621  double lxdif;
1622  double lxrec;
1623  double lxtun;
1624  double laigc;
1625  double lbigc;
1626  double lcigc;
1627  double laigsd;
1628  double lbigsd;
1629  double lcigsd;
1630  double lnigc;
1631  double lpigcd;
1632  double lpoxedge;
1633  double lnpeak;
1634  double lk1w1;
1635  double lk1w2;
1636  double lketas;
1637  double lpdibl1;
1638  double lpdibl2;
1639  double lpdiblb;
1640  double lfbjtii;
1641  double lbeta1;
1642  double lbeta2;
1643  double lvdsatii0;
1644  double llii;
1645  double lesatii;
1646  double lsii0;
1647  double lsii1;
1648  double lsii2;
1649  double lsiid;
1650  double lkb1;
1651  double lagidl;
1652  double lbgidl;
1653  double lngidl;
1654  double lntun;
1655  double lndiode;
1656  double lnrecf0;
1657  double lnrecr0;
1658  double lisbjt;
1659  double lisdif;
1660  double lisrec;
1661  double listun;
1662  double lvrec0;
1663  double lvtun0;
1664  double lnbjt;
1665  double llbjt0;
1666  double lvabjt;
1667  double laely;
1668  double lahli;
1669  double lvsdfb;
1670  double lvsdth;
1671  double ldelvt;
1672  double lxrcrg1;
1673  double lxrcrg2;
1674  double walphaGB1;
1675  double wbetaGB1;
1676  double walphaGB2;
1677  double wbetaGB2;
1678  double wndif;
1679  double wntrecf;
1680  double wntrecr;
1681  double wxbjt;
1682  double wxdif;
1683  double wxrec;
1684  double wxtun;
1685  double waigc;
1686  double wbigc;
1687  double wcigc;
1688  double waigsd;
1689  double wbigsd;
1690  double wcigsd;
1691  double wnigc;
1692  double wpigcd;
1693  double wpoxedge;
1694  double wnpeak;
1695  double wk1w1;
1696  double wk1w2;
1697  double wkb1;
1698  double wketas;
1699  double wpdibl1;
1700  double wpdibl2;
1701  double wpdiblb;
1702  double wfbjtii;
1703  double wbeta1;
1704  double wbeta2;
1705  double wvdsatii0;
1706  double wlii;
1707  double wesatii;
1708  double wsii0;
1709  double wsii1;
1710  double wsii2;
1711  double wsiid;
1712  double wagidl;
1713  double wbgidl;
1714  double wngidl;
1715  double wntun;
1716  double wndiode;
1717  double wnrecf0;
1718  double wnrecr0;
1719  double wisbjt;
1720  double wisdif;
1721  double wisrec;
1722  double wistun;
1723  double wvrec0;
1724  double wvtun0;
1725  double wnbjt;
1726  double wlbjt0;
1727  double wvabjt;
1728  double waely;
1729  double wahli;
1730  double wvsdfb;
1731  double wvsdth;
1732  double wdelvt;
1733  double wxrcrg1;
1734  double wxrcrg2;
1735  double palphaGB1;
1736  double pbetaGB1;
1737  double palphaGB2;
1738  double pbetaGB2;
1739  double pndif;
1740  double pntrecf;
1741  double pntrecr;
1742  double pxbjt;
1743  double pxdif;
1744  double pxrec;
1745  double pxtun;
1746  double paigc;
1747  double pbigc;
1748  double pcigc;
1749  double paigsd;
1750  double pbigsd;
1751  double pcigsd;
1752  double pnigc;
1753  double ppigcd;
1754  double ppoxedge;
1755  double pnpeak;
1756  double pk1w1;
1757  double pk1w2;
1758  double pkb1;
1759  double pketas;
1760  double ppdibl1;
1761  double ppdibl2;
1762  double ppdiblb;
1763  double pfbjtii;
1764  double pbeta1;
1765  double pbeta2;
1766  double pvdsatii0;
1767  double plii;
1768  double pesatii;
1769  double psii0;
1770  double psii1;
1771  double psii2;
1772  double psiid;
1773  double pagidl;
1774  double pbgidl;
1775  double pngidl;
1776  double pntun;
1777  double pndiode;
1778  double pnrecf0;
1779  double pnrecr0;
1780  double pisbjt;
1781  double pisdif;
1782  double pisrec;
1783  double pistun;
1784  double pvrec0;
1785  double pvtun0;
1786  double pnbjt;
1787  double plbjt0;
1788  double pvabjt;
1789  double paely;
1790  double pahli;
1791  double pvsdfb;
1792  double pvsdth;
1793  double pdelvt;
1794  double pxrcrg1;
1795  double pxrcrg2;
1796 
1803  bool vbxGiven;
1804  bool vbmGiven;
1805  bool xtGiven;
1806  bool k1Given;
1807  bool k2Given;
1808 
1809  double vcrit;
1810  double vtm;
1811 
1812  double tox;
1813  double toxm;
1814  double cdsc;
1815  double cdscb;
1816  double cdscd;
1817  double cit;
1818  double nfactor;
1819  double xj;
1820  double vsat;
1821  double at;
1822  double a0;
1823  double ags;
1824  double a1;
1825  double a2;
1826  double keta;
1827  double nsub;
1828  double ngate;
1829  double gamma1;
1830  double gamma2;
1831  double vbx;
1832  double vbm;
1833  double xt;
1834  double k1;
1835  double kt1;
1836  double kt1l;
1837  double kt2;
1838  double k2;
1839  double k3;
1840  double k3b;
1841  double w0;
1842  double nlx;
1843  double dvt0;
1844  double dvt1;
1845  double dvt2;
1846  double dvt0w;
1847  double dvt1w;
1848  double dvt2w;
1849  double drout;
1850  double dsub;
1851  double vth0;
1852  double ua;
1853  double ua1;
1854  double ub;
1855  double ub1;
1856  double uc;
1857  double uc1;
1858  double u0;
1859  double ute;
1860  double voff;
1861  double delta;
1862  double rdsw;
1863  double prwg;
1864  double prwb;
1865  double prt;
1866  double eta0;
1867  double etab;
1868  double pclm;
1869  double pvag;
1870  double wr;
1871  double dwg;
1872  double dwb;
1873  double b0;
1874  double b1;
1875  double alpha0;
1876  double beta0;
1877 
1878  // CV model
1879  double cgsl;
1880  double cgdl;
1881  double ckappa;
1882  double cf;
1883  double clc;
1884  double cle;
1885  double dwc;
1886  double dlc;
1887  double noff;
1888  double acde;
1889  double moin;
1890  double tcjswg;
1891  double tpbswg;
1892 
1893  // Length Dependence
1894  double lcdsc;
1895  double lcdscb;
1896  double lcdscd;
1897  double lcit;
1898  double lnfactor;
1899  double lxj;
1900  double lvsat;
1901  double lat;
1902  double la0;
1903  double lags;
1904  double la1;
1905  double la2;
1906  double lketa;
1907  double lnsub;
1908  double lngate;
1909  double lk1;
1910  double lkt1;
1911  double lkt1l;
1912  double lkt2;
1913  double lk2;
1914  double lk3;
1915  double lk3b;
1916  double lw0;
1917  double lnlx;
1918  double ldvt0;
1919  double ldvt1;
1920  double ldvt2;
1921  double ldvt0w;
1922  double ldvt1w;
1923  double ldvt2w;
1924  double ldrout;
1925  double ldsub;
1926  double lvth0;
1927  double lua;
1928  double lua1;
1929  double lub;
1930  double lub1;
1931  double luc;
1932  double luc1;
1933  double lu0;
1934  double lute;
1935  double lvoff;
1936  double ldelta;
1937  double lrdsw;
1938  double lprwg;
1939  double lprwb;
1940  double lprt;
1941  double leta0;
1942  double letab;
1943  double lpclm;
1944  double lpvag;
1945  double lwr;
1946  double ldwg;
1947  double ldwb;
1948  double lb0;
1949  double lb1;
1950  double lalpha0;
1951  double lbeta0;
1952 
1953  // CV model
1954  double lcgsl;
1955  double lcgdl;
1956  double lckappa;
1957  double lnoff;
1958  double lacde;
1959  double lmoin;
1960 
1961  // Width Dependence
1962  double wcdsc;
1963  double wcdscb;
1964  double wcdscd;
1965  double wcit;
1966  double wnfactor;
1967  double wxj;
1968  double wvsat;
1969  double wat;
1970  double wa0;
1971  double wags;
1972  double wa1;
1973  double wa2;
1974  double wketa;
1975  double wnsub;
1976  double wngate;
1977  double wk1;
1978  double wkt1;
1979  double wkt1l;
1980  double wkt2;
1981  double wk2;
1982  double wk3;
1983  double wk3b;
1984  double ww0;
1985  double wnlx;
1986  double wdvt0;
1987  double wdvt1;
1988  double wdvt2;
1989  double wdvt0w;
1990  double wdvt1w;
1991  double wdvt2w;
1992  double wdrout;
1993  double wdsub;
1994  double wvth0;
1995  double wua;
1996  double wua1;
1997  double wub;
1998  double wub1;
1999  double wuc;
2000  double wuc1;
2001  double wu0;
2002  double wute;
2003  double wvoff;
2004  double wdelta;
2005  double wrdsw;
2006  double wprwg;
2007  double wprwb;
2008  double wprt;
2009  double weta0;
2010  double wetab;
2011  double wpclm;
2012  double wpvag;
2013  double wwr;
2014  double wdwg;
2015  double wdwb;
2016  double wb0;
2017  double wb1;
2018  double walpha0;
2019  double wbeta0;
2020 
2021  // CV model
2022  double wcgsl;
2023  double wcgdl;
2024  double wckappa;
2025  double wnoff;
2026  double wacde;
2027  double wmoin;
2028 
2029  // Cross-term Dependence
2030  double pcdsc;
2031  double pcdscb;
2032  double pcdscd;
2033  double pcit;
2034  double pnfactor;
2035  double pxj;
2036  double pvsat;
2037  double pat;
2038  double pa0;
2039  double pags;
2040  double pa1;
2041  double pa2;
2042  double pketa;
2043  double pnsub;
2044  double pngate;
2045  double pk1;
2046  double pkt1;
2047  double pkt1l;
2048  double pkt2;
2049  double pk2;
2050  double pk3;
2051  double pk3b;
2052  double pw0;
2053  double pnlx;
2054  double pdvt0;
2055  double pdvt1;
2056  double pdvt2;
2057  double pdvt0w;
2058  double pdvt1w;
2059  double pdvt2w;
2060  double pdrout;
2061  double pdsub;
2062  double pvth0;
2063  double pua;
2064  double pua1;
2065  double pub;
2066  double pub1;
2067  double puc;
2068  double puc1;
2069  double pu0;
2070  double pute;
2071  double pvoff;
2072  double pdelta;
2073  double prdsw;
2074  double pprwg;
2075  double pprwb;
2076  double pprt;
2077  double peta0;
2078  double petab;
2079  double ppclm;
2080  double ppvag;
2081  double pwr;
2082  double pdwg;
2083  double pdwb;
2084  double pb0;
2085  double pb1;
2086  double palpha0;
2087  double pbeta0;
2088 
2089  // CV model
2090  double pcgsl;
2091  double pcgdl;
2092  double pckappa;
2093  double pnoff;
2094  double pacde;
2095  double pmoin;
2096 
2097  double tnom;
2098  double cgso;
2099  double cgdo;
2100  double xpart;
2101 
2105 
2106  double Lint;
2107  double Ll;
2108  double Llc;
2109  double Lln;
2110  double Lw;
2111  double Lwc;
2112  double Lwn;
2113  double Lwl;
2114  double Lwlc;
2115 
2116  double Wint;
2117  double Wl;
2118  double Wlc;
2119  double Wln;
2120  double Ww;
2121  double Wwc;
2122  double Wwn;
2123  double Wwl;
2124  double Wwlc;
2125 
2126  // Pre-calculated constants
2127  // MCJ: move to size-dependent param.
2128  double cox;
2129  double factor1;
2130 
2134  double em;
2135  double ef;
2136  double af;
2137  double kf;
2138 
2139  std::list<SizeDependParam*> sizeDependParamList;
2140 
2143  // end of original 3f5 stuff.
2144 
2145  // Variables from the 3f5 B3SOI function b3soitemp, but are more
2146  // appropriate as model variables.
2147  double Vtm0;
2148  double Eg0;
2149  double ni;
2150 };
2151 
2152 //-----------------------------------------------------------------------------
2153 // Class : Master
2154 // Purpose :
2155 // Special Notes :
2156 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
2157 // Creation Date : 11/26/08
2158 //-----------------------------------------------------------------------------
2159 class Master : public DeviceMaster<Traits>
2160 {
2161  friend class Instance;
2162  friend class Model;
2163 
2164 public:
2166  const Configuration & configuration,
2167  const FactoryBlock & factory_block,
2168  const SolverState & ss1,
2169  const DeviceOptions & do1)
2170  : DeviceMaster<Traits>(configuration, factory_block, ss1, do1)
2171  {}
2172 
2173  virtual bool updateState (double * solVec, double * staVec, double * stoVec);
2174 
2175  // load functions:
2176  virtual bool loadDAEVectors (double * solVec, double * fVec, double * qVec, double * bVec, double * storeLeadF, double * storeLeadQ, double * leadF, double * leadQ, double * junctionV);
2177  virtual bool loadDAEMatrices (Linear::Matrix & dFdx, Linear::Matrix & dQdx);
2178 
2179 };
2180 
2181 void registerDevice();
2182 
2183 } // namespace MOSFET_B3SOI
2184 } // namespace Device
2185 } // namespace Xyce
2186 
2187 #endif // Xyce_N_DEV_MOSFET_B3SOI_h
2188 
Model & operator=(const Model &)
const std::vector< std::vector< int > > & jacobianStamp() const
virtual bool loadDAEVectors(double *solVec, double *fVec, double *qVec, double *bVec, double *storeLeadF, double *storeLeadQ, double *leadF, double *leadQ, double *junctionV)
Populates the device's ExternData object with these pointers.
std::vector< Instance * > InstanceVector
Instance(const Configuration &configuration, const InstanceBlock &IB, Model &Miter, const FactoryBlock &factory_block)
static std::vector< std::vector< int > > jacMap_v
std::vector< std::vector< int > > jacStampIC
Pure virtual class to augment a linear system.
void registerStateLIDs(const std::vector< int > &staLIDVecRef)
void loadNodeSymbols(Util::SymbolTable &symbol_table) const
Populates and returns the store name map.
Instance & operator=(const Instance &)
static void loadInstanceParameters(ParametricData< Instance > &instance_parameters)
virtual bool loadDAEMatrices(Linear::Matrix &dFdx, Linear::Matrix &dQdx)
Populates the device's Jacobian object with these pointers.
double Eval1ovFNoise(double vds, double freq)
bool updateTemperature(const double &temp_tmp)
std::vector< std::vector< int > > jacMapIC2
virtual std::ostream & printOutInstances(std::ostream &os) const
DeviceMaster instantiates a device as described by the device traits T.
void registerJacLIDs(const std::vector< std::vector< int > > &jacLIDVec)
static std::vector< std::vector< std::vector< int > > > jacStamp_v
std::list< SizeDependParam * > sizeDependParamList
The FactoryBlock contains parameters needed by the device, instance and model creation functions...
Master(const Configuration &configuration, const FactoryBlock &factory_block, const SolverState &ss1, const DeviceOptions &do1)
static Device * factory(const Configuration &configuration, const FactoryBlock &factory_block)
bool processInstanceParams()
processInstanceParams
void registerLIDs(const std::vector< int > &intLIDVecRef, const std::vector< int > &extLIDVecRef)
void getNoiseSources(Xyce::Analysis::NoiseData &noiseData)
The Device class is an interface for device implementations.
Definition: N_DEV_Device.h:101
virtual void forEachInstance(DeviceInstanceOp &op) const
Apply a device instance "op" to all instances associated with this model.
std::vector< Instance * > instanceContainer
static void loadModelParameters(ParametricData< Model > &model_parameters)
Class Configuration contains device configuration data.
virtual bool updateState(double *solVec, double *staVec, double *stoVec)
Updates the devices state information.
static std::vector< std::vector< std::vector< int > > > jacMap2_v
void addInstance(Instance *instance)
void registerStoreLIDs(const std::vector< int > &stoLIDVecRef)
void setupNoiseSources(Xyce::Analysis::NoiseData &noiseData)
ModelBlock represents a .MODEL line from the netlist.
The DeviceTraits template describes the configuration of a device.
Manages parameter binding for class C.
Definition: N_DEV_Pars.h:214
InstanceBlock represent a device instance line from the netlist.
double B3SOIlimit(double vnew, double vold, double limit, int *check)