From 6d7c50a4b85a59925644439cecd70ef7d04e8862 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 1 Apr 2013 22:45:14 +0200 Subject: [PATCH] New Binding Method extended to LTRA device --- src/spicelib/devices/ltra/ltrabindCSC.c | 657 +++++++++++------------- src/spicelib/devices/ltra/ltradefs.h | 24 + 2 files changed, 314 insertions(+), 367 deletions(-) diff --git a/src/spicelib/devices/ltra/ltrabindCSC.c b/src/spicelib/devices/ltra/ltrabindCSC.c index d31a3b70e..6693b8f10 100644 --- a/src/spicelib/devices/ltra/ltrabindCSC.c +++ b/src/spicelib/devices/ltra/ltrabindCSC.c @@ -1,5 +1,5 @@ /********** -Author: 2012 Francesco Lannutti +Author: 2013 Francesco Lannutti **********/ #include "ngspice/ngspice.h" @@ -7,280 +7,281 @@ Author: 2012 Francesco Lannutti #include "ltradefs.h" #include "ngspice/sperror.h" +#include + +static int -LTRAbindCSC(GENmodel *inModel, CKTcircuit *ckt) +BindCompare (const void *a, const void *b) { - LTRAmodel *model = (LTRAmodel *)inModel; - int i ; + BindElement *A, *B ; + A = (BindElement *)a ; + B = (BindElement *)b ; - /* loop through all the ltra models */ - for( ; model != NULL; model = model->LTRAnextModel ) { - LTRAinstance *here; - - /* loop through all the instances of the model */ - for (here = model->LTRAinstances; here != NULL ; - here = here->LTRAnextInstance) { - - i = 0 ; - if ((here-> LTRAbrEq1 != 0) && (here-> LTRAposNode1 != 0)) { - while (here->LTRAibr1Pos1Ptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->LTRAibr1Pos1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> LTRAbrEq1 != 0) && (here-> LTRAnegNode1 != 0)) { - while (here->LTRAibr1Neg1Ptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->LTRAibr1Neg1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> LTRAbrEq1 != 0) && (here-> LTRAposNode2 != 0)) { - while (here->LTRAibr1Pos2Ptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->LTRAibr1Pos2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> LTRAbrEq1 != 0) && (here-> LTRAnegNode2 != 0)) { - while (here->LTRAibr1Neg2Ptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->LTRAibr1Neg2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> LTRAbrEq1 != 0) && (here-> LTRAbrEq1 != 0)) { - while (here->LTRAibr1Ibr1Ptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->LTRAibr1Ibr1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> LTRAbrEq1 != 0) && (here-> LTRAbrEq2 != 0)) { - while (here->LTRAibr1Ibr2Ptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->LTRAibr1Ibr2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> LTRAbrEq2 != 0) && (here-> LTRAposNode1 != 0)) { - while (here->LTRAibr2Pos1Ptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->LTRAibr2Pos1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> LTRAbrEq2 != 0) && (here-> LTRAnegNode1 != 0)) { - while (here->LTRAibr2Neg1Ptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->LTRAibr2Neg1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> LTRAbrEq2 != 0) && (here-> LTRAposNode2 != 0)) { - while (here->LTRAibr2Pos2Ptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->LTRAibr2Pos2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> LTRAbrEq2 != 0) && (here-> LTRAnegNode2 != 0)) { - while (here->LTRAibr2Neg2Ptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->LTRAibr2Neg2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> LTRAbrEq2 != 0) && (here-> LTRAbrEq1 != 0)) { - while (here->LTRAibr2Ibr1Ptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->LTRAibr2Ibr1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> LTRAbrEq2 != 0) && (here-> LTRAbrEq2 != 0)) { - while (here->LTRAibr2Ibr2Ptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->LTRAibr2Ibr2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> LTRAposNode1 != 0) && (here-> LTRAbrEq1 != 0)) { - while (here->LTRApos1Ibr1Ptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->LTRApos1Ibr1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> LTRAnegNode1 != 0) && (here-> LTRAbrEq1 != 0)) { - while (here->LTRAneg1Ibr1Ptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->LTRAneg1Ibr1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> LTRAposNode2 != 0) && (here-> LTRAbrEq2 != 0)) { - while (here->LTRApos2Ibr2Ptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->LTRApos2Ibr2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> LTRAnegNode2 != 0) && (here-> LTRAbrEq2 != 0)) { - while (here->LTRAneg2Ibr2Ptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->LTRAneg2Ibr2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> LTRAposNode1 != 0) && (here-> LTRAposNode1 != 0)) { - while (here->LTRApos1Pos1Ptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->LTRApos1Pos1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> LTRAnegNode1 != 0) && (here-> LTRAnegNode1 != 0)) { - while (here->LTRAneg1Neg1Ptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->LTRAneg1Neg1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> LTRAposNode2 != 0) && (here-> LTRAposNode2 != 0)) { - while (here->LTRApos2Pos2Ptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->LTRApos2Pos2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - - i = 0 ; - if ((here-> LTRAnegNode2 != 0) && (here-> LTRAnegNode2 != 0)) { - while (here->LTRAneg2Neg2Ptr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ; - here->LTRAneg2Neg2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } - } - } - return(OK); + return ((int)(A->Sparse - B->Sparse)) ; } int -LTRAbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt) +LTRAbindCSC (GENmodel *inModel, CKTcircuit *ckt) { - LTRAmodel *model = (LTRAmodel *)inModel; - int i ; + LTRAmodel *model = (LTRAmodel *)inModel ; + LTRAinstance *here ; + double *i ; + BindElement *matched, *BindStruct ; + size_t nz ; - /* loop through all the ltra models */ - for( ; model != NULL; model = model->LTRAnextModel ) { - LTRAinstance *here; + BindStruct = ckt->CKTmatrix->CKTbindStruct ; + nz = (size_t)ckt->CKTmatrix->CKTklunz ; + /* loop through all the LTRA models */ + for ( ; model != NULL ; model = model->LTRAnextModel) + { /* loop through all the instances of the model */ - for (here = model->LTRAinstances; here != NULL ; - here = here->LTRAnextInstance) { + for (here = model->LTRAinstances ; here != NULL ; here = here->LTRAnextInstance) + { + if ((here-> LTRAbrEq1 != 0) && (here-> LTRAposNode1 != 0)) + { + i = here->LTRAibr1Pos1Ptr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->LTRAibr1Pos1StructPtr = matched ; + here->LTRAibr1Pos1Ptr = matched->CSC ; + } - i = 0 ; - if ((here-> LTRAbrEq1 != 0) && (here-> LTRAposNode1 != 0)) { - while (here->LTRAibr1Pos1Ptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->LTRAibr1Pos1Ptr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> LTRAbrEq1 != 0) && (here-> LTRAnegNode1 != 0)) + { + i = here->LTRAibr1Neg1Ptr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->LTRAibr1Neg1StructPtr = matched ; + here->LTRAibr1Neg1Ptr = matched->CSC ; + } - i = 0 ; - if ((here-> LTRAbrEq1 != 0) && (here-> LTRAnegNode1 != 0)) { - while (here->LTRAibr1Neg1Ptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->LTRAibr1Neg1Ptr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> LTRAbrEq1 != 0) && (here-> LTRAposNode2 != 0)) + { + i = here->LTRAibr1Pos2Ptr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->LTRAibr1Pos2StructPtr = matched ; + here->LTRAibr1Pos2Ptr = matched->CSC ; + } - i = 0 ; - if ((here-> LTRAbrEq1 != 0) && (here-> LTRAposNode2 != 0)) { - while (here->LTRAibr1Pos2Ptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->LTRAibr1Pos2Ptr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> LTRAbrEq1 != 0) && (here-> LTRAnegNode2 != 0)) + { + i = here->LTRAibr1Neg2Ptr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->LTRAibr1Neg2StructPtr = matched ; + here->LTRAibr1Neg2Ptr = matched->CSC ; + } - i = 0 ; - if ((here-> LTRAbrEq1 != 0) && (here-> LTRAnegNode2 != 0)) { - while (here->LTRAibr1Neg2Ptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->LTRAibr1Neg2Ptr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> LTRAbrEq1 != 0) && (here-> LTRAbrEq1 != 0)) + { + i = here->LTRAibr1Ibr1Ptr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->LTRAibr1Ibr1StructPtr = matched ; + here->LTRAibr1Ibr1Ptr = matched->CSC ; + } - i = 0 ; - if ((here-> LTRAbrEq1 != 0) && (here-> LTRAbrEq1 != 0)) { - while (here->LTRAibr1Ibr1Ptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->LTRAibr1Ibr1Ptr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> LTRAbrEq1 != 0) && (here-> LTRAbrEq2 != 0)) + { + i = here->LTRAibr1Ibr2Ptr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->LTRAibr1Ibr2StructPtr = matched ; + here->LTRAibr1Ibr2Ptr = matched->CSC ; + } - i = 0 ; - if ((here-> LTRAbrEq1 != 0) && (here-> LTRAbrEq2 != 0)) { - while (here->LTRAibr1Ibr2Ptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->LTRAibr1Ibr2Ptr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> LTRAbrEq2 != 0) && (here-> LTRAposNode1 != 0)) + { + i = here->LTRAibr2Pos1Ptr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->LTRAibr2Pos1StructPtr = matched ; + here->LTRAibr2Pos1Ptr = matched->CSC ; + } - i = 0 ; - if ((here-> LTRAbrEq2 != 0) && (here-> LTRAposNode1 != 0)) { - while (here->LTRAibr2Pos1Ptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->LTRAibr2Pos1Ptr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> LTRAbrEq2 != 0) && (here-> LTRAnegNode1 != 0)) + { + i = here->LTRAibr2Neg1Ptr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->LTRAibr2Neg1StructPtr = matched ; + here->LTRAibr2Neg1Ptr = matched->CSC ; + } - i = 0 ; - if ((here-> LTRAbrEq2 != 0) && (here-> LTRAnegNode1 != 0)) { - while (here->LTRAibr2Neg1Ptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->LTRAibr2Neg1Ptr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> LTRAbrEq2 != 0) && (here-> LTRAposNode2 != 0)) + { + i = here->LTRAibr2Pos2Ptr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->LTRAibr2Pos2StructPtr = matched ; + here->LTRAibr2Pos2Ptr = matched->CSC ; + } - i = 0 ; - if ((here-> LTRAbrEq2 != 0) && (here-> LTRAposNode2 != 0)) { - while (here->LTRAibr2Pos2Ptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->LTRAibr2Pos2Ptr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> LTRAbrEq2 != 0) && (here-> LTRAnegNode2 != 0)) + { + i = here->LTRAibr2Neg2Ptr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->LTRAibr2Neg2StructPtr = matched ; + here->LTRAibr2Neg2Ptr = matched->CSC ; + } - i = 0 ; - if ((here-> LTRAbrEq2 != 0) && (here-> LTRAnegNode2 != 0)) { - while (here->LTRAibr2Neg2Ptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->LTRAibr2Neg2Ptr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> LTRAbrEq2 != 0) && (here-> LTRAbrEq1 != 0)) + { + i = here->LTRAibr2Ibr1Ptr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->LTRAibr2Ibr1StructPtr = matched ; + here->LTRAibr2Ibr1Ptr = matched->CSC ; + } - i = 0 ; - if ((here-> LTRAbrEq2 != 0) && (here-> LTRAbrEq1 != 0)) { - while (here->LTRAibr2Ibr1Ptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->LTRAibr2Ibr1Ptr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> LTRAbrEq2 != 0) && (here-> LTRAbrEq2 != 0)) + { + i = here->LTRAibr2Ibr2Ptr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->LTRAibr2Ibr2StructPtr = matched ; + here->LTRAibr2Ibr2Ptr = matched->CSC ; + } - i = 0 ; - if ((here-> LTRAbrEq2 != 0) && (here-> LTRAbrEq2 != 0)) { - while (here->LTRAibr2Ibr2Ptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->LTRAibr2Ibr2Ptr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> LTRAposNode1 != 0) && (here-> LTRAbrEq1 != 0)) + { + i = here->LTRApos1Ibr1Ptr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->LTRApos1Ibr1StructPtr = matched ; + here->LTRApos1Ibr1Ptr = matched->CSC ; + } - i = 0 ; - if ((here-> LTRAposNode1 != 0) && (here-> LTRAbrEq1 != 0)) { - while (here->LTRApos1Ibr1Ptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->LTRApos1Ibr1Ptr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> LTRAnegNode1 != 0) && (here-> LTRAbrEq1 != 0)) + { + i = here->LTRAneg1Ibr1Ptr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->LTRAneg1Ibr1StructPtr = matched ; + here->LTRAneg1Ibr1Ptr = matched->CSC ; + } - i = 0 ; - if ((here-> LTRAnegNode1 != 0) && (here-> LTRAbrEq1 != 0)) { - while (here->LTRAneg1Ibr1Ptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->LTRAneg1Ibr1Ptr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> LTRAposNode2 != 0) && (here-> LTRAbrEq2 != 0)) + { + i = here->LTRApos2Ibr2Ptr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->LTRApos2Ibr2StructPtr = matched ; + here->LTRApos2Ibr2Ptr = matched->CSC ; + } - i = 0 ; - if ((here-> LTRAposNode2 != 0) && (here-> LTRAbrEq2 != 0)) { - while (here->LTRApos2Ibr2Ptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->LTRApos2Ibr2Ptr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> LTRAnegNode2 != 0) && (here-> LTRAbrEq2 != 0)) + { + i = here->LTRAneg2Ibr2Ptr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->LTRAneg2Ibr2StructPtr = matched ; + here->LTRAneg2Ibr2Ptr = matched->CSC ; + } - i = 0 ; - if ((here-> LTRAnegNode2 != 0) && (here-> LTRAbrEq2 != 0)) { - while (here->LTRAneg2Ibr2Ptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->LTRAneg2Ibr2Ptr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> LTRAposNode1 != 0) && (here-> LTRAposNode1 != 0)) + { + i = here->LTRApos1Pos1Ptr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->LTRApos1Pos1StructPtr = matched ; + here->LTRApos1Pos1Ptr = matched->CSC ; + } - i = 0 ; - if ((here-> LTRAposNode1 != 0) && (here-> LTRAposNode1 != 0)) { - while (here->LTRApos1Pos1Ptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->LTRApos1Pos1Ptr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> LTRAnegNode1 != 0) && (here-> LTRAnegNode1 != 0)) + { + i = here->LTRAneg1Neg1Ptr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->LTRAneg1Neg1StructPtr = matched ; + here->LTRAneg1Neg1Ptr = matched->CSC ; + } - i = 0 ; - if ((here-> LTRAnegNode1 != 0) && (here-> LTRAnegNode1 != 0)) { - while (here->LTRAneg1Neg1Ptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->LTRAneg1Neg1Ptr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> LTRAposNode2 != 0) && (here-> LTRAposNode2 != 0)) + { + i = here->LTRApos2Pos2Ptr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->LTRApos2Pos2StructPtr = matched ; + here->LTRApos2Pos2Ptr = matched->CSC ; + } - i = 0 ; - if ((here-> LTRAposNode2 != 0) && (here-> LTRAposNode2 != 0)) { - while (here->LTRApos2Pos2Ptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->LTRApos2Pos2Ptr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } + if ((here-> LTRAnegNode2 != 0) && (here-> LTRAnegNode2 != 0)) + { + i = here->LTRAneg2Neg2Ptr ; + matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ; + here->LTRAneg2Neg2StructPtr = matched ; + here->LTRAneg2Neg2Ptr = matched->CSC ; + } - i = 0 ; - if ((here-> LTRAnegNode2 != 0) && (here-> LTRAnegNode2 != 0)) { - while (here->LTRAneg2Neg2Ptr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ; - here->LTRAneg2Neg2Ptr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ; - } - } + } } - return(OK); + + return (OK) ; +} + +int +LTRAbindCSCComplex (GENmodel *inModel, CKTcircuit *ckt) +{ + LTRAmodel *model = (LTRAmodel *)inModel ; + LTRAinstance *here ; + + NG_IGNORE (ckt) ; + + /* loop through all the LTRA models */ + for ( ; model != NULL ; model = model->LTRAnextModel) + { + /* loop through all the instances of the model */ + for (here = model->LTRAinstances ; here != NULL ; here = here->LTRAnextInstance) + { + if ((here-> LTRAbrEq1 != 0) && (here-> LTRAposNode1 != 0)) + here->LTRAibr1Pos1Ptr = here->LTRAibr1Pos1StructPtr->CSC_Complex ; + + if ((here-> LTRAbrEq1 != 0) && (here-> LTRAnegNode1 != 0)) + here->LTRAibr1Neg1Ptr = here->LTRAibr1Neg1StructPtr->CSC_Complex ; + + if ((here-> LTRAbrEq1 != 0) && (here-> LTRAposNode2 != 0)) + here->LTRAibr1Pos2Ptr = here->LTRAibr1Pos2StructPtr->CSC_Complex ; + + if ((here-> LTRAbrEq1 != 0) && (here-> LTRAnegNode2 != 0)) + here->LTRAibr1Neg2Ptr = here->LTRAibr1Neg2StructPtr->CSC_Complex ; + + if ((here-> LTRAbrEq1 != 0) && (here-> LTRAbrEq1 != 0)) + here->LTRAibr1Ibr1Ptr = here->LTRAibr1Ibr1StructPtr->CSC_Complex ; + + if ((here-> LTRAbrEq1 != 0) && (here-> LTRAbrEq2 != 0)) + here->LTRAibr1Ibr2Ptr = here->LTRAibr1Ibr2StructPtr->CSC_Complex ; + + if ((here-> LTRAbrEq2 != 0) && (here-> LTRAposNode1 != 0)) + here->LTRAibr2Pos1Ptr = here->LTRAibr2Pos1StructPtr->CSC_Complex ; + + if ((here-> LTRAbrEq2 != 0) && (here-> LTRAnegNode1 != 0)) + here->LTRAibr2Neg1Ptr = here->LTRAibr2Neg1StructPtr->CSC_Complex ; + + if ((here-> LTRAbrEq2 != 0) && (here-> LTRAposNode2 != 0)) + here->LTRAibr2Pos2Ptr = here->LTRAibr2Pos2StructPtr->CSC_Complex ; + + if ((here-> LTRAbrEq2 != 0) && (here-> LTRAnegNode2 != 0)) + here->LTRAibr2Neg2Ptr = here->LTRAibr2Neg2StructPtr->CSC_Complex ; + + if ((here-> LTRAbrEq2 != 0) && (here-> LTRAbrEq1 != 0)) + here->LTRAibr2Ibr1Ptr = here->LTRAibr2Ibr1StructPtr->CSC_Complex ; + + if ((here-> LTRAbrEq2 != 0) && (here-> LTRAbrEq2 != 0)) + here->LTRAibr2Ibr2Ptr = here->LTRAibr2Ibr2StructPtr->CSC_Complex ; + + if ((here-> LTRAposNode1 != 0) && (here-> LTRAbrEq1 != 0)) + here->LTRApos1Ibr1Ptr = here->LTRApos1Ibr1StructPtr->CSC_Complex ; + + if ((here-> LTRAnegNode1 != 0) && (here-> LTRAbrEq1 != 0)) + here->LTRAneg1Ibr1Ptr = here->LTRAneg1Ibr1StructPtr->CSC_Complex ; + + if ((here-> LTRAposNode2 != 0) && (here-> LTRAbrEq2 != 0)) + here->LTRApos2Ibr2Ptr = here->LTRApos2Ibr2StructPtr->CSC_Complex ; + + if ((here-> LTRAnegNode2 != 0) && (here-> LTRAbrEq2 != 0)) + here->LTRAneg2Ibr2Ptr = here->LTRAneg2Ibr2StructPtr->CSC_Complex ; + + if ((here-> LTRAposNode1 != 0) && (here-> LTRAposNode1 != 0)) + here->LTRApos1Pos1Ptr = here->LTRApos1Pos1StructPtr->CSC_Complex ; + + if ((here-> LTRAnegNode1 != 0) && (here-> LTRAnegNode1 != 0)) + here->LTRAneg1Neg1Ptr = here->LTRAneg1Neg1StructPtr->CSC_Complex ; + + if ((here-> LTRAposNode2 != 0) && (here-> LTRAposNode2 != 0)) + here->LTRApos2Pos2Ptr = here->LTRApos2Pos2StructPtr->CSC_Complex ; + + if ((here-> LTRAnegNode2 != 0) && (here-> LTRAnegNode2 != 0)) + here->LTRAneg2Neg2Ptr = here->LTRAneg2Neg2StructPtr->CSC_Complex ; + + } + } + + return (OK) ; } int @@ -288,155 +289,77 @@ LTRAbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt) { LTRAmodel *model = (LTRAmodel *)inModel ; LTRAinstance *here ; - int i ; - /* loop through all the TransmissionLine models */ + NG_IGNORE (ckt) ; + + /* loop through all the LTRA models */ for ( ; model != NULL ; model = model->LTRAnextModel) { /* loop through all the instances of the model */ for (here = model->LTRAinstances ; here != NULL ; here = here->LTRAnextInstance) { - i = 0 ; - if ((here->LTRAbrEq1 != 0) && (here->LTRAposNode1 != 0)) - { - while (here->LTRAibr1Pos1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->LTRAibr1Pos1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> LTRAbrEq1 != 0) && (here-> LTRAposNode1 != 0)) + here->LTRAibr1Pos1Ptr = here->LTRAibr1Pos1StructPtr->CSC ; - i = 0 ; - if ((here->LTRAbrEq1 != 0) && (here->LTRAnegNode1 != 0)) - { - while (here->LTRAibr1Neg1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->LTRAibr1Neg1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> LTRAbrEq1 != 0) && (here-> LTRAnegNode1 != 0)) + here->LTRAibr1Neg1Ptr = here->LTRAibr1Neg1StructPtr->CSC ; - i = 0 ; - if ((here->LTRAbrEq1 != 0) && (here->LTRAposNode2 != 0)) - { - while (here->LTRAibr1Pos2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->LTRAibr1Pos2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> LTRAbrEq1 != 0) && (here-> LTRAposNode2 != 0)) + here->LTRAibr1Pos2Ptr = here->LTRAibr1Pos2StructPtr->CSC ; - i = 0 ; - if ((here->LTRAbrEq1 != 0) && (here->LTRAnegNode2 != 0)) - { - while (here->LTRAibr1Neg2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->LTRAibr1Neg2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> LTRAbrEq1 != 0) && (here-> LTRAnegNode2 != 0)) + here->LTRAibr1Neg2Ptr = here->LTRAibr1Neg2StructPtr->CSC ; - i = 0 ; - if ((here->LTRAbrEq1 != 0) && (here->LTRAbrEq1 != 0)) - { - while (here->LTRAibr1Ibr1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->LTRAibr1Ibr1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> LTRAbrEq1 != 0) && (here-> LTRAbrEq1 != 0)) + here->LTRAibr1Ibr1Ptr = here->LTRAibr1Ibr1StructPtr->CSC ; - i = 0 ; - if ((here->LTRAbrEq1 != 0) && (here->LTRAbrEq2 != 0)) - { - while (here->LTRAibr1Ibr2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->LTRAibr1Ibr2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> LTRAbrEq1 != 0) && (here-> LTRAbrEq2 != 0)) + here->LTRAibr1Ibr2Ptr = here->LTRAibr1Ibr2StructPtr->CSC ; - i = 0 ; - if ((here->LTRAbrEq2 != 0) && (here->LTRAposNode1 != 0)) - { - while (here->LTRAibr2Pos1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->LTRAibr2Pos1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> LTRAbrEq2 != 0) && (here-> LTRAposNode1 != 0)) + here->LTRAibr2Pos1Ptr = here->LTRAibr2Pos1StructPtr->CSC ; - i = 0 ; - if ((here->LTRAbrEq2 != 0) && (here->LTRAnegNode1 != 0)) - { - while (here->LTRAibr2Neg1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->LTRAibr2Neg1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> LTRAbrEq2 != 0) && (here-> LTRAnegNode1 != 0)) + here->LTRAibr2Neg1Ptr = here->LTRAibr2Neg1StructPtr->CSC ; - i = 0 ; - if ((here->LTRAbrEq2 != 0) && (here->LTRAposNode2 != 0)) - { - while (here->LTRAibr2Pos2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->LTRAibr2Pos2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> LTRAbrEq2 != 0) && (here-> LTRAposNode2 != 0)) + here->LTRAibr2Pos2Ptr = here->LTRAibr2Pos2StructPtr->CSC ; - i = 0 ; - if ((here->LTRAbrEq2 != 0) && (here->LTRAnegNode2 != 0)) - { - while (here->LTRAibr2Neg2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->LTRAibr2Neg2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> LTRAbrEq2 != 0) && (here-> LTRAnegNode2 != 0)) + here->LTRAibr2Neg2Ptr = here->LTRAibr2Neg2StructPtr->CSC ; - i = 0 ; - if ((here->LTRAbrEq2 != 0) && (here->LTRAbrEq1 != 0)) - { - while (here->LTRAibr2Ibr1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->LTRAibr2Ibr1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> LTRAbrEq2 != 0) && (here-> LTRAbrEq1 != 0)) + here->LTRAibr2Ibr1Ptr = here->LTRAibr2Ibr1StructPtr->CSC ; - i = 0 ; - if ((here->LTRAbrEq2 != 0) && (here->LTRAbrEq2 != 0)) - { - while (here->LTRAibr2Ibr2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->LTRAibr2Ibr2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> LTRAbrEq2 != 0) && (here-> LTRAbrEq2 != 0)) + here->LTRAibr2Ibr2Ptr = here->LTRAibr2Ibr2StructPtr->CSC ; - i = 0 ; - if ((here->LTRAposNode1 != 0) && (here->LTRAbrEq1 != 0)) - { - while (here->LTRApos1Ibr1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->LTRApos1Ibr1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> LTRAposNode1 != 0) && (here-> LTRAbrEq1 != 0)) + here->LTRApos1Ibr1Ptr = here->LTRApos1Ibr1StructPtr->CSC ; - i = 0 ; - if ((here->LTRAnegNode1 != 0) && (here->LTRAbrEq1 != 0)) - { - while (here->LTRAneg1Ibr1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->LTRAneg1Ibr1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> LTRAnegNode1 != 0) && (here-> LTRAbrEq1 != 0)) + here->LTRAneg1Ibr1Ptr = here->LTRAneg1Ibr1StructPtr->CSC ; - i = 0 ; - if ((here->LTRAposNode2 != 0) && (here->LTRAbrEq2 != 0)) - { - while (here->LTRApos2Ibr2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->LTRApos2Ibr2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> LTRAposNode2 != 0) && (here-> LTRAbrEq2 != 0)) + here->LTRApos2Ibr2Ptr = here->LTRApos2Ibr2StructPtr->CSC ; - i = 0 ; - if ((here->LTRAnegNode2 != 0) && (here->LTRAbrEq2 != 0)) - { - while (here->LTRAneg2Ibr2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->LTRAneg2Ibr2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> LTRAnegNode2 != 0) && (here-> LTRAbrEq2 != 0)) + here->LTRAneg2Ibr2Ptr = here->LTRAneg2Ibr2StructPtr->CSC ; - i = 0 ; - if ((here->LTRAposNode1 != 0) && (here->LTRAposNode1 != 0)) - { - while (here->LTRApos1Pos1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->LTRApos1Pos1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> LTRAposNode1 != 0) && (here-> LTRAposNode1 != 0)) + here->LTRApos1Pos1Ptr = here->LTRApos1Pos1StructPtr->CSC ; - i = 0 ; - if ((here->LTRAnegNode1 != 0) && (here->LTRAnegNode1 != 0)) - { - while (here->LTRAneg1Neg1Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->LTRAneg1Neg1Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> LTRAnegNode1 != 0) && (here-> LTRAnegNode1 != 0)) + here->LTRAneg1Neg1Ptr = here->LTRAneg1Neg1StructPtr->CSC ; - i = 0 ; - if ((here->LTRAposNode2 != 0) && (here->LTRAposNode2 != 0)) - { - while (here->LTRApos2Pos2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->LTRApos2Pos2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } + if ((here-> LTRAposNode2 != 0) && (here-> LTRAposNode2 != 0)) + here->LTRApos2Pos2Ptr = here->LTRApos2Pos2StructPtr->CSC ; + + if ((here-> LTRAnegNode2 != 0) && (here-> LTRAnegNode2 != 0)) + here->LTRAneg2Neg2Ptr = here->LTRAneg2Neg2StructPtr->CSC ; - i = 0 ; - if ((here->LTRAnegNode2 != 0) && (here->LTRAnegNode2 != 0)) - { - while (here->LTRAneg2Neg2Ptr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ; - here->LTRAneg2Neg2Ptr = ckt->CKTmatrix->CKTbind_CSC [i] ; - } } } return (OK) ; -} \ No newline at end of file +} diff --git a/src/spicelib/devices/ltra/ltradefs.h b/src/spicelib/devices/ltra/ltradefs.h index 5afd6c5dd..99c08a5cd 100644 --- a/src/spicelib/devices/ltra/ltradefs.h +++ b/src/spicelib/devices/ltra/ltradefs.h @@ -67,6 +67,30 @@ typedef struct sLTRAinstance { unsigned LTRAicC1Given : 1; /* flag to ind. init. current at port 1 given */ unsigned LTRAicV2Given : 1; /* flag to ind. init. voltage at port 2 given */ unsigned LTRAicC2Given : 1; /* flag to ind. init. current at port 2 given */ + +#ifdef KLU + BindElement *LTRAibr1Pos1StructPtr ; + BindElement *LTRAibr1Neg1StructPtr ; + BindElement *LTRAibr1Pos2StructPtr ; + BindElement *LTRAibr1Neg2StructPtr ; + BindElement *LTRAibr1Ibr1StructPtr ; + BindElement *LTRAibr1Ibr2StructPtr ; + BindElement *LTRAibr2Pos1StructPtr ; + BindElement *LTRAibr2Neg1StructPtr ; + BindElement *LTRAibr2Pos2StructPtr ; + BindElement *LTRAibr2Neg2StructPtr ; + BindElement *LTRAibr2Ibr1StructPtr ; + BindElement *LTRAibr2Ibr2StructPtr ; + BindElement *LTRApos1Ibr1StructPtr ; + BindElement *LTRAneg1Ibr1StructPtr ; + BindElement *LTRApos2Ibr2StructPtr ; + BindElement *LTRAneg2Ibr2StructPtr ; + BindElement *LTRApos1Pos1StructPtr ; + BindElement *LTRAneg1Neg1StructPtr ; + BindElement *LTRApos2Pos2StructPtr ; + BindElement *LTRAneg2Neg2StructPtr ; +#endif + } LTRAinstance ;