10 changed files with 505 additions and 475 deletions
-
13ChangeLog
-
25configure.in
-
2src/frontend/control.c
-
20src/include/ngspice.h
-
6src/maths/misc/equality.c
-
1src/spicelib/devices/cpl/cplask.c
-
5src/spicelib/devices/hisim/hsm1eval102.c
-
5src/spicelib/devices/hisim/hsm1eval112.c
-
5src/spicelib/devices/hisim/hsm1eval120.c
-
898src/spicelib/devices/soi3/soi3acld.c
@ -1,449 +1,449 @@ |
|||||
/********** |
|
||||
STAG version 2.7 |
|
||||
Copyright 2000 owned by the United Kingdom Secretary of State for Defence |
|
||||
acting through the Defence Evaluation and Research Agency. |
|
||||
Developed by : Jim Benson, |
|
||||
Department of Electronics and Computer Science, |
|
||||
University of Southampton, |
|
||||
United Kingdom. |
|
||||
With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, |
|
||||
and Craig Easson. |
|
||||
|
|
||||
Based on STAG version 2.1 |
|
||||
Developed by : Mike Lee, |
|
||||
With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards |
|
||||
and John Bunyan. |
|
||||
Acknowledgements : Rupert Howes and Pete Mole. |
|
||||
**********/ |
|
||||
|
|
||||
/********** |
|
||||
Modified by Paolo Nenzi 2002 |
|
||||
ngspice integration |
|
||||
**********/ |
|
||||
|
|
||||
#include "ngspice.h" |
|
||||
#include "cktdefs.h" |
|
||||
#include "soi3defs.h" |
|
||||
#include "sperror.h" |
|
||||
#include "suffix.h" |
|
||||
|
|
||||
|
|
||||
int |
|
||||
SOI3acLoad(GENmodel *inModel, CKTcircuit *ckt) |
|
||||
{ |
|
||||
SOI3model *model = (SOI3model*)inModel; |
|
||||
SOI3instance *here; |
|
||||
int xnrm; |
|
||||
int xrev; |
|
||||
|
|
||||
double cgfgf,cgfd,cgfs,cgfdeltaT,cgfgb; |
|
||||
double cdgf,cdd,cds,cddeltaT,cdgb; |
|
||||
double csgf,csd,css,csdeltaT,csgb; |
|
||||
double cbgf,cbd,cbs,cbdeltaT,cbgb; |
|
||||
double cgbgf,cgbd,cgbs,cgbdeltaT,cgbgb; |
|
||||
|
|
||||
double xcgfgf,xcgfd,xcgfs,xcgfdeltaT,xcgfgb; |
|
||||
double xcdgf,xcdd,xcds,xcddeltaT,xcdgb; |
|
||||
double xcsgf,xcsd,xcss,xcsdeltaT,xcsgb; |
|
||||
double xcbgf,xcbd,xcbs,xcbdeltaT,xcbgb; |
|
||||
double xcgbgf,xcgbd,xcgbs,xcgbdeltaT,xcgbgb; |
|
||||
|
|
||||
double capbd,capbs; /* diode capacitances */ |
|
||||
|
|
||||
double xcBJTbsbs,xcBJTbsdeltaT; |
|
||||
double xcBJTbdbd,xcBJTbddeltaT; |
|
||||
|
|
||||
double rtargs[5]; |
|
||||
double grt[5]; |
|
||||
double ctargs[5]; |
|
||||
double xct[5]; /* 1/reactance of thermal cap */ |
|
||||
int tnodeindex; |
|
||||
|
|
||||
double cgfb0; |
|
||||
double cgfd0; |
|
||||
double cgfs0; |
|
||||
|
|
||||
double cgbb0; |
|
||||
double cgbd0; |
|
||||
double cgbs0; |
|
||||
|
|
||||
double EffectiveLength; |
|
||||
|
|
||||
double omega; |
|
||||
|
|
||||
double m; |
|
||||
|
|
||||
omega = ckt->CKTomega; |
|
||||
|
|
||||
for( ; model != NULL; model = model->SOI3nextModel) |
|
||||
{ |
|
||||
for(here = model->SOI3instances; here!= NULL; |
|
||||
here = here->SOI3nextInstance) |
|
||||
{ |
|
||||
|
|
||||
if (here->SOI3owner != ARCHme) |
|
||||
continue; |
|
||||
|
|
||||
if (here->SOI3mode < 0) |
|
||||
{ |
|
||||
xnrm=0; |
|
||||
xrev=1; |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
xnrm=1; |
|
||||
xrev=0; |
|
||||
} |
|
||||
|
|
||||
EffectiveLength=here->SOI3l - 2*model->SOI3latDiff; |
|
||||
|
|
||||
/* JimB - can use basic device geometry to estimate front and back */ |
|
||||
/* overlap capacitances to a first approximation. Use this default */ |
|
||||
/* model if capacitance factors aren't given in model netlist. */ |
|
||||
|
|
||||
/* Calculate front gate overlap capacitances. */ |
|
||||
|
|
||||
if(model->SOI3frontGateSourceOverlapCapFactorGiven) |
|
||||
{ |
|
||||
cgfs0 = model->SOI3frontGateSourceOverlapCapFactor * here->SOI3w; |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
cgfs0 = model->SOI3latDiff * here->SOI3w * model->SOI3frontOxideCapFactor; |
|
||||
} |
|
||||
if(model->SOI3frontGateDrainOverlapCapFactorGiven) |
|
||||
{ |
|
||||
cgfd0 = model->SOI3frontGateDrainOverlapCapFactor * here->SOI3w; |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
cgfd0 = model->SOI3latDiff * here->SOI3w * model->SOI3frontOxideCapFactor; |
|
||||
} |
|
||||
if(model->SOI3frontGateBulkOverlapCapFactorGiven) |
|
||||
{ |
|
||||
cgfb0 = model->SOI3frontGateBulkOverlapCapFactor * EffectiveLength; |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
cgfb0 = EffectiveLength * (0.1*1e-6*model->SOI3minimumFeatureSize) |
|
||||
* model->SOI3frontOxideCapFactor; |
|
||||
} |
|
||||
|
|
||||
/* Calculate back gate overlap capacitances. */ |
|
||||
|
|
||||
if( (model->SOI3backGateSourceOverlapCapAreaFactorGiven) && |
|
||||
(!model->SOI3backGateSourceOverlapCapAreaFactor || here->SOI3asGiven) ) |
|
||||
{ |
|
||||
cgbs0 = model->SOI3backGateSourceOverlapCapAreaFactor * here->SOI3as; |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
cgbs0 = (2*1e-6*model->SOI3minimumFeatureSize + model->SOI3latDiff) * here->SOI3w |
|
||||
* model->SOI3backOxideCapFactor; |
|
||||
} |
|
||||
if( (model->SOI3backGateDrainOverlapCapAreaFactorGiven) && |
|
||||
(!model->SOI3backGateDrainOverlapCapAreaFactor || here->SOI3adGiven) ) |
|
||||
{ |
|
||||
cgbd0 = model->SOI3backGateDrainOverlapCapAreaFactor * here->SOI3ad; |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
cgbd0 = (2*1e-6*model->SOI3minimumFeatureSize + model->SOI3latDiff) * here->SOI3w |
|
||||
* model->SOI3backOxideCapFactor; |
|
||||
} |
|
||||
if( (model->SOI3backGateBulkOverlapCapAreaFactorGiven) && |
|
||||
(!model->SOI3backGateBulkOverlapCapAreaFactor || here->SOI3abGiven) ) |
|
||||
{ |
|
||||
cgbb0 = model->SOI3backGateBulkOverlapCapAreaFactor * here->SOI3ab; |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
cgbb0 = EffectiveLength * (0.1*1e-6*model->SOI3minimumFeatureSize + here->SOI3w) |
|
||||
* model->SOI3backOxideCapFactor; |
|
||||
} |
|
||||
|
|
||||
capbd = here->SOI3capbd; |
|
||||
capbs = here->SOI3capbs; |
|
||||
|
|
||||
cgfgf = *(ckt->CKTstate0 + here->SOI3cgfgf); |
|
||||
cgfd = *(ckt->CKTstate0 + here->SOI3cgfd); |
|
||||
cgfs = *(ckt->CKTstate0 + here->SOI3cgfs); |
|
||||
cgfdeltaT = *(ckt->CKTstate0 + here->SOI3cgfdeltaT); |
|
||||
cgfgb = *(ckt->CKTstate0 + here->SOI3cgfgb); |
|
||||
csgf = *(ckt->CKTstate0 + here->SOI3csgf); |
|
||||
csd = *(ckt->CKTstate0 + here->SOI3csd); |
|
||||
css = *(ckt->CKTstate0 + here->SOI3css); |
|
||||
csdeltaT = *(ckt->CKTstate0 + here->SOI3csdeltaT); |
|
||||
csgb = *(ckt->CKTstate0 + here->SOI3csgb); |
|
||||
cdgf = *(ckt->CKTstate0 + here->SOI3cdgf); |
|
||||
cdd = *(ckt->CKTstate0 + here->SOI3cdd); |
|
||||
cds = *(ckt->CKTstate0 + here->SOI3cds); |
|
||||
cddeltaT = *(ckt->CKTstate0 + here->SOI3cddeltaT); |
|
||||
cdgb = *(ckt->CKTstate0 + here->SOI3cdgb); |
|
||||
cgbgf = *(ckt->CKTstate0 + here->SOI3cgbgf); |
|
||||
cgbd = *(ckt->CKTstate0 + here->SOI3cgbd); |
|
||||
cgbs = *(ckt->CKTstate0 + here->SOI3cgbs); |
|
||||
cgbdeltaT = *(ckt->CKTstate0 + here->SOI3cgbdeltaT); |
|
||||
cgbgb = *(ckt->CKTstate0 + here->SOI3cgbgb); |
|
||||
cbgf = -(cgfgf + cdgf + csgf + cgbgf); |
|
||||
cbd = -(cgfd + cdd + csd + cgbd); |
|
||||
cbs = -(cgfs + cds + css + cgbs); |
|
||||
cbdeltaT = -(cgfdeltaT + cddeltaT + csdeltaT + cgbdeltaT); |
|
||||
cbgb = -(cgfgb + cdgb + csgb + cgbgb); |
|
||||
|
|
||||
xcgfgf = (cgfgf + cgfd0 + cgfs0 + cgfb0) * omega; |
|
||||
xcgfd = (cgfd - cgfd0) * omega; |
|
||||
xcgfs = (cgfs - cgfs0) * omega; |
|
||||
xcgfdeltaT = cgfdeltaT * omega; |
|
||||
xcgfgb = cgfgb * omega; |
|
||||
xcdgf = (cdgf - cgfd0) * omega; |
|
||||
xcdd = (cdd + capbd + cgfd0 + cgbd0) * omega; |
|
||||
xcds = cds * omega; |
|
||||
xcddeltaT = cddeltaT * omega; |
|
||||
xcdgb = (cdgb - cgbd0) * omega; |
|
||||
xcsgf = (csgf - cgfs0) * omega; |
|
||||
xcsd = csd * omega; |
|
||||
xcss = (css + capbs + cgfs0 + cgbs0) * omega; |
|
||||
xcsdeltaT = csdeltaT * omega; |
|
||||
xcsgb = (csgb - cgbs0) * omega; |
|
||||
xcbgf = (cbgf - cgfb0) * omega; |
|
||||
xcbd = (cbd - capbd) * omega; |
|
||||
xcbs = (cbs - capbs) * omega; |
|
||||
xcbdeltaT = cbdeltaT * omega; |
|
||||
xcbgb = (cbgb - cgbb0) * omega; |
|
||||
xcgbgf = cgbgf * omega; |
|
||||
xcgbd = (cgbd - cgbd0) * omega; |
|
||||
xcgbs = (cgbs - cgbs0) * omega; |
|
||||
xcgbdeltaT = cgbdeltaT * omega; |
|
||||
xcgbgb = (cgbgb + cgbd0 + cgbs0 + cgbb0) * omega; |
|
||||
|
|
||||
xcBJTbsbs = *(ckt->CKTstate0 + here->SOI3cBJTbsbs) * omega; |
|
||||
xcBJTbsdeltaT = *(ckt->CKTstate0 + here->SOI3cBJTbsdeltaT) * omega; |
|
||||
xcBJTbdbd = *(ckt->CKTstate0 + here->SOI3cBJTbdbd) * omega; |
|
||||
xcBJTbddeltaT = *(ckt->CKTstate0 + here->SOI3cBJTbddeltaT) * omega; |
|
||||
|
|
||||
/* JimB - 15/9/99 */ |
|
||||
/* Code for multiple thermal time constants. Start by moving all */ |
|
||||
/* rt and ct constants into arrays. */ |
|
||||
rtargs[0]=here->SOI3rt; |
|
||||
rtargs[1]=here->SOI3rt1; |
|
||||
rtargs[2]=here->SOI3rt2; |
|
||||
rtargs[3]=here->SOI3rt3; |
|
||||
rtargs[4]=here->SOI3rt4; |
|
||||
|
|
||||
ctargs[0]=here->SOI3ct; |
|
||||
ctargs[1]=here->SOI3ct1; |
|
||||
ctargs[2]=here->SOI3ct2; |
|
||||
ctargs[3]=here->SOI3ct3; |
|
||||
ctargs[4]=here->SOI3ct4; |
|
||||
|
|
||||
/* Set all admittance components to zero. */ |
|
||||
grt[0]=grt[1]=grt[2]=grt[3]=grt[4]=0.0; |
|
||||
xct[0]=xct[1]=xct[2]=xct[3]=xct[4]=0.0; |
|
||||
/* Now calculate conductances and susceptances from rt and ct. */ |
|
||||
/* Don't need to worry about divide by zero when calculating */ |
|
||||
/* grt components, as soi3setup() only creates a thermal node */ |
|
||||
/* if corresponding rt is greater than zero. */ |
|
||||
for(tnodeindex=0;tnodeindex<here->SOI3numThermalNodes;tnodeindex++) |
|
||||
{ |
|
||||
xct[tnodeindex] = ctargs[tnodeindex] * ckt->CKTomega; |
|
||||
grt[tnodeindex] = 1/rtargs[tnodeindex]; |
|
||||
} |
|
||||
/* End JimB */ |
|
||||
|
|
||||
/* |
|
||||
* load matrix |
|
||||
*/ |
|
||||
|
|
||||
m = here->SOI3m; |
|
||||
|
|
||||
*(here->SOI3GF_gfPtr + 1) += m * xcgfgf; |
|
||||
*(here->SOI3GF_gbPtr + 1) += m * xcgfgb; |
|
||||
*(here->SOI3GF_dpPtr + 1) += m * xcgfd; |
|
||||
*(here->SOI3GF_spPtr + 1) += m * xcgfs; |
|
||||
*(here->SOI3GF_bPtr + 1) -= m * (xcgfgf + xcgfd + xcgfs + xcgfgb); |
|
||||
|
|
||||
*(here->SOI3GB_gfPtr + 1) += m * xcgbgf; |
|
||||
*(here->SOI3GB_gbPtr + 1) += m * xcgbgb; |
|
||||
*(here->SOI3GB_dpPtr + 1) += m * xcgbd; |
|
||||
*(here->SOI3GB_spPtr + 1) += m * xcgbs; |
|
||||
*(here->SOI3GB_bPtr + 1) -= m * (xcgbgf + xcgbd + xcgbs + xcgbgb); |
|
||||
|
|
||||
*(here->SOI3B_gfPtr + 1) += m * xcbgf; |
|
||||
*(here->SOI3B_gbPtr + 1) += m * xcbgb; |
|
||||
*(here->SOI3B_dpPtr + 1) += m * (xcbd-xcBJTbdbd); |
|
||||
*(here->SOI3B_spPtr + 1) += m * (xcbs-xcBJTbsbs); |
|
||||
*(here->SOI3B_bPtr + 1) += m * (-(xcbgf+xcbd+xcbs+xcbgb) |
|
||||
+xcBJTbsbs+xcBJTbdbd); |
|
||||
|
|
||||
*(here->SOI3DP_gfPtr + 1) += m * xcdgf; |
|
||||
*(here->SOI3DP_gbPtr + 1) += m * xcdgb; |
|
||||
*(here->SOI3DP_dpPtr + 1) += m * (xcdd+xcBJTbdbd); |
|
||||
*(here->SOI3DP_spPtr + 1) += m * xcds; |
|
||||
*(here->SOI3DP_bPtr + 1) -= m * (xcdgf + xcdd + xcds + xcdgb + xcBJTbdbd); |
|
||||
|
|
||||
*(here->SOI3SP_gfPtr + 1) += m * xcsgf; |
|
||||
*(here->SOI3SP_gbPtr + 1) += m * xcsgb; |
|
||||
*(here->SOI3SP_dpPtr + 1) += m * xcsd; |
|
||||
*(here->SOI3SP_spPtr + 1) += m * (xcss+xcBJTbsbs); |
|
||||
*(here->SOI3SP_bPtr + 1) -= m * (xcsgf + xcsd + xcss + xcsgb + xcBJTbsbs); |
|
||||
|
|
||||
/* if no thermal behaviour specified, then put in zero valued indpt. voltage source |
|
||||
between TOUT and ground */ |
|
||||
if (here->SOI3rt==0) |
|
||||
{ |
|
||||
*(here->SOI3TOUT_ibrPtr + 1) += m * 1.0; |
|
||||
*(here->SOI3IBR_toutPtr + 1) += m * 1.0; |
|
||||
*(ckt->CKTirhs + (here->SOI3branch)) = 0; |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
*(here->SOI3TOUT_toutPtr + 1) += m * xct[0]; |
|
||||
if (here->SOI3numThermalNodes > 1) |
|
||||
{ |
|
||||
*(here->SOI3TOUT_tout1Ptr + 1) += m * (-xct[0]); |
|
||||
*(here->SOI3TOUT1_toutPtr + 1) += m * (-xct[0]); |
|
||||
*(here->SOI3TOUT1_tout1Ptr + 1) += m * (xct[0]+xct[1]); |
|
||||
} |
|
||||
if (here->SOI3numThermalNodes > 2) |
|
||||
{ |
|
||||
*(here->SOI3TOUT1_tout2Ptr + 1) += m * (-xct[1]); |
|
||||
*(here->SOI3TOUT2_tout1Ptr + 1) += m * (-xct[1]); |
|
||||
*(here->SOI3TOUT2_tout2Ptr + 1) += m * (xct[1]+xct[2]); |
|
||||
} |
|
||||
if (here->SOI3numThermalNodes > 3) |
|
||||
{ |
|
||||
*(here->SOI3TOUT2_tout3Ptr + 1) += m * (-xct[2]); |
|
||||
*(here->SOI3TOUT3_tout2Ptr + 1) += m * (-xct[2]); |
|
||||
*(here->SOI3TOUT3_tout3Ptr + 1) += m * (xct[2]+xct[3]); |
|
||||
} |
|
||||
if (here->SOI3numThermalNodes > 4) |
|
||||
{ |
|
||||
*(here->SOI3TOUT3_tout4Ptr + 1) += m * (-xct[3]); |
|
||||
*(here->SOI3TOUT4_tout3Ptr + 1) += m * (-xct[3]); |
|
||||
*(here->SOI3TOUT4_tout4Ptr + 1) += m * (xct[3]+xct[4]); |
|
||||
} |
|
||||
*(here->SOI3GF_toutPtr + 1) += m * xcgfdeltaT*model->SOI3type; |
|
||||
*(here->SOI3DP_toutPtr + 1) += m * (xcddeltaT - xcBJTbddeltaT)*model->SOI3type; |
|
||||
*(here->SOI3SP_toutPtr + 1) += m * (xcsdeltaT - xcBJTbsdeltaT)*model->SOI3type; |
|
||||
*(here->SOI3B_toutPtr + 1) += m * model->SOI3type * |
|
||||
(xcbdeltaT + xcBJTbsdeltaT + xcBJTbddeltaT); |
|
||||
*(here->SOI3GB_toutPtr + 1) += m * xcgbdeltaT*model->SOI3type; |
|
||||
} |
|
||||
|
|
||||
|
|
||||
/* and now real part */ |
|
||||
*(here->SOI3D_dPtr) += (m * here->SOI3drainConductance); |
|
||||
*(here->SOI3D_dpPtr) += (m * (-here->SOI3drainConductance)); |
|
||||
*(here->SOI3DP_dPtr) += (m * (-here->SOI3drainConductance)); |
|
||||
|
|
||||
*(here->SOI3S_sPtr) += (m * here->SOI3sourceConductance); |
|
||||
*(here->SOI3S_spPtr) += (m * (-here->SOI3sourceConductance)); |
|
||||
*(here->SOI3SP_sPtr) += (m * (-here->SOI3sourceConductance)); |
|
||||
|
|
||||
*(here->SOI3DP_gfPtr) += ((m * (xnrm-xrev)*here->SOI3gmf + |
|
||||
xnrm*here->SOI3gMmf)); |
|
||||
*(here->SOI3DP_gbPtr) += (m * ((xnrm-xrev)*here->SOI3gmb + |
|
||||
xnrm*here->SOI3gMmb)); |
|
||||
*(here->SOI3DP_dpPtr) += m * (here->SOI3drainConductance+here->SOI3gds+ |
|
||||
here->SOI3gbd+xrev*(here->SOI3gmf+here->SOI3gmbs+ |
|
||||
here->SOI3gmb)+xnrm*here->SOI3gMd); |
|
||||
*(here->SOI3DP_spPtr) += m * (-here->SOI3gds - here->SOI3gBJTdb_bs |
|
||||
-xnrm*(here->SOI3gmf+here->SOI3gmb+here->SOI3gmbs + |
|
||||
here->SOI3gMmf+here->SOI3gMmb+here->SOI3gMmbs+here->SOI3gMd)); |
|
||||
*(here->SOI3DP_bPtr) += m * (-here->SOI3gbd + here->SOI3gBJTdb_bs |
|
||||
+(xnrm-xrev)*here->SOI3gmbs+ |
|
||||
xnrm*here->SOI3gMmbs); |
|
||||
|
|
||||
*(here->SOI3SP_gfPtr) += m * (-(xnrm-xrev)*here->SOI3gmf+ |
|
||||
xrev*here->SOI3gMmf); |
|
||||
*(here->SOI3SP_gbPtr) += m * (-(xnrm-xrev)*here->SOI3gmb+ |
|
||||
xrev*here->SOI3gMmb); |
|
||||
*(here->SOI3SP_dpPtr) += m * (-here->SOI3gds - here->SOI3gBJTsb_bd |
|
||||
-xrev*(here->SOI3gmf+here->SOI3gmb+here->SOI3gmbs+ |
|
||||
here->SOI3gMmf+here->SOI3gMmb+here->SOI3gMmbs+here->SOI3gMd)); |
|
||||
*(here->SOI3SP_spPtr) += m * (here->SOI3sourceConductance+here->SOI3gds+ |
|
||||
here->SOI3gbs+xnrm*(here->SOI3gmf+here->SOI3gmbs+ |
|
||||
here->SOI3gmb)+xrev*here->SOI3gMd); |
|
||||
*(here->SOI3SP_bPtr) += m * (-here->SOI3gbs + here->SOI3gBJTsb_bd |
|
||||
-(xnrm-xrev)*here->SOI3gmbs+ |
|
||||
xrev*here->SOI3gMmbs); |
|
||||
|
|
||||
*(here->SOI3B_gfPtr) += m * (-here->SOI3gMmf); |
|
||||
*(here->SOI3B_gbPtr) += m * (-here->SOI3gMmb); |
|
||||
*(here->SOI3B_dpPtr) += m * (-(here->SOI3gbd) + here->SOI3gBJTsb_bd + |
|
||||
xrev*(here->SOI3gMmf+here->SOI3gMmb+ |
|
||||
here->SOI3gMmbs+here->SOI3gMd) - |
|
||||
xnrm*here->SOI3gMd); |
|
||||
*(here->SOI3B_spPtr) += m * (-(here->SOI3gbs) + here->SOI3gBJTdb_bs + |
|
||||
xnrm*(here->SOI3gMmf+here->SOI3gMmb+ |
|
||||
here->SOI3gMmbs+here->SOI3gMd) - |
|
||||
xrev*here->SOI3gMd); |
|
||||
*(here->SOI3B_bPtr) += m * (here->SOI3gbd+here->SOI3gbs - |
|
||||
here->SOI3gMmbs |
|
||||
- here->SOI3gBJTdb_bs - here->SOI3gBJTsb_bd); |
|
||||
|
|
||||
/* if no thermal behaviour specified, then put in zero valued indpt. voltage source |
|
||||
between TOUT and ground */ |
|
||||
if (here->SOI3rt==0) |
|
||||
{ |
|
||||
*(here->SOI3TOUT_ibrPtr) += m * 1.0; |
|
||||
*(here->SOI3IBR_toutPtr) += m * 1.0; |
|
||||
*(ckt->CKTrhs + (here->SOI3branch)) = 0; |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
*(here->SOI3TOUT_toutPtr) += m * (-(here->SOI3gPdT)+grt[0]); |
|
||||
if (here->SOI3numThermalNodes > 1) |
|
||||
{ |
|
||||
*(here->SOI3TOUT_tout1Ptr) += m * (-grt[0]); |
|
||||
*(here->SOI3TOUT1_toutPtr) += m * (-grt[0]); |
|
||||
*(here->SOI3TOUT1_tout1Ptr) += m * (grt[0]+grt[1]); |
|
||||
} |
|
||||
if (here->SOI3numThermalNodes > 2) |
|
||||
{ |
|
||||
*(here->SOI3TOUT1_tout2Ptr) += m * (-grt[1]); |
|
||||
*(here->SOI3TOUT2_tout1Ptr) += m * (-grt[1]); |
|
||||
*(here->SOI3TOUT2_tout2Ptr) += m * (grt[1]+grt[2]); |
|
||||
} |
|
||||
if (here->SOI3numThermalNodes > 3) |
|
||||
{ |
|
||||
*(here->SOI3TOUT2_tout3Ptr) += m * (-grt[2]); |
|
||||
*(here->SOI3TOUT3_tout2Ptr) += m * (-grt[2]); |
|
||||
*(here->SOI3TOUT3_tout3Ptr) += m * (grt[2]+grt[3]); |
|
||||
} |
|
||||
if (here->SOI3numThermalNodes > 4) |
|
||||
{ |
|
||||
*(here->SOI3TOUT3_tout4Ptr) += m * (-grt[3]); |
|
||||
*(here->SOI3TOUT4_tout3Ptr) += m * (-grt[3]); |
|
||||
*(here->SOI3TOUT4_tout4Ptr) += m * (grt[3]+grt[4]); |
|
||||
} |
|
||||
|
|
||||
*(here->SOI3TOUT_dpPtr) += m * (xnrm*(-(here->SOI3gPds*model->SOI3type)) |
|
||||
+xrev*(here->SOI3gPds+here->SOI3gPmf+ |
|
||||
here->SOI3gPmb+here->SOI3gPmbs)* |
|
||||
model->SOI3type); |
|
||||
*(here->SOI3TOUT_gfPtr) += m * (-(here->SOI3gPmf*model->SOI3type)); |
|
||||
*(here->SOI3TOUT_gbPtr) += m * (-(here->SOI3gPmb*model->SOI3type)); |
|
||||
*(here->SOI3TOUT_bPtr) += m * (-(here->SOI3gPmbs*model->SOI3type)); |
|
||||
*(here->SOI3TOUT_spPtr) += m * (xnrm*(here->SOI3gPds+here->SOI3gPmf+ |
|
||||
here->SOI3gPmb+here->SOI3gPmbs)*model->SOI3type |
|
||||
+xrev*(-(here->SOI3gPds*model->SOI3type))); |
|
||||
|
|
||||
*(here->SOI3DP_toutPtr) += m * (xnrm-xrev)*here->SOI3gt*model->SOI3type; |
|
||||
*(here->SOI3SP_toutPtr) += m * (xrev-xnrm)*here->SOI3gt*model->SOI3type; |
|
||||
/* need to mult by type in above as conductances will be used with exterior voltages |
|
||||
which will be -ve for PMOS except for gPdT */ |
|
||||
/* now for thermal influence on impact ionisation current and transient stuff */ |
|
||||
*(here->SOI3DP_toutPtr) += m * (xnrm*here->SOI3gMdeltaT - |
|
||||
here->SOI3gbdT + here->SOI3gBJTdb_deltaT)*model->SOI3type; |
|
||||
*(here->SOI3SP_toutPtr) += m * (xrev*here->SOI3gMdeltaT - |
|
||||
here->SOI3gbsT + here->SOI3gBJTsb_deltaT)*model->SOI3type; |
|
||||
*(here->SOI3B_toutPtr) -= m * (here->SOI3gMdeltaT - here->SOI3gbsT - |
|
||||
here->SOI3gbdT + here->SOI3gBJTdb_deltaT + |
|
||||
here->SOI3gBJTsb_deltaT)*model->SOI3type; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
return(OK); |
|
||||
} |
|
||||
|
/********** |
||||
|
STAG version 2.7 |
||||
|
Copyright 2000 owned by the United Kingdom Secretary of State for Defence |
||||
|
acting through the Defence Evaluation and Research Agency. |
||||
|
Developed by : Jim Benson, |
||||
|
Department of Electronics and Computer Science, |
||||
|
University of Southampton, |
||||
|
United Kingdom. |
||||
|
With help from : Nele D'Halleweyn, Ketan Mistry, Bill Redman-White, |
||||
|
and Craig Easson. |
||||
|
|
||||
|
Based on STAG version 2.1 |
||||
|
Developed by : Mike Lee, |
||||
|
With help from : Bernard Tenbroek, Bill Redman-White, Mike Uren, Chris Edwards |
||||
|
and John Bunyan. |
||||
|
Acknowledgements : Rupert Howes and Pete Mole. |
||||
|
**********/ |
||||
|
|
||||
|
/********** |
||||
|
Modified by Paolo Nenzi 2002 |
||||
|
ngspice integration |
||||
|
**********/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include "cktdefs.h" |
||||
|
#include "soi3defs.h" |
||||
|
#include "sperror.h" |
||||
|
#include "suffix.h" |
||||
|
|
||||
|
|
||||
|
int |
||||
|
SOI3acLoad(GENmodel *inModel, CKTcircuit *ckt) |
||||
|
{ |
||||
|
SOI3model *model = (SOI3model*)inModel; |
||||
|
SOI3instance *here; |
||||
|
int xnrm; |
||||
|
int xrev; |
||||
|
|
||||
|
double cgfgf,cgfd,cgfs,cgfdeltaT,cgfgb; |
||||
|
double cdgf,cdd,cds,cddeltaT,cdgb; |
||||
|
double csgf,csd,css,csdeltaT,csgb; |
||||
|
double cbgf,cbd,cbs,cbdeltaT,cbgb; |
||||
|
double cgbgf,cgbd,cgbs,cgbdeltaT,cgbgb; |
||||
|
|
||||
|
double xcgfgf,xcgfd,xcgfs,xcgfdeltaT,xcgfgb; |
||||
|
double xcdgf,xcdd,xcds,xcddeltaT,xcdgb; |
||||
|
double xcsgf,xcsd,xcss,xcsdeltaT,xcsgb; |
||||
|
double xcbgf,xcbd,xcbs,xcbdeltaT,xcbgb; |
||||
|
double xcgbgf,xcgbd,xcgbs,xcgbdeltaT,xcgbgb; |
||||
|
|
||||
|
double capbd,capbs; /* diode capacitances */ |
||||
|
|
||||
|
double xcBJTbsbs,xcBJTbsdeltaT; |
||||
|
double xcBJTbdbd,xcBJTbddeltaT; |
||||
|
|
||||
|
double rtargs[5]; |
||||
|
double grt[5]; |
||||
|
double ctargs[5]; |
||||
|
double xct[5]; /* 1/reactance of thermal cap */ |
||||
|
int tnodeindex; |
||||
|
|
||||
|
double cgfb0; |
||||
|
double cgfd0; |
||||
|
double cgfs0; |
||||
|
|
||||
|
double cgbb0; |
||||
|
double cgbd0; |
||||
|
double cgbs0; |
||||
|
|
||||
|
double EffectiveLength; |
||||
|
|
||||
|
double omega; |
||||
|
|
||||
|
double m; |
||||
|
|
||||
|
omega = ckt->CKTomega; |
||||
|
|
||||
|
for( ; model != NULL; model = model->SOI3nextModel) |
||||
|
{ |
||||
|
for(here = model->SOI3instances; here!= NULL; |
||||
|
here = here->SOI3nextInstance) |
||||
|
{ |
||||
|
|
||||
|
if (here->SOI3owner != ARCHme) |
||||
|
continue; |
||||
|
|
||||
|
if (here->SOI3mode < 0) |
||||
|
{ |
||||
|
xnrm=0; |
||||
|
xrev=1; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
xnrm=1; |
||||
|
xrev=0; |
||||
|
} |
||||
|
|
||||
|
EffectiveLength=here->SOI3l - 2*model->SOI3latDiff; |
||||
|
|
||||
|
/* JimB - can use basic device geometry to estimate front and back */ |
||||
|
/* overlap capacitances to a first approximation. Use this default */ |
||||
|
/* model if capacitance factors aren't given in model netlist. */ |
||||
|
|
||||
|
/* Calculate front gate overlap capacitances. */ |
||||
|
|
||||
|
if(model->SOI3frontGateSourceOverlapCapFactorGiven) |
||||
|
{ |
||||
|
cgfs0 = model->SOI3frontGateSourceOverlapCapFactor * here->SOI3w; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
cgfs0 = model->SOI3latDiff * here->SOI3w * model->SOI3frontOxideCapFactor; |
||||
|
} |
||||
|
if(model->SOI3frontGateDrainOverlapCapFactorGiven) |
||||
|
{ |
||||
|
cgfd0 = model->SOI3frontGateDrainOverlapCapFactor * here->SOI3w; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
cgfd0 = model->SOI3latDiff * here->SOI3w * model->SOI3frontOxideCapFactor; |
||||
|
} |
||||
|
if(model->SOI3frontGateBulkOverlapCapFactorGiven) |
||||
|
{ |
||||
|
cgfb0 = model->SOI3frontGateBulkOverlapCapFactor * EffectiveLength; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
cgfb0 = EffectiveLength * (0.1*1e-6*model->SOI3minimumFeatureSize) |
||||
|
* model->SOI3frontOxideCapFactor; |
||||
|
} |
||||
|
|
||||
|
/* Calculate back gate overlap capacitances. */ |
||||
|
|
||||
|
if( (model->SOI3backGateSourceOverlapCapAreaFactorGiven) && |
||||
|
(!model->SOI3backGateSourceOverlapCapAreaFactor || here->SOI3asGiven) ) |
||||
|
{ |
||||
|
cgbs0 = model->SOI3backGateSourceOverlapCapAreaFactor * here->SOI3as; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
cgbs0 = (2*1e-6*model->SOI3minimumFeatureSize + model->SOI3latDiff) * here->SOI3w |
||||
|
* model->SOI3backOxideCapFactor; |
||||
|
} |
||||
|
if( (model->SOI3backGateDrainOverlapCapAreaFactorGiven) && |
||||
|
(!model->SOI3backGateDrainOverlapCapAreaFactor || here->SOI3adGiven) ) |
||||
|
{ |
||||
|
cgbd0 = model->SOI3backGateDrainOverlapCapAreaFactor * here->SOI3ad; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
cgbd0 = (2*1e-6*model->SOI3minimumFeatureSize + model->SOI3latDiff) * here->SOI3w |
||||
|
* model->SOI3backOxideCapFactor; |
||||
|
} |
||||
|
if( (model->SOI3backGateBulkOverlapCapAreaFactorGiven) && |
||||
|
(!model->SOI3backGateBulkOverlapCapAreaFactor || here->SOI3abGiven) ) |
||||
|
{ |
||||
|
cgbb0 = model->SOI3backGateBulkOverlapCapAreaFactor * here->SOI3ab; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
cgbb0 = EffectiveLength * (0.1*1e-6*model->SOI3minimumFeatureSize + here->SOI3w) |
||||
|
* model->SOI3backOxideCapFactor; |
||||
|
} |
||||
|
|
||||
|
capbd = here->SOI3capbd; |
||||
|
capbs = here->SOI3capbs; |
||||
|
|
||||
|
cgfgf = *(ckt->CKTstate0 + here->SOI3cgfgf); |
||||
|
cgfd = *(ckt->CKTstate0 + here->SOI3cgfd); |
||||
|
cgfs = *(ckt->CKTstate0 + here->SOI3cgfs); |
||||
|
cgfdeltaT = *(ckt->CKTstate0 + here->SOI3cgfdeltaT); |
||||
|
cgfgb = *(ckt->CKTstate0 + here->SOI3cgfgb); |
||||
|
csgf = *(ckt->CKTstate0 + here->SOI3csgf); |
||||
|
csd = *(ckt->CKTstate0 + here->SOI3csd); |
||||
|
css = *(ckt->CKTstate0 + here->SOI3css); |
||||
|
csdeltaT = *(ckt->CKTstate0 + here->SOI3csdeltaT); |
||||
|
csgb = *(ckt->CKTstate0 + here->SOI3csgb); |
||||
|
cdgf = *(ckt->CKTstate0 + here->SOI3cdgf); |
||||
|
cdd = *(ckt->CKTstate0 + here->SOI3cdd); |
||||
|
cds = *(ckt->CKTstate0 + here->SOI3cds); |
||||
|
cddeltaT = *(ckt->CKTstate0 + here->SOI3cddeltaT); |
||||
|
cdgb = *(ckt->CKTstate0 + here->SOI3cdgb); |
||||
|
cgbgf = *(ckt->CKTstate0 + here->SOI3cgbgf); |
||||
|
cgbd = *(ckt->CKTstate0 + here->SOI3cgbd); |
||||
|
cgbs = *(ckt->CKTstate0 + here->SOI3cgbs); |
||||
|
cgbdeltaT = *(ckt->CKTstate0 + here->SOI3cgbdeltaT); |
||||
|
cgbgb = *(ckt->CKTstate0 + here->SOI3cgbgb); |
||||
|
cbgf = -(cgfgf + cdgf + csgf + cgbgf); |
||||
|
cbd = -(cgfd + cdd + csd + cgbd); |
||||
|
cbs = -(cgfs + cds + css + cgbs); |
||||
|
cbdeltaT = -(cgfdeltaT + cddeltaT + csdeltaT + cgbdeltaT); |
||||
|
cbgb = -(cgfgb + cdgb + csgb + cgbgb); |
||||
|
|
||||
|
xcgfgf = (cgfgf + cgfd0 + cgfs0 + cgfb0) * omega; |
||||
|
xcgfd = (cgfd - cgfd0) * omega; |
||||
|
xcgfs = (cgfs - cgfs0) * omega; |
||||
|
xcgfdeltaT = cgfdeltaT * omega; |
||||
|
xcgfgb = cgfgb * omega; |
||||
|
xcdgf = (cdgf - cgfd0) * omega; |
||||
|
xcdd = (cdd + capbd + cgfd0 + cgbd0) * omega; |
||||
|
xcds = cds * omega; |
||||
|
xcddeltaT = cddeltaT * omega; |
||||
|
xcdgb = (cdgb - cgbd0) * omega; |
||||
|
xcsgf = (csgf - cgfs0) * omega; |
||||
|
xcsd = csd * omega; |
||||
|
xcss = (css + capbs + cgfs0 + cgbs0) * omega; |
||||
|
xcsdeltaT = csdeltaT * omega; |
||||
|
xcsgb = (csgb - cgbs0) * omega; |
||||
|
xcbgf = (cbgf - cgfb0) * omega; |
||||
|
xcbd = (cbd - capbd) * omega; |
||||
|
xcbs = (cbs - capbs) * omega; |
||||
|
xcbdeltaT = cbdeltaT * omega; |
||||
|
xcbgb = (cbgb - cgbb0) * omega; |
||||
|
xcgbgf = cgbgf * omega; |
||||
|
xcgbd = (cgbd - cgbd0) * omega; |
||||
|
xcgbs = (cgbs - cgbs0) * omega; |
||||
|
xcgbdeltaT = cgbdeltaT * omega; |
||||
|
xcgbgb = (cgbgb + cgbd0 + cgbs0 + cgbb0) * omega; |
||||
|
|
||||
|
xcBJTbsbs = *(ckt->CKTstate0 + here->SOI3cBJTbsbs) * omega; |
||||
|
xcBJTbsdeltaT = *(ckt->CKTstate0 + here->SOI3cBJTbsdeltaT) * omega; |
||||
|
xcBJTbdbd = *(ckt->CKTstate0 + here->SOI3cBJTbdbd) * omega; |
||||
|
xcBJTbddeltaT = *(ckt->CKTstate0 + here->SOI3cBJTbddeltaT) * omega; |
||||
|
|
||||
|
/* JimB - 15/9/99 */ |
||||
|
/* Code for multiple thermal time constants. Start by moving all */ |
||||
|
/* rt and ct constants into arrays. */ |
||||
|
rtargs[0]=here->SOI3rt; |
||||
|
rtargs[1]=here->SOI3rt1; |
||||
|
rtargs[2]=here->SOI3rt2; |
||||
|
rtargs[3]=here->SOI3rt3; |
||||
|
rtargs[4]=here->SOI3rt4; |
||||
|
|
||||
|
ctargs[0]=here->SOI3ct; |
||||
|
ctargs[1]=here->SOI3ct1; |
||||
|
ctargs[2]=here->SOI3ct2; |
||||
|
ctargs[3]=here->SOI3ct3; |
||||
|
ctargs[4]=here->SOI3ct4; |
||||
|
|
||||
|
/* Set all admittance components to zero. */ |
||||
|
grt[0]=grt[1]=grt[2]=grt[3]=grt[4]=0.0; |
||||
|
xct[0]=xct[1]=xct[2]=xct[3]=xct[4]=0.0; |
||||
|
/* Now calculate conductances and susceptances from rt and ct. */ |
||||
|
/* Don't need to worry about divide by zero when calculating */ |
||||
|
/* grt components, as soi3setup() only creates a thermal node */ |
||||
|
/* if corresponding rt is greater than zero. */ |
||||
|
for(tnodeindex=0;tnodeindex<here->SOI3numThermalNodes;tnodeindex++) |
||||
|
{ |
||||
|
xct[tnodeindex] = ctargs[tnodeindex] * ckt->CKTomega; |
||||
|
grt[tnodeindex] = 1/rtargs[tnodeindex]; |
||||
|
} |
||||
|
/* End JimB */ |
||||
|
|
||||
|
/* |
||||
|
* load matrix |
||||
|
*/ |
||||
|
|
||||
|
m = here->SOI3m; |
||||
|
|
||||
|
*(here->SOI3GF_gfPtr + 1) += m * xcgfgf; |
||||
|
*(here->SOI3GF_gbPtr + 1) += m * xcgfgb; |
||||
|
*(here->SOI3GF_dpPtr + 1) += m * xcgfd; |
||||
|
*(here->SOI3GF_spPtr + 1) += m * xcgfs; |
||||
|
*(here->SOI3GF_bPtr + 1) -= m * (xcgfgf + xcgfd + xcgfs + xcgfgb); |
||||
|
|
||||
|
*(here->SOI3GB_gfPtr + 1) += m * xcgbgf; |
||||
|
*(here->SOI3GB_gbPtr + 1) += m * xcgbgb; |
||||
|
*(here->SOI3GB_dpPtr + 1) += m * xcgbd; |
||||
|
*(here->SOI3GB_spPtr + 1) += m * xcgbs; |
||||
|
*(here->SOI3GB_bPtr + 1) -= m * (xcgbgf + xcgbd + xcgbs + xcgbgb); |
||||
|
|
||||
|
*(here->SOI3B_gfPtr + 1) += m * xcbgf; |
||||
|
*(here->SOI3B_gbPtr + 1) += m * xcbgb; |
||||
|
*(here->SOI3B_dpPtr + 1) += m * (xcbd-xcBJTbdbd); |
||||
|
*(here->SOI3B_spPtr + 1) += m * (xcbs-xcBJTbsbs); |
||||
|
*(here->SOI3B_bPtr + 1) += m * (-(xcbgf+xcbd+xcbs+xcbgb) |
||||
|
+xcBJTbsbs+xcBJTbdbd); |
||||
|
|
||||
|
*(here->SOI3DP_gfPtr + 1) += m * xcdgf; |
||||
|
*(here->SOI3DP_gbPtr + 1) += m * xcdgb; |
||||
|
*(here->SOI3DP_dpPtr + 1) += m * (xcdd+xcBJTbdbd); |
||||
|
*(here->SOI3DP_spPtr + 1) += m * xcds; |
||||
|
*(here->SOI3DP_bPtr + 1) -= m * (xcdgf + xcdd + xcds + xcdgb + xcBJTbdbd); |
||||
|
|
||||
|
*(here->SOI3SP_gfPtr + 1) += m * xcsgf; |
||||
|
*(here->SOI3SP_gbPtr + 1) += m * xcsgb; |
||||
|
*(here->SOI3SP_dpPtr + 1) += m * xcsd; |
||||
|
*(here->SOI3SP_spPtr + 1) += m * (xcss+xcBJTbsbs); |
||||
|
*(here->SOI3SP_bPtr + 1) -= m * (xcsgf + xcsd + xcss + xcsgb + xcBJTbsbs); |
||||
|
|
||||
|
/* if no thermal behaviour specified, then put in zero valued indpt. voltage source |
||||
|
between TOUT and ground */ |
||||
|
if (here->SOI3rt==0) |
||||
|
{ |
||||
|
*(here->SOI3TOUT_ibrPtr + 1) += m * 1.0; |
||||
|
*(here->SOI3IBR_toutPtr + 1) += m * 1.0; |
||||
|
*(ckt->CKTirhs + (here->SOI3branch)) = 0; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
*(here->SOI3TOUT_toutPtr + 1) += m * xct[0]; |
||||
|
if (here->SOI3numThermalNodes > 1) |
||||
|
{ |
||||
|
*(here->SOI3TOUT_tout1Ptr + 1) += m * (-xct[0]); |
||||
|
*(here->SOI3TOUT1_toutPtr + 1) += m * (-xct[0]); |
||||
|
*(here->SOI3TOUT1_tout1Ptr + 1) += m * (xct[0]+xct[1]); |
||||
|
} |
||||
|
if (here->SOI3numThermalNodes > 2) |
||||
|
{ |
||||
|
*(here->SOI3TOUT1_tout2Ptr + 1) += m * (-xct[1]); |
||||
|
*(here->SOI3TOUT2_tout1Ptr + 1) += m * (-xct[1]); |
||||
|
*(here->SOI3TOUT2_tout2Ptr + 1) += m * (xct[1]+xct[2]); |
||||
|
} |
||||
|
if (here->SOI3numThermalNodes > 3) |
||||
|
{ |
||||
|
*(here->SOI3TOUT2_tout3Ptr + 1) += m * (-xct[2]); |
||||
|
*(here->SOI3TOUT3_tout2Ptr + 1) += m * (-xct[2]); |
||||
|
*(here->SOI3TOUT3_tout3Ptr + 1) += m * (xct[2]+xct[3]); |
||||
|
} |
||||
|
if (here->SOI3numThermalNodes > 4) |
||||
|
{ |
||||
|
*(here->SOI3TOUT3_tout4Ptr + 1) += m * (-xct[3]); |
||||
|
*(here->SOI3TOUT4_tout3Ptr + 1) += m * (-xct[3]); |
||||
|
*(here->SOI3TOUT4_tout4Ptr + 1) += m * (xct[3]+xct[4]); |
||||
|
} |
||||
|
*(here->SOI3GF_toutPtr + 1) += m * xcgfdeltaT*model->SOI3type; |
||||
|
*(here->SOI3DP_toutPtr + 1) += m * (xcddeltaT - xcBJTbddeltaT)*model->SOI3type; |
||||
|
*(here->SOI3SP_toutPtr + 1) += m * (xcsdeltaT - xcBJTbsdeltaT)*model->SOI3type; |
||||
|
*(here->SOI3B_toutPtr + 1) += m * model->SOI3type * |
||||
|
(xcbdeltaT + xcBJTbsdeltaT + xcBJTbddeltaT); |
||||
|
*(here->SOI3GB_toutPtr + 1) += m * xcgbdeltaT*model->SOI3type; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/* and now real part */ |
||||
|
*(here->SOI3D_dPtr) += (m * here->SOI3drainConductance); |
||||
|
*(here->SOI3D_dpPtr) += (m * (-here->SOI3drainConductance)); |
||||
|
*(here->SOI3DP_dPtr) += (m * (-here->SOI3drainConductance)); |
||||
|
|
||||
|
*(here->SOI3S_sPtr) += (m * here->SOI3sourceConductance); |
||||
|
*(here->SOI3S_spPtr) += (m * (-here->SOI3sourceConductance)); |
||||
|
*(here->SOI3SP_sPtr) += (m * (-here->SOI3sourceConductance)); |
||||
|
|
||||
|
*(here->SOI3DP_gfPtr) += ((m * (xnrm-xrev)*here->SOI3gmf + |
||||
|
xnrm*here->SOI3gMmf)); |
||||
|
*(here->SOI3DP_gbPtr) += (m * ((xnrm-xrev)*here->SOI3gmb + |
||||
|
xnrm*here->SOI3gMmb)); |
||||
|
*(here->SOI3DP_dpPtr) += m * (here->SOI3drainConductance+here->SOI3gds+ |
||||
|
here->SOI3gbd+xrev*(here->SOI3gmf+here->SOI3gmbs+ |
||||
|
here->SOI3gmb)+xnrm*here->SOI3gMd); |
||||
|
*(here->SOI3DP_spPtr) += m * (-here->SOI3gds - here->SOI3gBJTdb_bs |
||||
|
-xnrm*(here->SOI3gmf+here->SOI3gmb+here->SOI3gmbs + |
||||
|
here->SOI3gMmf+here->SOI3gMmb+here->SOI3gMmbs+here->SOI3gMd)); |
||||
|
*(here->SOI3DP_bPtr) += m * (-here->SOI3gbd + here->SOI3gBJTdb_bs |
||||
|
+(xnrm-xrev)*here->SOI3gmbs+ |
||||
|
xnrm*here->SOI3gMmbs); |
||||
|
|
||||
|
*(here->SOI3SP_gfPtr) += m * (-(xnrm-xrev)*here->SOI3gmf+ |
||||
|
xrev*here->SOI3gMmf); |
||||
|
*(here->SOI3SP_gbPtr) += m * (-(xnrm-xrev)*here->SOI3gmb+ |
||||
|
xrev*here->SOI3gMmb); |
||||
|
*(here->SOI3SP_dpPtr) += m * (-here->SOI3gds - here->SOI3gBJTsb_bd |
||||
|
-xrev*(here->SOI3gmf+here->SOI3gmb+here->SOI3gmbs+ |
||||
|
here->SOI3gMmf+here->SOI3gMmb+here->SOI3gMmbs+here->SOI3gMd)); |
||||
|
*(here->SOI3SP_spPtr) += m * (here->SOI3sourceConductance+here->SOI3gds+ |
||||
|
here->SOI3gbs+xnrm*(here->SOI3gmf+here->SOI3gmbs+ |
||||
|
here->SOI3gmb)+xrev*here->SOI3gMd); |
||||
|
*(here->SOI3SP_bPtr) += m * (-here->SOI3gbs + here->SOI3gBJTsb_bd |
||||
|
-(xnrm-xrev)*here->SOI3gmbs+ |
||||
|
xrev*here->SOI3gMmbs); |
||||
|
|
||||
|
*(here->SOI3B_gfPtr) += m * (-here->SOI3gMmf); |
||||
|
*(here->SOI3B_gbPtr) += m * (-here->SOI3gMmb); |
||||
|
*(here->SOI3B_dpPtr) += m * (-(here->SOI3gbd) + here->SOI3gBJTsb_bd + |
||||
|
xrev*(here->SOI3gMmf+here->SOI3gMmb+ |
||||
|
here->SOI3gMmbs+here->SOI3gMd) - |
||||
|
xnrm*here->SOI3gMd); |
||||
|
*(here->SOI3B_spPtr) += m * (-(here->SOI3gbs) + here->SOI3gBJTdb_bs + |
||||
|
xnrm*(here->SOI3gMmf+here->SOI3gMmb+ |
||||
|
here->SOI3gMmbs+here->SOI3gMd) - |
||||
|
xrev*here->SOI3gMd); |
||||
|
*(here->SOI3B_bPtr) += m * (here->SOI3gbd+here->SOI3gbs - |
||||
|
here->SOI3gMmbs |
||||
|
- here->SOI3gBJTdb_bs - here->SOI3gBJTsb_bd); |
||||
|
|
||||
|
/* if no thermal behaviour specified, then put in zero valued indpt. voltage source |
||||
|
between TOUT and ground */ |
||||
|
if (here->SOI3rt==0) |
||||
|
{ |
||||
|
*(here->SOI3TOUT_ibrPtr) += m * 1.0; |
||||
|
*(here->SOI3IBR_toutPtr) += m * 1.0; |
||||
|
*(ckt->CKTrhs + (here->SOI3branch)) = 0; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
*(here->SOI3TOUT_toutPtr) += m * (-(here->SOI3gPdT)+grt[0]); |
||||
|
if (here->SOI3numThermalNodes > 1) |
||||
|
{ |
||||
|
*(here->SOI3TOUT_tout1Ptr) += m * (-grt[0]); |
||||
|
*(here->SOI3TOUT1_toutPtr) += m * (-grt[0]); |
||||
|
*(here->SOI3TOUT1_tout1Ptr) += m * (grt[0]+grt[1]); |
||||
|
} |
||||
|
if (here->SOI3numThermalNodes > 2) |
||||
|
{ |
||||
|
*(here->SOI3TOUT1_tout2Ptr) += m * (-grt[1]); |
||||
|
*(here->SOI3TOUT2_tout1Ptr) += m * (-grt[1]); |
||||
|
*(here->SOI3TOUT2_tout2Ptr) += m * (grt[1]+grt[2]); |
||||
|
} |
||||
|
if (here->SOI3numThermalNodes > 3) |
||||
|
{ |
||||
|
*(here->SOI3TOUT2_tout3Ptr) += m * (-grt[2]); |
||||
|
*(here->SOI3TOUT3_tout2Ptr) += m * (-grt[2]); |
||||
|
*(here->SOI3TOUT3_tout3Ptr) += m * (grt[2]+grt[3]); |
||||
|
} |
||||
|
if (here->SOI3numThermalNodes > 4) |
||||
|
{ |
||||
|
*(here->SOI3TOUT3_tout4Ptr) += m * (-grt[3]); |
||||
|
*(here->SOI3TOUT4_tout3Ptr) += m * (-grt[3]); |
||||
|
*(here->SOI3TOUT4_tout4Ptr) += m * (grt[3]+grt[4]); |
||||
|
} |
||||
|
|
||||
|
*(here->SOI3TOUT_dpPtr) += m * (xnrm*(-(here->SOI3gPds*model->SOI3type)) |
||||
|
+xrev*(here->SOI3gPds+here->SOI3gPmf+ |
||||
|
here->SOI3gPmb+here->SOI3gPmbs)* |
||||
|
model->SOI3type); |
||||
|
*(here->SOI3TOUT_gfPtr) += m * (-(here->SOI3gPmf*model->SOI3type)); |
||||
|
*(here->SOI3TOUT_gbPtr) += m * (-(here->SOI3gPmb*model->SOI3type)); |
||||
|
*(here->SOI3TOUT_bPtr) += m * (-(here->SOI3gPmbs*model->SOI3type)); |
||||
|
*(here->SOI3TOUT_spPtr) += m * (xnrm*(here->SOI3gPds+here->SOI3gPmf+ |
||||
|
here->SOI3gPmb+here->SOI3gPmbs)*model->SOI3type |
||||
|
+xrev*(-(here->SOI3gPds*model->SOI3type))); |
||||
|
|
||||
|
*(here->SOI3DP_toutPtr) += m * (xnrm-xrev)*here->SOI3gt*model->SOI3type; |
||||
|
*(here->SOI3SP_toutPtr) += m * (xrev-xnrm)*here->SOI3gt*model->SOI3type; |
||||
|
/* need to mult by type in above as conductances will be used with exterior voltages |
||||
|
which will be -ve for PMOS except for gPdT */ |
||||
|
/* now for thermal influence on impact ionisation current and transient stuff */ |
||||
|
*(here->SOI3DP_toutPtr) += m * (xnrm*here->SOI3gMdeltaT - |
||||
|
here->SOI3gbdT + here->SOI3gBJTdb_deltaT)*model->SOI3type; |
||||
|
*(here->SOI3SP_toutPtr) += m * (xrev*here->SOI3gMdeltaT - |
||||
|
here->SOI3gbsT + here->SOI3gBJTsb_deltaT)*model->SOI3type; |
||||
|
*(here->SOI3B_toutPtr) -= m * (here->SOI3gMdeltaT - here->SOI3gbsT - |
||||
|
here->SOI3gbdT + here->SOI3gBJTdb_deltaT + |
||||
|
here->SOI3gBJTsb_deltaT)*model->SOI3type; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return(OK); |
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue