From 7717c748d92b37fb886deadda66a695807c8a17c Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 1 Apr 2013 22:17:11 +0200 Subject: [PATCH] New Binding Method extended to BSIM2 device --- src/spicelib/devices/bsim2/b2bindCSC.c | 715 +++++++++++-------------- src/spicelib/devices/bsim2/bsim2def.h | 25 + 2 files changed, 339 insertions(+), 401 deletions(-) diff --git a/src/spicelib/devices/bsim2/b2bindCSC.c b/src/spicelib/devices/bsim2/b2bindCSC.c index d9eb14749..791ea5943 100644 --- a/src/spicelib/devices/bsim2/b2bindCSC.c +++ b/src/spicelib/devices/bsim2/b2bindCSC.c @@ -1,5 +1,5 @@ /********** -Author: 2012 Francesco Lannutti +Author: 2013 Francesco Lannutti **********/ #include "ngspice/ngspice.h" @@ -7,304 +7,303 @@ Author: 2012 Francesco Lannutti #include "bsim2def.h" #include "ngspice/sperror.h" +#include + +static int -B2bindCSC(GENmodel *inModel, CKTcircuit *ckt) +BindCompare (const void *a, const void *b) { - B2model *model = (B2model *)inModel; - int i ; + BindElement *A, *B ; + A = (BindElement *)a ; + B = (BindElement *)b ; - /* loop through all the b2 models */ - for( ; model != NULL; model = model->B2nextModel ) { - B2instance *here; - - /* loop through all the instances of the model */ - for (here = model->B2instances; here != NULL ; - here = here->B2nextInstance) { - - i = 0 ; - if ((here-> B2dNode != 0) && (here-> B2dNode != 0)) { - while (here->B2DdPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2DdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2gNode != 0) && (here-> B2gNode != 0)) { - while (here->B2GgPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2GgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2sNode != 0) && (here-> B2sNode != 0)) { - while (here->B2SsPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2SsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2bNode != 0) && (here-> B2bNode != 0)) { - while (here->B2BbPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2BbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2dNodePrime != 0) && (here-> B2dNodePrime != 0)) { - while (here->B2DPdpPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2DPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2sNodePrime != 0) && (here-> B2sNodePrime != 0)) { - while (here->B2SPspPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2SPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2dNode != 0) && (here-> B2dNodePrime != 0)) { - while (here->B2DdpPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2DdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2gNode != 0) && (here-> B2bNode != 0)) { - while (here->B2GbPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2GbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2gNode != 0) && (here-> B2dNodePrime != 0)) { - while (here->B2GdpPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2GdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2gNode != 0) && (here-> B2sNodePrime != 0)) { - while (here->B2GspPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2GspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2sNode != 0) && (here-> B2sNodePrime != 0)) { - while (here->B2SspPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2SspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2bNode != 0) && (here-> B2dNodePrime != 0)) { - while (here->B2BdpPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2BdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2bNode != 0) && (here-> B2sNodePrime != 0)) { - while (here->B2BspPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2BspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2dNodePrime != 0) && (here-> B2sNodePrime != 0)) { - while (here->B2DPspPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2DPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2dNodePrime != 0) && (here-> B2dNode != 0)) { - while (here->B2DPdPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2DPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2bNode != 0) && (here-> B2gNode != 0)) { - while (here->B2BgPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2BgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2dNodePrime != 0) && (here-> B2gNode != 0)) { - while (here->B2DPgPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2DPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2sNodePrime != 0) && (here-> B2gNode != 0)) { - while (here->B2SPgPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2SPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2sNodePrime != 0) && (here-> B2sNode != 0)) { - while (here->B2SPsPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2SPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2dNodePrime != 0) && (here-> B2bNode != 0)) { - while (here->B2DPbPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2DPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2sNodePrime != 0) && (here-> B2bNode != 0)) { - while (here->B2SPbPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2SPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> B2sNodePrime != 0) && (here-> B2dNodePrime != 0)) { - while (here->B2SPdpPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->B2SPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - } - } - return(OK); + return ((int)(A->Sparse - B->Sparse)) ; } int -B2bindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) +B2bindCSC (GENmodel *inModel, CKTcircuit *ckt) { - B2model *model = (B2model *)inModel; - int i ; + B2model *model = (B2model *)inModel ; + B2instance *here ; + double *i ; + BindElement *matched, *BindStruct ; + size_t nz ; - /* loop through all the b2 models */ - for( ; model != NULL; model = model->B2nextModel ) { - B2instance *here; + BindStruct = ckt->CKTmatrix->CKTbindStruct ; + nz = (size_t)ckt->CKTmatrix->CKTklunz ; + /* loop through all the B2 models */ + for ( ; model != NULL ; model = model->B2nextModel) + { /* loop through all the instances of the model */ - for (here = model->B2instances; here != NULL ; - here = here->B2nextInstance) { + for (here = model->B2instances ; here != NULL ; here = here->B2nextInstance) + { + if ((here-> B2dNode != 0) && (here-> B2dNode != 0)) + { + i = here->B2DdPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2DdStructPtr = matched ; + here->B2DdPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2dNode != 0) && (here-> B2dNode != 0)) { - while (here->B2DdPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2DdPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2gNode != 0) && (here-> B2gNode != 0)) + { + i = here->B2GgPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2GgStructPtr = matched ; + here->B2GgPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2gNode != 0) && (here-> B2gNode != 0)) { - while (here->B2GgPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2GgPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2sNode != 0) && (here-> B2sNode != 0)) + { + i = here->B2SsPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2SsStructPtr = matched ; + here->B2SsPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2sNode != 0) && (here-> B2sNode != 0)) { - while (here->B2SsPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2SsPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2bNode != 0) && (here-> B2bNode != 0)) + { + i = here->B2BbPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2BbStructPtr = matched ; + here->B2BbPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2bNode != 0) && (here-> B2bNode != 0)) { - while (here->B2BbPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2BbPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2dNodePrime != 0) && (here-> B2dNodePrime != 0)) + { + i = here->B2DPdpPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2DPdpStructPtr = matched ; + here->B2DPdpPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2dNodePrime != 0) && (here-> B2dNodePrime != 0)) { - while (here->B2DPdpPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2DPdpPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2sNodePrime != 0) && (here-> B2sNodePrime != 0)) + { + i = here->B2SPspPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2SPspStructPtr = matched ; + here->B2SPspPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2sNodePrime != 0) && (here-> B2sNodePrime != 0)) { - while (here->B2SPspPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2SPspPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2dNode != 0) && (here-> B2dNodePrime != 0)) + { + i = here->B2DdpPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2DdpStructPtr = matched ; + here->B2DdpPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2dNode != 0) && (here-> B2dNodePrime != 0)) { - while (here->B2DdpPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2DdpPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2gNode != 0) && (here-> B2bNode != 0)) + { + i = here->B2GbPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2GbStructPtr = matched ; + here->B2GbPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2gNode != 0) && (here-> B2bNode != 0)) { - while (here->B2GbPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2GbPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2gNode != 0) && (here-> B2dNodePrime != 0)) + { + i = here->B2GdpPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2GdpStructPtr = matched ; + here->B2GdpPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2gNode != 0) && (here-> B2dNodePrime != 0)) { - while (here->B2GdpPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2GdpPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2gNode != 0) && (here-> B2sNodePrime != 0)) + { + i = here->B2GspPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2GspStructPtr = matched ; + here->B2GspPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2gNode != 0) && (here-> B2sNodePrime != 0)) { - while (here->B2GspPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2GspPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2sNode != 0) && (here-> B2sNodePrime != 0)) + { + i = here->B2SspPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2SspStructPtr = matched ; + here->B2SspPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2sNode != 0) && (here-> B2sNodePrime != 0)) { - while (here->B2SspPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2SspPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2bNode != 0) && (here-> B2dNodePrime != 0)) + { + i = here->B2BdpPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2BdpStructPtr = matched ; + here->B2BdpPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2bNode != 0) && (here-> B2dNodePrime != 0)) { - while (here->B2BdpPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2BdpPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2bNode != 0) && (here-> B2sNodePrime != 0)) + { + i = here->B2BspPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2BspStructPtr = matched ; + here->B2BspPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2bNode != 0) && (here-> B2sNodePrime != 0)) { - while (here->B2BspPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2BspPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2dNodePrime != 0) && (here-> B2sNodePrime != 0)) + { + i = here->B2DPspPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2DPspStructPtr = matched ; + here->B2DPspPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2dNodePrime != 0) && (here-> B2sNodePrime != 0)) { - while (here->B2DPspPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2DPspPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2dNodePrime != 0) && (here-> B2dNode != 0)) + { + i = here->B2DPdPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2DPdStructPtr = matched ; + here->B2DPdPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2dNodePrime != 0) && (here-> B2dNode != 0)) { - while (here->B2DPdPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2DPdPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2bNode != 0) && (here-> B2gNode != 0)) + { + i = here->B2BgPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2BgStructPtr = matched ; + here->B2BgPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2bNode != 0) && (here-> B2gNode != 0)) { - while (here->B2BgPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2BgPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2dNodePrime != 0) && (here-> B2gNode != 0)) + { + i = here->B2DPgPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2DPgStructPtr = matched ; + here->B2DPgPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2dNodePrime != 0) && (here-> B2gNode != 0)) { - while (here->B2DPgPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2DPgPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2sNodePrime != 0) && (here-> B2gNode != 0)) + { + i = here->B2SPgPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2SPgStructPtr = matched ; + here->B2SPgPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2sNodePrime != 0) && (here-> B2gNode != 0)) { - while (here->B2SPgPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2SPgPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2sNodePrime != 0) && (here-> B2sNode != 0)) + { + i = here->B2SPsPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2SPsStructPtr = matched ; + here->B2SPsPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2sNodePrime != 0) && (here-> B2sNode != 0)) { - while (here->B2SPsPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2SPsPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2dNodePrime != 0) && (here-> B2bNode != 0)) + { + i = here->B2DPbPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2DPbStructPtr = matched ; + here->B2DPbPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2dNodePrime != 0) && (here-> B2bNode != 0)) { - while (here->B2DPbPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2DPbPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2sNodePrime != 0) && (here-> B2bNode != 0)) + { + i = here->B2SPbPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2SPbStructPtr = matched ; + here->B2SPbPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2sNodePrime != 0) && (here-> B2bNode != 0)) { - while (here->B2SPbPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2SPbPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> B2sNodePrime != 0) && (here-> B2dNodePrime != 0)) + { + i = here->B2SPdpPtr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->B2SPdpStructPtr = matched ; + here->B2SPdpPtr = matched->CSC ; + } - i = 0 ; - if ((here-> B2sNodePrime != 0) && (here-> B2dNodePrime != 0)) { - while (here->B2SPdpPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->B2SPdpPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } - } + } } - return(OK); + + return (OK) ; +} + +int +B2bindCSCComplex (GENmodel *inModel, CKTcircuit *ckt) +{ + B2model *model = (B2model *)inModel ; + B2instance *here ; + + NG_IGNORE (ckt) ; + + /* loop through all the B2 models */ + for ( ; model != NULL ; model = model->B2nextModel) + { + /* loop through all the instances of the model */ + for (here = model->B2instances ; here != NULL ; here = here->B2nextInstance) + { + if ((here-> B2dNode != 0) && (here-> B2dNode != 0)) + here->B2DdPtr = here->B2DdStructPtr->CSC_Complex ; + + if ((here-> B2gNode != 0) && (here-> B2gNode != 0)) + here->B2GgPtr = here->B2GgStructPtr->CSC_Complex ; + + if ((here-> B2sNode != 0) && (here-> B2sNode != 0)) + here->B2SsPtr = here->B2SsStructPtr->CSC_Complex ; + + if ((here-> B2bNode != 0) && (here-> B2bNode != 0)) + here->B2BbPtr = here->B2BbStructPtr->CSC_Complex ; + + if ((here-> B2dNodePrime != 0) && (here-> B2dNodePrime != 0)) + here->B2DPdpPtr = here->B2DPdpStructPtr->CSC_Complex ; + + if ((here-> B2sNodePrime != 0) && (here-> B2sNodePrime != 0)) + here->B2SPspPtr = here->B2SPspStructPtr->CSC_Complex ; + + if ((here-> B2dNode != 0) && (here-> B2dNodePrime != 0)) + here->B2DdpPtr = here->B2DdpStructPtr->CSC_Complex ; + + if ((here-> B2gNode != 0) && (here-> B2bNode != 0)) + here->B2GbPtr = here->B2GbStructPtr->CSC_Complex ; + + if ((here-> B2gNode != 0) && (here-> B2dNodePrime != 0)) + here->B2GdpPtr = here->B2GdpStructPtr->CSC_Complex ; + + if ((here-> B2gNode != 0) && (here-> B2sNodePrime != 0)) + here->B2GspPtr = here->B2GspStructPtr->CSC_Complex ; + + if ((here-> B2sNode != 0) && (here-> B2sNodePrime != 0)) + here->B2SspPtr = here->B2SspStructPtr->CSC_Complex ; + + if ((here-> B2bNode != 0) && (here-> B2dNodePrime != 0)) + here->B2BdpPtr = here->B2BdpStructPtr->CSC_Complex ; + + if ((here-> B2bNode != 0) && (here-> B2sNodePrime != 0)) + here->B2BspPtr = here->B2BspStructPtr->CSC_Complex ; + + if ((here-> B2dNodePrime != 0) && (here-> B2sNodePrime != 0)) + here->B2DPspPtr = here->B2DPspStructPtr->CSC_Complex ; + + if ((here-> B2dNodePrime != 0) && (here-> B2dNode != 0)) + here->B2DPdPtr = here->B2DPdStructPtr->CSC_Complex ; + + if ((here-> B2bNode != 0) && (here-> B2gNode != 0)) + here->B2BgPtr = here->B2BgStructPtr->CSC_Complex ; + + if ((here-> B2dNodePrime != 0) && (here-> B2gNode != 0)) + here->B2DPgPtr = here->B2DPgStructPtr->CSC_Complex ; + + if ((here-> B2sNodePrime != 0) && (here-> B2gNode != 0)) + here->B2SPgPtr = here->B2SPgStructPtr->CSC_Complex ; + + if ((here-> B2sNodePrime != 0) && (here-> B2sNode != 0)) + here->B2SPsPtr = here->B2SPsStructPtr->CSC_Complex ; + + if ((here-> B2dNodePrime != 0) && (here-> B2bNode != 0)) + here->B2DPbPtr = here->B2DPbStructPtr->CSC_Complex ; + + if ((here-> B2sNodePrime != 0) && (here-> B2bNode != 0)) + here->B2SPbPtr = here->B2SPbStructPtr->CSC_Complex ; + + if ((here-> B2sNodePrime != 0) && (here-> B2dNodePrime != 0)) + here->B2SPdpPtr = here->B2SPdpStructPtr->CSC_Complex ; + + } + } + + return (OK) ; } int @@ -312,169 +311,83 @@ B2bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) { B2model *model = (B2model *)inModel ; B2instance *here ; - int i ; - /* loop through all the bsim2 models */ + NG_IGNORE (ckt) ; + + /* loop through all the B2 models */ for ( ; model != NULL ; model = model->B2nextModel) { /* loop through all the instances of the model */ for (here = model->B2instances ; here != NULL ; here = here->B2nextInstance) { - i = 0 ; - if ((here->B2dNode != 0) && (here->B2dNode != 0)) - { - while (here->B2DdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2DdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2dNode != 0) && (here-> B2dNode != 0)) + here->B2DdPtr = here->B2DdStructPtr->CSC ; - i = 0 ; - if ((here->B2gNode != 0) && (here->B2gNode != 0)) - { - while (here->B2GgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2GgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2gNode != 0) && (here-> B2gNode != 0)) + here->B2GgPtr = here->B2GgStructPtr->CSC ; - i = 0 ; - if ((here->B2sNode != 0) && (here->B2sNode != 0)) - { - while (here->B2SsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2SsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2sNode != 0) && (here-> B2sNode != 0)) + here->B2SsPtr = here->B2SsStructPtr->CSC ; - i = 0 ; - if ((here->B2bNode != 0) && (here->B2bNode != 0)) - { - while (here->B2BbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2BbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2bNode != 0) && (here-> B2bNode != 0)) + here->B2BbPtr = here->B2BbStructPtr->CSC ; - i = 0 ; - if ((here->B2dNodePrime != 0) && (here->B2dNodePrime != 0)) - { - while (here->B2DPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2DPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2dNodePrime != 0) && (here-> B2dNodePrime != 0)) + here->B2DPdpPtr = here->B2DPdpStructPtr->CSC ; - i = 0 ; - if ((here->B2sNodePrime != 0) && (here->B2sNodePrime != 0)) - { - while (here->B2SPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2SPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2sNodePrime != 0) && (here-> B2sNodePrime != 0)) + here->B2SPspPtr = here->B2SPspStructPtr->CSC ; - i = 0 ; - if ((here->B2dNode != 0) && (here->B2dNodePrime != 0)) - { - while (here->B2DdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2DdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2dNode != 0) && (here-> B2dNodePrime != 0)) + here->B2DdpPtr = here->B2DdpStructPtr->CSC ; - i = 0 ; - if ((here->B2gNode != 0) && (here->B2bNode != 0)) - { - while (here->B2GbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2GbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2gNode != 0) && (here-> B2bNode != 0)) + here->B2GbPtr = here->B2GbStructPtr->CSC ; - i = 0 ; - if ((here->B2gNode != 0) && (here->B2dNodePrime != 0)) - { - while (here->B2GdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2GdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2gNode != 0) && (here-> B2dNodePrime != 0)) + here->B2GdpPtr = here->B2GdpStructPtr->CSC ; - i = 0 ; - if ((here->B2gNode != 0) && (here->B2sNodePrime != 0)) - { - while (here->B2GspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2GspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2gNode != 0) && (here-> B2sNodePrime != 0)) + here->B2GspPtr = here->B2GspStructPtr->CSC ; - i = 0 ; - if ((here->B2sNode != 0) && (here->B2sNodePrime != 0)) - { - while (here->B2SspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2SspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2sNode != 0) && (here-> B2sNodePrime != 0)) + here->B2SspPtr = here->B2SspStructPtr->CSC ; - i = 0 ; - if ((here->B2bNode != 0) && (here->B2dNodePrime != 0)) - { - while (here->B2BdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2BdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2bNode != 0) && (here-> B2dNodePrime != 0)) + here->B2BdpPtr = here->B2BdpStructPtr->CSC ; - i = 0 ; - if ((here->B2bNode != 0) && (here->B2sNodePrime != 0)) - { - while (here->B2BspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2BspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2bNode != 0) && (here-> B2sNodePrime != 0)) + here->B2BspPtr = here->B2BspStructPtr->CSC ; - i = 0 ; - if ((here->B2dNodePrime != 0) && (here->B2sNodePrime != 0)) - { - while (here->B2DPspPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2DPspPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2dNodePrime != 0) && (here-> B2sNodePrime != 0)) + here->B2DPspPtr = here->B2DPspStructPtr->CSC ; - i = 0 ; - if ((here->B2dNodePrime != 0) && (here->B2dNode != 0)) - { - while (here->B2DPdPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2DPdPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2dNodePrime != 0) && (here-> B2dNode != 0)) + here->B2DPdPtr = here->B2DPdStructPtr->CSC ; - i = 0 ; - if ((here->B2bNode != 0) && (here->B2gNode != 0)) - { - while (here->B2BgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2BgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2bNode != 0) && (here-> B2gNode != 0)) + here->B2BgPtr = here->B2BgStructPtr->CSC ; - i = 0 ; - if ((here->B2dNodePrime != 0) && (here->B2gNode != 0)) - { - while (here->B2DPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2DPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2dNodePrime != 0) && (here-> B2gNode != 0)) + here->B2DPgPtr = here->B2DPgStructPtr->CSC ; - i = 0 ; - if ((here->B2sNodePrime != 0) && (here->B2gNode != 0)) - { - while (here->B2SPgPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2SPgPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2sNodePrime != 0) && (here-> B2gNode != 0)) + here->B2SPgPtr = here->B2SPgStructPtr->CSC ; - i = 0 ; - if ((here->B2sNodePrime != 0) && (here->B2sNode != 0)) - { - while (here->B2SPsPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2SPsPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2sNodePrime != 0) && (here-> B2sNode != 0)) + here->B2SPsPtr = here->B2SPsStructPtr->CSC ; - i = 0 ; - if ((here->B2dNodePrime != 0) && (here->B2bNode != 0)) - { - while (here->B2DPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2DPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2dNodePrime != 0) && (here-> B2bNode != 0)) + here->B2DPbPtr = here->B2DPbStructPtr->CSC ; - i = 0 ; - if ((here->B2sNodePrime != 0) && (here->B2bNode != 0)) - { - while (here->B2SPbPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2SPbPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> B2sNodePrime != 0) && (here-> B2bNode != 0)) + here->B2SPbPtr = here->B2SPbStructPtr->CSC ; + + if ((here-> B2sNodePrime != 0) && (here-> B2dNodePrime != 0)) + here->B2SPdpPtr = here->B2SPdpStructPtr->CSC ; - i = 0 ; - if ((here->B2sNodePrime != 0) && (here->B2dNodePrime != 0)) - { - while (here->B2SPdpPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->B2SPdpPtr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } } } return (OK) ; -} \ No newline at end of file +} diff --git a/src/spicelib/devices/bsim2/bsim2def.h b/src/spicelib/devices/bsim2/bsim2def.h index ddcc65a34..86f4a3a7a 100644 --- a/src/spicelib/devices/bsim2/bsim2def.h +++ b/src/spicelib/devices/bsim2/bsim2def.h @@ -176,6 +176,31 @@ typedef struct sBSIM2instance { #define B2numStates 35 +#ifdef KLU + BindElement *B2DdStructPtr ; + BindElement *B2GgStructPtr ; + BindElement *B2SsStructPtr ; + BindElement *B2BbStructPtr ; + BindElement *B2DPdpStructPtr ; + BindElement *B2SPspStructPtr ; + BindElement *B2DdpStructPtr ; + BindElement *B2GbStructPtr ; + BindElement *B2GdpStructPtr ; + BindElement *B2GspStructPtr ; + BindElement *B2SspStructPtr ; + BindElement *B2BdpStructPtr ; + BindElement *B2BspStructPtr ; + BindElement *B2DPspStructPtr ; + BindElement *B2DPdStructPtr ; + BindElement *B2BgStructPtr ; + BindElement *B2DPgStructPtr ; + BindElement *B2SPgStructPtr ; + BindElement *B2SPsStructPtr ; + BindElement *B2DPbStructPtr ; + BindElement *B2SPbStructPtr ; + BindElement *B2SPdpStructPtr ; +#endif + } B2instance ; struct bsim2SizeDependParam