Jspice3
b2temp.c File Reference
#include "spice.h"
#include <stdio.h>
#include <math.h>
#include "bsim2def.h"
#include "const.h"
#include "sperror.h"
#include "util.h"
Include dependency graph for b2temp.c:

Go to the source code of this file.

Functions

int B2temp (GENmodel *inModel, CKTcircuit *ckt)
 

Function Documentation

int B2temp ( GENmodel inModel,
CKTcircuit ckt 
)

Definition at line 19 of file b2temp.c.

26 {
27  register B2model *model = (B2model*) inModel;
28  register B2instance *here;
29  register struct bsim2SizeDependParam *pSizeDependParamKnot, *pLastKnot;
30  double EffectiveLength;
31  double EffectiveWidth;
32  double CoxWoverL, Inv_L, Inv_W, tmp;
33  int Size_Not_Found;
34 
35  /* loop through all the B2 device models */
36  for( ; model != NULL; model = model->B2nextModel ) {
37 
38 /* Default value Processing for B2 MOSFET Models */
39  /* Some Limiting for Model Parameters */
40  if( model->B2bulkJctPotential < 0.1) {
41  model->B2bulkJctPotential = 0.1;
42  }
43  if( model->B2sidewallJctPotential < 0.1) {
44  model->B2sidewallJctPotential = 0.1;
45  }
46 
47  model->B2Cox = 3.453e-13/(model->B2tox * 1.0e-4);/*in F/cm**2 */
48  model->B2vdd2 = 2.0 * model->B2vdd;
49  model->B2vgg2 = 2.0 * model->B2vgg;
50  model->B2vbb2 = 2.0 * model->B2vbb;
51  model->B2Vtm = 8.625e-5 * (model->B2temp + 273.0);
52  model->pSizeDependParamKnot = NULL;
53  pLastKnot = NULL;
54 
55  /* loop through all the instances of the model */
56  for (here = model->B2instances; here != NULL ;
57  here=here->B2nextInstance) {
58 
59  pSizeDependParamKnot = model->pSizeDependParamKnot;
60  Size_Not_Found = 1;
61 
62  while ((pSizeDependParamKnot != NULL) && Size_Not_Found)
63  { if ((here->B2l == pSizeDependParamKnot->Length)
64  && (here->B2w == pSizeDependParamKnot->Width))
65  { Size_Not_Found = 0;
66  here->pParam = pSizeDependParamKnot;
67  }
68  else
69  { pLastKnot = pSizeDependParamKnot;
70  pSizeDependParamKnot = pSizeDependParamKnot->pNext;
71  }
72  }
73 
74  if (Size_Not_Found)
75  { here->pParam = (struct bsim2SizeDependParam *)malloc(
76  sizeof(struct bsim2SizeDependParam));
77  if (pLastKnot == NULL)
78  model->pSizeDependParamKnot = here->pParam;
79  else
80  pLastKnot->pNext = here->pParam;
81  here->pParam->pNext = NULL;
82 
83  EffectiveLength = here->B2l - model->B2deltaL * 1.0e-6;
84  EffectiveWidth = here->B2w - model->B2deltaW * 1.0e-6;
85 
86  if(EffectiveLength<=0)
87  { IFuid namarray[2];
88  namarray[0] = model->B2modName;
89  namarray[1] = here->B2name;
90  (*(SPfrontEnd->IFerror))(ERR_FATAL,
91  "B2: mosfet %s, model %s: Effective channel length <=0",
92  namarray);
93  return(E_BADPARM);
94  }
95 
96  if(EffectiveWidth <= 0)
97  { IFuid namarray[2];
98  namarray[0] = model->B2modName;
99  namarray[1] = here->B2name;
100  (*(SPfrontEnd->IFerror))(ERR_FATAL,
101  "B2: mosfet %s, model %s: Effective channel width <=0",
102  namarray);
103  return(E_BADPARM);
104  }
105 
106  Inv_L = 1.0e-6 / EffectiveLength;
107  Inv_W = 1.0e-6 / EffectiveWidth;
108  here->pParam->Width = here->B2w;
109  here->pParam->Length = here->B2l;
110  here->pParam->B2vfb = model->B2vfb0 + model->B2vfbW * Inv_W
111  + model->B2vfbL * Inv_L;
112  here->pParam->B2phi = model->B2phi0 + model->B2phiW * Inv_W
113  + model->B2phiL * Inv_L;
114  here->pParam->B2k1 = model->B2k10 + model->B2k1W * Inv_W
115  + model->B2k1L * Inv_L;
116  here->pParam->B2k2 = model->B2k20 + model->B2k2W * Inv_W
117  + model->B2k2L * Inv_L;
118  here->pParam->B2eta0 = model->B2eta00
119  + model->B2eta0W * Inv_W
120  + model->B2eta0L * Inv_L;
121  here->pParam->B2etaB = model->B2etaB0 + model->B2etaBW
122  * Inv_W + model->B2etaBL * Inv_L;
123  here->pParam->B2beta0 = model->B2mob00;
124  here->pParam->B2beta0B = model->B2mob0B0
125  + model->B2mob0BW * Inv_W
126  + model->B2mob0BL * Inv_L;
127  here->pParam->B2betas0 = model->B2mobs00
128  + model->B2mobs0W * Inv_W
129  + model->B2mobs0L * Inv_L;
130  if (here->pParam->B2betas0 < 1.01 * here->pParam->B2beta0)
131  here->pParam->B2betas0 = 1.01 * here->pParam->B2beta0;
132  here->pParam->B2betasB = model->B2mobsB0
133  + model->B2mobsBW * Inv_W
134  + model->B2mobsBL * Inv_L;
135  tmp = (here->pParam->B2betas0 - here->pParam->B2beta0
136  - here->pParam->B2beta0B * model->B2vbb);
137  if ((-here->pParam->B2betasB * model->B2vbb) > tmp)
138  here->pParam->B2betasB = -tmp / model->B2vbb;
139  here->pParam->B2beta20 = model->B2mob200
140  + model->B2mob20W * Inv_W
141  + model->B2mob20L * Inv_L;
142  here->pParam->B2beta2B = model->B2mob2B0
143  + model->B2mob2BW * Inv_W
144  + model->B2mob2BL * Inv_L;
145  here->pParam->B2beta2G = model->B2mob2G0
146  + model->B2mob2GW * Inv_W
147  + model->B2mob2GL * Inv_L;
148  here->pParam->B2beta30 = model->B2mob300
149  + model->B2mob30W * Inv_W
150  + model->B2mob30L * Inv_L;
151  here->pParam->B2beta3B = model->B2mob3B0
152  + model->B2mob3BW * Inv_W
153  + model->B2mob3BL * Inv_L;
154  here->pParam->B2beta3G = model->B2mob3G0
155  + model->B2mob3GW * Inv_W
156  + model->B2mob3GL * Inv_L;
157  here->pParam->B2beta40 = model->B2mob400
158  + model->B2mob40W * Inv_W
159  + model->B2mob40L * Inv_L;
160  here->pParam->B2beta4B = model->B2mob4B0
161  + model->B2mob4BW * Inv_W
162  + model->B2mob4BL * Inv_L;
163  here->pParam->B2beta4G = model->B2mob4G0
164  + model->B2mob4GW * Inv_W
165  + model->B2mob4GL * Inv_L;
166 
167  CoxWoverL = model->B2Cox * EffectiveWidth / EffectiveLength;
168 
169  here->pParam->B2beta0 *= CoxWoverL;
170  here->pParam->B2beta0B *= CoxWoverL;
171  here->pParam->B2betas0 *= CoxWoverL;
172  here->pParam->B2betasB *= CoxWoverL;
173  here->pParam->B2beta30 *= CoxWoverL;
174  here->pParam->B2beta3B *= CoxWoverL;
175  here->pParam->B2beta3G *= CoxWoverL;
176  here->pParam->B2beta40 *= CoxWoverL;
177  here->pParam->B2beta4B *= CoxWoverL;
178  here->pParam->B2beta4G *= CoxWoverL;
179 
180  here->pParam->B2ua0 = model->B2ua00 + model->B2ua0W * Inv_W
181  + model->B2ua0L * Inv_L;
182  here->pParam->B2uaB = model->B2uaB0 + model->B2uaBW * Inv_W
183  + model->B2uaBL * Inv_L;
184  here->pParam->B2ub0 = model->B2ub00 + model->B2ub0W * Inv_W
185  + model->B2ub0L * Inv_L;
186  here->pParam->B2ubB = model->B2ubB0 + model->B2ubBW * Inv_W
187  + model->B2ubBL * Inv_L;
188  here->pParam->B2u10 = model->B2u100 + model->B2u10W * Inv_W
189  + model->B2u10L * Inv_L;
190  here->pParam->B2u1B = model->B2u1B0 + model->B2u1BW * Inv_W
191  + model->B2u1BL * Inv_L;
192  here->pParam->B2u1D = model->B2u1D0 + model->B2u1DW * Inv_W
193  + model->B2u1DL * Inv_L;
194  here->pParam->B2n0 = model->B2n00 + model->B2n0W * Inv_W
195  + model->B2n0L * Inv_L;
196  here->pParam->B2nB = model->B2nB0 + model->B2nBW * Inv_W
197  + model->B2nBL * Inv_L;
198  here->pParam->B2nD = model->B2nD0 + model->B2nDW * Inv_W
199  + model->B2nDL * Inv_L;
200  if (here->pParam->B2n0 < 0.0)
201  here->pParam->B2n0 = 0.0;
202 
203  here->pParam->B2vof0 = model->B2vof00
204  + model->B2vof0W * Inv_W
205  + model->B2vof0L * Inv_L;
206  here->pParam->B2vofB = model->B2vofB0
207  + model->B2vofBW * Inv_W
208  + model->B2vofBL * Inv_L;
209  here->pParam->B2vofD = model->B2vofD0
210  + model->B2vofDW * Inv_W
211  + model->B2vofDL * Inv_L;
212  here->pParam->B2ai0 = model->B2ai00 + model->B2ai0W * Inv_W
213  + model->B2ai0L * Inv_L;
214  here->pParam->B2aiB = model->B2aiB0 + model->B2aiBW * Inv_W
215  + model->B2aiBL * Inv_L;
216  here->pParam->B2bi0 = model->B2bi00 + model->B2bi0W * Inv_W
217  + model->B2bi0L * Inv_L;
218  here->pParam->B2biB = model->B2biB0 + model->B2biBW * Inv_W
219  + model->B2biBL * Inv_L;
220  here->pParam->B2vghigh = model->B2vghigh0
221  + model->B2vghighW * Inv_W
222  + model->B2vghighL * Inv_L;
223  here->pParam->B2vglow = model->B2vglow0
224  + model->B2vglowW * Inv_W
225  + model->B2vglowL * Inv_L;
226 
227  here->pParam->CoxWL = model->B2Cox * EffectiveLength
228  * EffectiveWidth * 1.0e4;
229  here->pParam->One_Third_CoxWL = here->pParam->CoxWL / 3.0;
230  here->pParam->Two_Third_CoxWL = 2.0
231  * here->pParam->One_Third_CoxWL;
233  * EffectiveWidth;
235  * EffectiveWidth;
237  * EffectiveLength;
238  here->pParam->SqrtPhi = sqrt(here->pParam->B2phi);
239  here->pParam->Phis3 = here->pParam->SqrtPhi
240  * here->pParam->B2phi;
241  here->pParam->Arg = here->pParam->B2betasB
242  - here->pParam->B2beta0B - model->B2vdd
243  * (here->pParam->B2beta3B - model->B2vdd
244  * here->pParam->B2beta4B);
245 
246 
247  }
248 
249 
250  /* process drain series resistance */
251  if( (here->B2drainConductance=model->B2sheetResistance *
252  here->B2drainSquares) != 0.0 ) {
253  here->B2drainConductance = 1. / here->B2drainConductance ;
254  }
255 
256  /* process source series resistance */
257  if( (here->B2sourceConductance=model->B2sheetResistance *
258  here->B2sourceSquares) != 0.0 ) {
259  here->B2sourceConductance = 1. / here->B2sourceConductance ;
260  }
261 
262 
263  here->pParam->B2vt0 = here->pParam->B2vfb
264  + here->pParam->B2phi
265  + here->pParam->B2k1 * here->pParam->SqrtPhi
266  - here->pParam->B2k2 * here->pParam->B2phi;
267  here->B2von = here->pParam->B2vt0; /* added for initialization*/
268  }
269  }
270  return(OK);
271 }
double B2mob2BL
Definition: bsim2def.h:266
double B2vbb2
Definition: bsim2def.h:354
double B2mob3GW
Definition: bsim2def.h:279
double B2ua00
Definition: bsim2def.h:289
double B2mob2G0
Definition: bsim2def.h:268
double B2mob3GL
Definition: bsim2def.h:278
double B2ub0L
Definition: bsim2def.h:296
double B2mob3BW
Definition: bsim2def.h:276
B2instance * B2instances
Definition: bsim2def.h:226
double B2mob30W
Definition: bsim2def.h:273
double B2vofDL
Definition: bsim2def.h:326
struct sBSIM2instance * B2nextInstance
Definition: bsim2def.h:19
double B2sheetResistance
Definition: bsim2def.h:361
double B2deltaL
Definition: bsim2def.h:250
double B2vof00
Definition: bsim2def.h:319
double B2uaBW
Definition: bsim2def.h:294
double B2mobsB0
Definition: bsim2def.h:259
double B2etaB0
Definition: bsim2def.h:247
double B2vghighW
Definition: bsim2def.h:342
double B2mob3B0
Definition: bsim2def.h:274
double B2n0L
Definition: bsim2def.h:311
double B2mobsBW
Definition: bsim2def.h:261
double B2mob20L
Definition: bsim2def.h:263
double B2ubBL
Definition: bsim2def.h:299
if(TDesc==NULL)
Definition: cd.c:1326
double B2eta00
Definition: bsim2def.h:244
#define ERR_FATAL
Definition: ifsim.h:518
double B2vglowW
Definition: bsim2def.h:345
double B2ubBW
Definition: bsim2def.h:300
double B2u1D0
Definition: bsim2def.h:307
double B2k20
Definition: bsim2def.h:241
double B2ub00
Definition: bsim2def.h:295
double B2sourceSquares
Definition: bsim2def.h:36
double B2mob30L
Definition: bsim2def.h:272
double B2mob2B0
Definition: bsim2def.h:265
double B2mob300
Definition: bsim2def.h:271
double B2ai0L
Definition: bsim2def.h:329
double B2nBW
Definition: bsim2def.h:315
double B2mob40L
Definition: bsim2def.h:281
double B2von
Definition: bsim2def.h:45
double B2deltaW
Definition: bsim2def.h:251
char * malloc()
double B2nD0
Definition: bsim2def.h:316
IFfrontEnd * SPfrontEnd
Definition: main.c:917
double B2mob4G0
Definition: bsim2def.h:286
#define E_BADPARM
Definition: iferrmsg.h:26
double B2u1BL
Definition: bsim2def.h:305
double B2mob2BW
Definition: bsim2def.h:267
double B2mob0BL
Definition: bsim2def.h:254
double B2eta0W
Definition: bsim2def.h:246
double B2mobsBL
Definition: bsim2def.h:260
double B2mob20W
Definition: bsim2def.h:264
double B2u1B0
Definition: bsim2def.h:304
struct bsim2SizeDependParam * pSizeDependParamKnot
Definition: bsim2def.h:372
double B2nDL
Definition: bsim2def.h:317
double B2ubB0
Definition: bsim2def.h:298
double B2Vtm
Definition: bsim2def.h:359
double B2vglowL
Definition: bsim2def.h:344
double Two_Third_CoxWL
Definition: bsim2def.h:213
double B2l
Definition: bsim2def.h:31
double B2vgg2
Definition: bsim2def.h:352
double B2bulkJctPotential
Definition: bsim2def.h:363
double B2aiBL
Definition: bsim2def.h:332
double B2u1DW
Definition: bsim2def.h:309
#define OK
Definition: iferrmsg.h:17
double B2mob3G0
Definition: bsim2def.h:277
struct bsim2SizeDependParam * pNext
Definition: bsim2def.h:216
double B2mob0BW
Definition: bsim2def.h:255
double B2drainSquares
Definition: bsim2def.h:35
double B2u10L
Definition: bsim2def.h:302
GENERIC * IFuid
Definition: ifsim.h:72
IFuid B2modName
Definition: bsim2def.h:228
double One_Third_CoxWL
Definition: bsim2def.h:212
double B2biB0
Definition: bsim2def.h:337
double B2vdd2
Definition: bsim2def.h:350
#define NULL
Definition: spdefs.h:121
double B2sourceConductance
Definition: bsim2def.h:39
double B2etaBL
Definition: bsim2def.h:248
double B2vofD0
Definition: bsim2def.h:325
double B2k2L
Definition: bsim2def.h:242
double B2mob4GL
Definition: bsim2def.h:287
double B2w
Definition: bsim2def.h:32
double B2uaBL
Definition: bsim2def.h:293
double B2bi0L
Definition: bsim2def.h:335
double B2ai00
Definition: bsim2def.h:328
double B2vof0W
Definition: bsim2def.h:321
double B2vfbL
Definition: bsim2def.h:233
double B2vglow0
Definition: bsim2def.h:343
double B2nB0
Definition: bsim2def.h:313
double B2n0W
Definition: bsim2def.h:312
double B2aiB0
Definition: bsim2def.h:331
double B2mobs0W
Definition: bsim2def.h:258
double B2phi0
Definition: bsim2def.h:235
double B2mob3BL
Definition: bsim2def.h:275
double B2ub0W
Definition: bsim2def.h:297
double B2aiBW
Definition: bsim2def.h:333
static char model[32]
Definition: subckt.c:76
double B2Cox
Definition: bsim2def.h:347
struct sBSIM2model * B2nextModel
Definition: bsim2def.h:224
double B2mob4B0
Definition: bsim2def.h:283
double B2k10
Definition: bsim2def.h:238
double B2vofBW
Definition: bsim2def.h:324
double B2mobs00
Definition: bsim2def.h:256
double B2ua0W
Definition: bsim2def.h:291
struct bsim2SizeDependParam * pParam
Definition: bsim2def.h:50
double B2gateDrainOverlapCap
Definition: bsim2def.h:356
double B2mob0B0
Definition: bsim2def.h:253
double B2vofDW
Definition: bsim2def.h:327
double B2n00
Definition: bsim2def.h:310
double B2vfb0
Definition: bsim2def.h:232
double B2bi0W
Definition: bsim2def.h:336
double B2mob4BL
Definition: bsim2def.h:284
double B2vofBL
Definition: bsim2def.h:323
double B2u1BW
Definition: bsim2def.h:306
double B2drainConductance
Definition: bsim2def.h:40
double B2k1L
Definition: bsim2def.h:239
double B2vgg
Definition: bsim2def.h:351
double B2biBL
Definition: bsim2def.h:338
double B2mob200
Definition: bsim2def.h:262
double B2k1W
Definition: bsim2def.h:240
double B2vbb
Definition: bsim2def.h:353
double B2vof0L
Definition: bsim2def.h:320
double B2vghigh0
Definition: bsim2def.h:340
double B2u10W
Definition: bsim2def.h:303
double B2phiL
Definition: bsim2def.h:236
double B2gateSourceOverlapCap
Definition: bsim2def.h:355
double B2mob2GW
Definition: bsim2def.h:270
double B2bi00
Definition: bsim2def.h:334
double B2gateBulkOverlapCap
Definition: bsim2def.h:357
double B2phiW
Definition: bsim2def.h:237
double B2nDW
Definition: bsim2def.h:318
double B2sidewallJctPotential
Definition: bsim2def.h:366
double B2mob40W
Definition: bsim2def.h:282
double B2vghighL
Definition: bsim2def.h:341
double B2uaB0
Definition: bsim2def.h:292
double B2etaBW
Definition: bsim2def.h:249
double B2mobs0L
Definition: bsim2def.h:257
double B2u1DL
Definition: bsim2def.h:308
double B2biBW
Definition: bsim2def.h:339
double B2eta0L
Definition: bsim2def.h:245
double B2mob400
Definition: bsim2def.h:280
double B2vdd
Definition: bsim2def.h:349
double B2mob00
Definition: bsim2def.h:252
double B2vfbW
Definition: bsim2def.h:234
IFuid B2name
Definition: bsim2def.h:21
double B2u100
Definition: bsim2def.h:301
double B2nBL
Definition: bsim2def.h:314
double B2mob4GW
Definition: bsim2def.h:288
double B2vofB0
Definition: bsim2def.h:322
double B2temp
Definition: bsim2def.h:348
double B2mob2GL
Definition: bsim2def.h:269
double B2ai0W
Definition: bsim2def.h:330
double B2tox
Definition: bsim2def.h:346
double B2ua0L
Definition: bsim2def.h:290
double B2k2W
Definition: bsim2def.h:243
double B2mob4BW
Definition: bsim2def.h:285