fix OMP in BSIM3/simd, simdified BSIM3trunc
This commit is contained in:
parent
a15f9a1eba
commit
6ec7b3b9e5
|
|
@ -2996,8 +2996,12 @@ line900:
|
|||
here->BSIM3rhsD = m * (ceqbd - cdreq - ceqqd);
|
||||
here->BSIM3rhsS = m * (cdreq + ceqbs + ceqqg
|
||||
+ ceqqb + ceqqd);
|
||||
if (here->BSIM3nqsMod)
|
||||
#ifndef OMP_EFFMEM
|
||||
if (here->BSIM3nqsMod)
|
||||
here->BSIM3rhsQ = m * (cqcheq - cqdef);
|
||||
#else
|
||||
*(ckt->CKTrhs + here->BSIM3qNode) += m * (cqcheq - cqdef);
|
||||
#endif
|
||||
#else
|
||||
(*(ckt->CKTrhs + here->BSIM3gNode) -= m * ceqqg);
|
||||
(*(ckt->CKTrhs + here->BSIM3bNode) -= m * (ceqbs + ceqbd + ceqqb));
|
||||
|
|
@ -3051,7 +3055,8 @@ line900:
|
|||
here->BSIM3SPdpPt = m * (here->BSIM3gds + RevSum - gcsdb
|
||||
- sxpart * ggtd - T1 * dsxpart_dVd - gbspdp);
|
||||
|
||||
if (here->BSIM3nqsMod)
|
||||
#ifndef OMP_EFFMEM
|
||||
if (here->BSIM3nqsMod)
|
||||
{ here->BSIM3QqPt = m * (gqdef + here->BSIM3gtau);
|
||||
|
||||
here->BSIM3DPqPt = m * (dxpart * here->BSIM3gtau);
|
||||
|
|
@ -3063,6 +3068,20 @@ line900:
|
|||
here->BSIM3QspPt = m * (ggts - gcqsb);
|
||||
here->BSIM3QbPt = m * (ggtb - gcqbb);
|
||||
}
|
||||
#else
|
||||
if (here->BSIM3nqsMod)
|
||||
{ *(here->BSIM3QqPtr) += m * (gqdef + here->BSIM3gtau);
|
||||
|
||||
*(here->BSIM3DPqPtr) += m * (dxpart * here->BSIM3gtau);
|
||||
*(here->BSIM3SPqPtr) += m * (sxpart * here->BSIM3gtau);
|
||||
*(here->BSIM3GqPtr) -= m * here->BSIM3gtau;
|
||||
|
||||
*(here->BSIM3QgPtr) += m * (ggtg - gcqgb);
|
||||
*(here->BSIM3QdpPtr) += m * (ggtd - gcqdb);
|
||||
*(here->BSIM3QspPtr) += m * (ggts - gcqsb);
|
||||
*(here->BSIM3QbPtr) += m * (ggtb - gcqbb);
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
(*(here->BSIM3DdPtr) += m * here->BSIM3drainConductance);
|
||||
(*(here->BSIM3GgPtr) += m * (gcggb - ggtg));
|
||||
|
|
@ -3137,14 +3156,17 @@ void BSIM3SIMDLoadRhsMat(GENmodel *inModel, CKTcircuit *ckt)
|
|||
for(idx = 0; idx < InstCount; idx++) {
|
||||
here = InstArray[idx];
|
||||
model = BSIM3SIMDmodPtr(here);
|
||||
ckt->CKTnoncon += here->BSIM3noncon;
|
||||
/* Update b for Ax = b */
|
||||
(*(ckt->CKTrhs + here->BSIM3gNode) -= here->BSIM3rhsG);
|
||||
(*(ckt->CKTrhs + here->BSIM3bNode) -= here->BSIM3rhsB);
|
||||
(*(ckt->CKTrhs + here->BSIM3dNodePrime) += here->BSIM3rhsD);
|
||||
(*(ckt->CKTrhs + here->BSIM3sNodePrime) += here->BSIM3rhsS);
|
||||
#ifndef OMP_EFFMEM
|
||||
if (here->BSIM3nqsMod)
|
||||
(*(ckt->CKTrhs + here->BSIM3qNode) += here->BSIM3rhsQ);
|
||||
|
||||
#endif
|
||||
|
||||
/* Update A for Ax = b */
|
||||
(*(here->BSIM3DdPtr) += here->BSIM3DdPt);
|
||||
(*(here->BSIM3GgPtr) += here->BSIM3GgPt);
|
||||
|
|
@ -3169,7 +3191,8 @@ void BSIM3SIMDLoadRhsMat(GENmodel *inModel, CKTcircuit *ckt)
|
|||
(*(here->BSIM3SPbPtr) -= here->BSIM3SPbPt);
|
||||
(*(here->BSIM3SPdpPtr) -= here->BSIM3SPdpPt);
|
||||
|
||||
if (here->BSIM3nqsMod)
|
||||
#ifndef OMP_EFFMEM
|
||||
if (here->BSIM3nqsMod)
|
||||
{ *(here->BSIM3QqPtr) += here->BSIM3QqPt;
|
||||
|
||||
*(here->BSIM3DPqPtr) += here->BSIM3DPqPt;
|
||||
|
|
@ -3181,6 +3204,7 @@ void BSIM3SIMDLoadRhsMat(GENmodel *inModel, CKTcircuit *ckt)
|
|||
*(here->BSIM3QspPtr) += here->BSIM3QspPt;
|
||||
*(here->BSIM3QbPtr) += here->BSIM3QbPt;
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -14,6 +14,10 @@
|
|||
#include "ngspice/sperror.h"
|
||||
#include "ngspice/suffix.h"
|
||||
|
||||
#include "ngspice/SIMD/simdvector.h"
|
||||
#include "ngspice/SIMD/simdckt.h"
|
||||
#include <float.h>
|
||||
|
||||
|
||||
int
|
||||
BSIM3SIMDtrunc(
|
||||
|
|
@ -23,28 +27,39 @@ double *timeStep)
|
|||
{
|
||||
BSIM3model *model = (BSIM3model*)inModel;
|
||||
BSIM3instance *here;
|
||||
|
||||
int i;
|
||||
#ifdef STEPDEBUG
|
||||
double debugtemp;
|
||||
#endif /* STEPDEBUG */
|
||||
|
||||
for (; model != NULL; model = BSIM3SIMDnextModel(model))
|
||||
{ for (here = BSIM3SIMDinstances(model); here != NULL;
|
||||
here = BSIM3SIMDnextInstance(here))
|
||||
for(i=0;i<model->BSIM3InstCount;i+=NSIMD)
|
||||
{
|
||||
VecNi indexes;
|
||||
#ifdef STEPDEBUG
|
||||
debugtemp = *timeStep;
|
||||
#endif /* STEPDEBUG */
|
||||
CKTterr(here->BSIM3qb,ckt,timeStep);
|
||||
CKTterr(here->BSIM3qg,ckt,timeStep);
|
||||
CKTterr(here->BSIM3qd,ckt,timeStep);
|
||||
|
||||
for(int k=0;k<NSIMD;k++)
|
||||
indexes[k] = model->BSIM3InstanceArray[i+k]->BSIM3qb;
|
||||
vecN_CKTterr(indexes,ckt,timeStep);
|
||||
for(int k=0;k<NSIMD;k++)
|
||||
indexes[k] = model->BSIM3InstanceArray[i+k]->BSIM3qg;
|
||||
vecN_CKTterr(indexes,ckt,timeStep);
|
||||
for(int k=0;k<NSIMD;k++)
|
||||
indexes[k] = model->BSIM3InstanceArray[i+k]->BSIM3qd;
|
||||
vecN_CKTterr(indexes,ckt,timeStep);
|
||||
#ifdef STEPDEBUG
|
||||
if(debugtemp != *timeStep)
|
||||
{ printf("device %s reduces step from %g to %g\n",
|
||||
here->BSIM3name,debugtemp,*timeStep);
|
||||
model->BSIM3v32InstanceArray[i]->BSIM3name,debugtemp,*timeStep);
|
||||
}
|
||||
#endif /* STEPDEBUG */
|
||||
}
|
||||
|
||||
for(;i<model->BSIM3InstCount;i++)
|
||||
{
|
||||
CKTterr(model->BSIM3InstanceArray[i]->BSIM3qb,ckt,timeStep);
|
||||
CKTterr(model->BSIM3InstanceArray[i]->BSIM3qg,ckt,timeStep);
|
||||
CKTterr(model->BSIM3InstanceArray[i]->BSIM3qd,ckt,timeStep);
|
||||
}
|
||||
return(OK);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -192,8 +192,9 @@ typedef struct sBSIM3instance
|
|||
double BSIM3SIMDcdhat;
|
||||
double BSIM3SIMDcbhat;
|
||||
int BSIM3SIMDCheck;
|
||||
|
||||
|
||||
/* per instance storage of results, to update matrix at a later stge */
|
||||
int BSIM3noncon;
|
||||
double BSIM3rhsG;
|
||||
double BSIM3rhsB;
|
||||
double BSIM3rhsD;
|
||||
|
|
|
|||
Loading…
Reference in New Issue