diff --git a/src/spicelib/devices/dio/dioacld.c b/src/spicelib/devices/dio/dioacld.c index d7e68c41b..f44c4d639 100644 --- a/src/spicelib/devices/dio/dioacld.c +++ b/src/spicelib/devices/dio/dioacld.c @@ -61,6 +61,26 @@ DIOacLoad(GENmodel *inModel, CKTcircuit *ckt) double xgcTt= *(ckt->CKTstate0 + here->DIOcqth) * ckt->CKTomega; (*(here->DIOtempTempPtr + 1) += xgcTt); } + if (model->DIOsoftRevRecParamGiven) { + double dcrrdvd, grr, geqrrd; + double gdres = *(ckt->CKTstate0 + here->DIOresConduct); + double gqcsr = *(ckt->CKTstate0 + here->DIOgqcsr); + /* QP subcircuit */ + dcrrdvd = here->DIOtTransitTime / model->DIOsoftRevRecParam * gdres; + grr = 1/model->DIOsoftRevRecParam; + *(here->DIOqpQpPtr) += grr + gqcsr; + *(here->DIOqpPosPrimePtr) += -dcrrdvd; + *(here->DIOqpNegPtr) += dcrrdvd; + /* Contribution to diode current */ + /* Linear contribution -(1-vp)/tau*ddt(Qp) */ + geqrrd = (1 - model->DIOsoftRevRecParam) / here->DIOtTransitTime * gqcsr; + *(here->DIOposPrimeQpPtr) += geqrrd; + *(here->DIOnegQpPtr) += -geqrrd; + + xceq = *(ckt->CKTstate0 + here->DIOsrcapCurrent) * ckt->CKTomega; + *(here->DIOqpQpPtr + 1) += xceq; + + } } } return(OK); diff --git a/src/spicelib/devices/dio/dioask.c b/src/spicelib/devices/dio/dioask.c index 5d3a7374b..80d0e781b 100644 --- a/src/spicelib/devices/dio/dioask.c +++ b/src/spicelib/devices/dio/dioask.c @@ -63,6 +63,8 @@ DIOask (CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, return(OK); case DIO_CURRENT: value->rValue = *(ckt->CKTstate0+here->DIOcurrent); + if (here->DIOqpNode > 0) + value->rValue += *(ckt->CKTstate0+here->DIOcqcsr); return(OK); case DIO_CAP: value->rValue = here->DIOcap; diff --git a/src/spicelib/devices/dio/dioload.c b/src/spicelib/devices/dio/dioload.c index 9724622c1..84f88420a 100644 --- a/src/spicelib/devices/dio/dioload.c +++ b/src/spicelib/devices/dio/dioload.c @@ -505,6 +505,7 @@ next1: (!(ckt->CKTmode & MODEUIC)) ) { if (ckt->CKTmode & MODEINITSMSIG){ *(ckt->CKTstate0 + here->DIOcapCurrent) = capd; + *(ckt->CKTstate0 + here->DIOsrcapCurrent) = capsr; if(SenCond){ *(ckt->CKTstate0 + here->DIOcurrent) = cd; diff --git a/src/spicelib/devices/dio/diotrunc.c b/src/spicelib/devices/dio/diotrunc.c index 5c64086f9..0c077e4dc 100644 --- a/src/spicelib/devices/dio/diotrunc.c +++ b/src/spicelib/devices/dio/diotrunc.c @@ -21,6 +21,9 @@ DIOtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) for( ; model != NULL; model = DIOnextModel(model)) { for(here=DIOinstances(model);here!=NULL;here = DIOnextInstance(here)){ CKTterr(here->DIOcapCharge,ckt,timeStep); + if (model->DIOsoftRevRecParamGiven) { + CKTterr(here->DIOsrcapCharge,ckt,timeStep); + } } } return(OK);