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