My Project  0.0.16
QUCS Mapping
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
phototransistor.core.cpp
Go to the documentation of this file.
1 /*
2  * phototransistor.core.cpp - device implementations for phototransistor module
3  *
4  * This is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2, or (at your option)
7  * any later version.
8  *
9  */
10 
11 #if HAVE_CONFIG_H
12 #include <config.h>
13 #endif
14 
16 #include "component.h"
17 #include "device.h"
18 #include "phototransistor.core.h"
19 
20 #ifndef CIR_phototransistor
21 #define CIR_phototransistor -1
22 #endif
23 
24 // external nodes
25 #define Collector 0
26 #define Base 1
27 #define Emitter 2
28 #define Power 3
29 #define Wavelength 4
30 // internal nodes
31 #define CI 5
32 #define BI 6
33 #define BI2 7
34 #define EI 8
35 
36 // useful macro definitions
37 #define NP(node) real (getV (node))
38 #define BP(pnode,nnode) (NP(pnode) - NP(nnode))
39 #define _load_static_residual2(pnode,nnode,current)\
40  _rhs[pnode] -= current;\
41  _rhs[nnode] += current;
42 #define _load_static_augmented_residual2(pnode,nnode,current)\
43  _rhs[pnode] -= current;\
44  _rhs[nnode] += current;
45 #define _load_static_residual1(node,current)\
46  _rhs[node] -= current;
47 #define _load_static_augmented_residual1(node,current)\
48  _rhs[node] -= current;
49 #define _load_static_jacobian4(pnode,nnode,vpnode,vnnode,conductance)\
50  _jstat[pnode][vpnode] += conductance;\
51  _jstat[nnode][vnnode] += conductance;\
52  _jstat[pnode][vnnode] -= conductance;\
53  _jstat[nnode][vpnode] -= conductance;\
54  if (doHB) {\
55  _ghs[pnode] += conductance * BP(vpnode,vnnode);\
56  _ghs[nnode] -= conductance * BP(vpnode,vnnode);\
57  } else {\
58  _rhs[pnode] += conductance * BP(vpnode,vnnode);\
59  _rhs[nnode] -= conductance * BP(vpnode,vnnode);\
60  }
61 #define _load_static_jacobian2p(node,vpnode,vnnode,conductance)\
62  _jstat[node][vpnode] += conductance;\
63  _jstat[node][vnnode] -= conductance;\
64  if (doHB) {\
65  _ghs[node] += conductance * BP(vpnode,vnnode);\
66  } else {\
67  _rhs[node] += conductance * BP(vpnode,vnnode);\
68  }
69 #define _load_static_jacobian2s(pnode,nnode,node,conductance)\
70  _jstat[pnode][node] += conductance;\
71  _jstat[nnode][node] -= conductance;\
72  if (doHB) {\
73  _ghs[pnode] += conductance * NP(node);\
74  _ghs[nnode] -= conductance * NP(node);\
75  } else {\
76  _rhs[pnode] += conductance * NP(node);\
77  _rhs[nnode] -= conductance * NP(node);\
78  }
79 #define _load_static_jacobian1(node,vnode,conductance)\
80  _jstat[node][vnode] += conductance;\
81  if (doHB) {\
82  _ghs[node] += conductance * NP(vnode);\
83  } else {\
84  _rhs[node] += conductance * NP(vnode);\
85  }
86 #define _load_dynamic_residual2(pnode,nnode,charge)\
87  if (doTR) _charges[pnode][nnode] += charge;\
88  if (doHB) {\
89  _qhs[pnode] -= charge;\
90  _qhs[nnode] += charge;\
91  }
92 #define _load_dynamic_residual1(node,charge)\
93  if (doTR) _charges[node][node] += charge;\
94  if (doHB) {\
95  _qhs[node] -= charge;\
96  }
97 #define _load_dynamic_jacobian4(pnode,nnode,vpnode,vnnode,capacitance)\
98  if (doAC) {\
99  _jdyna[pnode][vpnode] += capacitance;\
100  _jdyna[nnode][vnnode] += capacitance;\
101  _jdyna[pnode][vnnode] -= capacitance;\
102  _jdyna[nnode][vpnode] -= capacitance;\
103  }\
104  if (doTR) {\
105  _caps[pnode][nnode][vpnode][vnnode] += capacitance;\
106  }\
107  if (doHB) {\
108  _chs[pnode] += capacitance * BP(vpnode,vnnode);\
109  _chs[nnode] -= capacitance * BP(vpnode,vnnode);\
110  }
111 #define _load_dynamic_jacobian2s(pnode,nnode,vnode,capacitance)\
112  if (doAC) {\
113  _jdyna[pnode][vnode] += capacitance;\
114  _jdyna[nnode][vnode] -= capacitance;\
115  }\
116  if (doTR) {\
117  _caps[pnode][nnode][vnode][vnode] += capacitance;\
118  }\
119  if (doHB) {\
120  _chs[pnode] += capacitance * NP(vnode);\
121  _chs[nnode] -= capacitance * NP(vnode);\
122  }
123 #define _load_dynamic_jacobian2p(node,vpnode,vnnode,capacitance)\
124  if (doAC) {\
125  _jdyna[node][vpnode] += capacitance;\
126  _jdyna[node][vnnode] -= capacitance;\
127  }\
128  if (doTR) {\
129  _caps[node][node][vpnode][vnnode] += capacitance;\
130  }\
131  if (doHB) {\
132  _chs[node] += capacitance * BP(vpnode,vnnode);\
133  }
134 #define _load_dynamic_jacobian1(node,vnode,capacitance)\
135  if (doAC) {\
136  _jdyna[node][vnode] += capacitance;\
137  }\
138  if (doTR) {\
139  _caps[node][node][vnode][vnode] += capacitance;\
140  }\
141  if (doHB) {\
142  _chs[node] += capacitance * NP(vnode);\
143  }
144 
145 #define _save_whitenoise1(n1,pwr,type)\
146  _white_pwr[n1][n1] += pwr;
147 #define _save_whitenoise2(n1,n2,pwr,type)\
148  _white_pwr[n1][n2] += pwr;
149 #define _save_flickernoise1(n1,pwr,exp,type)\
150  _flicker_pwr[n1][n1] += pwr;\
151  _flicker_exp[n1][n1] += exp;
152 #define _save_flickernoise2(n1,n2,pwr,exp,type)\
153  _flicker_pwr[n1][n2] += pwr;\
154  _flicker_exp[n1][n2] += exp;
155 #define _load_whitenoise2(n1,n2,pwr)\
156  cy (n1,n2) -= pwr/kB/T0; cy (n2,n1) -= pwr/kB/T0;\
157  cy (n1,n1) += pwr/kB/T0; cy (n2,n2) += pwr/kB/T0;
158 #define _load_whitenoise1(n1,pwr)\
159  cy (n1,n1) += pwr/kB/T0;
160 #define _load_flickernoise2(n1,n2,pwr,exp)\
161  cy (n1,n2) -= pwr*pow(_freq,-exp)/kB/T0;\
162  cy (n2,n1) -= pwr*pow(_freq,-exp)/kB/T0;\
163  cy (n1,n1) += pwr*pow(_freq,-exp)/kB/T0;\
164  cy (n2,n2) += pwr*pow(_freq,-exp)/kB/T0;
165 #define _load_flickernoise1(n1,pwr,exp)\
166  cy (n1,n1) += pwr*pow(_freq,-exp)/kB/T0;
167 
168 // derivative helper macros
169 #define m00_hypot(v00,x,y) v00 = xhypot(x,y);
170 #define m10_hypot(v10,v00,x,y) v10 = (x)/(v00);
171 #define m11_hypot(v11,v00,x,y) v11 = (y)/(v00);
172 #define m00_max(v00,x,y) v00 = ((x)>(y))?(x):(y);
173 #define m10_max(v10,v00,x,y) v10 = ((x)>(y))?1.0:0.0;
174 #define m11_max(v11,v00,x,y) v11 = ((x)>(y))?0.0:1.0;
175 #define m00_min(v00,x,y) v00 = ((x)<(y))?(x):(y);
176 #define m10_min(v10,v00,x,y) v10 = ((x)<(y))?1.0:0.0;
177 #define m11_min(v11,v00,x,y) v11 = ((x)<(y))?0.0:1.0;
178 #define m00_pow(v00,x,y) v00 = pow(x,y);
179 #define m10_pow(v10,v00,x,y) v10 = (x==0.0)?0.0:(v00)*(y)/(x);
180 #define m11_pow(v11,v00,x,y) v11 = (x==0.0)?0.0:(log(x)*(v00));
181 
182 #define m00_div(v00,v10,x,y) double v10=1/(y); double v00=(x)*v10;
183 #define m10_div(v10,v00,vv,x,y)
184 #define m11_div(v11,v00,vv,x,y) double v11 = -v00*vv;
185 
186 #define m00_mult(v00,v10,v11,x,y) double v10=(x); double v11=(y); double v00=v10*v11;
187 #define m00_add(v00,x,y) double v00=(x)+(y);
188 
189 #define m00_cos(v00,x) v00 = cos(x);
190 #define m10_cos(v10,v00,x) v10 = (-sin(x));
191 #define m00_sin(v00,x) v00 = sin(x);
192 #define m10_sin(v10,v00,x) v10 = (cos(x));
193 #define m00_tan(v00,x) v00 = tan(x);
194 #define m10_tan(v10,v00,x) v10 = (1.0/cos(x)/cos(x));
195 #define m00_cosh(v00,x) v00 = cosh(x);
196 #define m10_cosh(v10,v00,x) v10 = (sinh(x));
197 #define m00_sinh(v00,x) v00 = sinh(x);
198 #define m10_sinh(v10,v00,x) v10 = (cosh(x));
199 #define m00_tanh(v00,x) v00 = tanh(x);
200 #define m10_tanh(v10,v00,x) v10 = (1.0/cosh(x)/cosh(x));
201 #define m00_acos(v00,x) v00 = acos(x);
202 #define m10_acos(v10,v00,x) v10 = (-1.0/sqrt(1-x*x));
203 #define m00_asin(v00,x) v00 = asin(x);
204 #define m10_asin(v10,v00,x) v10 = (+1.0/sqrt(1-x*x));
205 #define m00_atan(v00,x) v00 = atan(x);
206 #define m10_atan(v10,v00,x) v10 = (+1.0/(1+x*x));
207 #define m00_atanh(v00,x) v00 = atanh(x);
208 #define m10_atanh(v10,v00,x) v10 = (+1.0/(1-x*x));
209 #define m00_logE(v00,x) v00 = log(x);
210 #define m10_logE(v10,v00,x) v10 = (1.0/x);
211 #define m00_log10(v00,x) v00 = log10(x);
212 #define m10_log10(v10,v00,x) v10 = (1.0/x/M_LN10);
213 #define m00_sqrt(v00,x) v00 = sqrt(x);
214 #define m10_sqrt(v10,v00,x) v10 = (0.5/v00);
215 #define m00_fabs(v00,x) v00 = fabs(x);
216 #define m10_fabs(v10,v00,x) v10 = (((x)>=0)?(+1.0):(-1.0));
217 
218 #define m00_exp(v00,x) v00 = exp(x);
219 #define m10_exp(v10,v00,x) v10 = v00;
220 
221 #define m00_abs(v00) ((v00)<(0)?(-(v00)):(v00))
222 #define m00_floor(v00,x) v00 = floor(x);
223 #define m00_limexp(v00,x) v00 = ((x)<80.0?exp(x):exp(80.0)*(x-79.0));
224 #define m10_limexp(v10,v00,x) v10 = ((x)<80.0?(v00):exp(80.0));
225 
226 #define m20_logE(v00) (-1.0/v00/v00)
227 #define m20_exp(v00) exp(v00)
228 #define m20_limexp(v00) ((v00)<80.0?exp(v00):0.0)
229 #define m20_sqrt(v00) (-0.25/(v00)/sqrt(v00))
230 #define m20_fabs(v00) 0.0
231 #define m20_pow(x,y) ((y)*((y)-1.0)*pow(x,y)/(x)/(x))
232 #define m00_vt(x) (kBoverQ*(x))
233 #define m10_vt(x) (kBoverQ)
234 
235 // simulator specific definitions
236 #define _modelname "phototransistor"
237 #define _instancename getName()
238 #define _circuit_temp (getPropertyDouble("Temp")+273.15)
239 #define _param_given(p) (isPropertyGiven(p)?1:0)
240 
241 
242 // $vt and $vt() functions
243 #define _vt_nom (kBoverQ*_circuit_temp)
244 
245 using namespace device;
246 
247 /* Device constructor. */
249 {
250  type = CIR_phototransistor;
251 }
252 
253 /* Initialization of model. */
254 void phototransistor::initModel (void)
255 {
256  // create internal nodes
257  setInternalNode (CI, "CI");
258  setInternalNode (BI, "BI");
259  setInternalNode (BI2, "BI2");
260  setInternalNode (EI, "EI");
261 
262  // get device model parameters
263  loadVariables ();
264  // evaluate global model equations
265  initializeModel ();
266  // evaluate initial step equations
267  initialStep ();
268  // evaluate global instance equations
269  initializeInstance ();
270 }
271 
272 /* Initialization of DC analysis. */
274 {
275  allocMatrixMNA ();
276  initModel ();
277  pol = 1;
278  restartDC ();
279  doAC = 1;
280  doTR = 0;
281  doHB = 0;
282 }
283 
284 /* Run when DC is restarted (fallback algorithms). */
286 {
287 }
288 
289 /* Initialize Verilog-AMS code. */
290 void phototransistor::initVerilog (void)
291 {
292  // initialization of noise variables
293  _white_pwr[CI][EI] = 0.0;
294  _white_pwr[BI][EI] = 0.0;
295  _white_pwr[EI][Emitter] = 0.0;
296  _white_pwr[BI2][BI] = 0.0;
297  _white_pwr[Base][BI2] = 0.0;
298  _white_pwr[Collector][CI] = 0.0;
299  _flicker_pwr[BI][EI] = 0.0;
300  _flicker_exp[BI][EI] = 0.0;
301 
302  int i1, i2, i3, i4;
303 
304  // zero charges
305  for (i1 = 0; i1 < 9; i1++) {
306  for (i2 = 0; i2 < 9; i2++) {
307  _charges[i1][i2] = 0.0;
308  } }
309 
310  // zero capacitances
311  for (i1 = 0; i1 < 9; i1++) {
312  for (i2 = 0; i2 < 9; i2++) {
313  for (i3 = 0; i3 < 9; i3++) {
314  for (i4 = 0; i4 < 9; i4++) {
315  _caps[i1][i2][i3][i4] = 0.0;
316  } } } }
317 
318  // zero right hand side, static and dynamic jacobian
319  for (i1 = 0; i1 < 9; i1++) {
320  _rhs[i1] = 0.0;
321  _qhs[i1] = 0.0;
322  _chs[i1] = 0.0;
323  _ghs[i1] = 0.0;
324  for (i2 = 0; i2 < 9; i2++) {
325  _jstat[i1][i2] = 0.0;
326  _jdyna[i1][i2] = 0.0;
327  }
328  }
329 }
330 
331 /* Load device model input parameters. */
332 void phototransistor::loadVariables (void)
333 {
334  Bf = getPropertyDouble ("Bf");
335  Br = getPropertyDouble ("Br");
336  Is = getPropertyDouble ("Is");
337  Nf = getPropertyDouble ("Nf");
338  Nr = getPropertyDouble ("Nr");
339  Vaf = getPropertyDouble ("Vaf");
340  Var = getPropertyDouble ("Var");
341  Mje = getPropertyDouble ("Mje");
342  Vje = getPropertyDouble ("Vje");
343  Cje = getPropertyDouble ("Cje");
344  Mjc = getPropertyDouble ("Mjc");
345  Vjc = getPropertyDouble ("Vjc");
346  Cjc = getPropertyDouble ("Cjc");
347  Tr = getPropertyDouble ("Tr");
348  Tf = getPropertyDouble ("Tf");
349  Ikf = getPropertyDouble ("Ikf");
350  Ikr = getPropertyDouble ("Ikr");
351  Rc = getPropertyDouble ("Rc");
352  Re = getPropertyDouble ("Re");
353  Rb = getPropertyDouble ("Rb");
354  Kf = getPropertyDouble ("Kf");
355  Ffe = getPropertyDouble ("Ffe");
356  Af = getPropertyDouble ("Af");
357  Responsivity = getPropertyDouble ("Responsivity");
358  P0 = getPropertyDouble ("P0");
359  P1 = getPropertyDouble ("P1");
360  P2 = getPropertyDouble ("P2");
361  P3 = getPropertyDouble ("P3");
362  P4 = getPropertyDouble ("P4");
363 }
364 
365 /* #define's for translated code */
366 #undef _DDT
367 #define _DDT(q) q
368 #define _DYNAMIC
369 #define _DERIVATE
370 #define _DDX
371 #define _DERIVATEFORDDX
372 
373 /* Evaluate Verilog-AMS equations in model initialization. */
374 void phototransistor::initializeModel (void)
375 {
376 }
377 
378 /* Evaluate Verilog-AMS equations in instance initialization. */
379 void phototransistor::initializeInstance (void)
380 {
381 }
382 
383 /* Evaluate Verilog-AMS equations in initial step. */
384 void phototransistor::initialStep (void)
385 {
386 double con7;
387 #if defined(_DYNAMIC)
388 #endif
389 #if defined(_DYNAMIC)
390 #endif
391 #if defined(_DYNAMIC)
392 #endif
393 #if defined(_DYNAMIC)
394 #endif
395 double VT;
396 {
397 VT=((1.3806503e-23*300)/1.602176462e-19);
398 con1=(1/(Nf*VT));
399 con2=(1/(Nr*VT));
400 #if defined(_DYNAMIC)
401 con3=(1-Mje);
402 #endif
403 #if defined(_DYNAMIC)
404 con4=(1-Mjc);
405 #endif
406 #if defined(_DYNAMIC)
407 {
408 double m00_pow(d00_pow0,2,Mje)
409 con5=d00_pow0;
410 }
411 #endif
412 #if defined(_DYNAMIC)
413 {
414 double m00_pow(d00_pow0,2,Mjc)
415 con6=d00_pow0;
416 }
417 #endif
418 #if defined(_DYNAMIC)
419 con7=(Rb/2);
420 #endif
421 con8=(2/Rb);
422 con9=(1/Rc);
423 con10=(1/Re);
424 TwoQ=(2*1.602176462e-19);
425 FourKT=((4*1.3806503e-23)*_circuit_temp);
426 GMIN=1e-12;
427 }
428 }
429 
430 /* Evaluate Verilog-AMS equations in final step. */
431 void phototransistor::finalStep (void)
432 {
433 }
434 
435 /* Evaluate Verilog-AMS equations in analog block. */
436 void phototransistor::calcVerilog (void)
437 {
438 
439 /* ----------------- evaluate verilog analog equations -------------------- */
440 double RelSensitivity;
441 #if defined(_DERIVATE)
442 double RelSensitivity_VWavelength_GND;
443 #endif
444 #if defined(_DYNAMIC)
445 double Q1;
446 #if defined(_DERIVATE)
447 double Q1_VBI_EI;
448 double Q1_VBI_CI;
449 #endif
450 #endif
451 double IE;
452 #if defined(_DERIVATE)
453 double IE_VEI_Emitter;
454 #endif
455 double IC;
456 #if defined(_DERIVATE)
457 double IC_VCollector_CI;
458 #endif
459 double IB;
460 #if defined(_DERIVATE)
461 double IB_VBI2_BI;
462 #endif
463 double q2;
464 #if defined(_DERIVATE)
465 double q2_VBI_EI;
466 double q2_VBI_CI;
467 #endif
468 double q1;
469 #if defined(_DERIVATE)
470 double q1_VBI_CI;
471 double q1_VBI_EI;
472 #endif
473 double IEC;
474 #if defined(_DERIVATE)
475 double IEC_VBI_CI;
476 #endif
477 double ICC;
478 #if defined(_DERIVATE)
479 double ICC_VBI_EI;
480 #endif
481 {
482 double m00_limexp(d00_limexp0,(BP(BI,EI)*con1))
483 #if defined(_DERIVATE)
484 double m10_limexp(d10_limexp0,d00_limexp0,(BP(BI,EI)*con1))
485 #endif
486 #if defined(_DERIVATE)
487 ICC_VBI_EI=(Is*(con1)*d10_limexp0);
488 #endif
489 ICC=(Is*(d00_limexp0-1));
490 }
491 {
492 double m00_limexp(d00_limexp0,(BP(BI,CI)*con2))
493 #if defined(_DERIVATE)
494 double m10_limexp(d10_limexp0,d00_limexp0,(BP(BI,CI)*con2))
495 #endif
496 #if defined(_DERIVATE)
497 IEC_VBI_CI=(Is*(con2)*d10_limexp0);
498 #endif
499 IEC=(Is*(d00_limexp0-1));
500 }
501 #if defined(_DERIVATE)
502 q1_VBI_CI=(1/Vaf);
503 q1_VBI_EI=(1/Var);
504 #endif
505 q1=((1+(BP(BI,CI)/Vaf))+(BP(BI,EI)/Var));
506 #if defined(_DERIVATE)
507 q2_VBI_EI=(ICC_VBI_EI/Ikf);
508 q2_VBI_CI=(IEC_VBI_CI/Ikr);
509 #endif
510 q2=((ICC/Ikf)+(IEC/Ikr));
511 #if defined(_DERIVATE)
512 IB_VBI2_BI=(con8);
513 #endif
514 IB=(BP(BI2,BI)*con8);
515 #if defined(_DERIVATE)
516 IC_VCollector_CI=(con9);
517 #endif
518 IC=(BP(Collector,CI)*con9);
519 #if defined(_DERIVATE)
520 IE_VEI_Emitter=(con10);
521 #endif
522 IE=(BP(EI,Emitter)*con10);
524 #if defined(_DERIVATE)
526 #endif
528 #if defined(_DERIVATE)
530 #endif
532 #if defined(_DERIVATE)
533 _load_static_jacobian4(BI2,BI,BI2,BI,IB_VBI2_BI);
534 #endif
536 #if defined(_DERIVATE)
537 _load_static_jacobian4(EI,Emitter,EI,Emitter,IE_VEI_Emitter);
538 #endif
539 _load_static_residual2(BI,CI,((IEC/Br)+(GMIN*BP(BI,CI))));
540 #if defined(_DERIVATE)
541 _load_static_jacobian4(BI,CI,BI,CI,((IEC_VBI_CI/Br)+(GMIN)));
542 #endif
543 _load_static_residual2(BI,EI,((ICC/Bf)+(GMIN*BP(BI,EI))));
544 #if defined(_DERIVATE)
545 _load_static_jacobian4(BI,EI,BI,EI,((ICC_VBI_EI/Bf)+(GMIN)));
546 #endif
547 {
548 double m00_sqrt(d00_sqrt0,(1+(4*q2)))
549 #if defined(_DERIVATE)
550 double m10_sqrt(d10_sqrt0,d00_sqrt0,(1+(4*q2)))
551 #endif
552 _load_static_residual2(CI,EI,((ICC-IEC)/(1e-20+((q1/2)*(1+d00_sqrt0)))));
553 #if defined(_DERIVATE)
554 _load_static_jacobian4(CI,EI,BI,CI,(((-IEC_VBI_CI)*(1e-20+((q1/2)*(1+d00_sqrt0)))-(ICC-IEC)*(((q1_VBI_CI/2)*(1+d00_sqrt0))+((q1/2)*(4*q2_VBI_CI)*d10_sqrt0)))/(1e-20+((q1/2)*(1+d00_sqrt0)))/(1e-20+((q1/2)*(1+d00_sqrt0)))));
555 _load_static_jacobian4(CI,EI,BI,EI,((ICC_VBI_EI*(1e-20+((q1/2)*(1+d00_sqrt0)))-(ICC-IEC)*(((q1_VBI_EI/2)*(1+d00_sqrt0))+((q1/2)*(4*q2_VBI_EI)*d10_sqrt0)))/(1e-20+((q1/2)*(1+d00_sqrt0)))/(1e-20+((q1/2)*(1+d00_sqrt0)))));
556 #endif
557 }
558 #if defined(_DYNAMIC)
559 {
560 double m00_pow(d00_pow0,(1-BP(BI,CI)),con4)
561 #if defined(_DERIVATE)
562 double m10_pow(d10_pow0,d00_pow0,(1-BP(BI,CI)),con4)
563 #endif
564 #if defined(_DERIVATE)
565 Q1_VBI_EI=0.0;
566 Q1_VBI_CI=((BP(BI,CI)>(Vjc/2))?((Tr*IEC_VBI_CI)+((Cjc*con6)*(((((Mjc)*BP(BI,CI))+(Mjc*BP(BI,CI)))/Vjc)+(con4)))):((Tr*IEC_VBI_CI)+(Cjc*((Vjc/con4)*(-(d10_pow0*(-1.0)))))));
567 #endif
568 Q1=((BP(BI,CI)>(Vjc/2))?((Tr*IEC)+((Cjc*con6)*((((Mjc*BP(BI,CI))*BP(BI,CI))/Vjc)+(con4*BP(BI,CI))))):((Tr*IEC)+(Cjc*((Vjc/con4)*(1-d00_pow0)))));
569 }
570 #endif
571 #if defined(_DYNAMIC)
573 #if defined(_DERIVATE)
574 _load_dynamic_jacobian4(BI,CI,BI,CI,Q1_VBI_CI);
575 #endif
576 #endif
577 #if defined(_DYNAMIC)
578 {
579 double m00_pow(d00_pow0,(1-BP(BI,EI)),con3)
580 #if defined(_DERIVATE)
581 double m10_pow(d10_pow0,d00_pow0,(1-BP(BI,EI)),con3)
582 #endif
583 #if defined(_DERIVATE)
584 Q1_VBI_EI=((BP(BI,EI)>(Vje/2))?((Tf*ICC_VBI_EI)+((Cje*con5)*(((((Mje)*BP(BI,EI))+(Mje*BP(BI,EI)))/Vje)+(con3)))):((Tf*ICC_VBI_EI)+(Cje*((Vje/con3)*(-(d10_pow0*(-1.0)))))));
585 Q1_VBI_CI=0.0;
586 #endif
587 Q1=((BP(BI,EI)>(Vje/2))?((Tf*ICC)+((Cje*con5)*((((Mje*BP(BI,EI))*BP(BI,EI))/Vje)+(con3*BP(BI,EI))))):((Tf*ICC)+(Cje*((Vje/con3)*(1-d00_pow0)))));
588 }
589 #endif
590 #if defined(_DYNAMIC)
592 #if defined(_DERIVATE)
593 _load_dynamic_jacobian4(BI,EI,BI,CI,Q1_VBI_CI);
594 _load_dynamic_jacobian4(BI,EI,BI,EI,Q1_VBI_EI);
595 #endif
596 #endif
597 {
598 double m00_pow(d00_pow0,NP(Wavelength),2)
599 double m00_pow(d00_pow1,NP(Wavelength),3)
600 double m00_pow(d00_pow2,NP(Wavelength),4)
601 #if defined(_DERIVATE)
602 double m10_pow(d10_pow0,d00_pow0,NP(Wavelength),2)
603 double m10_pow(d10_pow1,d00_pow1,NP(Wavelength),3)
604 double m10_pow(d10_pow2,d00_pow2,NP(Wavelength),4)
605 #endif
606 #if defined(_DERIVATE)
607 RelSensitivity_VWavelength_GND=((((P1)+(P2*(d10_pow0*1.0)))+(P3*(d10_pow1*1.0)))+(P4*(d10_pow2*1.0)));
608 #endif
609 RelSensitivity=((((P0+(P1*NP(Wavelength)))+(P2*d00_pow0))+(P3*d00_pow1))+(P4*d00_pow2));
610 }
611 _load_static_residual2(CI,BI2,(((Responsivity*RelSensitivity)/(Bf*100))*NP(Power)));
612 #if defined(_DERIVATE)
613 _load_static_jacobian2s(CI,BI2,Power,(((Responsivity*RelSensitivity)/(Bf*100))));
614 _load_static_jacobian2s(CI,BI2,Wavelength,((Responsivity*RelSensitivity_VWavelength_GND)/(Bf*100))*NP(Power));
615 #endif
616 _save_whitenoise2(Collector,CI,(FourKT*con9),"thermal");
617 _save_whitenoise2(Base,BI2,(FourKT*con8),"thermal");
618 _save_whitenoise2(BI2,BI,(FourKT*con8),"thermal");
619 _save_whitenoise2(EI,Emitter,(FourKT*con10),"thermal");
620 _save_whitenoise2(CI,EI,(TwoQ*IC),"shot");
621 _save_whitenoise2(BI,EI,(TwoQ*IB),"shot");
622 _save_flickernoise2(BI,EI,(Kf*pow(IB,Af)),Ffe,"flicker");
623 
624 /* ------------------ end of verilog analog equations --------------------- */
625 
626 /* ------------------ evaluate verilog noise equations -------------------- */
627 
628 /* ------------------- end of verilog noise equations --------------------- */
629 }
630 
631 /* Perform DC iteration. */
633 {
634  // evaluate Verilog code
635  initVerilog ();
636  calcVerilog ();
637 
638  // fill right hand side and static jacobian
639  for (int i1 = 0; i1 < 9; i1++) {
640  setI (i1, _rhs[i1]);
641  for (int i2 = 0; i2 < 9; i2++) {
642  setY (i1, i2, _jstat[i1][i2]);
643  }
644  }
645 }
646 
647 /* Save operating points. */
649 {
650  // save global instance operating points
651  setOperatingPoint ("con1", con1);
652  setOperatingPoint ("con2", con2);
653  setOperatingPoint ("con3", con3);
654  setOperatingPoint ("con4", con4);
655  setOperatingPoint ("con5", con5);
656  setOperatingPoint ("con6", con6);
657  setOperatingPoint ("con8", con8);
658  setOperatingPoint ("con9", con9);
659  setOperatingPoint ("con10", con10);
660  setOperatingPoint ("TwoQ", TwoQ);
661  setOperatingPoint ("FourKT", FourKT);
662  setOperatingPoint ("GMIN", GMIN);
663 }
664 
665 /* Load operating points. */
667 {
668 }
669 
670 /* Calculate operating points. */
672 {
673 }
674 
675 /* Initialization of AC analysis. */
677 {
678  allocMatrixMNA ();
679 }
680 
681 /* Perform AC calculations. */
682 void phototransistor::calcAC (nr_double_t frequency)
683 {
684  setMatrixY (calcMatrixY (frequency));
685 }
686 
687 /* Compute Y-matrix for AC analysis. */
688 matrix phototransistor::calcMatrixY (nr_double_t frequency)
689 {
690  _freq = frequency;
692  matrix y (9);
693 
694  for (int i1 = 0; i1 < 9; i1++) {
695  for (int i2 = 0; i2 < 9; i2++) {
696  y (i1,i2) = rect (_jstat[i1][i2], _jdyna[i1][i2] * 2 * M_PI * _freq);
697  }
698  }
699 
700  return y;
701 }
702 
703 /* Initialization of S-parameter analysis. */
705 {
706  allocMatrixS ();
707 }
708 
709 /* Perform S-parameter calculations. */
710 void phototransistor::calcSP (nr_double_t frequency)
711 {
712  setMatrixS (ytos (calcMatrixY (frequency)));
713 }
714 
715 /* Initialization of transient analysis. */
717 {
718  setStates (2 * 9 * 9);
719  initDC ();
720 }
721 
722 /* Perform transient analysis iteration step. */
723 void phototransistor::calcTR (nr_double_t)
724 {
725  doHB = 0;
726  doAC = 1;
727  doTR = 1;
728  calcDC ();
729 
730  int i1, i2, i3, i4, state;
731 
732  // 2-node charge integrations
733  for (i1 = 0; i1 < 9; i1++) {
734  for (i2 = 0; i2 < 9; i2++) {
735  state = 2 * (i2 + 9 * i1);
736  if (i1 != i2)
737  if (_charges[i1][i2] != 0.0)
738  transientCapacitanceQ (state, i1, i2, _charges[i1][i2]);
739  } }
740 
741  // 1-node charge integrations
742  for (i1 = 0; i1 < 9; i1++) {
743  state = 2 * (i1 + 9 * i1);
744  if (_charges[i1][i1] != 0.0)
745  transientCapacitanceQ (state, i1, _charges[i1][i1]);
746  }
747 
748  // charge: 2-node, voltage: 2-node
749  for (i1 = 0; i1 < 9; i1++) {
750  for (i2 = 0; i2 < 9; i2++) {
751  if (i1 != i2)
752  for (i3 = 0; i3 < 9; i3++) {
753  for (i4 = 0; i4 < 9; i4++) {
754  if (i3 != i4)
755  if (_caps[i1][i2][i3][i4] != 0.0)
756  transientCapacitanceC (i1, i2, i3, i4, _caps[i1][i2][i3][i4], BP(i3,i4));
757  } } } }
758 
759  // charge: 2-node, voltage: 1-node
760  for (i1 = 0; i1 < 9; i1++) {
761  for (i2 = 0; i2 < 9; i2++) {
762  if (i1 != i2)
763  for (i3 = 0; i3 < 9; i3++) {
764  if (_caps[i1][i2][i3][i3] != 0.0)
765  transientCapacitanceC2Q (i1, i2, i3, _caps[i1][i2][i3][i3], NP(i3));
766  } } }
767 
768  // charge: 1-node, voltage: 2-node
769  for (i1 = 0; i1 < 9; i1++) {
770  for (i3 = 0; i3 < 9; i3++) {
771  for (i4 = 0; i4 < 9; i4++) {
772  if (i3 != i4)
773  if (_caps[i1][i1][i3][i4] != 0.0)
774  transientCapacitanceC2V (i1, i3, i4, _caps[i1][i1][i3][i4], BP(i3,i4));
775  } } }
776 
777  // charge: 1-node, voltage: 1-node
778  for (i1 = 0; i1 < 9; i1++) {
779  for (i3 = 0; i3 < 9; i3++) {
780  if (_caps[i1][i1][i3][i3] != 0.0)
781  transientCapacitanceC (i1, i3, _caps[i1][i1][i3][i3], NP(i3));
782  } }
783 }
784 
785 /* Compute Cy-matrix for AC noise analysis. */
786 matrix phototransistor::calcMatrixCy (nr_double_t frequency)
787 {
788  _freq = frequency;
789  matrix cy (9);
790 
791  _load_flickernoise2 (BI,EI,_flicker_pwr[BI][EI],_flicker_exp[BI][EI]);
792  _load_whitenoise2 (CI,EI,_white_pwr[CI][EI]);
793  _load_whitenoise2 (BI,EI,_white_pwr[BI][EI]);
794  _load_whitenoise2 (EI,Emitter,_white_pwr[EI][Emitter]);
795  _load_whitenoise2 (BI2,BI,_white_pwr[BI2][BI]);
796  _load_whitenoise2 (Base,BI2,_white_pwr[Base][BI2]);
797  _load_whitenoise2 (Collector,CI,_white_pwr[Collector][CI]);
798 
799  return cy;
800 }
801 
802 /* Perform AC noise computations. */
803 void phototransistor::calcNoiseAC (nr_double_t frequency)
804 {
805  setMatrixN (calcMatrixCy (frequency));
806 }
807 
808 /* Perform S-parameter noise computations. */
809 void phototransistor::calcNoiseSP (nr_double_t frequency)
810 {
811  setMatrixN (cytocs (calcMatrixCy (frequency) * z0, getMatrixS ()));
812 }
813 
814 /* Initialization of HB analysis. */
816 {
817  initDC ();
818  allocMatrixHB ();
819 }
820 
821 /* Perform HB analysis. */
823 {
824  doHB = 1;
825  doAC = 1;
826  doTR = 0;
827 
828  // jacobian dI/dV and currents get filled
829  calcDC ();
831 
832  // fill in HB matrices
833  for (int i1 = 0; i1 < 9; i1++) {
834  setQ (i1, _qhs[i1]); // charges
835  setCV (i1, _chs[i1]); // jacobian dQ/dV * V
836  setGV (i1, _ghs[i1]); // jacobian dI/dV * V
837  for (int i2 = 0; i2 < 9; i2++) {
838  setQV (i1, i2, _jdyna[i1][i2]); // jacobian dQ/dV
839  }
840  }
841 }
842 
843 #include "phototransistor.defs.h"