1 /**********
2 Copyright 1990 Regents of the University of California.  All rights reserved.
3 Author: 1988 Jaijeet S Roychowdhury
4 **********/
5 
6 #include "ngspice/ngspice.h"
7 #include "ngspice/cktdefs.h"
8 #include "vdmosdefs.h"
9 #include "ngspice/sperror.h"
10 #include "ngspice/distodef.h"
11 #include "ngspice/suffix.h"
12 
13 int
VDMOSdisto(int mode,GENmodel * genmodel,CKTcircuit * ckt)14 VDMOSdisto(int mode, GENmodel *genmodel, CKTcircuit *ckt)
15 
16 /* assuming here that ckt->CKTomega has been initialised to
17  * the correct value
18  */
19 {
20     VDMOSmodel *model = (VDMOSmodel *) genmodel;
21     DISTOAN* job = (DISTOAN*) ckt->CKTcurJob;
22     DpassStr pass;
23     double r1h1x,i1h1x;
24     double r1h1y,i1h1y;
25     double r1h2x, i1h2x;
26     double r1h2y, i1h2y;
27     double r1hm2x,i1hm2x;
28     double r1hm2y,i1hm2y;
29     double r2h11x,i2h11x;
30     double r2h11y,i2h11y;
31     double r2h1m2x,i2h1m2x;
32     double r2h1m2y,i2h1m2y;
33     double temp, itemp;
34     VDMOSinstance *here;
35 
36     if (mode == D_SETUP)
37         return(VDMOSdSetup(genmodel,ckt));
38 
39     if ((mode == D_TWOF1) || (mode == D_THRF1) ||
40             (mode == D_F1PF2) || (mode == D_F1MF2) ||
41             (mode == D_2F1MF2)) {
42 
43         /* loop through all the VDMOS models */
44         for( ; model != NULL; model = VDMOSnextModel(model)) {
45 
46             /* loop through all the instances of the model */
47             for (here = VDMOSinstances(model); here != NULL ;
48                     here=VDMOSnextInstance(here)) {
49 
50                 /* loading starts here */
51 
52                 switch (mode) {
53                 case D_TWOF1:
54                     /* x = vgs, z = vds */
55 
56                     /* getting first order (linear) Volterra kernel */
57                     r1h1x = *(job->r1H1ptr + (here->VDMOSgNode)) -
58                             *(job->r1H1ptr + (here->VDMOSsNodePrime));
59                     i1h1x = *(job->i1H1ptr + (here->VDMOSgNode)) -
60                             *(job->i1H1ptr + (here->VDMOSsNodePrime));
61 
62                     r1h1y = *(job->r1H1ptr + (here->VDMOSdNodePrime)) -
63                             *(job->r1H1ptr + (here->VDMOSsNodePrime));
64                     i1h1y = *(job->i1H1ptr + (here->VDMOSdNodePrime)) -
65                             *(job->i1H1ptr + (here->VDMOSsNodePrime));
66 
67                     /* loading starts here */
68                     /* loading cdrain term  */
69 
70                     temp = DFn2F1(here->cdr_x2,
71                                   here->cdr_y2,
72                                   0.0,
73                                   here->cdr_xy,
74                                   0.0,
75                                   0.0,
76                                   r1h1x,
77                                   i1h1x,
78                                   r1h1y,
79                                   i1h1y,
80                                   0.0,
81                                   0.0);
82 
83                     itemp = DFi2F1(here->cdr_x2,
84                                    here->cdr_y2,
85                                    0.0,
86                                    here->cdr_xy,
87                                    0.0,
88                                    0.0,
89                                    r1h1x,
90                                    i1h1x,
91                                    r1h1y,
92                                    i1h1y,
93                                    0.0,
94                                    0.0);
95 
96                     *(ckt->CKTrhs + (here->VDMOSdNodePrime)) -= temp;
97                     *(ckt->CKTirhs + (here->VDMOSdNodePrime)) -= itemp;
98                     *(ckt->CKTrhs + (here->VDMOSsNodePrime)) += temp;
99                     *(ckt->CKTirhs + (here->VDMOSsNodePrime)) += itemp;
100 
101                     /* cdrain term over */
102 
103                     /* loading capgs term */
104 
105                     temp = -ckt->CKTomega *
106                            D1i2F1(here->capgs2,
107                                   r1h1x,
108                                   i1h1x);
109 
110                     itemp = ckt->CKTomega *
111                             D1n2F1(here->capgs2,
112                                    r1h1x,
113                                    i1h1x);
114 
115                     *(ckt->CKTrhs + (here->VDMOSgNode)) -= temp;
116                     *(ckt->CKTirhs + (here->VDMOSgNode)) -= itemp;
117                     *(ckt->CKTrhs + (here->VDMOSsNodePrime)) += temp;
118                     *(ckt->CKTirhs + (here->VDMOSsNodePrime)) += itemp;
119 
120                     /* capgs over */
121 
122                     /* loading capgd term */
123 
124                     temp = -ckt->CKTomega *
125                            D1i2F1(here->capgd2,
126                                   r1h1x - r1h1y,
127                                   i1h1x - i1h1y);
128 
129                     itemp = ckt->CKTomega *
130                             D1n2F1(here->capgd2,
131                                    r1h1x - r1h1y,
132                                    i1h1x - i1h1y);
133 
134 
135                     *(ckt->CKTrhs + (here->VDMOSgNode)) -= temp;
136                     *(ckt->CKTirhs + (here->VDMOSgNode)) -= itemp;
137                     *(ckt->CKTrhs + (here->VDMOSdNodePrime)) += temp;
138                     *(ckt->CKTirhs + (here->VDMOSdNodePrime)) += itemp;
139 
140                     /* capgd over */
141 
142                     /* all done */
143 
144                     break;
145 
146                 case D_THRF1:
147                     /* x = vgs, y = vds */
148 
149                     /* getting first order (linear) Volterra kernel */
150                     r1h1x = *(job->r1H1ptr + (here->VDMOSgNode)) -
151                             *(job->r1H1ptr + (here->VDMOSsNodePrime));
152                     i1h1x = *(job->i1H1ptr + (here->VDMOSgNode)) -
153                             *(job->i1H1ptr + (here->VDMOSsNodePrime));
154 
155                     r1h1y = *(job->r1H1ptr + (here->VDMOSdNodePrime)) -
156                             *(job->r1H1ptr + (here->VDMOSsNodePrime));
157                     i1h1y = *(job->i1H1ptr + (here->VDMOSdNodePrime)) -
158                             *(job->i1H1ptr + (here->VDMOSsNodePrime));
159 
160                     r2h11x = *(job->r2H11ptr + (here->VDMOSgNode)) -
161                              *(job->r2H11ptr + (here->VDMOSsNodePrime));
162                     i2h11x = *(job->i2H11ptr + (here->VDMOSgNode)) -
163                              *(job->i2H11ptr + (here->VDMOSsNodePrime));
164 
165                     r2h11y = *(job->r2H11ptr + (here->VDMOSdNodePrime)) -
166                              *(job->r2H11ptr + (here->VDMOSsNodePrime));
167                     i2h11y = *(job->i2H11ptr + (here->VDMOSdNodePrime)) -
168                              *(job->i2H11ptr + (here->VDMOSsNodePrime));
169                     /* loading starts here */
170                     /* loading cdrain term  */
171 
172                     temp = DFn3F1(here->cdr_x2,
173                                   here->cdr_y2,
174                                   0.0,
175                                   here->cdr_xy,
176                                   0.0,
177                                   0.0,
178                                   here->cdr_x3,
179                                   here->cdr_y3,
180                                   0.0,
181                                   here->cdr_x2y,
182                                   0.0,
183                                   here->cdr_xy2,
184                                   0.0,
185                                   0.0,
186                                   0.0,
187                                   0.0,
188                                   r1h1x,
189                                   i1h1x,
190                                   r1h1y,
191                                   i1h1y,
192                                   0.0,
193                                   0.0,
194                                   r2h11x,
195                                   i2h11x,
196                                   r2h11y,
197                                   i2h11y,
198                                   0.0,
199                                   0.0);
200                     itemp = DFi3F1(here->cdr_x2,
201                                    here->cdr_y2,
202                                    0.0,
203                                    here->cdr_xy,
204                                    0.0,
205                                    0.0,
206                                    here->cdr_x3,
207                                    here->cdr_y3,
208                                    0.0,
209                                    here->cdr_x2y,
210                                    0.0,
211                                    here->cdr_xy2,
212                                    0.0,
213                                    0.0,
214                                    0.0,
215                                    0.0,
216                                    r1h1x,
217                                    i1h1x,
218                                    r1h1y,
219                                    i1h1y,
220                                    0.0,
221                                    0.0,
222                                    r2h11x,
223                                    i2h11x,
224                                    r2h11y,
225                                    i2h11y,
226                                    0.0,
227                                    0.0);
228 
229 
230                     *(ckt->CKTrhs + (here->VDMOSdNodePrime)) -= temp;
231                     *(ckt->CKTirhs + (here->VDMOSdNodePrime)) -= itemp;
232                     *(ckt->CKTrhs + (here->VDMOSsNodePrime)) += temp;
233                     *(ckt->CKTirhs + (here->VDMOSsNodePrime)) += itemp;
234 
235                     /* cdrain term over */
236 
237                     /* loading capgs term */
238 
239                     temp = -ckt->CKTomega *
240                            D1i3F1(here->capgs2,
241                                   here->capgs3,
242                                   r1h1x,
243                                   i1h1x,
244                                   r2h11x,
245                                   i2h11x);
246 
247                     itemp = ckt->CKTomega *
248                             D1n3F1(here->capgs2,
249                                    here->capgs3,
250                                    r1h1x,
251                                    i1h1x,
252                                    r2h11x,
253                                    i2h11x);
254 
255                     *(ckt->CKTrhs + (here->VDMOSgNode)) -= temp;
256                     *(ckt->CKTirhs + (here->VDMOSgNode)) -= itemp;
257                     *(ckt->CKTrhs + (here->VDMOSsNodePrime)) += temp;
258                     *(ckt->CKTirhs + (here->VDMOSsNodePrime)) += itemp;
259 
260                     /* capgs over */
261 
262                     /* loading capgd term */
263 
264                     temp = -ckt->CKTomega *
265                            D1i3F1(here->capgd2,
266                                   here->capgd3,
267                                   r1h1x - r1h1y,
268                                   i1h1x - i1h1y,
269                                   r2h11x - r2h11y,
270                                   i2h11x - i2h11y);
271 
272                     itemp = ckt->CKTomega *
273                             D1n3F1(here->capgd2,
274                                    here->capgd3,
275                                    r1h1x - r1h1y,
276                                    i1h1x - i1h1y,
277                                    r2h11x - r2h11y,
278                                    i2h11x - i2h11y);
279 
280 
281                     *(ckt->CKTrhs + (here->VDMOSgNode)) -= temp;
282                     *(ckt->CKTirhs + (here->VDMOSgNode)) -= itemp;
283                     *(ckt->CKTrhs + (here->VDMOSdNodePrime)) += temp;
284                     *(ckt->CKTirhs + (here->VDMOSdNodePrime)) += itemp;
285 
286                     /* capgd over */
287                     /* all done */
288 
289                     break;
290                 case D_F1PF2:
291                     /* x = vgs, y = vds */
292 
293                     /* getting first order (linear) Volterra kernel */
294                     r1h1x = *(job->r1H1ptr + (here->VDMOSgNode)) -
295                             *(job->r1H1ptr + (here->VDMOSsNodePrime));
296                     i1h1x = *(job->i1H1ptr + (here->VDMOSgNode)) -
297                             *(job->i1H1ptr + (here->VDMOSsNodePrime));
298 
299                     r1h1y = *(job->r1H1ptr + (here->VDMOSdNodePrime)) -
300                             *(job->r1H1ptr + (here->VDMOSsNodePrime));
301                     i1h1y = *(job->i1H1ptr + (here->VDMOSdNodePrime)) -
302                             *(job->i1H1ptr + (here->VDMOSsNodePrime));
303 
304                     r1h2x = *(job->r1H2ptr + (here->VDMOSgNode)) -
305                             *(job->r1H2ptr + (here->VDMOSsNodePrime));
306                     i1h2x = *(job->i1H2ptr + (here->VDMOSgNode)) -
307                             *(job->i1H2ptr + (here->VDMOSsNodePrime));
308 
309                     r1h2y = *(job->r1H2ptr + (here->VDMOSdNodePrime)) -
310                             *(job->r1H2ptr + (here->VDMOSsNodePrime));
311                     i1h2y = *(job->i1H2ptr + (here->VDMOSdNodePrime)) -
312                             *(job->i1H2ptr + (here->VDMOSsNodePrime));
313 
314                     /* loading starts here */
315                     /* loading cdrain term  */
316 
317                     temp = DFnF12(here->cdr_x2,
318                                   here->cdr_y2,
319                                   0.0,
320                                   here->cdr_xy,
321                                   0.0,
322                                   0.0,
323                                   r1h1x,
324                                   i1h1x,
325                                   r1h1y,
326                                   i1h1y,
327                                   0.0,
328                                   0.0,
329                                   r1h2x,
330                                   i1h2x,
331                                   r1h2y,
332                                   i1h2y,
333                                   0.0,
334                                   0.0);
335 
336                     itemp = DFiF12(here->cdr_x2,
337                                    here->cdr_y2,
338                                    0.0,
339                                    here->cdr_xy,
340                                    0.0,
341                                    0.0,
342                                    r1h1x,
343                                    i1h1x,
344                                    r1h1y,
345                                    i1h1y,
346                                    0.0,
347                                    0.0,
348                                    r1h2x,
349                                    i1h2x,
350                                    r1h2y,
351                                    i1h2y,
352                                    0.0,
353                                    0.0);
354 
355                     *(ckt->CKTrhs + (here->VDMOSdNodePrime)) -= temp;
356                     *(ckt->CKTirhs + (here->VDMOSdNodePrime)) -= itemp;
357                     *(ckt->CKTrhs + (here->VDMOSsNodePrime)) += temp;
358                     *(ckt->CKTirhs + (here->VDMOSsNodePrime)) += itemp;
359 
360                     /* cdrain term over */
361 
362                     /* loading capgs term */
363 
364                     temp = -ckt->CKTomega *
365                            D1iF12(here->capgs2,
366                                   r1h1x,
367                                   i1h1x,
368                                   r1h2x,
369                                   i1h2x);
370 
371                     itemp = ckt->CKTomega *
372                             D1nF12(here->capgs2,
373                                    r1h1x,
374                                    i1h1x,
375                                    r1h2x,
376                                    i1h2x);
377 
378                     *(ckt->CKTrhs + (here->VDMOSgNode)) -= temp;
379                     *(ckt->CKTirhs + (here->VDMOSgNode)) -= itemp;
380                     *(ckt->CKTrhs + (here->VDMOSsNodePrime)) += temp;
381                     *(ckt->CKTirhs + (here->VDMOSsNodePrime)) += itemp;
382 
383                     /* capgs over */
384 
385                     /* loading capgd term */
386 
387                     temp = -ckt->CKTomega *
388                            D1iF12(here->capgd2,
389                                   r1h1x - r1h1y,
390                                   i1h1x - i1h1y,
391                                   r1h2x - r1h2y,
392                                   i1h2x - i1h2y);
393 
394                     itemp = ckt->CKTomega *
395                             D1nF12(here->capgd2,
396                                    r1h1x - r1h1y,
397                                    i1h1x - i1h1y,
398                                    r1h2x - r1h2y,
399                                    i1h2x - i1h2y);
400 
401 
402                     *(ckt->CKTrhs + (here->VDMOSgNode)) -= temp;
403                     *(ckt->CKTirhs + (here->VDMOSgNode)) -= itemp;
404                     *(ckt->CKTrhs + (here->VDMOSdNodePrime)) += temp;
405                     *(ckt->CKTirhs + (here->VDMOSdNodePrime)) += itemp;
406 
407                     /* capgd over */
408                     /* all done */
409 
410                     break;
411                 case D_F1MF2:
412                     /* x = vgs, y = vds */
413 
414                     /* getting first order (linear) Volterra kernel */
415                     r1h1x = *(job->r1H1ptr + (here->VDMOSgNode)) -
416                             *(job->r1H1ptr + (here->VDMOSsNodePrime));
417                     i1h1x = *(job->i1H1ptr + (here->VDMOSgNode)) -
418                             *(job->i1H1ptr + (here->VDMOSsNodePrime));
419 
420                     r1h1y = *(job->r1H1ptr + (here->VDMOSdNodePrime)) -
421                             *(job->r1H1ptr + (here->VDMOSsNodePrime));
422                     i1h1y = *(job->i1H1ptr + (here->VDMOSdNodePrime)) -
423                             *(job->i1H1ptr + (here->VDMOSsNodePrime));
424 
425                     r1hm2x = *(job->r1H2ptr + (here->VDMOSgNode)) -
426                              *(job->r1H2ptr + (here->VDMOSsNodePrime));
427                     i1hm2x = -(*(job->i1H2ptr + (here->VDMOSgNode)) -
428                                *(job->i1H2ptr + (here->VDMOSsNodePrime)));
429 
430                     r1hm2y = *(job->r1H2ptr + (here->VDMOSdNodePrime)) -
431                              *(job->r1H2ptr + (here->VDMOSsNodePrime));
432                     i1hm2y = -(*(job->i1H2ptr + (here->VDMOSdNodePrime)) -
433                                *(job->i1H2ptr + (here->VDMOSsNodePrime)));
434 
435                     /* loading starts here */
436                     /* loading cdrain term  */
437 
438                     temp = DFnF12(here->cdr_x2,
439                                   here->cdr_y2,
440                                   0.0,
441                                   here->cdr_xy,
442                                   0.0,
443                                   0.0,
444                                   r1h1x,
445                                   i1h1x,
446                                   r1h1y,
447                                   i1h1y,
448                                   0.0,
449                                   0.0,
450                                   r1hm2x,
451                                   i1hm2x,
452                                   r1hm2y,
453                                   i1hm2y,
454                                   0.0,
455                                   0.0);
456 
457                     itemp = DFiF12(here->cdr_x2,
458                                    here->cdr_y2,
459                                    0.0,
460                                    here->cdr_xy,
461                                    0.0,
462                                    0.0,
463                                    r1h1x,
464                                    i1h1x,
465                                    r1h1y,
466                                    i1h1y,
467                                    0.0,
468                                    0.0,
469                                    r1hm2x,
470                                    i1hm2x,
471                                    r1hm2y,
472                                    i1hm2y,
473                                    0.0,
474                                    0.0);
475 
476                     *(ckt->CKTrhs + (here->VDMOSdNodePrime)) -= temp;
477                     *(ckt->CKTirhs + (here->VDMOSdNodePrime)) -= itemp;
478                     *(ckt->CKTrhs + (here->VDMOSsNodePrime)) += temp;
479                     *(ckt->CKTirhs + (here->VDMOSsNodePrime)) += itemp;
480 
481                     /* cdrain term over */
482 
483                     /* loading capgs term */
484 
485                     temp = -ckt->CKTomega *
486                            D1iF12(here->capgs2,
487                                   r1h1x,
488                                   i1h1x,
489                                   r1hm2x,
490                                   i1hm2x);
491 
492                     itemp = ckt->CKTomega *
493                             D1nF12(here->capgs2,
494                                    r1h1x,
495                                    i1h1x,
496                                    r1hm2x,
497                                    i1hm2x);
498 
499                     *(ckt->CKTrhs + (here->VDMOSgNode)) -= temp;
500                     *(ckt->CKTirhs + (here->VDMOSgNode)) -= itemp;
501                     *(ckt->CKTrhs + (here->VDMOSsNodePrime)) += temp;
502                     *(ckt->CKTirhs + (here->VDMOSsNodePrime)) += itemp;
503 
504                     /* capgs over */
505 
506                     /* loading capgd term */
507 
508                     temp = -ckt->CKTomega *
509                            D1iF12(here->capgd2,
510                                   r1h1x - r1h1y,
511                                   i1h1x - i1h1y,
512                                   r1hm2x - r1hm2y,
513                                   i1hm2x - i1hm2y);
514 
515                     itemp = ckt->CKTomega *
516                             D1nF12(here->capgd2,
517                                    r1h1x - r1h1y,
518                                    i1h1x - i1h1y,
519                                    r1hm2x - r1hm2y,
520                                    i1hm2x - i1hm2y);
521 
522 
523                     *(ckt->CKTrhs + (here->VDMOSgNode)) -= temp;
524                     *(ckt->CKTirhs + (here->VDMOSgNode)) -= itemp;
525                     *(ckt->CKTrhs + (here->VDMOSdNodePrime)) += temp;
526                     *(ckt->CKTirhs + (here->VDMOSdNodePrime)) += itemp;
527 
528                     /* capgd over */
529                     /* all done */
530 
531                     break;
532                 case D_2F1MF2:
533                     /* x = vgs, y = vds */
534 
535                     /* getting first order (linear) Volterra kernel */
536                     r1h1x = *(job->r1H1ptr + (here->VDMOSgNode)) -
537                             *(job->r1H1ptr + (here->VDMOSsNodePrime));
538                     i1h1x = *(job->i1H1ptr + (here->VDMOSgNode)) -
539                             *(job->i1H1ptr + (here->VDMOSsNodePrime));
540 
541                     r1h1y = *(job->r1H1ptr + (here->VDMOSdNodePrime)) -
542                             *(job->r1H1ptr + (here->VDMOSsNodePrime));
543                     i1h1y = *(job->i1H1ptr + (here->VDMOSdNodePrime)) -
544                             *(job->i1H1ptr + (here->VDMOSsNodePrime));
545 
546                     r1hm2x = *(job->r1H2ptr + (here->VDMOSgNode)) -
547                              *(job->r1H2ptr + (here->VDMOSsNodePrime));
548                     i1hm2x = -(*(job->i1H2ptr + (here->VDMOSgNode)) -
549                                *(job->i1H2ptr + (here->VDMOSsNodePrime)));
550 
551                     r1hm2y = *(job->r1H2ptr + (here->VDMOSdNodePrime)) -
552                              *(job->r1H2ptr + (here->VDMOSsNodePrime));
553                     i1hm2y = -(*(job->i1H2ptr + (here->VDMOSdNodePrime)) -
554                                *(job->i1H2ptr + (here->VDMOSsNodePrime)));
555 
556                     r2h11x = *(job->r1H1ptr + (here->VDMOSgNode)) -
557                              *(job->r1H1ptr + (here->VDMOSsNodePrime));
558                     i2h11x = *(job->i1H1ptr + (here->VDMOSgNode)) -
559                              *(job->i1H1ptr + (here->VDMOSsNodePrime));
560 
561                     r2h11y = *(job->r1H1ptr + (here->VDMOSdNodePrime)) -
562                              *(job->r1H1ptr + (here->VDMOSsNodePrime));
563                     i2h11y = *(job->i1H1ptr + (here->VDMOSdNodePrime)) -
564                              *(job->i1H1ptr + (here->VDMOSsNodePrime));
565 
566                     r2h1m2x = *(job->r2H1m2ptr + (here->VDMOSgNode)) -
567                               *(job->r2H1m2ptr + (here->VDMOSsNodePrime));
568                     i2h1m2x = *(job->i2H1m2ptr + (here->VDMOSgNode)) -
569                               *(job->i2H1m2ptr + (here->VDMOSsNodePrime));
570 
571                     r2h1m2y = *(job->r2H1m2ptr + (here->VDMOSdNodePrime)) -
572                               *(job->r2H1m2ptr + (here->VDMOSsNodePrime));
573                     i2h1m2y = *(job->i2H1m2ptr + (here->VDMOSdNodePrime)) -
574                               *(job->i2H1m2ptr + (here->VDMOSsNodePrime));
575 
576                     /* loading starts here */
577                     /* loading cdrain term  */
578 
579                     pass.cxx = here->cdr_x2;
580                     pass.cyy = here->cdr_y2;
581                     pass.czz = 0.0;
582                     pass.cxy = here->cdr_xy;
583                     pass.cyz = 0.0;
584                     pass.cxz = 0.0;
585                     pass.cxxx = here->cdr_x3;
586                     pass.cyyy = here->cdr_y3;
587                     pass.czzz = 0.0;
588                     pass.cxxy = here->cdr_x2y;
589                     pass.cxxz = 0.0;
590                     pass.cxyy = here->cdr_xy2;
591                     pass.cyyz = 0.0;
592                     pass.cxzz = 0.0;
593                     pass.cyzz = 0.0;
594                     pass.cxyz = 0.0;
595                     pass.r1h1x = r1h1x;
596                     pass.i1h1x = i1h1x;
597                     pass.r1h1y = r1h1y;
598                     pass.i1h1y = i1h1y;
599                     pass.r1h1z = 0.0;
600                     pass.i1h1z = 0.0;
601                     pass.r1h2x = r1hm2x;
602                     pass.i1h2x = i1hm2x;
603                     pass.r1h2y = r1hm2y;
604                     pass.i1h2y = i1hm2y;
605                     pass.r1h2z = 0.0;
606                     pass.i1h2z = 0.0;
607                     pass.r2h11x = r2h11x;
608                     pass.i2h11x = i2h11x;
609                     pass.r2h11y = r2h11y;
610                     pass.i2h11y = i2h11y;
611                     pass.r2h11z = 0.0;
612                     pass.i2h11z = 0.0;
613                     pass.h2f1f2x = r2h1m2x;
614                     pass.ih2f1f2x = i2h1m2x;
615                     pass.h2f1f2y = r2h1m2y;
616                     pass.ih2f1f2y = i2h1m2y;
617                     pass.h2f1f2z = 0.0;
618                     pass.ih2f1f2z = 0.0;
619                     temp = DFn2F12(&pass);
620 
621                     itemp = DFi2F12(&pass);
622 
623 
624                     *(ckt->CKTrhs + (here->VDMOSdNodePrime)) -= temp;
625                     *(ckt->CKTirhs + (here->VDMOSdNodePrime)) -= itemp;
626                     *(ckt->CKTrhs + (here->VDMOSsNodePrime)) += temp;
627                     *(ckt->CKTirhs + (here->VDMOSsNodePrime)) += itemp;
628 
629                     /* cdrain term over */
630 
631                     /* loading capgs term */
632 
633                     temp = -ckt->CKTomega *
634                            D1i2F12(here->capgs2,
635                                    here->capgs3,
636                                    r1h1x,
637                                    i1h1x,
638                                    r1hm2x,
639                                    i1hm2x,
640                                    r2h11x,
641                                    i2h11x,
642                                    r2h1m2x,
643                                    i2h1m2x);
644 
645                     itemp = ckt->CKTomega *
646                             D1n2F12(here->capgs2,
647                                     here->capgs3,
648                                     r1h1x,
649                                     i1h1x,
650                                     r1hm2x,
651                                     i1hm2x,
652                                     r2h11x,
653                                     i2h11x,
654                                     r2h1m2x,
655                                     i2h1m2x);
656 
657                     *(ckt->CKTrhs + (here->VDMOSgNode)) -= temp;
658                     *(ckt->CKTirhs + (here->VDMOSgNode)) -= itemp;
659                     *(ckt->CKTrhs + (here->VDMOSsNodePrime)) += temp;
660                     *(ckt->CKTirhs + (here->VDMOSsNodePrime)) += itemp;
661 
662                     /* capgs over */
663 
664                     /* loading capgd term */
665 
666                     temp = -ckt->CKTomega *
667                            D1i2F12(here->capgd2,
668                                    here->capgd3,
669                                    r1h1x - r1h1y,
670                                    i1h1x - i1h1y,
671                                    r1hm2x - r1hm2y,
672                                    i1hm2x - i1hm2y,
673                                    r2h11x - r2h11y,
674                                    i2h11x - i2h11y,
675                                    r2h1m2x - r2h1m2y,
676                                    i2h1m2x - i2h1m2y);
677 
678                     itemp = ckt->CKTomega *
679                             D1n2F12(here->capgd2,
680                                     here->capgd3,
681                                     r1h1x - r1h1y,
682                                     i1h1x - i1h1y,
683                                     r1hm2x - r1hm2y,
684                                     i1hm2x - i1hm2y,
685                                     r2h11x - r2h11y,
686                                     i2h11x - i2h11y,
687                                     r2h1m2x - r2h1m2y,
688                                     i2h1m2x - i2h1m2y);
689 
690 
691                     *(ckt->CKTrhs + (here->VDMOSgNode)) -= temp;
692                     *(ckt->CKTirhs + (here->VDMOSgNode)) -= itemp;
693                     *(ckt->CKTrhs + (here->VDMOSdNodePrime)) += temp;
694                     *(ckt->CKTirhs + (here->VDMOSdNodePrime)) += itemp;
695 
696                     /* capgd over */
697                     /* all done */
698 
699                     break;
700                 default:
701                     ;
702                 }
703             }
704         }
705         return(OK);
706     } else
707         return(E_BADPARM);
708 }
709