1 /*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
2
3
4 /**********
5 * Copyright 2010 Regents of the University of California. All rights reserved.
6 * Authors: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
7 * Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soiacld.c
8 * Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu.
9 * Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu.
10 * Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu.
11 * File: b4soiacld.c
12 * Modified by Hui Wan, Xuemei Xi 11/30/2005
13 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
14 * Modified by Tanvir Morshed 09/22/2009
15 **********/
16
17 #include "ngspice/ngspice.h"
18
19 #include "ngspice/cktdefs.h"
20 #include "b4soidef.h"
21 #include "ngspice/sperror.h"
22 #include "ngspice/suffix.h"
23
24
25 int
B4SOIacLoad(GENmodel * inModel,CKTcircuit * ckt)26 B4SOIacLoad(
27 GENmodel *inModel,
28 CKTcircuit *ckt)
29 {
30 register B4SOImodel *model = (B4SOImodel*)inModel;
31 register B4SOIinstance *here;
32 register int selfheat;
33 double xcggb, xcgdb, xcgsb, xcgeb, xcgT;
34 double xcdgb, xcddb, xcdsb, xcdeb, xcdT;
35 double xcsgb, xcsdb, xcssb, xcseb, xcsT;
36 double xcbgb, xcbdb, xcbsb, xcbeb, xcbT;
37 double xcegb, xceeb, xceT;
38 double gdpr, gspr, gds;
39 double cggb, cgdb, cgsb, cgT;
40 double cdgb, cddb, cdsb, cdeb, cdT;
41 double cbgb, cbdb, cbsb, cbeb, cbT;
42 double ceeb, ceT;
43 double GSoverlapCap, GDoverlapCap, GEoverlapCap, FwdSum, RevSum, Gm, Gmbs, GmT;
44 double omega;
45 double dxpart, sxpart;
46 double gbbg, gbbdp, gbbb, gbbp, gbbsp, gbbT;
47 double gddpg, gddpdp, gddpsp, gddpb, gddpT;
48 double gsspg, gsspdp, gsspsp, gsspb, gsspT;
49 double gppb, gppp;
50 double xcTt, cTt, gTtt, gTtg, gTtb, gTtdp, gTtsp;
51 double EDextrinsicCap, ESextrinsicCap;
52 double xcedb, xcesb;
53
54 /* v3.0 */
55 double Gme, gddpe, gsspe, gbbe, gTte;
56
57 /* v3.1 added variables for RF */
58 double T0=0.0;
59 double gcrgd, gcrgg, gcrgs, gcrgb, gcrg;
60 double xcgmgmb, xcgmdb, xcgmsb, xcgmeb, xcdgmb, xcsgmb, xcegmb;
61 double geltd;
62 double gigg, gigd, gigs, gigb, gige, gigT;
63 double gigpg, gigpp;
64
65 /* v3.1.1 bug fix */
66 double gIstotg, gIstotd, gIstotb, gIstots;
67 double gIdtotg, gIdtotd, gIdtotb, gIdtots;
68 double gIgtotg, gIgtotd, gIgtotb, gIgtots;
69
70 /* v4.0 */
71 double xcdbb, xcsbb, xcdbdb, xcsbsb, xcjdbdp, xcjsbsp;
72 double gstot, gstotd, gstotg, gstots, gstotb;
73 double gdtot, gdtotd, gdtotg, gdtots, gdtotb;
74
75 double m;
76
77 omega = ckt->CKTomega;
78 for (; model != NULL; model = B4SOInextModel(model))
79 {
80
81 for (here = B4SOIinstances(model); here!= NULL;
82 here = B4SOInextInstance(here))
83 {
84 selfheat = (model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0);
85 if (here->B4SOImode >= 0)
86 { Gm = here->B4SOIgm;
87 Gmbs = here->B4SOIgmbs;
88
89 /* v3.0 */
90 Gme = here->B4SOIgme;
91
92 GmT = model->B4SOItype * here->B4SOIgmT;
93 FwdSum = Gm + Gmbs + Gme; /* v3.0 */
94 RevSum = 0.0;
95
96 cbgb = here->B4SOIcbgb;
97 cbsb = here->B4SOIcbsb;
98 cbdb = here->B4SOIcbdb;
99 cbeb = here->B4SOIcbeb;
100 cbT = model->B4SOItype * here->B4SOIcbT;
101
102 ceeb = here->B4SOIceeb;
103 ceT = model->B4SOItype * here->B4SOIceT;
104
105 cggb = here->B4SOIcggb;
106 cgsb = here->B4SOIcgsb;
107 cgdb = here->B4SOIcgdb;
108 cgT = model->B4SOItype * here->B4SOIcgT;
109
110 cdgb = here->B4SOIcdgb;
111 cdsb = here->B4SOIcdsb;
112 cddb = here->B4SOIcddb;
113 cdeb = here->B4SOIcdeb;
114 cdT = model->B4SOItype * here->B4SOIcdT;
115
116 cTt = here->pParam->B4SOIcth;
117
118
119 /* v3.1 bug fix */
120 gigg = here->B4SOIgigg;
121 gigb = here->B4SOIgigb;
122 gige = here->B4SOIgige;
123 gigs = here->B4SOIgigs;
124 gigd = here->B4SOIgigd;
125 gigT = model->B4SOItype * here->B4SOIgigT;
126
127 /* v4.1 */
128 gigpg = here->B4SOIgigpg;
129 gigpp = here->B4SOIgigpp;
130
131 gbbg = -here->B4SOIgbgs;
132 gbbdp = -here->B4SOIgbds;
133 gbbb = -here->B4SOIgbbs;
134 gbbp = -here->B4SOIgbps;
135 gbbT = -model->B4SOItype * here->B4SOIgbT;
136 gbbe = -here->B4SOIgbes;
137
138 if (here->B4SOIrbodyMod) { /* v4.0 */
139 gbbdp = -here->B4SOIgiigidld;
140 gbbb = -here->B4SOIgbgiigbpb;
141 }
142
143 gbbsp = - ( gbbg + gbbdp + gbbb + gbbp + gbbe);
144
145 gddpg = -here->B4SOIgjdg;
146 gddpdp = -here->B4SOIgjdd;
147 if (!here->B4SOIrbodyMod) /* v4.0 */
148 gddpb = -here->B4SOIgjdb;
149 else
150 gddpb = here->B4SOIgiigidlb;
151
152 gddpT = -model->B4SOItype * here->B4SOIgjdT;
153
154 /* v3.0 */
155 gddpe = -here->B4SOIgjde;
156 gddpsp = - ( gddpg + gddpdp + gddpb + gddpe);
157
158 gsspg = -here->B4SOIgjsg;
159 gsspdp = -here->B4SOIgjsd;
160 if (!here->B4SOIrbodyMod) /* v4.0 */
161 gsspb = -here->B4SOIgjsb;
162 else
163 gsspb = 0.0;
164 gsspT = -model->B4SOItype * here->B4SOIgjsT;
165
166 gsspe = 0.0;
167 gsspsp = - (gsspg + gsspdp + gsspb + gsspe);
168
169 gppb = -here->B4SOIgbpbs;
170 gppp = -here->B4SOIgbpps;
171
172 gTtg = here->B4SOIgtempg;
173 gTtb = here->B4SOIgtempb;
174 gTtdp = here->B4SOIgtempd;
175 gTtt = here->B4SOIgtempT;
176
177 /* v3.0 */
178 gTte = here->B4SOIgtempe;
179 gTtsp = - (gTtg + gTtb + gTtdp + gTte);
180
181
182 /* v3.1.1 bug fix */
183 if (model->B4SOIigcMod)
184 {
185 gIstotg = here->B4SOIgIgsg + here->B4SOIgIgcsg;
186 gIstotd = here->B4SOIgIgcsd;
187 gIstots = here->B4SOIgIgss + here->B4SOIgIgcss;
188 gIstotb = here->B4SOIgIgcsb;
189
190 gIdtotg = here->B4SOIgIgdg + here->B4SOIgIgcdg;
191 gIdtotd = here->B4SOIgIgdd + here->B4SOIgIgcdd;
192 gIdtots = here->B4SOIgIgcds;
193 gIdtotb = here->B4SOIgIgcdb;
194
195 gIgtotg = gIstotg + gIdtotg;
196 gIgtotd = gIstotd + gIdtotd;
197 gIgtots = gIstots + gIdtots;
198 gIgtotb = gIstotb + gIdtotb;
199 }
200 else
201 {
202 gIstotg = gIstotd = gIstots = gIstotb = 0.0;
203 gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0;
204 gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0;
205 }
206
207
208 sxpart = 0.6;
209 dxpart = 0.4;
210
211 /* v3.1 for RF */
212 if (here->B4SOIrgateMod == 2)
213 T0 = *(ckt->CKTstates[0] + here->B4SOIvges)
214 - *(ckt->CKTstates[0] + here->B4SOIvgs);
215 else if (here->B4SOIrgateMod == 3)
216 T0 = *(ckt->CKTstates[0] + here->B4SOIvgms)
217 - *(ckt->CKTstates[0] + here->B4SOIvgs);
218 if (here->B4SOIrgateMod > 1)
219 { gcrgd = here->B4SOIgcrgd * T0;
220 gcrgg = here->B4SOIgcrgg * T0;
221 gcrgs = here->B4SOIgcrgs * T0;
222 gcrgb = here->B4SOIgcrgb * T0;
223 gcrgg -= here->B4SOIgcrg;
224 gcrg = here->B4SOIgcrg;
225 }
226 else
227 gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0;
228 /* v3.1 for RF end*/
229
230 }
231 else
232 { Gm = -here->B4SOIgm;
233 Gmbs = -here->B4SOIgmbs;
234
235 /* v3.0 */
236 Gme = -here->B4SOIgme;
237
238 GmT = -model->B4SOItype * here->B4SOIgmT;
239 FwdSum = 0.0;
240 RevSum = -Gm - Gmbs - Gme; /* v3.0 */
241
242 cdgb = - (here->B4SOIcdgb + here->B4SOIcggb + here->B4SOIcbgb);
243 cdsb = - (here->B4SOIcddb + here->B4SOIcgdb + here->B4SOIcbdb);
244 cddb = - (here->B4SOIcdsb + here->B4SOIcgsb + here->B4SOIcbsb);
245 cdeb = - (here->B4SOIcdeb + here->B4SOIcbeb + here->B4SOIceeb);
246 cdT = - model->B4SOItype * (here->B4SOIcgT + here->B4SOIcbT
247 + here->B4SOIcdT + here->B4SOIceT);
248
249 ceeb = here->B4SOIceeb;
250 ceT = model->B4SOItype * here->B4SOIceT;
251
252 cggb = here->B4SOIcggb;
253 cgsb = here->B4SOIcgdb;
254 cgdb = here->B4SOIcgsb;
255 cgT = model->B4SOItype * here->B4SOIcgT;
256
257 cbgb = here->B4SOIcbgb;
258 cbsb = here->B4SOIcbdb;
259 cbdb = here->B4SOIcbsb;
260 cbeb = here->B4SOIcbeb;
261 cbT = model->B4SOItype * here->B4SOIcbT;
262
263 cTt = here->pParam->B4SOIcth;
264
265
266 /* v3.1 bug fix */
267 gigg = here->B4SOIgigg;
268 gigb = here->B4SOIgigb;
269 gige = here->B4SOIgige;
270 gigs = here->B4SOIgigd; /* v3.1.1 bug fix */
271 gigd = here->B4SOIgigs; /* v3.1.1 bug fix */
272 gigT = model->B4SOItype * here->B4SOIgigT;
273
274 gigpg = here->B4SOIgigpg;/* bugfix_snps for setting gigpg gigpp*/
275 gigpp = here->B4SOIgigpp;
276
277 gbbg = -here->B4SOIgbgs;
278 gbbb = -here->B4SOIgbbs;
279 gbbp = -here->B4SOIgbps;
280 gbbsp = -here->B4SOIgbds;
281 gbbT = -model->B4SOItype * here->B4SOIgbT;
282 /* v3.0 */
283 gbbe = -here->B4SOIgbes;
284
285 if (here->B4SOIrbodyMod) { /* v4.0 */
286 gbbsp = -here->B4SOIgiigidld;
287 gbbb = -here->B4SOIgbgiigbpb;
288 }
289
290 gbbdp = - ( gbbg + gbbsp + gbbb + gbbp + gbbe);
291
292 gddpg = -here->B4SOIgjsg;
293 gddpsp = -here->B4SOIgjsd;
294 if (!here->B4SOIrbodyMod) /* v4.0 */
295 gddpb = -here->B4SOIgjsb;
296 else
297 gddpb = 0.0;
298
299 gddpT = -model->B4SOItype * here->B4SOIgjsT;
300
301 /* v3.0 */
302 gddpe = 0.0;
303 gddpdp = - (gddpg + gddpsp + gddpb + gddpe );
304
305 gsspg = -here->B4SOIgjdg;
306 gsspsp = -here->B4SOIgjdd;
307 if (!here->B4SOIrbodyMod) /* v4.0 */
308 gsspb = -here->B4SOIgjdb;
309 else
310 gsspb = here->B4SOIgiigidlb;
311
312 gsspT = -model->B4SOItype * here->B4SOIgjdT;
313
314 /* v3.0 */
315 gsspe = -here->B4SOIgjde;
316 gsspdp = - ( gsspg + gsspsp + gsspb + gsspe );
317
318 gppb = -here->B4SOIgbpbs;
319 gppp = -here->B4SOIgbpps;
320
321 gTtg = here->B4SOIgtempg;
322 gTtb = here->B4SOIgtempb;
323 gTtsp = here->B4SOIgtempd;
324 gTtt = here->B4SOIgtempT;
325
326 /* v3.0 */
327 gTte = here->B4SOIgtempe;
328 gTtdp = - (gTtg + gTtb + gTtsp + gTte);
329
330
331 /* v3.1.1 bug fix */
332 if (model->B4SOIigcMod)
333 {
334 gIstotg = here->B4SOIgIgsg + here->B4SOIgIgcdg;
335 gIstotd = here->B4SOIgIgcds;
336 gIstots = here->B4SOIgIgss + here->B4SOIgIgcdd;
337 gIstotb = here->B4SOIgIgcdb;
338
339 gIdtotg = here->B4SOIgIgdg + here->B4SOIgIgcsg;
340 gIdtotd = here->B4SOIgIgdd + here->B4SOIgIgcss;
341 gIdtots = here->B4SOIgIgcsd;
342 gIdtotb = here->B4SOIgIgcsb;
343
344 gIgtotg = gIstotg + gIdtotg;
345 gIgtotd = gIstotd + gIdtotd;
346 gIgtots = gIstots + gIdtots;
347 gIgtotb = gIstotb + gIdtotb;
348 }
349 else
350 {
351 gIstotg = gIstotd = gIstots = gIstotb = 0.0;
352 gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0;
353 gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0;
354 }
355
356
357 sxpart = 0.4;
358 dxpart = 0.6;
359
360 /* v3.1 for RF */
361 if (here->B4SOIrgateMod == 2)
362 T0 = *(ckt->CKTstates[0] + here->B4SOIvges)
363 - *(ckt->CKTstates[0] + here->B4SOIvgs);
364 else if (here->B4SOIrgateMod == 3)
365 T0 = *(ckt->CKTstates[0] + here->B4SOIvgms)
366 - *(ckt->CKTstates[0] + here->B4SOIvgs);
367 if (here->B4SOIrgateMod > 1)
368 { gcrgd = here->B4SOIgcrgs * T0;
369 gcrgg = here->B4SOIgcrgg * T0;
370 gcrgs = here->B4SOIgcrgd * T0;
371 gcrgb = here->B4SOIgcrgb * T0;
372 gcrgg -= here->B4SOIgcrg;
373 gcrg = here->B4SOIgcrg;
374 }
375 else
376 gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0;
377
378 /* v3.1 RF end*/
379
380 }
381
382 if (!model->B4SOIrdsMod) {
383 gdpr=here->B4SOIdrainConductance;
384 gspr=here->B4SOIsourceConductance;
385 }
386 else gdpr = gspr = 0.0;
387
388
389 gds= here->B4SOIgds;
390
391 GSoverlapCap = here->B4SOIcgso;
392 GDoverlapCap = here->B4SOIcgdo;
393 GEoverlapCap = here->pParam->B4SOIcgeo;
394
395 EDextrinsicCap = here->B4SOIgcde;
396 ESextrinsicCap = here->B4SOIgcse;
397
398
399 /* v3.1 added for RF */
400 if (here->B4SOIrgateMod == 3)
401 {
402 xcgmgmb = (GDoverlapCap + GSoverlapCap + GEoverlapCap ) * omega;
403 xcgmdb = -GDoverlapCap * omega;
404 xcgmsb = -GSoverlapCap * omega;
405 xcgmeb = -GEoverlapCap * omega;
406
407 xcdgmb = xcgmdb;
408 xcsgmb = xcgmsb;
409 xcegmb = xcgmeb;
410
411 xcedb = -EDextrinsicCap * omega;
412 xcdeb = (cdeb - EDextrinsicCap) * omega;
413 xcddb = (cddb + GDoverlapCap + EDextrinsicCap) * omega;
414 xceeb = (ceeb + GEoverlapCap + EDextrinsicCap + ESextrinsicCap)
415 * omega;
416 xcesb = -ESextrinsicCap * omega;
417 xcssb = (GSoverlapCap + ESextrinsicCap - (cgsb + cbsb + cdsb))
418 * omega;
419
420 xcseb = -(cbeb + cdeb + ceeb + ESextrinsicCap) * omega;
421
422 xcegb = 0; /* v3.1 change for RF */
423 xceT = ceT * omega;
424 xcggb = here->B4SOIcggb * omega;
425 xcgdb = cgdb * omega;
426 xcgsb = cgsb * omega;
427 xcgeb = 0;
428 xcgT = cgT * omega;
429
430 xcdgb = cdgb * omega;
431 xcdsb = cdsb * omega;
432 xcdT = cdT * omega;
433
434 xcsgb = -(cggb + cbgb + cdgb) * omega;
435 xcsdb = -(cgdb + cbdb + cddb) * omega;
436 xcsT = -(cgT + cbT + cdT + ceT) * omega;
437
438 xcbgb = cbgb * omega;
439 xcbdb = cbdb * omega;
440 xcbsb = cbsb * omega;
441 xcbeb = cbeb * omega;
442 xcbT = cbT * omega;
443
444 xcTt = cTt * omega;
445 }
446
447 else
448 {
449 xcedb = -EDextrinsicCap * omega;
450 xcdeb = (cdeb - EDextrinsicCap) * omega;
451 xcddb = (cddb + GDoverlapCap + EDextrinsicCap) * omega;
452 xceeb = (ceeb + GEoverlapCap + EDextrinsicCap + ESextrinsicCap)
453 * omega;
454 xcesb = -ESextrinsicCap * omega;
455 xcssb = (GSoverlapCap + ESextrinsicCap - (cgsb + cbsb + cdsb))
456 * omega;
457
458 xcseb = -(cbeb + cdeb + ceeb + ESextrinsicCap) * omega;
459
460 xcegb = (- GEoverlapCap) * omega;
461 xceT = ceT * omega;
462 xcggb = (cggb + GDoverlapCap + GSoverlapCap + GEoverlapCap)
463 * omega;
464 xcgdb = (cgdb - GDoverlapCap ) * omega;
465 xcgsb = (cgsb - GSoverlapCap) * omega;
466 xcgeb = (- GEoverlapCap) * omega;
467 xcgT = cgT * omega;
468
469 xcdgb = (cdgb - GDoverlapCap) * omega;
470 xcdsb = cdsb * omega;
471 xcdT = cdT * omega;
472
473 xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap) * omega;
474 xcsdb = -(cgdb + cbdb + cddb) * omega;
475 xcsT = -(cgT + cbT + cdT + ceT) * omega;
476
477 xcbgb = cbgb * omega;
478 xcbdb = cbdb * omega;
479 xcbsb = cbsb * omega;
480 xcbeb = cbeb * omega;
481 xcbT = cbT * omega;
482
483 xcTt = cTt * omega;
484
485 /* v3.1 */
486 xcdgmb = xcsgmb = xcegmb = 0.0;
487 xcgmgmb = xcgmdb = xcgmsb = xcgmeb =0.0;
488 }
489
490 if (here->B4SOImode >= 0) { /* v4.0 */
491 if (!here->B4SOIrbodyMod) {
492 xcjdbdp = xcjsbsp = 0.0;
493 xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb + xcdeb);
494 xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb + xcseb);
495 xcdbdb = 0.0; xcsbsb = 0.0;
496 xcbdb = here->B4SOIcbdb * omega;
497 xcbsb = here->B4SOIcbsb * omega;
498 }
499 else {
500 xcjdbdp = here->B4SOIcjdb * omega;
501 xcjsbsp = here->B4SOIcjsb * omega;
502 xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb + xcdeb)
503 + xcjdbdp;
504 xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb + xcseb)
505 + xcjsbsp;
506 xcdbdb = -here->B4SOIcjdb * omega;
507 xcsbsb = -here->B4SOIcjsb * omega;
508 xcbdb = here->B4SOIcbdb * omega - xcdbdb;
509 xcbsb = here->B4SOIcbsb * omega - xcsbsb;
510 }
511 }
512 else {
513 if (!here->B4SOIrbodyMod) {
514 xcjdbdp = xcjsbsp = 0.0;
515 xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb + xcdeb);
516 xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb + xcseb);
517 xcdbdb = 0.0; xcsbsb = 0.0;
518 xcbdb = here->B4SOIcbsb * omega;
519 xcbsb = here->B4SOIcbdb * omega;
520 }
521 else {
522 xcjdbdp = here->B4SOIcjsb * omega;
523 xcjsbsp = here->B4SOIcjdb * omega;
524 xcdbb = -(xcdgb + xcddb + xcdsb + xcdgmb + xcdeb)
525 + xcjdbdp;
526 xcsbb = -(xcsgb + xcsdb + xcssb + xcsgmb + xcseb)
527 + xcjsbsp;
528 xcdbdb = -here->B4SOIcjsb * omega;
529 xcsbsb = -here->B4SOIcjdb * omega;
530 xcbdb = here->B4SOIcbsb * omega - xcdbdb;
531 xcbsb = here->B4SOIcbdb * omega - xcsbsb;
532 }
533
534 }
535
536 if (model->B4SOIrdsMod == 1)
537 { gstot = here->B4SOIgstot;
538 gstotd = here->B4SOIgstotd;
539 gstotg = here->B4SOIgstotg;
540 gstots = here->B4SOIgstots - gstot;
541 gstotb = here->B4SOIgstotb;
542
543 gdtot = here->B4SOIgdtot;
544 gdtotd = here->B4SOIgdtotd - gdtot;
545 gdtotg = here->B4SOIgdtotg;
546 gdtots = here->B4SOIgdtots;
547 gdtotb = here->B4SOIgdtotb;
548 }
549 else
550 { gstot = gstotd = gstotg = gstots = gstotb = 0.0;
551 gdtot = gdtotd = gdtotg = gdtots = gdtotb = 0.0;
552 }
553
554 m = here->B4SOIm;
555
556 /* v3.1 for RF */
557 geltd = here->B4SOIgrgeltd;
558 if (here->B4SOIrgateMod == 1)
559 {
560 *(here->B4SOIGEgePtr) += m * geltd;
561 *(here->B4SOIGgePtr) -= m * geltd;
562 *(here->B4SOIGEgPtr) -= m * geltd;
563 *(here->B4SOIGgPtr) += m * (geltd + gigg + gIgtotg); /* v3.1.1 bug fix */
564 *(here->B4SOIGdpPtr) += m * (gigd + gIgtotd); /* v3.1.1 bug fix */
565 *(here->B4SOIGspPtr) += m * (gigs + gIgtots); /* v3.1.1 bug fix */
566 if (here->B4SOIsoiMod != 2) /* v3.2 */
567 *(here->B4SOIGbPtr) -= m * (-gigb - gIgtotb); /* v3.1.1 bug fix */
568 }
569
570 else if (here->B4SOIrgateMod == 2)
571 {
572 *(here->B4SOIGEgePtr) += m * gcrg;
573 *(here->B4SOIGEgPtr) += m * gcrgg;
574 *(here->B4SOIGEdpPtr) += m * gcrgd;
575 *(here->B4SOIGEspPtr) += m * gcrgs;
576 if (here->B4SOIsoiMod != 2) /* v3.2 */
577 *(here->B4SOIGEbPtr) += m * gcrgb;
578
579 *(here->B4SOIGgePtr) -= m * gcrg;
580 *(here->B4SOIGgPtr) -= m * (gcrgg - gigg - gIgtotg); /* v3.1.1 bug fix */
581 *(here->B4SOIGdpPtr) -= m * (gcrgd - gigd - gIgtotd); /* v3.1.1 bug fix */
582 *(here->B4SOIGspPtr) -= m * (gcrgs - gigs - gIgtots); /* v3.1.1 bug fix */
583 if (here->B4SOIsoiMod != 2) /* v3.2 */
584 *(here->B4SOIGbPtr) -= m * (gcrgb - gigb - gIgtotb); /* v3.1.1 bug fix */
585 }
586
587 else if (here->B4SOIrgateMod == 3)
588 {
589 *(here->B4SOIGEgePtr) += m * geltd;
590 *(here->B4SOIGEgmPtr) -= m * geltd;
591 *(here->B4SOIGMgePtr) -= m * geltd;
592 *(here->B4SOIGMgmPtr) += m * (geltd + gcrg);
593 *(here->B4SOIGMgmPtr +1) += m * xcgmgmb;
594
595 *(here->B4SOIGMdpPtr) += m * gcrgd;
596 *(here->B4SOIGMdpPtr +1) += m * xcgmdb;
597 *(here->B4SOIGMgPtr) += m * gcrgg;
598 *(here->B4SOIGMspPtr) += m * gcrgs;
599 *(here->B4SOIGMspPtr +1) += m * xcgmsb;
600 if (here->B4SOIsoiMod != 2) /* v3.2 */
601 *(here->B4SOIGMbPtr) += m * gcrgb;
602 *(here->B4SOIGMePtr +1) += m * xcgmeb;
603
604 *(here->B4SOIDPgmPtr +1) += m * xcdgmb;
605 *(here->B4SOIGgmPtr) -= m * gcrg;
606 *(here->B4SOISPgmPtr +1) += m * xcsgmb;
607 *(here->B4SOIEgmPtr +1) += m * xcegmb;
608
609 *(here->B4SOIGgPtr) -= m * (gcrgg - gigg - gIgtotg); /* v3.1.1 bug fix */
610 *(here->B4SOIGdpPtr) -= m * (gcrgd - gigd - gIgtotd); /* v3.1.1 bug fix */
611 *(here->B4SOIGspPtr) -= m * (gcrgs - gigs - gIgtots); /* v3.1.1 bug fix */
612 if (here->B4SOIsoiMod != 2) /* v3.2 */
613 *(here->B4SOIGbPtr) -= m * (gcrgb - gigb - gIgtotb); /* v3.1.1 bug fix */
614 }
615 else
616 {
617 *(here->B4SOIGgPtr) += m * (gigg + gIgtotg); /* v3.1.1 bug fix */
618 *(here->B4SOIGdpPtr) += m * (gigd + gIgtotd); /* v3.1.1 bug fix */
619 *(here->B4SOIGspPtr) += m * (gigs + gIgtots); /* v3.1.1 bug fix */
620 if (here->B4SOIsoiMod != 2) /* v3.2 */
621 *(here->B4SOIGbPtr) += m * (gigb + gIgtotb); /* v3.1.1 bug fix */
622 }
623 /* v3.1 for RF end*/
624
625 if (model->B4SOIrdsMod)
626 { (*(here->B4SOIDgPtr) += m * gdtotg);
627 (*(here->B4SOIDspPtr) += m * gdtots);
628 (*(here->B4SOISdpPtr) += m * gstotd);
629 (*(here->B4SOISgPtr) += m * gstotg);
630 if (here->B4SOIsoiMod != 2) {
631 (*(here->B4SOIDbPtr) += m * gdtotb);
632 (*(here->B4SOISbPtr) += m * gstotb);
633 }
634 }
635
636 *(here->B4SOIEdpPtr +1) += m * xcedb;
637 *(here->B4SOIEspPtr +1) += m * xcesb;
638 *(here->B4SOIDPePtr +1) += m * xcdeb;
639 *(here->B4SOISPePtr +1) += m * xcseb;
640 *(here->B4SOIEgPtr +1) += m * xcegb;
641 *(here->B4SOIGePtr +1) += m * xcgeb;
642
643 *(here->B4SOIEePtr +1) += m * xceeb;
644
645 *(here->B4SOIGgPtr +1) += m * xcggb;
646 *(here->B4SOIGdpPtr +1) += m * xcgdb;
647 *(here->B4SOIGspPtr +1) += m * xcgsb;
648
649 *(here->B4SOIDPgPtr +1) += m * xcdgb;
650 *(here->B4SOIDPdpPtr +1) += m * xcddb;
651 *(here->B4SOIDPspPtr +1) += m * xcdsb;
652
653 *(here->B4SOISPgPtr +1) += m * xcsgb;
654 *(here->B4SOISPdpPtr +1) += m * xcsdb;
655 *(here->B4SOISPspPtr +1) += m * xcssb;
656
657 /* v3.1 */
658 if (here->B4SOIsoiMod != 2) /* v3.2 */
659 {
660 *(here->B4SOIBePtr +1) += m * xcbeb;
661 *(here->B4SOIBgPtr +1) += m * xcbgb;
662 *(here->B4SOIBdpPtr +1) += m * xcbdb;
663 *(here->B4SOIBspPtr +1) += m * xcbsb;
664
665 *(here->B4SOIEbPtr +1) -= m * (xcegb + xceeb + xcedb + xcesb);
666 *(here->B4SOIGbPtr +1) -= m * (xcggb + xcgdb + xcgsb + xcgeb);
667 /* *(here->B4SOIDPbPtr +1) -= xcdgb + xcddb + xcdsb + xcdeb;
668 + xcdgmb; */
669
670 *(here->B4SOIDPbPtr +1) -= m * -xcdbb; /* v4.0 */
671
672 /* *(here->B4SOISPbPtr +1) -= xcsgb + xcsdb + xcssb + xcseb
673 + xcsgmb; */
674 *(here->B4SOISPbPtr +1) -= m * -xcsbb; /* v4.0 */
675 *(here->B4SOIBbPtr +1) -= m * (xcbgb + xcbdb + xcbsb + xcbeb);
676 }
677 /* v3.1 */
678
679
680 if (selfheat)
681 {
682 *(here->B4SOITemptempPtr + 1) += m * xcTt;
683 *(here->B4SOIDPtempPtr + 1) += m * xcdT;
684 *(here->B4SOISPtempPtr + 1) += m * xcsT;
685 *(here->B4SOIBtempPtr + 1) += m * xcbT;
686 *(here->B4SOIEtempPtr + 1) += m * xceT;
687 *(here->B4SOIGtempPtr + 1) += m * xcgT;
688 }
689
690
691 /* v3.0 */
692 if (here->B4SOIsoiMod != 0) /* v3.2 */
693 {
694 *(here->B4SOIDPePtr) += m * (Gme + gddpe);
695 *(here->B4SOISPePtr) += m * (gsspe - Gme);
696
697 if (here->B4SOIsoiMod != 2) /* v3.2 */
698 {
699 *(here->B4SOIGePtr) += m * gige;
700 *(here->B4SOIBePtr) -= m * gige;
701 }
702 }
703
704 *(here->B4SOIEePtr) += 0.0;
705
706 *(here->B4SOIDPgPtr) += m * (Gm + gddpg - gIdtotg -gdtotg); /* v4.0 */
707 *(here->B4SOIDPdpPtr) += m * (gdpr + gds + gddpdp + RevSum - gIdtotd
708 - gdtotd); /* v4.0 */
709
710 *(here->B4SOIDPspPtr) -= m * (gds + FwdSum - gddpsp + gIdtots
711 + gdtots); /* v4.0 */
712 *(here->B4SOIDPdPtr) -= m * (gdpr + gdtot);
713
714 *(here->B4SOISPgPtr) -= m * (Gm - gsspg + gIstotg + gstotg); /* v4.0 */
715 *(here->B4SOISPdpPtr) -= m * (gds + RevSum - gsspdp + gIstotd
716 + gstotd); /* v4.0 */
717 *(here->B4SOISPspPtr) += m * (gspr + gds + FwdSum + gsspsp - gIstots
718 - gstots); /* v4.0 */
719 *(here->B4SOISPsPtr) -= m * (gspr + gstot);
720
721
722 /* v3.1 */
723 if (here->B4SOIsoiMod != 2) /* v3.2 */
724 {
725 *(here->B4SOIBePtr) += m * gbbe; /* v3.0 */
726 *(here->B4SOIBgPtr) += m * (gbbg - gigg); /* v3.1 bug fix */
727 *(here->B4SOIBdpPtr) += m * (gbbdp - gigd); /* v3.1 bug fix */
728 *(here->B4SOIBspPtr) += m * (gbbsp - gigs); /* v3.1 bug fix */
729 *(here->B4SOIBbPtr) += m * (gbbb - gigb); /* v3.1 bug fix */
730 *(here->B4SOISPbPtr) -= m * (Gmbs - gsspb + gIstotb + gstotb);
731 /* v4.0 */
732 *(here->B4SOIDPbPtr) -= m * ((-gddpb - Gmbs) + gIdtotb + gdtotb);
733 /* v4.0 */
734 }
735 /* v3.1 */
736
737
738
739 if (selfheat)
740 {
741 *(here->B4SOIDPtempPtr) += m * (GmT + gddpT);
742 *(here->B4SOISPtempPtr) += m * (-GmT + gsspT);
743 *(here->B4SOIBtempPtr) += m * (gbbT - gigT); /* v3.1 bug fix */
744 *(here->B4SOIGtempPtr) += m * gigT; /* v3.1 bug fix */
745 *(here->B4SOITemptempPtr) += m * (gTtt + 1/here->pParam->B4SOIrth);
746 *(here->B4SOITempgPtr) += m * gTtg;
747 *(here->B4SOITempbPtr) += m * gTtb;
748 *(here->B4SOITempdpPtr) += m * gTtdp;
749 *(here->B4SOITempspPtr) += m * gTtsp;
750
751 /* v3.0 */
752 if (here->B4SOIsoiMod != 0) /* v3.2 */
753 *(here->B4SOITempePtr) += m * gTte;
754 }
755
756
757 *(here->B4SOIDdPtr) += m * (gdpr + gdtot);
758 *(here->B4SOIDdpPtr) -= m * (gdpr - gdtotd);
759 *(here->B4SOISsPtr) += m * (gspr + gstot);
760 *(here->B4SOISspPtr) -= m * (gspr -gstots);
761
762
763 if (here->B4SOIbodyMod == 1) {
764 (*(here->B4SOIBpPtr) -= m * gppp);
765 (*(here->B4SOIPbPtr) += m * gppb);
766 (*(here->B4SOIPpPtr) += m * gppp);
767 }
768
769 /* v4.1 Ig_agbcp2 stamping */
770 (*(here->B4SOIGgPtr) += gigpg);
771 if (here->B4SOIbodyMod == 1) {
772 (*(here->B4SOIPpPtr) -= m * gigpp);
773 (*(here->B4SOIPgPtr) -= m * gigpg);
774 (*(here->B4SOIGpPtr) += m * gigpp);
775 }
776 else if(here->B4SOIbodyMod == 2)
777 {
778 (*(here->B4SOIBbPtr) -= m * gigpp);
779 (*(here->B4SOIBgPtr) -= m * gigpg);
780 (*(here->B4SOIGbPtr) += m * gigpp);
781 }
782
783
784
785 /* v4.0 */
786 if (here->B4SOIrbodyMod)
787 {
788 (*(here->B4SOIDPdbPtr + 1) -= m * xcjdbdp);
789 (*(here->B4SOIDPdbPtr) -= m * here->B4SOIGGjdb);
790 (*(here->B4SOISPsbPtr + 1) -= m * xcjsbsp);
791 (*(here->B4SOISPsbPtr) -= m * here->B4SOIGGjsb);
792
793 (*(here->B4SOIDBdpPtr + 1) -= m * xcjdbdp);
794 (*(here->B4SOIDBdpPtr) -= m * here->B4SOIGGjdb);
795 (*(here->B4SOIDBdbPtr + 1) += m * xcjdbdp);
796 (*(here->B4SOIDBdbPtr) += m * (here->B4SOIGGjdb
797 + here->B4SOIgrbdb));
798
799 (*(here->B4SOIDBbPtr) -= m * here->B4SOIgrbdb);
800 (*(here->B4SOISBbPtr) -= m * here->B4SOIgrbsb);
801
802 (*(here->B4SOISBspPtr + 1) -= m * xcjsbsp);
803 (*(here->B4SOISBspPtr) -= m * here->B4SOIGGjsb);
804 (*(here->B4SOISBsbPtr + 1) += m * xcjsbsp);
805 (*(here->B4SOISBsbPtr) += m * (here->B4SOIGGjsb
806 + here->B4SOIgrbsb));
807
808 (*(here->B4SOIBdbPtr) -= m * here->B4SOIgrbdb);
809 (*(here->B4SOIBsbPtr) -= m * here->B4SOIgrbsb);
810 (*(here->B4SOIBbPtr) += m * (here->B4SOIgrbsb
811 + here->B4SOIgrbdb));
812
813 }
814
815 if (here->B4SOIdebugMod != 0)
816 {
817 *(here->B4SOIVbsPtr) += 1;
818 *(here->B4SOIIdsPtr) += 1;
819 *(here->B4SOIIcPtr) += 1;
820 *(here->B4SOIIbsPtr) += 1;
821 *(here->B4SOIIbdPtr) += 1;
822 *(here->B4SOIIiiPtr) += 1;
823 *(here->B4SOIIgidlPtr) += 1;
824 *(here->B4SOIItunPtr) += 1;
825 *(here->B4SOIIbpPtr) += 1;
826 *(here->B4SOICbgPtr) += 1;
827 *(here->B4SOICbbPtr) += 1;
828 *(here->B4SOICbdPtr) += 1;
829 *(here->B4SOIQbfPtr) += 1;
830 *(here->B4SOIQjsPtr) += 1;
831 *(here->B4SOIQjdPtr) += 1;
832
833 }
834
835 }
836 }
837 return(OK);
838 }
839
840