From d03f3a6180a643f84ac7526beca88807fd808f65 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Sun, 19 Jun 2016 16:23:18 +0200 Subject: [PATCH] Added HISIMHV2 Model to KLU --- src/spicelib/devices/hisimhv2/Makefile.am | 5 + src/spicelib/devices/hisimhv2/hsmhv2bindCSC.c | 398 ++++++++++++++++++ src/spicelib/devices/hisimhv2/hsmhv2def.h | 106 +++++ src/spicelib/devices/hisimhv2/hsmhv2ext.h | 6 + src/spicelib/devices/hisimhv2/hsmhv2init.c | 5 + 5 files changed, 520 insertions(+) create mode 100644 src/spicelib/devices/hisimhv2/hsmhv2bindCSC.c diff --git a/src/spicelib/devices/hisimhv2/Makefile.am b/src/spicelib/devices/hisimhv2/Makefile.am index 520fb0f95..5ced87ca9 100644 --- a/src/spicelib/devices/hisimhv2/Makefile.am +++ b/src/spicelib/devices/hisimhv2/Makefile.am @@ -37,6 +37,11 @@ libhisimhv2_la_SOURCES = hisimhv2.h \ hsmhv2temp_eval_rdri.h \ hsmhv2trunc.c + +if KLU_WANTED +libhisimhv2_la_SOURCES += hsmhv2bindCSC.c +endif + AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include AM_CFLAGS = $(STATIC) diff --git a/src/spicelib/devices/hisimhv2/hsmhv2bindCSC.c b/src/spicelib/devices/hisimhv2/hsmhv2bindCSC.c new file mode 100644 index 000000000..a7577cb88 --- /dev/null +++ b/src/spicelib/devices/hisimhv2/hsmhv2bindCSC.c @@ -0,0 +1,398 @@ +/********** +Author: 2016 Francesco Lannutti +**********/ + +#include "ngspice/ngspice.h" +#include "ngspice/cktdefs.h" +#include "hsmhv2def.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 +HSMHV2bindCSC (GENmodel *inModel, CKTcircuit *ckt) +{ + HSMHV2model *model = (HSMHV2model *)inModel ; + HSMHV2instance *here ; + double *i ; + BindElement *matched, *BindStruct ; + size_t nz ; + + BindStruct = ckt->CKTmatrix->CKTbindStruct ; + nz = (size_t)ckt->CKTmatrix->CKTklunz ; + + /* loop through all the HSMHV2 models */ + for ( ; model != NULL ; model = HSMHV2nextModel(model)) + { + /* loop through all the instances of the model */ + for (here = HSMHV2instances(model); here != NULL ; here = HSMHV2nextInstance(here)) + { + CREATE_KLU_BINDING_TABLE (HSMHV2GPsPtr, HSMHV2GPsBinding, HSMHV2gNodePrime, HSMHV2sNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2GPspPtr, HSMHV2GPspBinding, HSMHV2gNodePrime, HSMHV2sNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SPgpPtr, HSMHV2SPgpBinding, HSMHV2sNodePrime, HSMHV2gNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DBdPtr, HSMHV2DBdBinding, HSMHV2dbNode, HSMHV2dNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SsPtr, HSMHV2SsBinding, HSMHV2sNode, HSMHV2sNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DPsPtr, HSMHV2DPsBinding, HSMHV2dNodePrime, HSMHV2sNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SsbPtr, HSMHV2SsbBinding, HSMHV2sNode, HSMHV2sbNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2GPdPtr, HSMHV2GPdBinding, HSMHV2gNodePrime, HSMHV2dNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2BPbPtr, HSMHV2BPbBinding, HSMHV2bNodePrime, HSMHV2bNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2BPspPtr, HSMHV2BPspBinding, HSMHV2bNodePrime, HSMHV2sNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SPspPtr, HSMHV2SPspBinding, HSMHV2sNodePrime, HSMHV2sNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2GgPtr, HSMHV2GgBinding, HSMHV2gNode, HSMHV2gNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DbpPtr, HSMHV2DbpBinding, HSMHV2dNode, HSMHV2bNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SdPtr, HSMHV2SdBinding, HSMHV2sNode, HSMHV2dNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DdpPtr, HSMHV2DdpBinding, HSMHV2dNode, HSMHV2dNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DPdPtr, HSMHV2DPdBinding, HSMHV2dNodePrime, HSMHV2dNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2GPbpPtr, HSMHV2GPbpBinding, HSMHV2gNodePrime, HSMHV2bNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2GPdpPtr, HSMHV2GPdpBinding, HSMHV2gNodePrime, HSMHV2dNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2GPgPtr, HSMHV2GPgBinding, HSMHV2gNodePrime, HSMHV2gNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DsPtr, HSMHV2DsBinding, HSMHV2dNode, HSMHV2sNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SgpPtr, HSMHV2SgpBinding, HSMHV2sNode, HSMHV2gNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2BPbpPtr, HSMHV2BPbpBinding, HSMHV2bNodePrime, HSMHV2bNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SPbpPtr, HSMHV2SPbpBinding, HSMHV2sNodePrime, HSMHV2bNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2BPdpPtr, HSMHV2BPdpBinding, HSMHV2bNodePrime, HSMHV2dNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SPdpPtr, HSMHV2SPdpBinding, HSMHV2sNodePrime, HSMHV2dNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SBbpPtr, HSMHV2SBbpBinding, HSMHV2sbNode, HSMHV2bNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DdPtr, HSMHV2DdBinding, HSMHV2dNode, HSMHV2dNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SBsPtr, HSMHV2SBsBinding, HSMHV2sbNode, HSMHV2sNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DPgpPtr, HSMHV2DPgpBinding, HSMHV2dNodePrime, HSMHV2gNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DBdbPtr, HSMHV2DBdbBinding, HSMHV2dbNode, HSMHV2dbNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SspPtr, HSMHV2SspBinding, HSMHV2sNode, HSMHV2sNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2BbPtr, HSMHV2BbBinding, HSMHV2bNode, HSMHV2bNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SPsPtr, HSMHV2SPsBinding, HSMHV2sNodePrime, HSMHV2sNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2GgpPtr, HSMHV2GgpBinding, HSMHV2gNode, HSMHV2gNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DPspPtr, HSMHV2DPspBinding, HSMHV2dNodePrime, HSMHV2sNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2BPsbPtr, HSMHV2BPsbBinding, HSMHV2bNodePrime, HSMHV2sbNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DdbPtr, HSMHV2DdbBinding, HSMHV2dNode, HSMHV2dbNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SBsbPtr, HSMHV2SBsbBinding, HSMHV2sbNode, HSMHV2sbNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DgpPtr, HSMHV2DgpBinding, HSMHV2dNode, HSMHV2gNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2BPsPtr, HSMHV2BPsBinding, HSMHV2bNodePrime, HSMHV2sNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SbpPtr, HSMHV2SbpBinding, HSMHV2sNode, HSMHV2bNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2GPgpPtr, HSMHV2GPgpBinding, HSMHV2gNodePrime, HSMHV2gNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SPdPtr, HSMHV2SPdBinding, HSMHV2sNodePrime, HSMHV2dNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SdpPtr, HSMHV2SdpBinding, HSMHV2sNode, HSMHV2dNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2BbpPtr, HSMHV2BbpBinding, HSMHV2bNode, HSMHV2bNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2BPdPtr, HSMHV2BPdBinding, HSMHV2bNodePrime, HSMHV2dNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DPbpPtr, HSMHV2DPbpBinding, HSMHV2dNodePrime, HSMHV2bNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DspPtr, HSMHV2DspBinding, HSMHV2dNode, HSMHV2sNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DPdpPtr, HSMHV2DPdpBinding, HSMHV2dNodePrime, HSMHV2dNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DBbpPtr, HSMHV2DBbpBinding, HSMHV2dbNode, HSMHV2bNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2BPdbPtr, HSMHV2BPdbBinding, HSMHV2bNodePrime, HSMHV2dbNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2BPgpPtr, HSMHV2BPgpBinding, HSMHV2bNodePrime, HSMHV2gNodePrime) ; + + if (here->HSMHV2subNode > 0) + { /* 5th substrate node */ + CREATE_KLU_BINDING_TABLE (HSMHV2DPsubPtr, HSMHV2DPsubBinding, HSMHV2dNodePrime, HSMHV2subNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DsubPtr, HSMHV2DsubBinding, HSMHV2dNode, HSMHV2subNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SPsubPtr, HSMHV2SPsubBinding, HSMHV2sNodePrime, HSMHV2subNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SsubPtr, HSMHV2SsubBinding, HSMHV2sNode, HSMHV2subNode) ; + } + + if (here->HSMHV2tempNode > 0) + { /* self heating */ + CREATE_KLU_BINDING_TABLE (HSMHV2TemptempPtr, HSMHV2TemptempBinding, HSMHV2tempNode, HSMHV2tempNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2TempbpPtr, HSMHV2TempbpBinding, HSMHV2tempNode, HSMHV2bNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2BPtempPtr, HSMHV2BPtempBinding, HSMHV2bNodePrime, HSMHV2tempNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2TempspPtr, HSMHV2TempspBinding, HSMHV2tempNode, HSMHV2sNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SPtempPtr, HSMHV2SPtempBinding, HSMHV2sNodePrime, HSMHV2tempNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DtempPtr, HSMHV2DtempBinding, HSMHV2dNode, HSMHV2tempNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2TempdPtr, HSMHV2TempdBinding, HSMHV2tempNode, HSMHV2dNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2TempdpPtr, HSMHV2TempdpBinding, HSMHV2tempNode, HSMHV2dNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DPtempPtr, HSMHV2DPtempBinding, HSMHV2dNodePrime, HSMHV2tempNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SBtempPtr, HSMHV2SBtempBinding, HSMHV2sbNode, HSMHV2tempNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DBtempPtr, HSMHV2DBtempBinding, HSMHV2dbNode, HSMHV2tempNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2TempgpPtr, HSMHV2TempgpBinding, HSMHV2tempNode, HSMHV2gNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2GPtempPtr, HSMHV2GPtempBinding, HSMHV2gNodePrime, HSMHV2tempNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2StempPtr, HSMHV2StempBinding, HSMHV2sNode, HSMHV2tempNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2TempsPtr, HSMHV2TempsBinding, HSMHV2tempNode, HSMHV2sNode) ; + } + + if (model->HSMHV2_conqs) + { /* flat handling of NQS */ + CREATE_KLU_BINDING_TABLE (HSMHV2GPqbPtr, HSMHV2GPqbBinding, HSMHV2gNodePrime, HSMHV2qbNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2QBgpPtr, HSMHV2QBgpBinding, HSMHV2qbNode, HSMHV2gNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2QIbpPtr, HSMHV2QIbpBinding, HSMHV2qiNode, HSMHV2bNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2QIqiPtr, HSMHV2QIqiBinding, HSMHV2qiNode, HSMHV2qiNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2QBbpPtr, HSMHV2QBbpBinding, HSMHV2qbNode, HSMHV2bNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2SPqiPtr, HSMHV2SPqiBinding, HSMHV2sNodePrime, HSMHV2qiNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2BPqbPtr, HSMHV2BPqbBinding, HSMHV2bNodePrime, HSMHV2qbNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2QIspPtr, HSMHV2QIspBinding, HSMHV2qiNode, HSMHV2sNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2QBqbPtr, HSMHV2QBqbBinding, HSMHV2qbNode, HSMHV2qbNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2QBspPtr, HSMHV2QBspBinding, HSMHV2qbNode, HSMHV2sNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2DPqiPtr, HSMHV2DPqiBinding, HSMHV2dNodePrime, HSMHV2qiNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2QIdpPtr, HSMHV2QIdpBinding, HSMHV2qiNode, HSMHV2dNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2QBdpPtr, HSMHV2QBdpBinding, HSMHV2qbNode, HSMHV2dNodePrime) ; + CREATE_KLU_BINDING_TABLE (HSMHV2GPqiPtr, HSMHV2GPqiBinding, HSMHV2gNodePrime, HSMHV2qiNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2QIgpPtr, HSMHV2QIgpBinding, HSMHV2qiNode, HSMHV2gNodePrime) ; + + if (here->HSMHV2tempNode > 0) + { /* self heating */ + CREATE_KLU_BINDING_TABLE (HSMHV2QItempPtr, HSMHV2QItempBinding, HSMHV2qiNode, HSMHV2tempNode) ; + CREATE_KLU_BINDING_TABLE (HSMHV2QBtempPtr, HSMHV2QBtempBinding, HSMHV2qbNode, HSMHV2tempNode) ; + } + } + } + } + + return (OK) ; +} + +int +HSMHV2bindCSCComplex (GENmodel *inModel, CKTcircuit *ckt) +{ + HSMHV2model *model = (HSMHV2model *)inModel ; + HSMHV2instance *here ; + + NG_IGNORE (ckt) ; + + /* loop through all the HSMHV2 models */ + for ( ; model != NULL ; model = HSMHV2nextModel(model)) + { + /* loop through all the instances of the model */ + for (here = HSMHV2instances(model); here != NULL ; here = HSMHV2nextInstance(here)) + { + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2GPsPtr, HSMHV2GPsBinding, HSMHV2gNodePrime, HSMHV2sNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2GPspPtr, HSMHV2GPspBinding, HSMHV2gNodePrime, HSMHV2sNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SPgpPtr, HSMHV2SPgpBinding, HSMHV2sNodePrime, HSMHV2gNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DBdPtr, HSMHV2DBdBinding, HSMHV2dbNode, HSMHV2dNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SsPtr, HSMHV2SsBinding, HSMHV2sNode, HSMHV2sNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DPsPtr, HSMHV2DPsBinding, HSMHV2dNodePrime, HSMHV2sNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SsbPtr, HSMHV2SsbBinding, HSMHV2sNode, HSMHV2sbNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2GPdPtr, HSMHV2GPdBinding, HSMHV2gNodePrime, HSMHV2dNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2BPbPtr, HSMHV2BPbBinding, HSMHV2bNodePrime, HSMHV2bNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2BPspPtr, HSMHV2BPspBinding, HSMHV2bNodePrime, HSMHV2sNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SPspPtr, HSMHV2SPspBinding, HSMHV2sNodePrime, HSMHV2sNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2GgPtr, HSMHV2GgBinding, HSMHV2gNode, HSMHV2gNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DbpPtr, HSMHV2DbpBinding, HSMHV2dNode, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SdPtr, HSMHV2SdBinding, HSMHV2sNode, HSMHV2dNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DdpPtr, HSMHV2DdpBinding, HSMHV2dNode, HSMHV2dNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DPdPtr, HSMHV2DPdBinding, HSMHV2dNodePrime, HSMHV2dNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2GPbpPtr, HSMHV2GPbpBinding, HSMHV2gNodePrime, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2GPdpPtr, HSMHV2GPdpBinding, HSMHV2gNodePrime, HSMHV2dNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2GPgPtr, HSMHV2GPgBinding, HSMHV2gNodePrime, HSMHV2gNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DsPtr, HSMHV2DsBinding, HSMHV2dNode, HSMHV2sNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SgpPtr, HSMHV2SgpBinding, HSMHV2sNode, HSMHV2gNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2BPbpPtr, HSMHV2BPbpBinding, HSMHV2bNodePrime, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SPbpPtr, HSMHV2SPbpBinding, HSMHV2sNodePrime, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2BPdpPtr, HSMHV2BPdpBinding, HSMHV2bNodePrime, HSMHV2dNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SPdpPtr, HSMHV2SPdpBinding, HSMHV2sNodePrime, HSMHV2dNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SBbpPtr, HSMHV2SBbpBinding, HSMHV2sbNode, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DdPtr, HSMHV2DdBinding, HSMHV2dNode, HSMHV2dNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SBsPtr, HSMHV2SBsBinding, HSMHV2sbNode, HSMHV2sNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DPgpPtr, HSMHV2DPgpBinding, HSMHV2dNodePrime, HSMHV2gNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DBdbPtr, HSMHV2DBdbBinding, HSMHV2dbNode, HSMHV2dbNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SspPtr, HSMHV2SspBinding, HSMHV2sNode, HSMHV2sNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2BbPtr, HSMHV2BbBinding, HSMHV2bNode, HSMHV2bNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SPsPtr, HSMHV2SPsBinding, HSMHV2sNodePrime, HSMHV2sNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2GgpPtr, HSMHV2GgpBinding, HSMHV2gNode, HSMHV2gNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DPspPtr, HSMHV2DPspBinding, HSMHV2dNodePrime, HSMHV2sNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2BPsbPtr, HSMHV2BPsbBinding, HSMHV2bNodePrime, HSMHV2sbNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DdbPtr, HSMHV2DdbBinding, HSMHV2dNode, HSMHV2dbNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SBsbPtr, HSMHV2SBsbBinding, HSMHV2sbNode, HSMHV2sbNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DgpPtr, HSMHV2DgpBinding, HSMHV2dNode, HSMHV2gNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2BPsPtr, HSMHV2BPsBinding, HSMHV2bNodePrime, HSMHV2sNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SbpPtr, HSMHV2SbpBinding, HSMHV2sNode, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2GPgpPtr, HSMHV2GPgpBinding, HSMHV2gNodePrime, HSMHV2gNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SPdPtr, HSMHV2SPdBinding, HSMHV2sNodePrime, HSMHV2dNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SdpPtr, HSMHV2SdpBinding, HSMHV2sNode, HSMHV2dNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2BbpPtr, HSMHV2BbpBinding, HSMHV2bNode, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2BPdPtr, HSMHV2BPdBinding, HSMHV2bNodePrime, HSMHV2dNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DPbpPtr, HSMHV2DPbpBinding, HSMHV2dNodePrime, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DspPtr, HSMHV2DspBinding, HSMHV2dNode, HSMHV2sNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DPdpPtr, HSMHV2DPdpBinding, HSMHV2dNodePrime, HSMHV2dNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DBbpPtr, HSMHV2DBbpBinding, HSMHV2dbNode, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2BPdbPtr, HSMHV2BPdbBinding, HSMHV2bNodePrime, HSMHV2dbNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2BPgpPtr, HSMHV2BPgpBinding, HSMHV2bNodePrime, HSMHV2gNodePrime) ; + + if (here->HSMHV2subNode > 0) + { /* 5th substrate node */ + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DPsubPtr, HSMHV2DPsubBinding, HSMHV2dNodePrime, HSMHV2subNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DsubPtr, HSMHV2DsubBinding, HSMHV2dNode, HSMHV2subNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SPsubPtr, HSMHV2SPsubBinding, HSMHV2sNodePrime, HSMHV2subNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SsubPtr, HSMHV2SsubBinding, HSMHV2sNode, HSMHV2subNode) ; + } + + if (here->HSMHV2tempNode > 0) + { /* self heating */ + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2TemptempPtr, HSMHV2TemptempBinding, HSMHV2tempNode, HSMHV2tempNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2TempbpPtr, HSMHV2TempbpBinding, HSMHV2tempNode, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2BPtempPtr, HSMHV2BPtempBinding, HSMHV2bNodePrime, HSMHV2tempNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2TempspPtr, HSMHV2TempspBinding, HSMHV2tempNode, HSMHV2sNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SPtempPtr, HSMHV2SPtempBinding, HSMHV2sNodePrime, HSMHV2tempNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DtempPtr, HSMHV2DtempBinding, HSMHV2dNode, HSMHV2tempNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2TempdPtr, HSMHV2TempdBinding, HSMHV2tempNode, HSMHV2dNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2TempdpPtr, HSMHV2TempdpBinding, HSMHV2tempNode, HSMHV2dNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DPtempPtr, HSMHV2DPtempBinding, HSMHV2dNodePrime, HSMHV2tempNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SBtempPtr, HSMHV2SBtempBinding, HSMHV2sbNode, HSMHV2tempNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DBtempPtr, HSMHV2DBtempBinding, HSMHV2dbNode, HSMHV2tempNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2TempgpPtr, HSMHV2TempgpBinding, HSMHV2tempNode, HSMHV2gNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2GPtempPtr, HSMHV2GPtempBinding, HSMHV2gNodePrime, HSMHV2tempNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2StempPtr, HSMHV2StempBinding, HSMHV2sNode, HSMHV2tempNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2TempsPtr, HSMHV2TempsBinding, HSMHV2tempNode, HSMHV2sNode) ; + } + + if (model->HSMHV2_conqs) + { /* flat handling of NQS */ + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2GPqbPtr, HSMHV2GPqbBinding, HSMHV2gNodePrime, HSMHV2qbNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2QBgpPtr, HSMHV2QBgpBinding, HSMHV2qbNode, HSMHV2gNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2QIbpPtr, HSMHV2QIbpBinding, HSMHV2qiNode, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2QIqiPtr, HSMHV2QIqiBinding, HSMHV2qiNode, HSMHV2qiNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2QBbpPtr, HSMHV2QBbpBinding, HSMHV2qbNode, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2SPqiPtr, HSMHV2SPqiBinding, HSMHV2sNodePrime, HSMHV2qiNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2BPqbPtr, HSMHV2BPqbBinding, HSMHV2bNodePrime, HSMHV2qbNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2QIspPtr, HSMHV2QIspBinding, HSMHV2qiNode, HSMHV2sNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2QBqbPtr, HSMHV2QBqbBinding, HSMHV2qbNode, HSMHV2qbNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2QBspPtr, HSMHV2QBspBinding, HSMHV2qbNode, HSMHV2sNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2DPqiPtr, HSMHV2DPqiBinding, HSMHV2dNodePrime, HSMHV2qiNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2QIdpPtr, HSMHV2QIdpBinding, HSMHV2qiNode, HSMHV2dNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2QBdpPtr, HSMHV2QBdpBinding, HSMHV2qbNode, HSMHV2dNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2GPqiPtr, HSMHV2GPqiBinding, HSMHV2gNodePrime, HSMHV2qiNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2QIgpPtr, HSMHV2QIgpBinding, HSMHV2qiNode, HSMHV2gNodePrime) ; + + if (here->HSMHV2tempNode > 0) + { /* self heating */ + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2QItempPtr, HSMHV2QItempBinding, HSMHV2qiNode, HSMHV2tempNode) ; + CONVERT_KLU_BINDING_TABLE_TO_COMPLEX (HSMHV2QBtempPtr, HSMHV2QBtempBinding, HSMHV2qbNode, HSMHV2tempNode) ; + } + } + } + } + + return (OK) ; +} + +int +HSMHV2bindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) +{ + HSMHV2model *model = (HSMHV2model *)inModel ; + HSMHV2instance *here ; + + NG_IGNORE (ckt) ; + + /* loop through all the HSMHV2 models */ + for ( ; model != NULL ; model = HSMHV2nextModel(model)) + { + /* loop through all the instances of the model */ + for (here = HSMHV2instances(model); here != NULL ; here = HSMHV2nextInstance(here)) + { + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2GPsPtr, HSMHV2GPsBinding, HSMHV2gNodePrime, HSMHV2sNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2GPspPtr, HSMHV2GPspBinding, HSMHV2gNodePrime, HSMHV2sNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SPgpPtr, HSMHV2SPgpBinding, HSMHV2sNodePrime, HSMHV2gNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DBdPtr, HSMHV2DBdBinding, HSMHV2dbNode, HSMHV2dNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SsPtr, HSMHV2SsBinding, HSMHV2sNode, HSMHV2sNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DPsPtr, HSMHV2DPsBinding, HSMHV2dNodePrime, HSMHV2sNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SsbPtr, HSMHV2SsbBinding, HSMHV2sNode, HSMHV2sbNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2GPdPtr, HSMHV2GPdBinding, HSMHV2gNodePrime, HSMHV2dNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2BPbPtr, HSMHV2BPbBinding, HSMHV2bNodePrime, HSMHV2bNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2BPspPtr, HSMHV2BPspBinding, HSMHV2bNodePrime, HSMHV2sNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SPspPtr, HSMHV2SPspBinding, HSMHV2sNodePrime, HSMHV2sNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2GgPtr, HSMHV2GgBinding, HSMHV2gNode, HSMHV2gNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DbpPtr, HSMHV2DbpBinding, HSMHV2dNode, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SdPtr, HSMHV2SdBinding, HSMHV2sNode, HSMHV2dNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DdpPtr, HSMHV2DdpBinding, HSMHV2dNode, HSMHV2dNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DPdPtr, HSMHV2DPdBinding, HSMHV2dNodePrime, HSMHV2dNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2GPbpPtr, HSMHV2GPbpBinding, HSMHV2gNodePrime, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2GPdpPtr, HSMHV2GPdpBinding, HSMHV2gNodePrime, HSMHV2dNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2GPgPtr, HSMHV2GPgBinding, HSMHV2gNodePrime, HSMHV2gNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DsPtr, HSMHV2DsBinding, HSMHV2dNode, HSMHV2sNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SgpPtr, HSMHV2SgpBinding, HSMHV2sNode, HSMHV2gNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2BPbpPtr, HSMHV2BPbpBinding, HSMHV2bNodePrime, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SPbpPtr, HSMHV2SPbpBinding, HSMHV2sNodePrime, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2BPdpPtr, HSMHV2BPdpBinding, HSMHV2bNodePrime, HSMHV2dNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SPdpPtr, HSMHV2SPdpBinding, HSMHV2sNodePrime, HSMHV2dNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SBbpPtr, HSMHV2SBbpBinding, HSMHV2sbNode, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DdPtr, HSMHV2DdBinding, HSMHV2dNode, HSMHV2dNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SBsPtr, HSMHV2SBsBinding, HSMHV2sbNode, HSMHV2sNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DPgpPtr, HSMHV2DPgpBinding, HSMHV2dNodePrime, HSMHV2gNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DBdbPtr, HSMHV2DBdbBinding, HSMHV2dbNode, HSMHV2dbNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SspPtr, HSMHV2SspBinding, HSMHV2sNode, HSMHV2sNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2BbPtr, HSMHV2BbBinding, HSMHV2bNode, HSMHV2bNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SPsPtr, HSMHV2SPsBinding, HSMHV2sNodePrime, HSMHV2sNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2GgpPtr, HSMHV2GgpBinding, HSMHV2gNode, HSMHV2gNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DPspPtr, HSMHV2DPspBinding, HSMHV2dNodePrime, HSMHV2sNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2BPsbPtr, HSMHV2BPsbBinding, HSMHV2bNodePrime, HSMHV2sbNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DdbPtr, HSMHV2DdbBinding, HSMHV2dNode, HSMHV2dbNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SBsbPtr, HSMHV2SBsbBinding, HSMHV2sbNode, HSMHV2sbNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DgpPtr, HSMHV2DgpBinding, HSMHV2dNode, HSMHV2gNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2BPsPtr, HSMHV2BPsBinding, HSMHV2bNodePrime, HSMHV2sNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SbpPtr, HSMHV2SbpBinding, HSMHV2sNode, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2GPgpPtr, HSMHV2GPgpBinding, HSMHV2gNodePrime, HSMHV2gNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SPdPtr, HSMHV2SPdBinding, HSMHV2sNodePrime, HSMHV2dNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SdpPtr, HSMHV2SdpBinding, HSMHV2sNode, HSMHV2dNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2BbpPtr, HSMHV2BbpBinding, HSMHV2bNode, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2BPdPtr, HSMHV2BPdBinding, HSMHV2bNodePrime, HSMHV2dNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DPbpPtr, HSMHV2DPbpBinding, HSMHV2dNodePrime, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DspPtr, HSMHV2DspBinding, HSMHV2dNode, HSMHV2sNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DPdpPtr, HSMHV2DPdpBinding, HSMHV2dNodePrime, HSMHV2dNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DBbpPtr, HSMHV2DBbpBinding, HSMHV2dbNode, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2BPdbPtr, HSMHV2BPdbBinding, HSMHV2bNodePrime, HSMHV2dbNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2BPgpPtr, HSMHV2BPgpBinding, HSMHV2bNodePrime, HSMHV2gNodePrime) ; + + if (here->HSMHV2subNode > 0) + { /* 5th substrate node */ + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DPsubPtr, HSMHV2DPsubBinding, HSMHV2dNodePrime, HSMHV2subNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DsubPtr, HSMHV2DsubBinding, HSMHV2dNode, HSMHV2subNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SPsubPtr, HSMHV2SPsubBinding, HSMHV2sNodePrime, HSMHV2subNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SsubPtr, HSMHV2SsubBinding, HSMHV2sNode, HSMHV2subNode) ; + } + + if (here->HSMHV2tempNode > 0) + { /* self heating */ + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2TemptempPtr, HSMHV2TemptempBinding, HSMHV2tempNode, HSMHV2tempNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2TempbpPtr, HSMHV2TempbpBinding, HSMHV2tempNode, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2BPtempPtr, HSMHV2BPtempBinding, HSMHV2bNodePrime, HSMHV2tempNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2TempspPtr, HSMHV2TempspBinding, HSMHV2tempNode, HSMHV2sNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SPtempPtr, HSMHV2SPtempBinding, HSMHV2sNodePrime, HSMHV2tempNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DtempPtr, HSMHV2DtempBinding, HSMHV2dNode, HSMHV2tempNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2TempdPtr, HSMHV2TempdBinding, HSMHV2tempNode, HSMHV2dNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2TempdpPtr, HSMHV2TempdpBinding, HSMHV2tempNode, HSMHV2dNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DPtempPtr, HSMHV2DPtempBinding, HSMHV2dNodePrime, HSMHV2tempNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SBtempPtr, HSMHV2SBtempBinding, HSMHV2sbNode, HSMHV2tempNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DBtempPtr, HSMHV2DBtempBinding, HSMHV2dbNode, HSMHV2tempNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2TempgpPtr, HSMHV2TempgpBinding, HSMHV2tempNode, HSMHV2gNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2GPtempPtr, HSMHV2GPtempBinding, HSMHV2gNodePrime, HSMHV2tempNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2StempPtr, HSMHV2StempBinding, HSMHV2sNode, HSMHV2tempNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2TempsPtr, HSMHV2TempsBinding, HSMHV2tempNode, HSMHV2sNode) ; + } + + if (model->HSMHV2_conqs) + { /* flat handling of NQS */ + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2GPqbPtr, HSMHV2GPqbBinding, HSMHV2gNodePrime, HSMHV2qbNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2QBgpPtr, HSMHV2QBgpBinding, HSMHV2qbNode, HSMHV2gNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2QIbpPtr, HSMHV2QIbpBinding, HSMHV2qiNode, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2QIqiPtr, HSMHV2QIqiBinding, HSMHV2qiNode, HSMHV2qiNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2QBbpPtr, HSMHV2QBbpBinding, HSMHV2qbNode, HSMHV2bNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2SPqiPtr, HSMHV2SPqiBinding, HSMHV2sNodePrime, HSMHV2qiNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2BPqbPtr, HSMHV2BPqbBinding, HSMHV2bNodePrime, HSMHV2qbNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2QIspPtr, HSMHV2QIspBinding, HSMHV2qiNode, HSMHV2sNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2QBqbPtr, HSMHV2QBqbBinding, HSMHV2qbNode, HSMHV2qbNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2QBspPtr, HSMHV2QBspBinding, HSMHV2qbNode, HSMHV2sNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2DPqiPtr, HSMHV2DPqiBinding, HSMHV2dNodePrime, HSMHV2qiNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2QIdpPtr, HSMHV2QIdpBinding, HSMHV2qiNode, HSMHV2dNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2QBdpPtr, HSMHV2QBdpBinding, HSMHV2qbNode, HSMHV2dNodePrime) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2GPqiPtr, HSMHV2GPqiBinding, HSMHV2gNodePrime, HSMHV2qiNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2QIgpPtr, HSMHV2QIgpBinding, HSMHV2qiNode, HSMHV2gNodePrime) ; + + if (here->HSMHV2tempNode > 0) + { /* self heating */ + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2QItempPtr, HSMHV2QItempBinding, HSMHV2qiNode, HSMHV2tempNode) ; + CONVERT_KLU_BINDING_TABLE_TO_REAL (HSMHV2QBtempPtr, HSMHV2QBtempBinding, HSMHV2qbNode, HSMHV2tempNode) ; + } + } + } + } + + return (OK) ; +} diff --git a/src/spicelib/devices/hisimhv2/hsmhv2def.h b/src/spicelib/devices/hisimhv2/hsmhv2def.h index aba3c33c0..4fac4f470 100644 --- a/src/spicelib/devices/hisimhv2/hsmhv2def.h +++ b/src/spicelib/devices/hisimhv2/hsmhv2def.h @@ -1017,6 +1017,112 @@ typedef struct sHSMHV2instance { double **HSMHV2nVar; #endif /* NONOISE */ +#ifdef KLU + BindElement *HSMHV2GgBinding ; + BindElement *HSMHV2GgpBinding ; + + BindElement *HSMHV2GPgBinding ; + BindElement *HSMHV2GPgpBinding ; + BindElement *HSMHV2GPdpBinding ; + BindElement *HSMHV2GPspBinding ; + BindElement *HSMHV2GPbpBinding ; + + BindElement *HSMHV2DPdBinding ; + BindElement *HSMHV2DPdpBinding ; + BindElement *HSMHV2DPgpBinding ; + BindElement *HSMHV2DPspBinding ; + BindElement *HSMHV2DPbpBinding ; + + BindElement *HSMHV2DdBinding ; + BindElement *HSMHV2DdpBinding ; + BindElement *HSMHV2DspBinding ; + BindElement *HSMHV2DdbBinding ; + + BindElement *HSMHV2SPsBinding ; + BindElement *HSMHV2SPspBinding ; + BindElement *HSMHV2SPgpBinding ; + BindElement *HSMHV2SPdpBinding ; + BindElement *HSMHV2SPbpBinding ; + + BindElement *HSMHV2SsBinding ; + BindElement *HSMHV2SspBinding ; + BindElement *HSMHV2SdpBinding ; + BindElement *HSMHV2SsbBinding ; + + BindElement *HSMHV2BPgpBinding ; + BindElement *HSMHV2BPbpBinding ; + BindElement *HSMHV2BPdBinding ; + BindElement *HSMHV2BPdpBinding ; + BindElement *HSMHV2BPspBinding ; + BindElement *HSMHV2BPsBinding ; + BindElement *HSMHV2BPbBinding ; + BindElement *HSMHV2BPdbBinding ; + BindElement *HSMHV2BPsbBinding ; + + BindElement *HSMHV2DBdBinding ; + BindElement *HSMHV2DBdbBinding ; + BindElement *HSMHV2DBbpBinding ; + + BindElement *HSMHV2SBsBinding ; + BindElement *HSMHV2SBbpBinding ; + BindElement *HSMHV2SBsbBinding ; + + BindElement *HSMHV2BbpBinding ; + BindElement *HSMHV2BbBinding ; + + BindElement *HSMHV2TemptempBinding ; + BindElement *HSMHV2TempdBinding ; + BindElement *HSMHV2TempdpBinding ; + BindElement *HSMHV2TempsBinding ; + BindElement *HSMHV2TempspBinding ; + BindElement *HSMHV2TempgpBinding ; + BindElement *HSMHV2TempbpBinding ; + BindElement *HSMHV2GPtempBinding ; + BindElement *HSMHV2DPtempBinding ; + BindElement *HSMHV2SPtempBinding ; + BindElement *HSMHV2BPtempBinding ; + BindElement *HSMHV2DBtempBinding ; + BindElement *HSMHV2SBtempBinding ; + + BindElement *HSMHV2DgpBinding ; + BindElement *HSMHV2DsBinding ; + BindElement *HSMHV2DbpBinding ; + BindElement *HSMHV2DtempBinding ; + BindElement *HSMHV2DPsBinding ; + BindElement *HSMHV2GPdBinding ; + BindElement *HSMHV2GPsBinding ; + BindElement *HSMHV2SdBinding ; + BindElement *HSMHV2SgpBinding ; + BindElement *HSMHV2SbpBinding ; + BindElement *HSMHV2StempBinding ; + BindElement *HSMHV2SPdBinding ; + + /* nqs related pointers */ + BindElement *HSMHV2DPqiBinding ; + BindElement *HSMHV2GPqiBinding ; + BindElement *HSMHV2GPqbBinding ; + BindElement *HSMHV2SPqiBinding ; + BindElement *HSMHV2BPqbBinding ; + BindElement *HSMHV2QIdpBinding ; + BindElement *HSMHV2QIgpBinding ; + BindElement *HSMHV2QIspBinding ; + BindElement *HSMHV2QIbpBinding ; + BindElement *HSMHV2QIqiBinding ; + BindElement *HSMHV2QBdpBinding ; + BindElement *HSMHV2QBgpBinding ; + BindElement *HSMHV2QBspBinding ; + BindElement *HSMHV2QBbpBinding ; + BindElement *HSMHV2QBqbBinding ; + BindElement *HSMHV2QItempBinding ; + BindElement *HSMHV2QBtempBinding ; + + /* Substrate effect related pointers */ + BindElement *HSMHV2DsubBinding ; + BindElement *HSMHV2DPsubBinding ; + BindElement *HSMHV2SsubBinding ; + BindElement *HSMHV2SPsubBinding ; +#endif + } HSMHV2instance ; diff --git a/src/spicelib/devices/hisimhv2/hsmhv2ext.h b/src/spicelib/devices/hisimhv2/hsmhv2ext.h index 28e2f9d66..e878e7fb4 100644 --- a/src/spicelib/devices/hisimhv2/hsmhv2ext.h +++ b/src/spicelib/devices/hisimhv2/hsmhv2ext.h @@ -38,3 +38,9 @@ extern int HSMHV2temp(GENmodel*,CKTcircuit*); extern int HSMHV2trunc(GENmodel*,CKTcircuit*,double*); extern int HSMHV2noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int HSMHV2soaCheck(CKTcircuit *, GENmodel *); + +#ifdef KLU +extern int HSMHV2bindCSC (GENmodel*, CKTcircuit*) ; +extern int HSMHV2bindCSCComplex (GENmodel*, CKTcircuit*) ; +extern int HSMHV2bindCSCComplexToReal (GENmodel*, CKTcircuit*) ; +#endif diff --git a/src/spicelib/devices/hisimhv2/hsmhv2init.c b/src/spicelib/devices/hisimhv2/hsmhv2init.c index fdd9004e8..bf7f5e04d 100644 --- a/src/spicelib/devices/hisimhv2/hsmhv2init.c +++ b/src/spicelib/devices/hisimhv2/hsmhv2init.c @@ -66,6 +66,11 @@ SPICEdev HSMHV2info = { .DEVdump = NULL, .DEVacct = NULL, #endif +#ifdef KLU + .DEVbindCSC = HSMHV2bindCSC, + .DEVbindCSCComplex = HSMHV2bindCSCComplex, + .DEVbindCSCComplexToReal = HSMHV2bindCSCComplexToReal, +#endif };