diff --git a/src/spicelib/analysis/cktsetup.c b/src/spicelib/analysis/cktsetup.c index 5aba27882..95f583e14 100644 --- a/src/spicelib/analysis/cktsetup.c +++ b/src/spicelib/analysis/cktsetup.c @@ -73,6 +73,8 @@ CKTsetup(CKTcircuit *ckt) #ifdef HAS_PROGREP SetAnalyse( "Device Setup", 0 ); #endif + // make sure asrc comes before res, cap, ind etc + // damit die findbranches durch sind ... if ( DEVices[i] && DEVices[i]->DEVsetup && ckt->CKThead[i] ) { error = DEVices[i]->DEVsetup (matrix, ckt->CKThead[i], ckt, &ckt->CKTnumStates); diff --git a/src/spicelib/devices/cap/Makefile.am b/src/spicelib/devices/cap/Makefile.am index 4205040ae..2ad748d9d 100644 --- a/src/spicelib/devices/cap/Makefile.am +++ b/src/spicelib/devices/cap/Makefile.am @@ -28,6 +28,7 @@ libcap_la_SOURCES = \ capsset.c \ capsupd.c \ captemp.c \ + capfindbr.c \ captrunc.c diff --git a/src/spicelib/devices/cap/capacld.c b/src/spicelib/devices/cap/capacld.c index 1c01e815a..7d5420a0d 100644 --- a/src/spicelib/devices/cap/capacld.c +++ b/src/spicelib/devices/cap/capacld.c @@ -29,10 +29,17 @@ CAPacLoad(GENmodel *inModel, CKTcircuit *ckt) val = ckt->CKTomega * here->CAPcapac; - *(here->CAPposPosptr +1) += m * val; - *(here->CAPnegNegptr +1) += m * val; - *(here->CAPposNegptr +1) -= m * val; - *(here->CAPnegPosptr +1) -= m * val; + *(here->CAP_posPrime_posPrime +1) += m * val; + *(here->CAP_neg_neg +1) += m * val; + *(here->CAP_posPrime_neg +1) -= m * val; + *(here->CAP_neg_PosPrime +1) -= m * val; + + if (here->CAPbranch) { + *(here->CAP_pos_ibr) += 1.0; + *(here->CAP_posPrime_ibr) -= 1.0; + *(here->CAP_ibr_pos) += 1.0; + *(here->CAP_ibr_posPrime) -= 1.0; + } } } return(OK); diff --git a/src/spicelib/devices/cap/capdefs.h b/src/spicelib/devices/cap/capdefs.h index fbf860f9a..7b470c047 100644 --- a/src/spicelib/devices/cap/capdefs.h +++ b/src/spicelib/devices/cap/capdefs.h @@ -26,6 +26,8 @@ typedef struct sCAPinstance { int CAPstate; /* pointer to start of capacitor state vector */ int CAPposNode; /* number of positive node of capacitor */ int CAPnegNode; /* number of negative node of capacitor */ + int CAPposPrimeNode; /* number of positive prime node of capacitor */ + int CAPbranch; /* number of vprobe branch current node */ double CAPtemp; /* temperature at which this capacitor operates */ double CAPdtemp; /* delta-temperature of this instance */ @@ -39,14 +41,19 @@ typedef struct sCAPinstance { double CAPtc2; /* second temperature coefficient of capacitors */ double CAPbv_max; /* Maximum capacitor voltage */ - double *CAPposPosptr; /* pointer to sparse matrix diagonal at + double *CAP_posPrime_posPrime; /* pointer to sparse matrix diagonal at * (positive,positive) */ - double *CAPnegNegptr; /* pointer to sparse matrix diagonal at + double *CAP_neg_neg; /* pointer to sparse matrix diagonal at * (negative,negative) */ - double *CAPposNegptr; /* pointer to sparse matrix offdiagonal at + double *CAP_posPrime_neg; /* pointer to sparse matrix offdiagonal at * (positive,negative) */ - double *CAPnegPosptr; /* pointer to sparse matrix offdiagonal at + double *CAP_neg_PosPrime; /* pointer to sparse matrix offdiagonal at * (negative,positive) */ + double *CAP_pos_ibr; + double *CAP_posPrime_ibr; + double *CAP_ibr_posPrime; + double *CAP_ibr_pos; + unsigned CAPcapGiven : 1; /* flag to indicate capacitance was specified */ unsigned CAPicGiven : 1; /* flag to indicate init. cond. was specified */ unsigned CAPwidthGiven : 1; /* flag to indicate capacitor width given */ diff --git a/src/spicelib/devices/cap/capext.h b/src/spicelib/devices/cap/capext.h index d128959c4..1548e1068 100644 --- a/src/spicelib/devices/cap/capext.h +++ b/src/spicelib/devices/cap/capext.h @@ -20,7 +20,9 @@ extern void CAPsPrint(GENmodel*,CKTcircuit*); extern int CAPsSetup(SENstruct *,GENmodel*); extern int CAPsUpdate(GENmodel*,CKTcircuit*); extern int CAPsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); +extern int CAPunsetup(GENmodel*,CKTcircuit*); extern int CAPtemp(GENmodel*,CKTcircuit*); extern int CAPtrunc(GENmodel*,CKTcircuit*,double*); extern int CAPsoaCheck(CKTcircuit *, GENmodel *); +extern int CAPfindBr(CKTcircuit*,GENmodel*,IFuid); diff --git a/src/spicelib/devices/cap/capfindbr.c b/src/spicelib/devices/cap/capfindbr.c new file mode 100644 index 000000000..6bb8de959 --- /dev/null +++ b/src/spicelib/devices/cap/capfindbr.c @@ -0,0 +1,41 @@ +/*********************************** +* Author: Marcel Hendrix, Feb 2015 * +***********************************/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "capdefs.h" +#include "ngspice/sperror.h" +#include "ngspice/suffix.h" + + +int +CAPfindBr (CKTcircuit *ckt, GENmodel *inModel, IFuid name) +{ + CAPmodel *model = (CAPmodel *) inModel; + CAPinstance *here; + + for (; model; model = model->CAPnextModel) + for (here = model->CAPinstances; here; here = here->CAPnextInstance) + if (here->CAPname == name) { + + if (here->CAPbranch == 0) { + CKTnode *tmp; + int error; + + error = CKTmkCur(ckt, &tmp, here->CAPname, "branch"); + if (error) + return error; + here->CAPbranch = tmp->number; + + error = CKTmkVolt(ckt, &tmp, here->CAPname, "aux"); + if (error) + return error; + here->CAPposPrimeNode = tmp->number; + } + + return here->CAPbranch; + } + + return 0; +} diff --git a/src/spicelib/devices/cap/capinit.c b/src/spicelib/devices/cap/capinit.c index 1c8bb5126..332276e1d 100644 --- a/src/spicelib/devices/cap/capinit.c +++ b/src/spicelib/devices/cap/capinit.c @@ -43,11 +43,11 @@ SPICEdev CAPinfo = { /* DEVmodParam */ CAPmParam, /* DEVload */ CAPload, /* DEVsetup */ CAPsetup, - /* DEVunsetup */ NULL, + /* DEVunsetup */ CAPunsetup, /* DEVpzSetup */ CAPsetup, /* DEVtemperature*/ CAPtemp, /* DEVtrunc */ CAPtrunc, - /* DEVfindBranch */ NULL, + /* DEVfindBranch */ CAPfindBr, /* DEVacLoad */ CAPacLoad, /* DEVaccept */ NULL, /* DEVdestroy */ CAPdestroy, diff --git a/src/spicelib/devices/cap/capload.c b/src/spicelib/devices/cap/capload.c index 8ad08ac0f..2a980b878 100644 --- a/src/spicelib/devices/cap/capload.c +++ b/src/spicelib/devices/cap/capload.c @@ -42,7 +42,7 @@ CAPload(GENmodel *inModel, CKTcircuit *ckt) if(cond1) { vcap = here->CAPinitCond; } else { - vcap = *(ckt->CKTrhsOld+here->CAPposNode) - + vcap = *(ckt->CKTrhsOld+here->CAPposPrimeNode) - *(ckt->CKTrhsOld+here->CAPnegNode) ; } if(ckt->CKTmode & (MODETRAN | MODEAC)) { @@ -67,16 +67,23 @@ CAPload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTstate1+here->CAPccap) = *(ckt->CKTstate0+here->CAPccap); } - *(here->CAPposPosptr) += m * geq; - *(here->CAPnegNegptr) += m * geq; - *(here->CAPposNegptr) -= m * geq; - *(here->CAPnegPosptr) -= m * geq; - *(ckt->CKTrhs+here->CAPposNode) -= m * ceq; - *(ckt->CKTrhs+here->CAPnegNode) += m * ceq; + *(here->CAP_posPrime_posPrime) += m * geq; + *(here->CAP_neg_neg) += m * geq; + *(here->CAP_posPrime_neg) -= m * geq; + *(here->CAP_neg_PosPrime) -= m * geq; + ckt->CKTrhs[here->CAPposPrimeNode] -= m * ceq; + ckt->CKTrhs[here->CAPnegNode] += m * ceq; } else if (ckt->CKTmode & MODETRANOP) { *(ckt->CKTstate0+here->CAPqcap) = here->CAPcapac * vcap; } + + if (here->CAPbranch) { + *(here->CAP_pos_ibr) += 1.0; + *(here->CAP_posPrime_ibr) -= 1.0; + *(here->CAP_ibr_pos) += 1.0; + *(here->CAP_ibr_posPrime) -= 1.0; + } } } return(OK); diff --git a/src/spicelib/devices/cap/cappzld.c b/src/spicelib/devices/cap/cappzld.c index dbccd97c6..9711d0e0e 100644 --- a/src/spicelib/devices/cap/cappzld.c +++ b/src/spicelib/devices/cap/cappzld.c @@ -33,14 +33,21 @@ CAPpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) val = here->CAPcapac; m = here->CAPm; - *(here->CAPposPosptr ) += m * val * s->real; - *(here->CAPposPosptr +1) += m * val * s->imag; - *(here->CAPnegNegptr ) += m * val * s->real; - *(here->CAPnegNegptr +1) += m * val * s->imag; - *(here->CAPposNegptr ) -= m * val * s->real; - *(here->CAPposNegptr +1) -= m * val * s->imag; - *(here->CAPnegPosptr ) -= m * val * s->real; - *(here->CAPnegPosptr +1) -= m * val * s->imag; + *(here->CAP_posPrime_posPrime ) += m * val * s->real; + *(here->CAP_posPrime_posPrime +1) += m * val * s->imag; + *(here->CAP_neg_neg ) += m * val * s->real; + *(here->CAP_neg_neg +1) += m * val * s->imag; + *(here->CAP_posPrime_neg ) -= m * val * s->real; + *(here->CAP_posPrime_neg +1) -= m * val * s->imag; + *(here->CAP_neg_PosPrime ) -= m * val * s->real; + *(here->CAP_neg_PosPrime +1) -= m * val * s->imag; + + if (here->CAPbranch) { + *(here->CAP_pos_ibr) += 1.0; + *(here->CAP_posPrime_ibr) -= 1.0; + *(here->CAP_ibr_pos) += 1.0; + *(here->CAP_ibr_posPrime) -= 1.0; + } } } return(OK); diff --git a/src/spicelib/devices/cap/capsetup.c b/src/spicelib/devices/cap/capsetup.c index 6d2bbdc55..a4713abe2 100644 --- a/src/spicelib/devices/cap/capsetup.c +++ b/src/spicelib/devices/cap/capsetup.c @@ -111,12 +111,39 @@ do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ } } while(0) - TSTALLOC(CAPposPosptr,CAPposNode,CAPposNode); - TSTALLOC(CAPnegNegptr,CAPnegNode,CAPnegNode); - TSTALLOC(CAPposNegptr,CAPposNode,CAPnegNode); - TSTALLOC(CAPnegPosptr,CAPnegNode,CAPposNode); + if (here->CAPbranch == 0) { + here->CAPposPrimeNode = here->CAPposNode; + } else { + TSTALLOC(CAP_pos_ibr, CAPposNode, CAPbranch); + TSTALLOC(CAP_posPrime_ibr, CAPposPrimeNode, CAPbranch); + TSTALLOC(CAP_ibr_posPrime, CAPbranch, CAPposPrimeNode); + TSTALLOC(CAP_ibr_pos, CAPbranch, CAPposNode); + } + + TSTALLOC(CAP_posPrime_posPrime, CAPposPrimeNode, CAPposPrimeNode); + TSTALLOC(CAP_neg_neg, CAPnegNode, CAPnegNode); + TSTALLOC(CAP_posPrime_neg, CAPposPrimeNode, CAPnegNode); + TSTALLOC(CAP_neg_PosPrime, CAPnegNode, CAPposPrimeNode); } } return(OK); } + +int +CAPunsetup(GENmodel *inModel, CKTcircuit *ckt) +{ + CAPmodel *model = (CAPmodel *) inModel; + CAPinstance *here; + + for (; model; model = model->CAPnextModel) + for (here = model->CAPinstances; here; here = here->CAPnextInstance) + if (here->CAPbranch) { + CKTdltNNum(ckt, here->CAPbranch); + here->CAPbranch = 0; + CKTdltNNum(ckt, here->CAPposPrimeNode); + here->CAPposPrimeNode = 0; + } + + return OK; +} diff --git a/src/spicelib/devices/dev.c b/src/spicelib/devices/dev.c index a4c7bc6b7..52140d62a 100644 --- a/src/spicelib/devices/dev.c +++ b/src/spicelib/devices/dev.c @@ -141,7 +141,7 @@ int add_udn(int,Evt_Udn_Info_t **); static SPICEdev *(*static_devices[])(void) = { /* URC device MUST precede both resistors and capacitors */ get_urc_info, - get_asrc_info, + get_asrc_info, /* asrc must precede res, cap, ind and dio */ get_bjt_info, get_bsim1_info, get_bsim2_info, diff --git a/src/spicelib/devices/ind/Makefile.am b/src/spicelib/devices/ind/Makefile.am index 5a05ee97b..102fa0e31 100644 --- a/src/spicelib/devices/ind/Makefile.am +++ b/src/spicelib/devices/ind/Makefile.am @@ -22,6 +22,7 @@ libind_la_SOURCES = \ indsacl.c \ indsetup.c \ indsload.c \ + indfindbr.c \ indsprt.c \ indsset.c \ indsupd.c \ diff --git a/src/spicelib/devices/ind/indext.h b/src/spicelib/devices/ind/indext.h index 8d2fa035c..9568a1522 100644 --- a/src/spicelib/devices/ind/indext.h +++ b/src/spicelib/devices/ind/indext.h @@ -24,6 +24,7 @@ extern int INDsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); extern int INDunsetup(GENmodel*,CKTcircuit*); extern int INDtemp(GENmodel*, CKTcircuit*); extern int INDtrunc(GENmodel*,CKTcircuit*,double*); +extern int INDfindBr(CKTcircuit*, GENmodel*, IFuid); extern int MUTacLoad(GENmodel*,CKTcircuit*); extern int MUTask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); diff --git a/src/spicelib/devices/ind/indfindbr.c b/src/spicelib/devices/ind/indfindbr.c new file mode 100644 index 000000000..1d4eb4a8c --- /dev/null +++ b/src/spicelib/devices/ind/indfindbr.c @@ -0,0 +1,36 @@ +/*********************************** +* Author: Marcel Hendrix, Feb 2015 * +***********************************/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "inddefs.h" +#include "ngspice/sperror.h" +#include "ngspice/suffix.h" + + +int +INDfindBr (CKTcircuit *ckt, GENmodel *inModel, IFuid name) +{ + INDmodel *model = (INDmodel *) inModel; + INDinstance *here; + + for (; model; model = model->INDnextModel) + for (here = model->INDinstances; here; here = here->INDnextInstance) + if (here->INDname == name) { + + if (here->INDbrEq == 0) { + CKTnode *tmp; + int error; + + error = CKTmkCur(ckt, &tmp, here->INDname, "branch"); + if (error) + return error; + here->INDbrEq = tmp->number; + } + + return here->INDbrEq; + } + + return 0; +} diff --git a/src/spicelib/devices/ind/indinit.c b/src/spicelib/devices/ind/indinit.c index 20c325543..3f95746e6 100644 --- a/src/spicelib/devices/ind/indinit.c +++ b/src/spicelib/devices/ind/indinit.c @@ -47,7 +47,7 @@ SPICEdev INDinfo = { /* DEVpzSetup */ INDsetup, /* DEVtemperature*/ INDtemp, /* DEVtrunc */ INDtrunc, - /* DEVfindBranch */ NULL, + /* DEVfindBranch */ INDfindBr, /* DEVacLoad */ INDacLoad, /* DEVaccept */ NULL, /* DEVdestroy */ INDdestroy, diff --git a/src/spicelib/devices/res/Makefile.am b/src/spicelib/devices/res/Makefile.am index ab746263d..9b5e75959 100644 --- a/src/spicelib/devices/res/Makefile.am +++ b/src/spicelib/devices/res/Makefile.am @@ -25,6 +25,7 @@ libres_la_SOURCES = \ ressload.c \ ressprt.c \ ressset.c \ + resfindbr.c \ restemp.c diff --git a/src/spicelib/devices/res/resdefs.h b/src/spicelib/devices/res/resdefs.h index a8f0578a2..57cb5d24f 100644 --- a/src/spicelib/devices/res/resdefs.h +++ b/src/spicelib/devices/res/resdefs.h @@ -27,6 +27,8 @@ typedef struct sRESinstance { int RESstate; /* not used but needed for sructure consistency */ int RESposNode; /* number of positive node of resistor */ int RESnegNode; /* number of negative node of resistor */ + int RESposPrimeNode; /* number of node between resistor and vprobe */ + int RESbranch; /* number of vprobe branch current node */ double REStemp; /* temperature at which this resistor operates */ double RESdtemp; /* delta-temperature of a particular instance */ @@ -45,14 +47,19 @@ typedef struct sRESinstance { double RESbv_max; /* Maximum resistor voltage */ int RESnoisy; /* Set if the resistor generates noise */ double RESeffNoiseArea; /* effective resistor area for noise calculation */ - double *RESposPosptr; /* pointer to sparse matrix diagonal at + double *RES_posPrime_posPrime; /* pointer to sparse matrix diagonal at * (positive,positive) */ - double *RESnegNegptr; /* pointer to sparse matrix diagonal at + double *RES_neg_neg; /* pointer to sparse matrix diagonal at * (negative,negative) */ - double *RESposNegptr; /* pointer to sparse matrix offdiagonal at + double *RES_posPrime_neg; /* pointer to sparse matrix offdiagonal at * (positive,negative) */ - double *RESnegPosptr; /* pointer to sparse matrix offdiagonal at + double *RES_neg_PosPrime; /* pointer to sparse matrix offdiagonal at * (negative,positive) */ + double *RES_pos_ibr; + double *RES_posPrime_ibr; + double *RES_ibr_posPrime; + double *RES_ibr_pos; + unsigned RESresGiven : 1; /* flag to indicate resistance was specified */ unsigned RESwidthGiven : 1; /* flag to indicate width given */ unsigned RESlengthGiven : 1; /* flag to indicate length given */ diff --git a/src/spicelib/devices/res/resext.h b/src/spicelib/devices/res/resext.h index 148d1d222..23a9b2c5a 100644 --- a/src/spicelib/devices/res/resext.h +++ b/src/spicelib/devices/res/resext.h @@ -18,6 +18,8 @@ extern int RESsLoad(GENmodel*,CKTcircuit*); extern int RESsSetup(SENstruct*,GENmodel*); extern void RESsPrint(GENmodel*,CKTcircuit*); extern int RESsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*); +extern int RESunsetup(GENmodel*, CKTcircuit*); extern int REStemp(GENmodel*,CKTcircuit*); extern int RESnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int RESsoaCheck(CKTcircuit *, GENmodel *); +extern int RESfindBr(CKTcircuit*, GENmodel*, IFuid); diff --git a/src/spicelib/devices/res/resfindbr.c b/src/spicelib/devices/res/resfindbr.c new file mode 100644 index 000000000..26fb40561 --- /dev/null +++ b/src/spicelib/devices/res/resfindbr.c @@ -0,0 +1,41 @@ +/*********************************** +* Author: Marcel Hendrix, Feb 2015 * +***********************************/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "resdefs.h" +#include "ngspice/sperror.h" +#include "ngspice/suffix.h" + + +int +RESfindBr (CKTcircuit *ckt, GENmodel *inModel, IFuid name) +{ + RESmodel *model = (RESmodel *) inModel; + RESinstance *here; + + for (; model; model = model->RESnextModel) + for (here = model->RESinstances; here; here = here->RESnextInstance) + if (here->RESname == name) { + + if (!here->RESbranch) { + CKTnode *tmp; + int error; + + error = CKTmkCur(ckt, &tmp, here->RESname, "branch"); + if (error) + return error; + here->RESbranch = tmp->number; + + error = CKTmkVolt(ckt, &tmp, here->RESname, "aux"); + if (error) + return error; + here->RESposPrimeNode = tmp->number; + } + + return here->RESbranch; + } + + return 0; +} diff --git a/src/spicelib/devices/res/resinit.c b/src/spicelib/devices/res/resinit.c index d4096de8d..612228d71 100644 --- a/src/spicelib/devices/res/resinit.c +++ b/src/spicelib/devices/res/resinit.c @@ -44,11 +44,11 @@ SPICEdev RESinfo = { /* DEVmodParam */ RESmParam, /* DEVload */ RESload, /* DEVsetup */ RESsetup, - /* DEVunsetup */ NULL, + /* DEVunsetup */ RESunsetup, /* DEVpzSetup */ RESsetup, /* DEVtemperature*/ REStemp, /* DEVtrunc */ NULL, - /* DEVfindBranch */ NULL, + /* DEVfindBranch */ RESfindBr, /* DEVacLoad */ RESacload, /* ac load and normal load are identical */ /* DEVaccept */ NULL, /* DEVdestroy */ RESdestroy, diff --git a/src/spicelib/devices/res/resload.c b/src/spicelib/devices/res/resload.c index 87c62c7d0..027beee35 100644 --- a/src/spicelib/devices/res/resload.c +++ b/src/spicelib/devices/res/resload.c @@ -31,10 +31,17 @@ RESload(GENmodel *inModel, CKTcircuit *ckt) m = (here->RESm); - *(here->RESposPosptr) += m * here->RESconduct; - *(here->RESnegNegptr) += m * here->RESconduct; - *(here->RESposNegptr) -= m * here->RESconduct; - *(here->RESnegPosptr) -= m * here->RESconduct; + *(here->RES_posPrime_posPrime) += m * here->RESconduct; + *(here->RES_neg_neg) += m * here->RESconduct; + *(here->RES_posPrime_neg) -= m * here->RESconduct; + *(here->RES_neg_PosPrime) -= m * here->RESconduct; + + if (here->RESbranch) { + *(here->RES_pos_ibr) += 1.0 ; + *(here->RES_posPrime_ibr) -= 1.0 ; + *(here->RES_ibr_pos) += 1.0 ; + *(here->RES_ibr_posPrime) -= 1.0 ; + } } } return(OK); @@ -64,10 +71,17 @@ RESacload(GENmodel *inModel, CKTcircuit *ckt) else g = here->RESm * here->RESconduct; - *(here->RESposPosptr) += g; - *(here->RESnegNegptr) += g; - *(here->RESposNegptr) -= g; - *(here->RESnegPosptr) -= g; + *(here->RES_posPrime_posPrime) += g; + *(here->RES_neg_neg) += g; + *(here->RES_posPrime_neg) -= g; + *(here->RES_neg_PosPrime) -= g; + + if (here->RESbranch) { + *(here->RES_pos_ibr) += 1.0 ; + *(here->RES_posPrime_ibr) -= 1.0 ; + *(here->RES_ibr_pos) += 1.0 ; + *(here->RES_ibr_posPrime) -= 1.0 ; + } } } return(OK); diff --git a/src/spicelib/devices/res/respzld.c b/src/spicelib/devices/res/respzld.c index dcee4b4f2..39226bc51 100644 --- a/src/spicelib/devices/res/respzld.c +++ b/src/spicelib/devices/res/respzld.c @@ -38,10 +38,17 @@ RESpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) else g = here->RESm * here->RESconduct; - *(here->RESposPosptr) += g; - *(here->RESnegNegptr) += g; - *(here->RESposNegptr) -= g; - *(here->RESnegPosptr) -= g; + *(here->RES_posPrime_posPrime) += g; + *(here->RES_neg_neg) += g; + *(here->RES_posPrime_neg) -= g; + *(here->RES_neg_PosPrime) -= g; + + if (here->RESbranch) { + *(here->RES_pos_ibr) += 1.0; + *(here->RES_posPrime_ibr) -= 1.0; + *(here->RES_ibr_pos) += 1.0; + *(here->RES_ibr_posPrime) -= 1.0; + } } } return(OK); diff --git a/src/spicelib/devices/res/ressetup.c b/src/spicelib/devices/res/ressetup.c index 44c75ea5f..c40c94998 100644 --- a/src/spicelib/devices/res/ressetup.c +++ b/src/spicelib/devices/res/ressetup.c @@ -82,11 +82,40 @@ do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ return(E_NOMEM);\ } } while(0) - TSTALLOC(RESposPosptr, RESposNode, RESposNode); - TSTALLOC(RESnegNegptr, RESnegNode, RESnegNode); - TSTALLOC(RESposNegptr, RESposNode, RESnegNode); - TSTALLOC(RESnegPosptr, RESnegNode, RESposNode); + if (here->RESbranch == 0) { + here->RESposPrimeNode = here->RESposNode; + } else { + TSTALLOC(RES_pos_ibr, RESposNode, RESbranch); + TSTALLOC(RES_posPrime_ibr, RESposPrimeNode, RESbranch); + TSTALLOC(RES_ibr_posPrime, RESbranch, RESposPrimeNode); + TSTALLOC(RES_ibr_pos, RESbranch, RESposNode); + } + + TSTALLOC(RES_posPrime_posPrime, RESposPrimeNode, RESposPrimeNode); + TSTALLOC(RES_neg_neg, RESnegNode, RESnegNode); + TSTALLOC(RES_posPrime_neg, RESposPrimeNode, RESnegNode); + TSTALLOC(RES_neg_PosPrime, RESnegNode, RESposPrimeNode); + } } return(OK); } + + +int +RESunsetup(GENmodel *inModel, CKTcircuit *ckt) +{ + RESmodel *model = (RESmodel *) inModel; + RESinstance *here; + + for (; model; model = model->RESnextModel) + for (here = model->RESinstances; here; here = here->RESnextInstance) + if (here->RESbranch) { + CKTdltNNum(ckt, here->RESbranch); + here->RESbranch = 0; + CKTdltNNum(ckt, here->RESposPrimeNode); + here->RESposPrimeNode = 0; + } + + return OK; +}