Jspice3
mesdisto.c
Go to the documentation of this file.
1 /***************************************************************************
2 JSPICE3 adaptation of Spice3f2 - Copyright (c) Stephen R. Whiteley 1992
3 Copyright 1990 Regents of the University of California. All rights reserved.
4 Authors: 1988 Jaijeet S Roychowdhury
5  1993 Stephen R. Whiteley
6 ****************************************************************************/
7 
8 #include "spice.h"
9 #include <math.h>
10 #include <stdio.h>
11 #include "mesdefs.h"
12 #include "distodef.h"
13 #include "sperror.h"
14 #include "util.h"
15 #include "distoext.h"
16 
17 int
18 MESdisto(mode,genmodel,ckt)
19  GENmodel *genmodel;
20  register CKTcircuit *ckt;
21  int mode;
22 
23 /* assuming here that ckt->CKTomega has been initialised to
24  * the correct value
25  */
26 {
27  MESmodel *model = (MESmodel *) genmodel;
28  DISTOAN* job = (DISTOAN*) ckt->CKTcurJob;
29  DpassStr pass;
30  double r1h1x,i1h1x;
31  double r1h1y,i1h1y;
32  double r1h1z, i1h1z;
33  double r1h2x, i1h2x;
34  double r1h2y, i1h2y;
35  double r1h2z, i1h2z;
36  double r1hm2x,i1hm2x;
37  double r1hm2y,i1hm2y;
38  double r1hm2z, i1hm2z;
39  double r2h11x,i2h11x;
40  double r2h11y,i2h11y;
41  double r2h11z, i2h11z;
42  double r2h1m2x,i2h1m2x;
43  double r2h1m2y,i2h1m2y;
44  double r2h1m2z, i2h1m2z;
45  double temp, itemp;
46  register MESinstance *here;
47 
48 if (mode == D_SETUP)
49  return(MESdSetup(model,ckt));
50 
51 if ((mode == D_TWOF1) || (mode == D_THRF1) ||
52  (mode == D_F1PF2) || (mode == D_F1MF2) ||
53  (mode == D_2F1MF2)) {
54 
55  /* loop through all the MES models */
56 for( ; model != NULL; model = model->MESnextModel ) {
57 
58  /* loop through all the instances of the model */
59  for (here = model->MESinstances; here != NULL ;
60  here=here->MESnextInstance) {
61 
62 
63 
64  /* loading starts here */
65 
66  switch (mode) {
67  case D_TWOF1:
68  /* x = vgs, y = vds */
69 
70  /* getting first order (linear) Volterra kernel */
71  r1h1x = *(job->r1H1ptr + (here->MESgateNode)) -
72  *(job->r1H1ptr + (here->MESsourcePrimeNode));
73  i1h1x = *(job->i1H1ptr + (here->MESgateNode)) -
74  *(job->i1H1ptr + (here->MESsourcePrimeNode));
75 
76  r1h1y = *(job->r1H1ptr + (here->MESdrainPrimeNode)) -
77  *(job->r1H1ptr + (here->MESsourcePrimeNode));
78  i1h1y = *(job->i1H1ptr + (here->MESdrainPrimeNode)) -
79  *(job->i1H1ptr + (here->MESsourcePrimeNode));
80 
81 
82  /* loading starts here */
83  /* loading cdrain term */
84 
85  temp = DFn2F1(here->cdr_x2,
86  here->cdr_z2,
87  0.0,
88  here->cdr_xz,
89  0.0,
90  0.0,
91  r1h1x,
92  i1h1x,
93  r1h1y,
94  i1h1y,
95  0.0,
96  0.0);
97 
98  itemp = DFi2F1(here->cdr_x2,
99  here->cdr_z2,
100  0.0,
101  here->cdr_xz,
102  0.0,
103  0.0,
104  r1h1x,
105  i1h1x,
106  r1h1y,
107  i1h1y,
108  0.0,
109  0.0);
110 
111  *(ckt->CKTrhs + (here->MESdrainPrimeNode)) -= temp;
112  *(ckt->CKTirhs + (here->MESdrainPrimeNode)) -= itemp;
113  *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
114  *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
115 
116  /* cdrain term over */
117 
118  /* loading ggs term */
119 
120  temp = D1n2F1(here->ggs2,
121  r1h1x,
122  i1h1x);
123 
124  itemp = D1i2F1(here->ggs2,
125  r1h1x,
126  i1h1x);
127 
128 
129  *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
130  *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
131  *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
132  *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
133 
134  /* ggs over */
135 
136  /* loading ggd term */
137 
138  temp = D1n2F1(here->ggd2,
139  r1h1x - r1h1y,
140  i1h1x - i1h1y);
141 
142  itemp = D1i2F1(here->ggd2,
143  r1h1x - r1h1y,
144  i1h1x - i1h1y);
145 
146 
147  *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
148  *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
149  *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp;
150  *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp;
151 
152  /* ggd over */
153 
154  /* loading qgs term */
155 
156  temp = -ckt->CKTomega *
157  DFi2F1(here->qgs_x2,
158  here->qgs_y2,
159  0.0,
160  here->qgs_xy,
161  0.0,
162  0.0,
163  r1h1x,
164  i1h1x,
165  r1h1x - r1h1y,
166  i1h1x - i1h1y,
167  0.0,
168  0.0);
169 
170  itemp = ckt->CKTomega*
171  DFn2F1(here->qgs_x2,
172  here->qgs_y2,
173  0.0,
174  here->qgs_xy,
175  0.0,
176  0.0,
177  r1h1x,
178  i1h1x,
179  r1h1x - r1h1y,
180  i1h1x - i1h1y,
181  0.0,
182  0.0);
183 
184  *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
185  *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
186  *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
187  *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
188 
189  /* qgs term over */
190 
191  /* loading qgd term */
192 
193  temp = -ckt->CKTomega *
194  DFi2F1(here->qgd_x2,
195  here->qgd_y2,
196  0.0,
197  here->qgd_xy,
198  0.0,
199  0.0,
200  r1h1x,
201  i1h1x,
202  r1h1x - r1h1y,
203  i1h1x - i1h1y,
204  0.0,
205  0.0);
206 
207  itemp = ckt->CKTomega*
208  DFn2F1(here->qgd_x2,
209  here->qgd_y2,
210  0.0,
211  here->qgd_xy,
212  0.0,
213  0.0,
214  r1h1x,
215  i1h1x,
216  r1h1x - r1h1y,
217  i1h1x - i1h1y,
218  0.0,
219  0.0);
220 
221  *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
222  *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
223  *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp;
224  *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp;
225 
226  /* qgd term over */
227  /* all done */
228 
229  break;
230 
231  case D_THRF1:
232  /* x = vgs, y = vds */
233 
234  /* getting first order (linear) Volterra kernel */
235  r1h1x = *(job->r1H1ptr + (here->MESgateNode)) -
236  *(job->r1H1ptr + (here->MESsourcePrimeNode));
237  i1h1x = *(job->i1H1ptr + (here->MESgateNode)) -
238  *(job->i1H1ptr + (here->MESsourcePrimeNode));
239 
240  r1h1y = *(job->r1H1ptr + (here->MESdrainPrimeNode)) -
241  *(job->r1H1ptr + (here->MESsourcePrimeNode));
242  i1h1y = *(job->i1H1ptr + (here->MESdrainPrimeNode)) -
243  *(job->i1H1ptr + (here->MESsourcePrimeNode));
244 
245  r2h11x = *(job->r2H11ptr + (here->MESgateNode)) -
246  *(job->r2H11ptr + (here->MESsourcePrimeNode));
247  i2h11x = *(job->i2H11ptr + (here->MESgateNode)) -
248  *(job->i2H11ptr + (here->MESsourcePrimeNode));
249 
250  r2h11y = *(job->r2H11ptr + (here->MESdrainPrimeNode)) -
251  *(job->r2H11ptr + (here->MESsourcePrimeNode));
252  i2h11y = *(job->i2H11ptr + (here->MESdrainPrimeNode)) -
253  *(job->i2H11ptr + (here->MESsourcePrimeNode));
254 
255  /* loading starts here */
256  /* loading cdrain term */
257 
258  temp = DFn3F1(here->cdr_x2,
259  here->cdr_z2,
260  0.0,
261  here->cdr_xz,
262  0.0,
263  0.0,
264  here->cdr_x3,
265  here->cdr_z3,
266  0.0,
267  here->cdr_x2z,
268  0.0,
269  here->cdr_xz2,
270  0.0,
271  0.0,
272  0.0,
273  0.0,
274  r1h1x,
275  i1h1x,
276  r1h1y,
277  i1h1y,
278  0.0,
279  0.0,
280  r2h11x,
281  i2h11x,
282  r2h11y,
283  i2h11y,
284  0.0,
285  0.0);
286 
287  itemp = DFi3F1(here->cdr_x2,
288  here->cdr_z2,
289  0.0,
290  here->cdr_xz,
291  0.0,
292  0.0,
293  here->cdr_x3,
294  here->cdr_z3,
295  0.0,
296  here->cdr_x2z,
297  0.0,
298  here->cdr_xz2,
299  0.0,
300  0.0,
301  0.0,
302  0.0,
303  r1h1x,
304  i1h1x,
305  r1h1y,
306  i1h1y,
307  0.0,
308  0.0,
309  r2h11x,
310  i2h11x,
311  r2h11y,
312  i2h11y,
313  0.0,
314  0.0);
315 
316  *(ckt->CKTrhs + (here->MESdrainPrimeNode)) -= temp;
317  *(ckt->CKTirhs + (here->MESdrainPrimeNode)) -= itemp;
318  *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
319  *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
320 
321  /* cdrain term over */
322 
323  /* loading ggs term */
324 
325  temp = D1n3F1(here->ggs2,
326  here->ggs3,
327  r1h1x,
328  i1h1x,
329  r2h11x,
330  i2h11x);
331 
332  itemp = D1i3F1(here->ggs2,
333  here->ggs3,
334  r1h1x,
335  i1h1x,
336  r2h11x,
337  i2h11x);
338 
339 
340  *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
341  *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
342  *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
343  *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
344 
345  /* ggs over */
346 
347  /* loading ggd term */
348 
349  temp = D1n3F1(here->ggd2,
350  here->ggd3,
351  r1h1x - r1h1y,
352  i1h1x - i1h1y,
353  r2h11x - r2h11y,
354  i2h11x - i2h11y);
355 
356  itemp = D1i3F1(here->ggd2,
357  here->ggd3,
358  r1h1x - r1h1y,
359  i1h1x - i1h1y,
360  r2h11x - r2h11y,
361  i2h11x - i2h11y);
362 
363 
364 
365  *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
366  *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
367  *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp;
368  *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp;
369 
370  /* ggd over */
371 
372  /* loading qgs term */
373 
374  temp = -ckt->CKTomega*
375  DFi3F1(here->qgs_x2,
376  here->qgs_y2,
377  0.0,
378  here->qgs_xy,
379  0.0,
380  0.0,
381  here->qgs_x3,
382  here->qgs_y3,
383  0.0,
384  here->qgs_x2y,
385  0.0,
386  here->qgs_xy2,
387  0.0,
388  0.0,
389  0.0,
390  0.0,
391  r1h1x,
392  i1h1x,
393  r1h1x - r1h1y,
394  i1h1x - i1h1y,
395  0.0,
396  0.0,
397  r2h11x,
398  i2h11x,
399  r2h11x - r2h11y,
400  i2h11x - i2h11y,
401  0.0,
402  0.0);
403 
404  itemp =ckt->CKTomega*
405  DFn3F1(here->qgs_x2,
406  here->qgs_y2,
407  0.0,
408  here->qgs_xy,
409  0.0,
410  0.0,
411  here->qgs_x3,
412  here->qgs_y3,
413  0.0,
414  here->qgs_x2y,
415  0.0,
416  here->qgs_xy2,
417  0.0,
418  0.0,
419  0.0,
420  0.0,
421  r1h1x,
422  i1h1x,
423  r1h1x - r1h1y,
424  i1h1x - i1h1y,
425  0.0,
426  0.0,
427  r2h11x,
428  i2h11x,
429  r2h11x - r2h11y,
430  i2h11x - i2h11y,
431  0.0,
432  0.0);
433 
434  *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
435  *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
436  *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
437  *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
438 
439  /* qgs term over */
440 
441  /* loading qgd term */
442 
443  temp = -ckt->CKTomega*
444  DFi3F1(here->qgd_x2,
445  here->qgd_y2,
446  0.0,
447  here->qgd_xy,
448  0.0,
449  0.0,
450  here->qgd_x3,
451  here->qgd_y3,
452  0.0,
453  here->qgd_x2y,
454  0.0,
455  here->qgd_xy2,
456  0.0,
457  0.0,
458  0.0,
459  0.0,
460  r1h1x,
461  i1h1x,
462  r1h1x - r1h1y,
463  i1h1x - i1h1y,
464  0.0,
465  0.0,
466  r2h11x,
467  i2h11x,
468  r2h11x - r2h11y,
469  i2h11x - i2h11y,
470  0.0,
471  0.0);
472 
473  itemp =ckt->CKTomega*
474  DFn3F1(here->qgd_x2,
475  here->qgd_y2,
476  0.0,
477  here->qgd_xy,
478  0.0,
479  0.0,
480  here->qgd_x3,
481  here->qgd_y3,
482  0.0,
483  here->qgd_x2y,
484  0.0,
485  here->qgd_xy2,
486  0.0,
487  0.0,
488  0.0,
489  0.0,
490  r1h1x,
491  i1h1x,
492  r1h1x - r1h1y,
493  i1h1x - i1h1y,
494  0.0,
495  0.0,
496  r2h11x,
497  i2h11x,
498  r2h11x - r2h11y,
499  i2h11x - i2h11y,
500  0.0,
501  0.0);
502 
503  *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
504  *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
505  *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp;
506  *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp;
507 
508  /* qgd term over */
509  /* all done */
510 
511  break;
512  case D_F1PF2:
513  /* x = vgs, y = vds */
514 
515  /* getting first order (linear) Volterra transform */
516  r1h1x = *(job->r1H1ptr + (here->MESgateNode)) -
517  *(job->r1H1ptr + (here->MESsourcePrimeNode));
518  i1h1x = *(job->i1H1ptr + (here->MESgateNode)) -
519  *(job->i1H1ptr + (here->MESsourcePrimeNode));
520 
521  r1h1y = *(job->r1H1ptr + (here->MESdrainPrimeNode)) -
522  *(job->r1H1ptr + (here->MESsourcePrimeNode));
523  i1h1y = *(job->i1H1ptr + (here->MESdrainPrimeNode)) -
524  *(job->i1H1ptr + (here->MESsourcePrimeNode));
525 
526  r1h2x = *(job->r1H2ptr + (here->MESgateNode)) -
527  *(job->r1H2ptr + (here->MESsourcePrimeNode));
528  i1h2x = *(job->i1H2ptr + (here->MESgateNode)) -
529  *(job->i1H2ptr + (here->MESsourcePrimeNode));
530 
531  r1h2y = *(job->r1H2ptr + (here->MESdrainPrimeNode)) -
532  *(job->r1H2ptr + (here->MESsourcePrimeNode));
533  i1h2y = *(job->i1H2ptr + (here->MESdrainPrimeNode)) -
534  *(job->i1H2ptr + (here->MESsourcePrimeNode));
535 
536  /* loading starts here */
537  /* loading cdrain term */
538 
539  temp = DFnF12(here->cdr_x2,
540  here->cdr_z2,
541  0.0,
542  here->cdr_xz,
543  0.0,
544  0.0,
545  r1h1x,
546  i1h1x,
547  r1h1y,
548  i1h1y,
549  0.0,
550  0.0,
551  r1h2x,
552  i1h2x,
553  r1h2y,
554  i1h2y,
555  0.0,
556  0.0);
557 
558  itemp = DFiF12(here->cdr_x2,
559  here->cdr_z2,
560  0.0,
561  here->cdr_xz,
562  0.0,
563  0.0,
564  r1h1x,
565  i1h1x,
566  r1h1y,
567  i1h1y,
568  0.0,
569  0.0,
570  r1h2x,
571  i1h2x,
572  r1h2y,
573  i1h2y,
574  0.0,
575  0.0);
576 
577  *(ckt->CKTrhs + (here->MESdrainPrimeNode)) -= temp;
578  *(ckt->CKTirhs + (here->MESdrainPrimeNode)) -= itemp;
579  *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
580  *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
581 
582  /* cdrain term over */
583 
584  /* loading ggs term */
585 
586  temp = D1nF12(here->ggs2,
587  r1h1x,
588  i1h1x,
589  r1h2x,
590  i1h2x);
591 
592  itemp = D1iF12(here->ggs2,
593  r1h1x,
594  i1h1x,
595  r1h2x,
596  i1h2x);
597 
598 
599  *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
600  *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
601  *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
602  *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
603 
604  /* ggs over */
605 
606  /* loading ggd term */
607 
608  temp = D1nF12(here->ggd2,
609  r1h1x - r1h1y,
610  i1h1x - i1h1y,
611  r1h2x - r1h2y,
612  i1h2x - i1h2y);
613 
614  itemp = D1iF12(here->ggd2,
615  r1h1x - r1h1y,
616  i1h1x - i1h1y,
617  r1h2x - r1h2y,
618  i1h2x - i1h2y);
619 
620 
621  *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
622  *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
623  *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp;
624  *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp;
625 
626  /* ggd over */
627 
628  /* loading qgs term */
629 
630  temp = -ckt->CKTomega*
631  DFiF12(here->qgs_x2,
632  here->qgs_y2,
633  0.0,
634  here->qgs_xy,
635  0.0,
636  0.0,
637  r1h1x,
638  i1h1x,
639  r1h1x - r1h1y,
640  i1h1x - i1h1y,
641  0.0,
642  0.0,
643  r1h2x,
644  i1h2x,
645  r1h2x - r1h2y,
646  i1h2x - i1h2y,
647  0.0,
648  0.0);
649 
650  itemp =ckt->CKTomega*
651  DFnF12(here->qgs_x2,
652  here->qgs_y2,
653  0.0,
654  here->qgs_xy,
655  0.0,
656  0.0,
657  r1h1x,
658  i1h1x,
659  r1h1x - r1h1y,
660  i1h1x - i1h1y,
661  0.0,
662  0.0,
663  r1h2x,
664  i1h2x,
665  r1h2x - r1h2y,
666  i1h2x - i1h2y,
667  0.0,
668  0.0);
669 
670  *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
671  *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
672  *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
673  *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
674 
675  /* qgs term over */
676 
677  /* loading qgd term */
678 
679  temp = -ckt->CKTomega*
680  DFiF12(here->qgd_x2,
681  here->qgd_y2,
682  0.0,
683  here->qgd_xy,
684  0.0,
685  0.0,
686  r1h1x,
687  i1h1x,
688  r1h1x - r1h1y,
689  i1h1x - i1h1y,
690  0.0,
691  0.0,
692  r1h2x,
693  i1h2x,
694  r1h2x - r1h2y,
695  i1h2x - i1h2y,
696  0.0,
697  0.0);
698 
699  itemp =ckt->CKTomega*
700  DFnF12(here->qgd_x2,
701  here->qgd_y2,
702  0.0,
703  here->qgd_xy,
704  0.0,
705  0.0,
706  r1h1x,
707  i1h1x,
708  r1h1x - r1h1y,
709  i1h1x - i1h1y,
710  0.0,
711  0.0,
712  r1h2x,
713  i1h2x,
714  r1h2x - r1h2y,
715  i1h2x - i1h2y,
716  0.0,
717  0.0);
718 
719  *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
720  *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
721  *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp;
722  *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp;
723 
724  /* qgd term over */
725  /* all done */
726 
727  break;
728  case D_F1MF2:
729  /* x = vgs, y = vds */
730 
731  /* getting first order (linear) Volterra kernel */
732  r1h1x = *(job->r1H1ptr + (here->MESgateNode)) -
733  *(job->r1H1ptr + (here->MESsourcePrimeNode));
734  i1h1x = *(job->i1H1ptr + (here->MESgateNode)) -
735  *(job->i1H1ptr + (here->MESsourcePrimeNode));
736 
737  r1h1y = *(job->r1H1ptr + (here->MESdrainPrimeNode)) -
738  *(job->r1H1ptr + (here->MESsourcePrimeNode));
739  i1h1y = *(job->i1H1ptr + (here->MESdrainPrimeNode)) -
740  *(job->i1H1ptr + (here->MESsourcePrimeNode));
741 
742  r1hm2x = *(job->r1H2ptr + (here->MESgateNode)) -
743  *(job->r1H2ptr + (here->MESsourcePrimeNode));
744  i1hm2x = -(*(job->i1H2ptr + (here->MESgateNode)) -
745  *(job->i1H2ptr + (here->MESsourcePrimeNode)));
746 
747  r1hm2y = *(job->r1H2ptr + (here->MESdrainPrimeNode)) -
748  *(job->r1H2ptr + (here->MESsourcePrimeNode));
749  i1hm2y = -(*(job->i1H2ptr + (here->MESdrainPrimeNode)) -
750  *(job->i1H2ptr + (here->MESsourcePrimeNode)));
751 
752  /* loading starts here */
753  /* loading cdrain term */
754 
755  temp = DFnF12(here->cdr_x2,
756  here->cdr_z2,
757  0.0,
758  here->cdr_xz,
759  0.0,
760  0.0,
761  r1h1x,
762  i1h1x,
763  r1h1y,
764  i1h1y,
765  0.0,
766  0.0,
767  r1hm2x,
768  i1hm2x,
769  r1hm2y,
770  i1hm2y,
771  0.0,
772  0.0);
773 
774  itemp = DFiF12(here->cdr_x2,
775  here->cdr_z2,
776  0.0,
777  here->cdr_xz,
778  0.0,
779  0.0,
780  r1h1x,
781  i1h1x,
782  r1h1y,
783  i1h1y,
784  0.0,
785  0.0,
786  r1hm2x,
787  i1hm2x,
788  r1hm2y,
789  i1hm2y,
790  0.0,
791  0.0);
792 
793  *(ckt->CKTrhs + (here->MESdrainPrimeNode)) -= temp;
794  *(ckt->CKTirhs + (here->MESdrainPrimeNode)) -= itemp;
795  *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
796  *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
797 
798  /* cdrain term over */
799 
800  /* loading ggs term */
801 
802  temp = D1nF12(here->ggs2,
803  r1h1x,
804  i1h1x,
805  r1hm2x,
806  i1hm2x);
807 
808  itemp = D1iF12(here->ggs2,
809  r1h1x,
810  i1h1x,
811  r1hm2x,
812  i1hm2x);
813 
814 
815  *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
816  *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
817  *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
818  *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
819 
820  /* ggs over */
821 
822  /* loading ggd term */
823 
824  temp = D1nF12(here->ggd2,
825  r1h1x - r1h1y,
826  i1h1x - i1h1y,
827  r1hm2x - r1hm2y,
828  i1hm2x - i1hm2y);
829 
830  itemp = D1iF12(here->ggd2,
831  r1h1x - r1h1y,
832  i1h1x - i1h1y,
833  r1hm2x - r1hm2y,
834  i1hm2x - i1hm2y);
835 
836 
837  *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
838  *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
839  *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp;
840  *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp;
841 
842  /* ggd over */
843 
844  /* loading qgs term */
845 
846  temp = -ckt->CKTomega*
847  DFiF12(here->qgs_x2,
848  here->qgs_y2,
849  0.0,
850  here->qgs_xy,
851  0.0,
852  0.0,
853  r1h1x,
854  i1h1x,
855  r1h1x - r1h1y,
856  i1h1x - i1h1y,
857  0.0,
858  0.0,
859  r1hm2x,
860  i1hm2x,
861  r1hm2x - r1hm2y,
862  i1hm2x - i1hm2y,
863  0.0,
864  0.0);
865 
866  itemp = ckt->CKTomega*
867  DFnF12(here->qgs_x2,
868  here->qgs_y2,
869  0.0,
870  here->qgs_xy,
871  0.0,
872  0.0,
873  r1h1x,
874  i1h1x,
875  r1h1x - r1h1y,
876  i1h1x - i1h1y,
877  0.0,
878  0.0,
879  r1hm2x,
880  i1hm2x,
881  r1hm2x - r1hm2y,
882  i1hm2x - i1hm2y,
883  0.0,
884  0.0);
885 
886  *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
887  *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
888  *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
889  *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
890 
891  /* qgs term over */
892 
893  /* loading qgd term */
894 
895  temp = -ckt->CKTomega*
896  DFiF12(here->qgd_x2,
897  here->qgd_y2,
898  0.0,
899  here->qgd_xy,
900  0.0,
901  0.0,
902  r1h1x,
903  i1h1x,
904  r1h1x - r1h1y,
905  i1h1x - i1h1y,
906  0.0,
907  0.0,
908  r1hm2x,
909  i1hm2x,
910  r1hm2x - r1hm2y,
911  i1hm2x - i1hm2y,
912  0.0,
913  0.0);
914 
915  itemp = ckt->CKTomega*
916  DFnF12(here->qgd_x2,
917  here->qgd_y2,
918  0.0,
919  here->qgd_xy,
920  0.0,
921  0.0,
922  r1h1x,
923  i1h1x,
924  r1h1x - r1h1y,
925  i1h1x - i1h1y,
926  0.0,
927  0.0,
928  r1hm2x,
929  i1hm2x,
930  r1hm2x - r1hm2y,
931  i1hm2x - i1hm2y,
932  0.0,
933  0.0);
934 
935  *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
936  *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
937  *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp;
938  *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp;
939 
940  /* qgd term over */
941  /* all done */
942 
943  break;
944  case D_2F1MF2:
945  /* x = vgs, y = vds */
946 
947  /* getting first order (linear) Volterra kernel */
948  r1h1x = *(job->r1H1ptr + (here->MESgateNode)) -
949  *(job->r1H1ptr + (here->MESsourcePrimeNode));
950  i1h1x = *(job->i1H1ptr + (here->MESgateNode)) -
951  *(job->i1H1ptr + (here->MESsourcePrimeNode));
952 
953  r1h1y = *(job->r1H1ptr + (here->MESdrainPrimeNode)) -
954  *(job->r1H1ptr + (here->MESsourcePrimeNode));
955  i1h1y = *(job->i1H1ptr + (here->MESdrainPrimeNode)) -
956  *(job->i1H1ptr + (here->MESsourcePrimeNode));
957 
958  r2h11x = *(job->r2H11ptr + (here->MESgateNode)) -
959  *(job->r2H11ptr + (here->MESsourcePrimeNode));
960  i2h11x = *(job->i2H11ptr + (here->MESgateNode)) -
961  *(job->i2H11ptr + (here->MESsourcePrimeNode));
962 
963  r2h11y = *(job->r2H11ptr + (here->MESdrainPrimeNode)) -
964  *(job->r2H11ptr + (here->MESsourcePrimeNode));
965  i2h11y = *(job->i2H11ptr + (here->MESdrainPrimeNode)) -
966  *(job->i2H11ptr + (here->MESsourcePrimeNode));
967 
968  r1hm2x = *(job->r1H2ptr + (here->MESgateNode)) -
969  *(job->r1H2ptr + (here->MESsourcePrimeNode));
970  i1hm2x = -(*(job->i1H2ptr + (here->MESgateNode)) -
971  *(job->i1H2ptr + (here->MESsourcePrimeNode)));
972 
973  r1hm2y = *(job->r1H2ptr + (here->MESdrainPrimeNode)) -
974  *(job->r1H2ptr + (here->MESsourcePrimeNode));
975  i1hm2y = -(*(job->i1H2ptr + (here->MESdrainPrimeNode)) -
976  *(job->i1H2ptr + (here->MESsourcePrimeNode)));
977 
978  r2h1m2x = *(job->r2H1m2ptr + (here->MESgateNode)) -
979  *(job->r2H1m2ptr + (here->MESsourcePrimeNode));
980  i2h1m2x = *(job->i2H1m2ptr + (here->MESgateNode)) -
981  *(job->i2H1m2ptr + (here->MESsourcePrimeNode));
982 
983  r2h1m2y = *(job->r2H1m2ptr + (here->MESdrainPrimeNode)) -
984  *(job->r2H1m2ptr + (here->MESsourcePrimeNode));
985  i2h1m2y = *(job->i2H1m2ptr + (here->MESdrainPrimeNode))
986  - *(job->i2H1m2ptr + (here->MESsourcePrimeNode));
987 
988  /* loading starts here */
989  /* loading cdrain term */
990 
991  pass.cxx = here->cdr_x2;
992  pass.cyy = here->cdr_z2;
993  pass.czz = 0.0;
994  pass.cxy = here->cdr_xz;
995  pass.cyz = 0.0;
996  pass.cxz = 0.0;
997  pass.cxxx = here->cdr_x3;
998  pass.cyyy = here->cdr_z3;
999  pass.czzz = 0.0;
1000  pass.cxxy = here->cdr_x2z;
1001  pass.cxxz = 0.0;
1002  pass.cxyy = here->cdr_xz2;
1003  pass.cyyz = 0.0;
1004  pass.cxzz = 0.0;
1005  pass.cyzz = 0.0;
1006  pass.cxyz = 0.0;
1007  pass.r1h1x = r1h1x;
1008  pass.i1h1x = i1h1x;
1009  pass.r1h1y = r1h1y;
1010  pass.i1h1y = i1h1y;
1011  pass.r1h1z = 0.0;
1012  pass.i1h1z = 0.0;
1013  pass.r1h2x = r1hm2x;
1014  pass.i1h2x = i1hm2x;
1015  pass.r1h2y = r1hm2y;
1016  pass.i1h2y = i1hm2y;
1017  pass.r1h2z = 0.0;
1018  pass.i1h2z = 0.0;
1019  pass.r2h11x = r2h11x;
1020  pass.i2h11x = i2h11x;
1021  pass.r2h11y = r2h11y;
1022  pass.i2h11y = i2h11y;
1023  pass.r2h11z = 0.0;
1024  pass.i2h11z = 0.0;
1025  pass.h2f1f2x = r2h1m2x;
1026  pass.ih2f1f2x = i2h1m2x;
1027  pass.h2f1f2y = r2h1m2y;
1028  pass.ih2f1f2y = i2h1m2y;
1029  pass.h2f1f2z = 0.0;
1030  pass.ih2f1f2z = 0.0;
1031  temp = DFn2F12(&pass);
1032 
1033  itemp = DFi2F12(&pass);
1034 
1035  *(ckt->CKTrhs + (here->MESdrainPrimeNode)) -= temp;
1036  *(ckt->CKTirhs + (here->MESdrainPrimeNode)) -= itemp;
1037  *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
1038  *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
1039 
1040  /* cdrain term over */
1041 
1042  /* loading ggs term */
1043 
1044  temp = D1n2F12(here->ggs2,
1045  here->ggs3,
1046  r1h1x,
1047  i1h1x,
1048  r1hm2x,
1049  i1hm2x,
1050  r2h11x,
1051  i2h11x,
1052  r2h1m2x,
1053  i2h1m2x);
1054 
1055  itemp = D1i2F12(here->ggs2,
1056  here->ggs3,
1057  r1h1x,
1058  i1h1x,
1059  r1hm2x,
1060  i1hm2x,
1061  r2h11x,
1062  i2h11x,
1063  r2h1m2x,
1064  i2h1m2x);
1065 
1066 
1067  *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
1068  *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
1069  *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
1070  *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
1071 
1072  /* ggs over */
1073 
1074  /* loading ggd term */
1075 
1076  temp = D1n2F12(here->ggd2,
1077  here->ggd3,
1078  r1h1x - r1h1y,
1079  i1h1x - i1h1y,
1080  r1hm2x - r1hm2y,
1081  i1hm2x - i1hm2y,
1082  r2h11x - r2h11y,
1083  i2h11x - i2h11y,
1084  r2h1m2x - r2h1m2y,
1085  i2h1m2x - i2h1m2y);
1086 
1087  itemp = D1i2F12(here->ggd2,
1088  here->ggd3,
1089  r1h1x - r1h1y,
1090  i1h1x - i1h1y,
1091  r1hm2x - r1hm2y,
1092  i1hm2x - i1hm2y,
1093  r2h11x - r2h11y,
1094  i2h11x - i2h11y,
1095  r2h1m2x - r2h1m2y,
1096  i2h1m2x - i2h1m2y);
1097 
1098 
1099 
1100  *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
1101  *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
1102  *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp;
1103  *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp;
1104 
1105  /* ggd over */
1106 
1107  /* loading qgs term */
1108 
1109  pass.cxx = here->qgs_x2;
1110  pass.cyy = here->qgs_y2;
1111  pass.czz = 0.0;
1112  pass.cxy = here->qgs_xy;
1113  pass.cyz = 0.0;
1114  pass.cxz = 0.0;
1115  pass.cxxx = here->qgs_x3;
1116  pass.cyyy = here->qgs_y3;
1117  pass.czzz = 0.0;
1118  pass.cxxy = here->qgs_x2y;
1119  pass.cxxz = 0.0;
1120  pass.cxyy = here->qgs_xy2;
1121  pass.cyyz = 0.0;
1122  pass.cxzz = 0.0;
1123  pass.cyzz = 0.0;
1124  pass.cxyz = 0.0;
1125  pass.r1h1x = r1h1x;
1126  pass.i1h1x = i1h1x;
1127  pass.r1h1y = r1h1x - r1h1y;
1128  pass.i1h1y = i1h1x - i1h1y;
1129  pass.r1h1z = 0.0;
1130  pass.i1h1z = 0.0;
1131  pass.r1h2x = r1hm2x;
1132  pass.i1h2x = i1hm2x;
1133  pass.r1h2y = r1hm2x - r1hm2y;
1134  pass.i1h2y = i1hm2x - i1hm2y;
1135  pass.r1h2z = 0.0;
1136  pass.i1h2z = 0.0;
1137  pass.r2h11x = r2h11x;
1138  pass.i2h11x = i2h11x;
1139  pass.r2h11y = r2h11x - r2h11y;
1140  pass.i2h11y = i2h11x - i2h11y;
1141  pass.r2h11z = 0.0;
1142  pass.i2h11z = 0.0;
1143  pass.h2f1f2x = r2h1m2x;
1144  pass.ih2f1f2x = i2h1m2x;
1145  pass.h2f1f2y = r2h1m2x - r2h1m2y;
1146  pass.ih2f1f2y = i2h1m2x - i2h1m2y;
1147  pass.h2f1f2z = 0.0;
1148  pass.ih2f1f2z = 0.0;
1149  temp = -ckt->CKTomega*DFi2F12(&pass);
1150 
1151  itemp = ckt->CKTomega*DFn2F12(&pass);
1152 
1153  *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
1154  *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
1155  *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
1156  *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
1157 
1158  /* qgs term over */
1159 
1160  /* loading qgd term */
1161 
1162  pass.cxx = here->qgd_x2;
1163  pass.cyy = here->qgd_y2;
1164  pass.czz = 0.0;
1165  pass.cxy = here->qgd_xy;
1166  pass.cyz = 0.0;
1167  pass.cxz = 0.0;
1168  pass.cxxx = here->qgd_x3;
1169  pass.cyyy = here->qgd_y3;
1170  pass.czzz = 0.0;
1171  pass.cxxy = here->qgd_x2y;
1172  pass.cxxz = 0.0;
1173  pass.cxyy = here->qgd_xy2;
1174  pass.cyyz = 0.0;
1175  pass.cxzz = 0.0;
1176  pass.cyzz = 0.0;
1177  pass.cxyz = 0.0;
1178  pass.r1h1x = r1h1x;
1179  pass.i1h1x = i1h1x;
1180  pass.r1h1y = r1h1x - r1h1y;
1181  pass.i1h1y = i1h1x - i1h1y;
1182  pass.r1h1z = 0.0;
1183  pass.i1h1z = 0.0;
1184  pass.r1h2x = r1hm2x;
1185  pass.i1h2x = i1hm2x;
1186  pass.r1h2y = r1hm2x - r1hm2y;
1187  pass.i1h2y = i1hm2x - i1hm2y;
1188  pass.r1h2z = 0.0;
1189  pass.i1h2z = 0.0;
1190  pass.r2h11x = r2h11x;
1191  pass.i2h11x = i2h11x;
1192  pass.r2h11y = r2h11x - r2h11y;
1193  pass.i2h11y = i2h11x - i2h11y;
1194  pass.r2h11z = 0.0;
1195  pass.i2h11z = 0.0;
1196  pass.h2f1f2x = r2h1m2x;
1197  pass.ih2f1f2x = i2h1m2x;
1198  pass.h2f1f2y = r2h1m2x - r2h1m2y;
1199  pass.ih2f1f2y = i2h1m2x - i2h1m2y;
1200  pass.h2f1f2z = 0.0;
1201  pass.ih2f1f2z = 0.0;
1202  temp = -ckt->CKTomega*DFi2F12(&pass);
1203 
1204  itemp = ckt->CKTomega*DFn2F12(&pass);
1205 
1206  *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
1207  *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
1208  *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp;
1209  *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp;
1210 
1211  /* qgd term over */
1212  /* all done */
1213 
1214  break;
1215  default:
1216 ;
1217  }
1218  }
1219 }
1220 return(OK);
1221 }
1222 else
1223  return(E_BADPARM);
1224 }
double DFnF12()
#define D_SETUP
Definition: distodef.h:158
double D1n2F1()
double * i1H2ptr
Definition: distodef.h:116
if(TDesc==NULL)
Definition: cd.c:1326
double DFn2F12()
MESinstance * MESinstances
Definition: mesdefs.h:163
double D1n3F1()
#define E_BADPARM
Definition: iferrmsg.h:26
double * r1H1ptr
Definition: distodef.h:109
double DFi2F1()
double DFn3F1()
double * r2H1m2ptr
Definition: distodef.h:119
struct sMESmodel * MESnextModel
Definition: mesdefs.h:161
double * r1H2ptr
Definition: distodef.h:115
#define OK
Definition: iferrmsg.h:17
#define D_2F1MF2
Definition: distodef.h:165
#define NULL
Definition: spdefs.h:121
double * i2H1m2ptr
Definition: distodef.h:120
double D1i2F12()
double D1i2F1()
double DFiF12()
double * r2H11ptr
Definition: distodef.h:111
double * i2H11ptr
Definition: distodef.h:112
int MESdSetup(GENmodel *inModel, CKTcircuit *ckt)
Definition: mesdset.c:18
double DFi2F12()
static char model[32]
Definition: subckt.c:76
double D1iF12()
double DFi3F1()
double DFn2F1()
int MESdisto(int mode, GENmodel *genmodel, CKTcircuit *ckt)
Definition: mesdisto.c:18
#define D_TWOF1
Definition: distodef.h:161
#define D_F1PF2
Definition: distodef.h:163
double * i1H1ptr
Definition: distodef.h:110
#define D_F1MF2
Definition: distodef.h:164
#define D_THRF1
Definition: distodef.h:162
double D1nF12()
double D1n2F12()
double D1i3F1()