diff --git a/src/spicelib/devices/bsim4v7/Makefile.am b/src/spicelib/devices/bsim4v7/Makefile.am index 4bb833752..870301d3e 100644 --- a/src/spicelib/devices/bsim4v7/Makefile.am +++ b/src/spicelib/devices/bsim4v7/Makefile.am @@ -28,6 +28,9 @@ libbsim4v7_la_SOURCES = \ bsim4v7itf.h +if KLU_WANTED +libbsim4v7_la_SOURCES += b4v7bindCSC.c +endif AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/bsim4v7/b4v7bindCSC.c b/src/spicelib/devices/bsim4v7/b4v7bindCSC.c new file mode 100644 index 000000000..ccf935d5c --- /dev/null +++ b/src/spicelib/devices/bsim4v7/b4v7bindCSC.c @@ -0,0 +1,323 @@ +/********** +Author: 2013 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "bsim4v7def.h" +#include "ngspice/sperror.h" +#include "ngspice/klu-binding.h" + +#include + +static +int +BindCompare (const void *a, const void *b) +{ + BindElement *A, *B ; + A = (BindElement *)a ; + B = (BindElement *)b ; + + return ((int)(A->Sparse - B->Sparse)) ; +} + +int +BSIM4v7bindCSC (GENmodel *inModel, CKTcircuit *ckt) +{ + BSIM4v7model *model = (BSIM4v7model *)inModel ; + BSIM4v7instance *here ; + double *i ; + BindElement *matched, *BindStruct ; + size_t nz ; + + BindStruct = ckt->CKTmatrix->CKTbindStruct ; + nz = (size_t)ckt->CKTmatrix->CKTklunz ; + + /* loop through all the BSIM4v7 models */ + for ( ; model != NULL ; model = BSIM4v7nextModel(model)) + { + /* loop through all the instances of the model */ + for (here = BSIM4v7instances(model); here != NULL ; here = BSIM4v7nextInstance(here)) + { + CREATE_KLU_BINDING_TABLE(BSIM4v7DPbpPtr, BSIM4v7DPbpBinding, BSIM4v7dNodePrime, BSIM4v7bNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7GPbpPtr, BSIM4v7GPbpBinding, BSIM4v7gNodePrime, BSIM4v7bNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7SPbpPtr, BSIM4v7SPbpBinding, BSIM4v7sNodePrime, BSIM4v7bNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7BPdpPtr, BSIM4v7BPdpBinding, BSIM4v7bNodePrime, BSIM4v7dNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7BPgpPtr, BSIM4v7BPgpBinding, BSIM4v7bNodePrime, BSIM4v7gNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7BPspPtr, BSIM4v7BPspBinding, BSIM4v7bNodePrime, BSIM4v7sNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7BPbpPtr, BSIM4v7BPbpBinding, BSIM4v7bNodePrime, BSIM4v7bNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7DdPtr, BSIM4v7DdBinding, BSIM4v7dNode, BSIM4v7dNode); + CREATE_KLU_BINDING_TABLE(BSIM4v7GPgpPtr, BSIM4v7GPgpBinding, BSIM4v7gNodePrime, BSIM4v7gNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7SsPtr, BSIM4v7SsBinding, BSIM4v7sNode, BSIM4v7sNode); + CREATE_KLU_BINDING_TABLE(BSIM4v7DPdpPtr, BSIM4v7DPdpBinding, BSIM4v7dNodePrime, BSIM4v7dNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7SPspPtr, BSIM4v7SPspBinding, BSIM4v7sNodePrime, BSIM4v7sNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7DdpPtr, BSIM4v7DdpBinding, BSIM4v7dNode, BSIM4v7dNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7GPdpPtr, BSIM4v7GPdpBinding, BSIM4v7gNodePrime, BSIM4v7dNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7GPspPtr, BSIM4v7GPspBinding, BSIM4v7gNodePrime, BSIM4v7sNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7SspPtr, BSIM4v7SspBinding, BSIM4v7sNode, BSIM4v7sNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7DPspPtr, BSIM4v7DPspBinding, BSIM4v7dNodePrime, BSIM4v7sNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7DPdPtr, BSIM4v7DPdBinding, BSIM4v7dNodePrime, BSIM4v7dNode); + CREATE_KLU_BINDING_TABLE(BSIM4v7DPgpPtr, BSIM4v7DPgpBinding, BSIM4v7dNodePrime, BSIM4v7gNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7SPgpPtr, BSIM4v7SPgpBinding, BSIM4v7sNodePrime, BSIM4v7gNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7SPsPtr, BSIM4v7SPsBinding, BSIM4v7sNodePrime, BSIM4v7sNode); + CREATE_KLU_BINDING_TABLE(BSIM4v7SPdpPtr, BSIM4v7SPdpBinding, BSIM4v7sNodePrime, BSIM4v7dNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7QqPtr, BSIM4v7QqBinding, BSIM4v7qNode, BSIM4v7qNode); + CREATE_KLU_BINDING_TABLE(BSIM4v7QbpPtr, BSIM4v7QbpBinding, BSIM4v7qNode, BSIM4v7bNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7QdpPtr, BSIM4v7QdpBinding, BSIM4v7qNode, BSIM4v7dNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7QspPtr, BSIM4v7QspBinding, BSIM4v7qNode, BSIM4v7sNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7QgpPtr, BSIM4v7QgpBinding, BSIM4v7qNode, BSIM4v7gNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7DPqPtr, BSIM4v7DPqBinding, BSIM4v7dNodePrime, BSIM4v7qNode); + CREATE_KLU_BINDING_TABLE(BSIM4v7SPqPtr, BSIM4v7SPqBinding, BSIM4v7sNodePrime, BSIM4v7qNode); + CREATE_KLU_BINDING_TABLE(BSIM4v7GPqPtr, BSIM4v7GPqBinding, BSIM4v7gNodePrime, BSIM4v7qNode); + if (here->BSIM4v7rgateMod != 0) + { + CREATE_KLU_BINDING_TABLE(BSIM4v7GEgePtr, BSIM4v7GEgeBinding, BSIM4v7gNodeExt, BSIM4v7gNodeExt); + CREATE_KLU_BINDING_TABLE(BSIM4v7GEgpPtr, BSIM4v7GEgpBinding, BSIM4v7gNodeExt, BSIM4v7gNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7GPgePtr, BSIM4v7GPgeBinding, BSIM4v7gNodePrime, BSIM4v7gNodeExt); + CREATE_KLU_BINDING_TABLE(BSIM4v7GEdpPtr, BSIM4v7GEdpBinding, BSIM4v7gNodeExt, BSIM4v7dNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7GEspPtr, BSIM4v7GEspBinding, BSIM4v7gNodeExt, BSIM4v7sNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7GEbpPtr, BSIM4v7GEbpBinding, BSIM4v7gNodeExt, BSIM4v7bNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7GMdpPtr, BSIM4v7GMdpBinding, BSIM4v7gNodeMid, BSIM4v7dNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7GMgpPtr, BSIM4v7GMgpBinding, BSIM4v7gNodeMid, BSIM4v7gNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7GMgmPtr, BSIM4v7GMgmBinding, BSIM4v7gNodeMid, BSIM4v7gNodeMid); + CREATE_KLU_BINDING_TABLE(BSIM4v7GMgePtr, BSIM4v7GMgeBinding, BSIM4v7gNodeMid, BSIM4v7gNodeExt); + CREATE_KLU_BINDING_TABLE(BSIM4v7GMspPtr, BSIM4v7GMspBinding, BSIM4v7gNodeMid, BSIM4v7sNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7GMbpPtr, BSIM4v7GMbpBinding, BSIM4v7gNodeMid, BSIM4v7bNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7DPgmPtr, BSIM4v7DPgmBinding, BSIM4v7dNodePrime, BSIM4v7gNodeMid); + CREATE_KLU_BINDING_TABLE(BSIM4v7GPgmPtr, BSIM4v7GPgmBinding, BSIM4v7gNodePrime, BSIM4v7gNodeMid); + CREATE_KLU_BINDING_TABLE(BSIM4v7GEgmPtr, BSIM4v7GEgmBinding, BSIM4v7gNodeExt, BSIM4v7gNodeMid); + CREATE_KLU_BINDING_TABLE(BSIM4v7SPgmPtr, BSIM4v7SPgmBinding, BSIM4v7sNodePrime, BSIM4v7gNodeMid); + CREATE_KLU_BINDING_TABLE(BSIM4v7BPgmPtr, BSIM4v7BPgmBinding, BSIM4v7bNodePrime, BSIM4v7gNodeMid); + } + if ((here->BSIM4v7rbodyMod == 1) || (here->BSIM4v7rbodyMod == 2)) + { + CREATE_KLU_BINDING_TABLE(BSIM4v7DPdbPtr, BSIM4v7DPdbBinding, BSIM4v7dNodePrime, BSIM4v7dbNode); + CREATE_KLU_BINDING_TABLE(BSIM4v7SPsbPtr, BSIM4v7SPsbBinding, BSIM4v7sNodePrime, BSIM4v7sbNode); + CREATE_KLU_BINDING_TABLE(BSIM4v7DBdpPtr, BSIM4v7DBdpBinding, BSIM4v7dbNode, BSIM4v7dNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7DBdbPtr, BSIM4v7DBdbBinding, BSIM4v7dbNode, BSIM4v7dbNode); + CREATE_KLU_BINDING_TABLE(BSIM4v7DBbpPtr, BSIM4v7DBbpBinding, BSIM4v7dbNode, BSIM4v7bNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7DBbPtr, BSIM4v7DBbBinding, BSIM4v7dbNode, BSIM4v7bNode); + CREATE_KLU_BINDING_TABLE(BSIM4v7BPdbPtr, BSIM4v7BPdbBinding, BSIM4v7bNodePrime, BSIM4v7dbNode); + CREATE_KLU_BINDING_TABLE(BSIM4v7BPbPtr, BSIM4v7BPbBinding, BSIM4v7bNodePrime, BSIM4v7bNode); + CREATE_KLU_BINDING_TABLE(BSIM4v7BPsbPtr, BSIM4v7BPsbBinding, BSIM4v7bNodePrime, BSIM4v7sbNode); + CREATE_KLU_BINDING_TABLE(BSIM4v7SBspPtr, BSIM4v7SBspBinding, BSIM4v7sbNode, BSIM4v7sNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7SBbpPtr, BSIM4v7SBbpBinding, BSIM4v7sbNode, BSIM4v7bNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7SBbPtr, BSIM4v7SBbBinding, BSIM4v7sbNode, BSIM4v7bNode); + CREATE_KLU_BINDING_TABLE(BSIM4v7SBsbPtr, BSIM4v7SBsbBinding, BSIM4v7sbNode, BSIM4v7sbNode); + CREATE_KLU_BINDING_TABLE(BSIM4v7BdbPtr, BSIM4v7BdbBinding, BSIM4v7bNode, BSIM4v7dbNode); + CREATE_KLU_BINDING_TABLE(BSIM4v7BbpPtr, BSIM4v7BbpBinding, BSIM4v7bNode, BSIM4v7bNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7BsbPtr, BSIM4v7BsbBinding, BSIM4v7bNode, BSIM4v7sbNode); + CREATE_KLU_BINDING_TABLE(BSIM4v7BbPtr, BSIM4v7BbBinding, BSIM4v7bNode, BSIM4v7bNode); + } + if (model->BSIM4v7rdsMod) + { + CREATE_KLU_BINDING_TABLE(BSIM4v7DgpPtr, BSIM4v7DgpBinding, BSIM4v7dNode, BSIM4v7gNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7DspPtr, BSIM4v7DspBinding, BSIM4v7dNode, BSIM4v7sNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7DbpPtr, BSIM4v7DbpBinding, BSIM4v7dNode, BSIM4v7bNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7SdpPtr, BSIM4v7SdpBinding, BSIM4v7sNode, BSIM4v7dNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7SgpPtr, BSIM4v7SgpBinding, BSIM4v7sNode, BSIM4v7gNodePrime); + CREATE_KLU_BINDING_TABLE(BSIM4v7SbpPtr, BSIM4v7SbpBinding, BSIM4v7sNode, BSIM4v7bNodePrime); + } + } + } + + return (OK) ; +} + +int +BSIM4v7bindCSCComplex (GENmodel *inModel, CKTcircuit *ckt) +{ + BSIM4v7model *model = (BSIM4v7model *)inModel ; + BSIM4v7instance *here ; + + NG_IGNORE (ckt) ; + + /* loop through all the BSIM4v7 models */ + for ( ; model != NULL ; model = BSIM4v7nextModel(model)) + { + /* loop through all the instances of the model */ + for (here = BSIM4v7instances(model); here != NULL ; here = BSIM4v7nextInstance(here)) + { + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7DPbpPtr, BSIM4v7DPbpBinding, BSIM4v7dNodePrime, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7GPbpPtr, BSIM4v7GPbpBinding, BSIM4v7gNodePrime, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7SPbpPtr, BSIM4v7SPbpBinding, BSIM4v7sNodePrime, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7BPdpPtr, BSIM4v7BPdpBinding, BSIM4v7bNodePrime, BSIM4v7dNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7BPgpPtr, BSIM4v7BPgpBinding, BSIM4v7bNodePrime, BSIM4v7gNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7BPspPtr, BSIM4v7BPspBinding, BSIM4v7bNodePrime, BSIM4v7sNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7BPbpPtr, BSIM4v7BPbpBinding, BSIM4v7bNodePrime, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7DdPtr, BSIM4v7DdBinding, BSIM4v7dNode, BSIM4v7dNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7GPgpPtr, BSIM4v7GPgpBinding, BSIM4v7gNodePrime, BSIM4v7gNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7SsPtr, BSIM4v7SsBinding, BSIM4v7sNode, BSIM4v7sNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7DPdpPtr, BSIM4v7DPdpBinding, BSIM4v7dNodePrime, BSIM4v7dNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7SPspPtr, BSIM4v7SPspBinding, BSIM4v7sNodePrime, BSIM4v7sNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7DdpPtr, BSIM4v7DdpBinding, BSIM4v7dNode, BSIM4v7dNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7GPdpPtr, BSIM4v7GPdpBinding, BSIM4v7gNodePrime, BSIM4v7dNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7GPspPtr, BSIM4v7GPspBinding, BSIM4v7gNodePrime, BSIM4v7sNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7SspPtr, BSIM4v7SspBinding, BSIM4v7sNode, BSIM4v7sNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7DPspPtr, BSIM4v7DPspBinding, BSIM4v7dNodePrime, BSIM4v7sNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7DPdPtr, BSIM4v7DPdBinding, BSIM4v7dNodePrime, BSIM4v7dNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7DPgpPtr, BSIM4v7DPgpBinding, BSIM4v7dNodePrime, BSIM4v7gNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7SPgpPtr, BSIM4v7SPgpBinding, BSIM4v7sNodePrime, BSIM4v7gNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7SPsPtr, BSIM4v7SPsBinding, BSIM4v7sNodePrime, BSIM4v7sNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7SPdpPtr, BSIM4v7SPdpBinding, BSIM4v7sNodePrime, BSIM4v7dNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7QqPtr, BSIM4v7QqBinding, BSIM4v7qNode, BSIM4v7qNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7QbpPtr, BSIM4v7QbpBinding, BSIM4v7qNode, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7QdpPtr, BSIM4v7QdpBinding, BSIM4v7qNode, BSIM4v7dNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7QspPtr, BSIM4v7QspBinding, BSIM4v7qNode, BSIM4v7sNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7QgpPtr, BSIM4v7QgpBinding, BSIM4v7qNode, BSIM4v7gNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7DPqPtr, BSIM4v7DPqBinding, BSIM4v7dNodePrime, BSIM4v7qNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7SPqPtr, BSIM4v7SPqBinding, BSIM4v7sNodePrime, BSIM4v7qNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7GPqPtr, BSIM4v7GPqBinding, BSIM4v7gNodePrime, BSIM4v7qNode); + if (here->BSIM4v7rgateMod != 0) + { + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7GEgePtr, BSIM4v7GEgeBinding, BSIM4v7gNodeExt, BSIM4v7gNodeExt); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7GEgpPtr, BSIM4v7GEgpBinding, BSIM4v7gNodeExt, BSIM4v7gNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7GPgePtr, BSIM4v7GPgeBinding, BSIM4v7gNodePrime, BSIM4v7gNodeExt); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7GEdpPtr, BSIM4v7GEdpBinding, BSIM4v7gNodeExt, BSIM4v7dNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7GEspPtr, BSIM4v7GEspBinding, BSIM4v7gNodeExt, BSIM4v7sNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7GEbpPtr, BSIM4v7GEbpBinding, BSIM4v7gNodeExt, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7GMdpPtr, BSIM4v7GMdpBinding, BSIM4v7gNodeMid, BSIM4v7dNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7GMgpPtr, BSIM4v7GMgpBinding, BSIM4v7gNodeMid, BSIM4v7gNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7GMgmPtr, BSIM4v7GMgmBinding, BSIM4v7gNodeMid, BSIM4v7gNodeMid); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7GMgePtr, BSIM4v7GMgeBinding, BSIM4v7gNodeMid, BSIM4v7gNodeExt); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7GMspPtr, BSIM4v7GMspBinding, BSIM4v7gNodeMid, BSIM4v7sNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7GMbpPtr, BSIM4v7GMbpBinding, BSIM4v7gNodeMid, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7DPgmPtr, BSIM4v7DPgmBinding, BSIM4v7dNodePrime, BSIM4v7gNodeMid); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7GPgmPtr, BSIM4v7GPgmBinding, BSIM4v7gNodePrime, BSIM4v7gNodeMid); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7GEgmPtr, BSIM4v7GEgmBinding, BSIM4v7gNodeExt, BSIM4v7gNodeMid); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7SPgmPtr, BSIM4v7SPgmBinding, BSIM4v7sNodePrime, BSIM4v7gNodeMid); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7BPgmPtr, BSIM4v7BPgmBinding, BSIM4v7bNodePrime, BSIM4v7gNodeMid); + } + if ((here->BSIM4v7rbodyMod == 1) || (here->BSIM4v7rbodyMod == 2)) + { + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7DPdbPtr, BSIM4v7DPdbBinding, BSIM4v7dNodePrime, BSIM4v7dbNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7SPsbPtr, BSIM4v7SPsbBinding, BSIM4v7sNodePrime, BSIM4v7sbNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7DBdpPtr, BSIM4v7DBdpBinding, BSIM4v7dbNode, BSIM4v7dNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7DBdbPtr, BSIM4v7DBdbBinding, BSIM4v7dbNode, BSIM4v7dbNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7DBbpPtr, BSIM4v7DBbpBinding, BSIM4v7dbNode, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7DBbPtr, BSIM4v7DBbBinding, BSIM4v7dbNode, BSIM4v7bNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7BPdbPtr, BSIM4v7BPdbBinding, BSIM4v7bNodePrime, BSIM4v7dbNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7BPbPtr, BSIM4v7BPbBinding, BSIM4v7bNodePrime, BSIM4v7bNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7BPsbPtr, BSIM4v7BPsbBinding, BSIM4v7bNodePrime, BSIM4v7sbNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7SBspPtr, BSIM4v7SBspBinding, BSIM4v7sbNode, BSIM4v7sNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7SBbpPtr, BSIM4v7SBbpBinding, BSIM4v7sbNode, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7SBbPtr, BSIM4v7SBbBinding, BSIM4v7sbNode, BSIM4v7bNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7SBsbPtr, BSIM4v7SBsbBinding, BSIM4v7sbNode, BSIM4v7sbNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7BdbPtr, BSIM4v7BdbBinding, BSIM4v7bNode, BSIM4v7dbNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7BbpPtr, BSIM4v7BbpBinding, BSIM4v7bNode, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7BsbPtr, BSIM4v7BsbBinding, BSIM4v7bNode, BSIM4v7sbNode); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7BbPtr, BSIM4v7BbBinding, BSIM4v7bNode, BSIM4v7bNode); + } + if (model->BSIM4v7rdsMod) + { + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7DgpPtr, BSIM4v7DgpBinding, BSIM4v7dNode, BSIM4v7gNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7DspPtr, BSIM4v7DspBinding, BSIM4v7dNode, BSIM4v7sNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7DbpPtr, BSIM4v7DbpBinding, BSIM4v7dNode, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7SdpPtr, BSIM4v7SdpBinding, BSIM4v7sNode, BSIM4v7dNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7SgpPtr, BSIM4v7SgpBinding, BSIM4v7sNode, BSIM4v7gNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX(BSIM4v7SbpPtr, BSIM4v7SbpBinding, BSIM4v7sNode, BSIM4v7bNodePrime); + } + } + } + + return (OK) ; +} + +int +BSIM4v7bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + BSIM4v7model *model = (BSIM4v7model *)inModel ; + BSIM4v7instance *here ; + + NG_IGNORE (ckt) ; + + /* loop through all the BSIM4v7 models */ + for ( ; model != NULL ; model = BSIM4v7nextModel(model)) + { + /* loop through all the instances of the model */ + for (here = BSIM4v7instances(model); here != NULL ; here = BSIM4v7nextInstance(here)) + { + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7DPbpPtr, BSIM4v7DPbpBinding, BSIM4v7dNodePrime, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7GPbpPtr, BSIM4v7GPbpBinding, BSIM4v7gNodePrime, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7SPbpPtr, BSIM4v7SPbpBinding, BSIM4v7sNodePrime, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7BPdpPtr, BSIM4v7BPdpBinding, BSIM4v7bNodePrime, BSIM4v7dNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7BPgpPtr, BSIM4v7BPgpBinding, BSIM4v7bNodePrime, BSIM4v7gNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7BPspPtr, BSIM4v7BPspBinding, BSIM4v7bNodePrime, BSIM4v7sNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7BPbpPtr, BSIM4v7BPbpBinding, BSIM4v7bNodePrime, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7DdPtr, BSIM4v7DdBinding, BSIM4v7dNode, BSIM4v7dNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7GPgpPtr, BSIM4v7GPgpBinding, BSIM4v7gNodePrime, BSIM4v7gNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7SsPtr, BSIM4v7SsBinding, BSIM4v7sNode, BSIM4v7sNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7DPdpPtr, BSIM4v7DPdpBinding, BSIM4v7dNodePrime, BSIM4v7dNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7SPspPtr, BSIM4v7SPspBinding, BSIM4v7sNodePrime, BSIM4v7sNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7DdpPtr, BSIM4v7DdpBinding, BSIM4v7dNode, BSIM4v7dNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7GPdpPtr, BSIM4v7GPdpBinding, BSIM4v7gNodePrime, BSIM4v7dNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7GPspPtr, BSIM4v7GPspBinding, BSIM4v7gNodePrime, BSIM4v7sNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7SspPtr, BSIM4v7SspBinding, BSIM4v7sNode, BSIM4v7sNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7DPspPtr, BSIM4v7DPspBinding, BSIM4v7dNodePrime, BSIM4v7sNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7DPdPtr, BSIM4v7DPdBinding, BSIM4v7dNodePrime, BSIM4v7dNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7DPgpPtr, BSIM4v7DPgpBinding, BSIM4v7dNodePrime, BSIM4v7gNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7SPgpPtr, BSIM4v7SPgpBinding, BSIM4v7sNodePrime, BSIM4v7gNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7SPsPtr, BSIM4v7SPsBinding, BSIM4v7sNodePrime, BSIM4v7sNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7SPdpPtr, BSIM4v7SPdpBinding, BSIM4v7sNodePrime, BSIM4v7dNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7QqPtr, BSIM4v7QqBinding, BSIM4v7qNode, BSIM4v7qNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7QbpPtr, BSIM4v7QbpBinding, BSIM4v7qNode, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7QdpPtr, BSIM4v7QdpBinding, BSIM4v7qNode, BSIM4v7dNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7QspPtr, BSIM4v7QspBinding, BSIM4v7qNode, BSIM4v7sNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7QgpPtr, BSIM4v7QgpBinding, BSIM4v7qNode, BSIM4v7gNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7DPqPtr, BSIM4v7DPqBinding, BSIM4v7dNodePrime, BSIM4v7qNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7SPqPtr, BSIM4v7SPqBinding, BSIM4v7sNodePrime, BSIM4v7qNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7GPqPtr, BSIM4v7GPqBinding, BSIM4v7gNodePrime, BSIM4v7qNode); + if (here->BSIM4v7rgateMod != 0) + { + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7GEgePtr, BSIM4v7GEgeBinding, BSIM4v7gNodeExt, BSIM4v7gNodeExt); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7GEgpPtr, BSIM4v7GEgpBinding, BSIM4v7gNodeExt, BSIM4v7gNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7GPgePtr, BSIM4v7GPgeBinding, BSIM4v7gNodePrime, BSIM4v7gNodeExt); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7GEdpPtr, BSIM4v7GEdpBinding, BSIM4v7gNodeExt, BSIM4v7dNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7GEspPtr, BSIM4v7GEspBinding, BSIM4v7gNodeExt, BSIM4v7sNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7GEbpPtr, BSIM4v7GEbpBinding, BSIM4v7gNodeExt, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7GMdpPtr, BSIM4v7GMdpBinding, BSIM4v7gNodeMid, BSIM4v7dNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7GMgpPtr, BSIM4v7GMgpBinding, BSIM4v7gNodeMid, BSIM4v7gNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7GMgmPtr, BSIM4v7GMgmBinding, BSIM4v7gNodeMid, BSIM4v7gNodeMid); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7GMgePtr, BSIM4v7GMgeBinding, BSIM4v7gNodeMid, BSIM4v7gNodeExt); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7GMspPtr, BSIM4v7GMspBinding, BSIM4v7gNodeMid, BSIM4v7sNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7GMbpPtr, BSIM4v7GMbpBinding, BSIM4v7gNodeMid, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7DPgmPtr, BSIM4v7DPgmBinding, BSIM4v7dNodePrime, BSIM4v7gNodeMid); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7GPgmPtr, BSIM4v7GPgmBinding, BSIM4v7gNodePrime, BSIM4v7gNodeMid); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7GEgmPtr, BSIM4v7GEgmBinding, BSIM4v7gNodeExt, BSIM4v7gNodeMid); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7SPgmPtr, BSIM4v7SPgmBinding, BSIM4v7sNodePrime, BSIM4v7gNodeMid); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7BPgmPtr, BSIM4v7BPgmBinding, BSIM4v7bNodePrime, BSIM4v7gNodeMid); + } + if ((here->BSIM4v7rbodyMod == 1) || (here->BSIM4v7rbodyMod == 2)) + { + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7DPdbPtr, BSIM4v7DPdbBinding, BSIM4v7dNodePrime, BSIM4v7dbNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7SPsbPtr, BSIM4v7SPsbBinding, BSIM4v7sNodePrime, BSIM4v7sbNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7DBdpPtr, BSIM4v7DBdpBinding, BSIM4v7dbNode, BSIM4v7dNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7DBdbPtr, BSIM4v7DBdbBinding, BSIM4v7dbNode, BSIM4v7dbNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7DBbpPtr, BSIM4v7DBbpBinding, BSIM4v7dbNode, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7DBbPtr, BSIM4v7DBbBinding, BSIM4v7dbNode, BSIM4v7bNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7BPdbPtr, BSIM4v7BPdbBinding, BSIM4v7bNodePrime, BSIM4v7dbNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7BPbPtr, BSIM4v7BPbBinding, BSIM4v7bNodePrime, BSIM4v7bNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7BPsbPtr, BSIM4v7BPsbBinding, BSIM4v7bNodePrime, BSIM4v7sbNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7SBspPtr, BSIM4v7SBspBinding, BSIM4v7sbNode, BSIM4v7sNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7SBbpPtr, BSIM4v7SBbpBinding, BSIM4v7sbNode, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7SBbPtr, BSIM4v7SBbBinding, BSIM4v7sbNode, BSIM4v7bNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7SBsbPtr, BSIM4v7SBsbBinding, BSIM4v7sbNode, BSIM4v7sbNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7BdbPtr, BSIM4v7BdbBinding, BSIM4v7bNode, BSIM4v7dbNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7BbpPtr, BSIM4v7BbpBinding, BSIM4v7bNode, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7BsbPtr, BSIM4v7BsbBinding, BSIM4v7bNode, BSIM4v7sbNode); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7BbPtr, BSIM4v7BbBinding, BSIM4v7bNode, BSIM4v7bNode); + } + if (model->BSIM4v7rdsMod) + { + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7DgpPtr, BSIM4v7DgpBinding, BSIM4v7dNode, BSIM4v7gNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7DspPtr, BSIM4v7DspBinding, BSIM4v7dNode, BSIM4v7sNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7DbpPtr, BSIM4v7DbpBinding, BSIM4v7dNode, BSIM4v7bNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7SdpPtr, BSIM4v7SdpBinding, BSIM4v7sNode, BSIM4v7dNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7SgpPtr, BSIM4v7SgpBinding, BSIM4v7sNode, BSIM4v7gNodePrime); + CONVERT_KLU_BINDING_TABLE_TO_REAL(BSIM4v7SbpPtr, BSIM4v7SbpBinding, BSIM4v7sNode, BSIM4v7bNodePrime); + } + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/bsim4v7/bsim4v7def.h b/src/spicelib/devices/bsim4v7/bsim4v7def.h index d4e8495eb..0573cf620 100644 --- a/src/spicelib/devices/bsim4v7/bsim4v7def.h +++ b/src/spicelib/devices/bsim4v7/bsim4v7def.h @@ -577,6 +577,79 @@ typedef struct sBSIM4v7instance double **BSIM4v7nVar; #endif /* NONOISE */ +#ifdef KLU + BindElement *BSIM4v7DPbpBinding ; + BindElement *BSIM4v7GPbpBinding ; + BindElement *BSIM4v7SPbpBinding ; + BindElement *BSIM4v7BPdpBinding ; + BindElement *BSIM4v7BPgpBinding ; + BindElement *BSIM4v7BPspBinding ; + BindElement *BSIM4v7BPbpBinding ; + BindElement *BSIM4v7DdBinding ; + BindElement *BSIM4v7GPgpBinding ; + BindElement *BSIM4v7SsBinding ; + BindElement *BSIM4v7DPdpBinding ; + BindElement *BSIM4v7SPspBinding ; + BindElement *BSIM4v7DdpBinding ; + BindElement *BSIM4v7GPdpBinding ; + BindElement *BSIM4v7GPspBinding ; + BindElement *BSIM4v7SspBinding ; + BindElement *BSIM4v7DPspBinding ; + BindElement *BSIM4v7DPdBinding ; + BindElement *BSIM4v7DPgpBinding ; + BindElement *BSIM4v7SPgpBinding ; + BindElement *BSIM4v7SPsBinding ; + BindElement *BSIM4v7SPdpBinding ; + BindElement *BSIM4v7QqBinding ; + BindElement *BSIM4v7QbpBinding ; + BindElement *BSIM4v7QdpBinding ; + BindElement *BSIM4v7QspBinding ; + BindElement *BSIM4v7QgpBinding ; + BindElement *BSIM4v7DPqBinding ; + BindElement *BSIM4v7SPqBinding ; + BindElement *BSIM4v7GPqBinding ; + BindElement *BSIM4v7GEgeBinding ; + BindElement *BSIM4v7GEgpBinding ; + BindElement *BSIM4v7GPgeBinding ; + BindElement *BSIM4v7GEdpBinding ; + BindElement *BSIM4v7GEspBinding ; + BindElement *BSIM4v7GEbpBinding ; + BindElement *BSIM4v7GMdpBinding ; + BindElement *BSIM4v7GMgpBinding ; + BindElement *BSIM4v7GMgmBinding ; + BindElement *BSIM4v7GMgeBinding ; + BindElement *BSIM4v7GMspBinding ; + BindElement *BSIM4v7GMbpBinding ; + BindElement *BSIM4v7DPgmBinding ; + BindElement *BSIM4v7GPgmBinding ; + BindElement *BSIM4v7GEgmBinding ; + BindElement *BSIM4v7SPgmBinding ; + BindElement *BSIM4v7BPgmBinding ; + BindElement *BSIM4v7DPdbBinding ; + BindElement *BSIM4v7SPsbBinding ; + BindElement *BSIM4v7DBdpBinding ; + BindElement *BSIM4v7DBdbBinding ; + BindElement *BSIM4v7DBbpBinding ; + BindElement *BSIM4v7DBbBinding ; + BindElement *BSIM4v7BPdbBinding ; + BindElement *BSIM4v7BPbBinding ; + BindElement *BSIM4v7BPsbBinding ; + BindElement *BSIM4v7SBspBinding ; + BindElement *BSIM4v7SBbpBinding ; + BindElement *BSIM4v7SBbBinding ; + BindElement *BSIM4v7SBsbBinding ; + BindElement *BSIM4v7BdbBinding ; + BindElement *BSIM4v7BbpBinding ; + BindElement *BSIM4v7BsbBinding ; + BindElement *BSIM4v7BbBinding ; + BindElement *BSIM4v7DgpBinding ; + BindElement *BSIM4v7DspBinding ; + BindElement *BSIM4v7DbpBinding ; + BindElement *BSIM4v7SdpBinding ; + BindElement *BSIM4v7SgpBinding ; + BindElement *BSIM4v7SbpBinding ; +#endif + } BSIM4v7instance ; struct bsim4SizeDependParam diff --git a/src/spicelib/devices/bsim4v7/bsim4v7ext.h b/src/spicelib/devices/bsim4v7/bsim4v7ext.h index d25a3ad87..2cc4e7535 100644 --- a/src/spicelib/devices/bsim4v7/bsim4v7ext.h +++ b/src/spicelib/devices/bsim4v7/bsim4v7ext.h @@ -27,3 +27,9 @@ extern int BSIM4v7trunc(GENmodel*,CKTcircuit*,double*); extern int BSIM4v7noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM4v7unsetup(GENmodel*,CKTcircuit*); extern int BSIM4v7soaCheck(CKTcircuit *, GENmodel *); + +#ifdef KLU +extern int BSIM4v7bindCSC (GENmodel*, CKTcircuit*) ; +extern int BSIM4v7bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int BSIM4v7bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; +#endif diff --git a/src/spicelib/devices/bsim4v7/bsim4v7init.c b/src/spicelib/devices/bsim4v7/bsim4v7init.c index abe32d37b..415518421 100644 --- a/src/spicelib/devices/bsim4v7/bsim4v7init.c +++ b/src/spicelib/devices/bsim4v7/bsim4v7init.c @@ -66,6 +66,12 @@ SPICEdev BSIM4v7info = { .DEVdump = NULL, .DEVacct = NULL, #endif + +#ifdef KLU + .DEVbindCSC = BSIM4v7bindCSC, + .DEVbindCSCComplex = BSIM4v7bindCSCComplex, + .DEVbindCSCComplexToReal = BSIM4v7bindCSCComplexToReal, +#endif };