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