New Binding Method extended to BJT device

This commit is contained in:
Francesco Lannutti 2013-04-01 22:08:26 +02:00
parent 136e74c9bc
commit bbadbdab7e
2 changed files with 348 additions and 429 deletions

View File

@ -1,5 +1,5 @@
/**********
Author: 2012 Francesco Lannutti
Author: 2013 Francesco Lannutti
**********/
#include "ngspice/ngspice.h"
@ -7,332 +7,314 @@ Author: 2012 Francesco Lannutti
#include "bjtdefs.h"
#include "ngspice/sperror.h"
#include <stdlib.h>
static
int
BJTbindCSC(GENmodel *inModel, CKTcircuit *ckt)
BindCompare (const void *a, const void *b)
{
BJTmodel *model = (BJTmodel *)inModel;
int i ;
BindElement *A, *B ;
A = (BindElement *)a ;
B = (BindElement *)b ;
/* loop through all the bjt models */
for( ; model != NULL; model = model->BJTnextModel ) {
BJTinstance *here;
/* loop through all the instances of the model */
for (here = model->BJTinstances; here != NULL ;
here = here->BJTnextInstance) {
i = 0 ;
if ((here->BJTcolNode != 0) && (here->BJTcolPrimeNode != 0)) {
while (here->BJTcolColPrimePtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTcolColPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTbaseNode != 0) && (here->BJTbasePrimeNode != 0)) {
while (here->BJTbaseBasePrimePtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTbaseBasePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTemitNode != 0) && (here->BJTemitPrimeNode != 0)) {
while (here->BJTemitEmitPrimePtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTemitEmitPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTcolPrimeNode != 0) && (here->BJTcolNode != 0)) {
while (here->BJTcolPrimeColPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTcolPrimeColPtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTcolPrimeNode != 0) && (here->BJTbasePrimeNode != 0)) {
while (here->BJTcolPrimeBasePrimePtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTcolPrimeBasePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTcolPrimeNode != 0) && (here->BJTemitPrimeNode != 0)) {
while (here->BJTcolPrimeEmitPrimePtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTcolPrimeEmitPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTbasePrimeNode != 0) && (here->BJTbaseNode != 0)) {
while (here->BJTbasePrimeBasePtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTbasePrimeBasePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTbasePrimeNode != 0) && (here->BJTcolPrimeNode != 0)) {
while (here->BJTbasePrimeColPrimePtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTbasePrimeColPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTbasePrimeNode != 0) && (here->BJTemitPrimeNode != 0)) {
while (here->BJTbasePrimeEmitPrimePtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTbasePrimeEmitPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTemitPrimeNode != 0) && (here->BJTemitNode != 0)) {
while (here->BJTemitPrimeEmitPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTemitPrimeEmitPtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTemitPrimeNode != 0) && (here->BJTcolPrimeNode != 0)) {
while (here->BJTemitPrimeColPrimePtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTemitPrimeColPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTemitPrimeNode != 0) && (here->BJTbasePrimeNode != 0)) {
while (here->BJTemitPrimeBasePrimePtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTemitPrimeBasePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTcolNode != 0) && (here->BJTcolNode != 0)) {
while (here->BJTcolColPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTcolColPtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTbaseNode != 0) && (here->BJTbaseNode != 0)) {
while (here->BJTbaseBasePtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTbaseBasePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTemitNode != 0) && (here->BJTemitNode != 0)) {
while (here->BJTemitEmitPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTemitEmitPtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTcolPrimeNode != 0) && (here->BJTcolPrimeNode != 0)) {
while (here->BJTcolPrimeColPrimePtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTcolPrimeColPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTbasePrimeNode != 0) && (here->BJTbasePrimeNode != 0)) {
while (here->BJTbasePrimeBasePrimePtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTbasePrimeBasePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTemitPrimeNode != 0) && (here->BJTemitPrimeNode != 0)) {
while (here->BJTemitPrimeEmitPrimePtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTemitPrimeEmitPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTsubstNode != 0) && (here->BJTsubstNode != 0)) {
while (here->BJTsubstSubstPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTsubstSubstPtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
if (model -> BJTsubs == LATERAL) {
here -> BJTsubstConNode = here -> BJTbasePrimeNode;
here -> BJTsubstConSubstConPtr = here -> BJTbasePrimeBasePrimePtr;
} else {
here -> BJTsubstConNode = here -> BJTcolPrimeNode;
here -> BJTsubstConSubstConPtr = here -> BJTcolPrimeColPrimePtr;
}
i = 0 ;
if ((here->BJTsubstConNode != 0) && (here->BJTsubstNode != 0)) {
while (here->BJTsubstConSubstPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTsubstConSubstPtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTsubstNode != 0) && (here->BJTsubstConNode != 0)) {
while (here->BJTsubstSubstConPtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTsubstSubstConPtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTbaseNode != 0) && (here->BJTcolPrimeNode != 0)) {
while (here->BJTbaseColPrimePtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTbaseColPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
i = 0 ;
if ((here->BJTcolPrimeNode != 0) && (here->BJTbaseNode != 0)) {
while (here->BJTcolPrimeBasePtr != ckt->CKTmatrix->CKTbind_Sparse [i]) i ++ ;
here->BJTcolPrimeBasePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
}
}
return(OK);
return ((int)(A->Sparse - B->Sparse)) ;
}
int
BJTbindCSCComplex(GENmodel *inModel, CKTcircuit *ckt)
BJTbindCSC (GENmodel *inModel, CKTcircuit *ckt)
{
BJTmodel *model = (BJTmodel *)inModel;
int i ;
BJTmodel *model = (BJTmodel *)inModel ;
BJTinstance *here ;
double *i ;
BindElement *matched, *BindStruct ;
size_t nz ;
/* loop through all the bjt models */
for( ; model != NULL; model = model->BJTnextModel ) {
BJTinstance *here;
BindStruct = ckt->CKTmatrix->CKTbindStruct ;
nz = (size_t)ckt->CKTmatrix->CKTklunz ;
/* loop through all the BJT models */
for ( ; model != NULL ; model = model->BJTnextModel)
{
/* loop through all the instances of the model */
for (here = model->BJTinstances; here != NULL ;
here = here->BJTnextInstance) {
i = 0 ;
if ((here->BJTcolNode != 0) && (here->BJTcolPrimeNode != 0)) {
while (here->BJTcolColPrimePtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTcolColPrimePtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
i = 0 ;
if ((here->BJTbaseNode != 0) && (here->BJTbasePrimeNode != 0)) {
while (here->BJTbaseBasePrimePtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTbaseBasePrimePtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
i = 0 ;
if ((here->BJTemitNode != 0) && (here->BJTemitPrimeNode != 0)) {
while (here->BJTemitEmitPrimePtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTemitEmitPrimePtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
i = 0 ;
if ((here->BJTcolPrimeNode != 0) && (here->BJTcolNode != 0)) {
while (here->BJTcolPrimeColPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTcolPrimeColPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
i = 0 ;
if ((here->BJTcolPrimeNode != 0) && (here->BJTbasePrimeNode != 0)) {
while (here->BJTcolPrimeBasePrimePtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTcolPrimeBasePrimePtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
i = 0 ;
if ((here->BJTcolPrimeNode != 0) && (here->BJTemitPrimeNode != 0)) {
while (here->BJTcolPrimeEmitPrimePtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTcolPrimeEmitPrimePtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
i = 0 ;
if ((here->BJTbasePrimeNode != 0) && (here->BJTbaseNode != 0)) {
while (here->BJTbasePrimeBasePtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTbasePrimeBasePtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
i = 0 ;
if ((here->BJTbasePrimeNode != 0) && (here->BJTcolPrimeNode != 0)) {
while (here->BJTbasePrimeColPrimePtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTbasePrimeColPrimePtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
i = 0 ;
if ((here->BJTbasePrimeNode != 0) && (here->BJTemitPrimeNode != 0)) {
while (here->BJTbasePrimeEmitPrimePtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTbasePrimeEmitPrimePtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
i = 0 ;
if ((here->BJTemitPrimeNode != 0) && (here->BJTemitNode != 0)) {
while (here->BJTemitPrimeEmitPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTemitPrimeEmitPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
i = 0 ;
if ((here->BJTemitPrimeNode != 0) && (here->BJTcolPrimeNode != 0)) {
while (here->BJTemitPrimeColPrimePtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTemitPrimeColPrimePtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
i = 0 ;
if ((here->BJTemitPrimeNode != 0) && (here->BJTbasePrimeNode != 0)) {
while (here->BJTemitPrimeBasePrimePtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTemitPrimeBasePrimePtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
i = 0 ;
if ((here->BJTcolNode != 0) && (here->BJTcolNode != 0)) {
while (here->BJTcolColPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTcolColPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
i = 0 ;
if ((here->BJTbaseNode != 0) && (here->BJTbaseNode != 0)) {
while (here->BJTbaseBasePtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTbaseBasePtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
i = 0 ;
if ((here->BJTemitNode != 0) && (here->BJTemitNode != 0)) {
while (here->BJTemitEmitPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTemitEmitPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
i = 0 ;
if ((here->BJTcolPrimeNode != 0) && (here->BJTcolPrimeNode != 0)) {
while (here->BJTcolPrimeColPrimePtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTcolPrimeColPrimePtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
i = 0 ;
if ((here->BJTbasePrimeNode != 0) && (here->BJTbasePrimeNode != 0)) {
while (here->BJTbasePrimeBasePrimePtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTbasePrimeBasePrimePtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
i = 0 ;
if ((here->BJTemitPrimeNode != 0) && (here->BJTemitPrimeNode != 0)) {
while (here->BJTemitPrimeEmitPrimePtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTemitPrimeEmitPrimePtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
i = 0 ;
if ((here->BJTsubstNode != 0) && (here->BJTsubstNode != 0)) {
while (here->BJTsubstSubstPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTsubstSubstPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
if (model -> BJTsubs == LATERAL) {
here -> BJTsubstConNode = here -> BJTbasePrimeNode;
here -> BJTsubstConSubstConPtr = here -> BJTbasePrimeBasePrimePtr;
} else {
here -> BJTsubstConNode = here -> BJTcolPrimeNode;
here -> BJTsubstConSubstConPtr = here -> BJTcolPrimeColPrimePtr;
for (here = model->BJTinstances ; here != NULL ; here = here->BJTnextInstance)
{
if ((here->BJTcolNode != 0) && (here->BJTcolPrimeNode != 0))
{
i = here->BJTcolColPrimePtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTcolColPrimeStructPtr = matched ;
here->BJTcolColPrimePtr = matched->CSC ;
}
i = 0 ;
if ((here->BJTsubstConNode != 0) && (here->BJTsubstNode != 0)) {
while (here->BJTsubstConSubstPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTsubstConSubstPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
if ((here->BJTbaseNode != 0) && (here->BJTbasePrimeNode != 0))
{
i = here->BJTbaseBasePrimePtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTbaseBasePrimeStructPtr = matched ;
here->BJTbaseBasePrimePtr = matched->CSC ;
}
i = 0 ;
if ((here->BJTsubstNode != 0) && (here->BJTsubstConNode != 0)) {
while (here->BJTsubstSubstConPtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTsubstSubstConPtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
if ((here->BJTemitNode != 0) && (here->BJTemitPrimeNode != 0))
{
i = here->BJTemitEmitPrimePtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTemitEmitPrimeStructPtr = matched ;
here->BJTemitEmitPrimePtr = matched->CSC ;
}
i = 0 ;
if ((here->BJTbaseNode != 0) && (here->BJTcolPrimeNode != 0)) {
while (here->BJTbaseColPrimePtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTbaseColPrimePtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
if ((here->BJTcolPrimeNode != 0) && (here->BJTcolNode != 0))
{
i = here->BJTcolPrimeColPtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTcolPrimeColStructPtr = matched ;
here->BJTcolPrimeColPtr = matched->CSC ;
}
i = 0 ;
if ((here->BJTcolPrimeNode != 0) && (here->BJTbaseNode != 0)) {
while (here->BJTcolPrimeBasePtr != ckt->CKTmatrix->CKTbind_CSC [i]) i ++ ;
here->BJTcolPrimeBasePtr = ckt->CKTmatrix->CKTbind_CSC_Complex [i] ;
}
}
if ((here->BJTcolPrimeNode != 0) && (here->BJTbasePrimeNode != 0))
{
i = here->BJTcolPrimeBasePrimePtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTcolPrimeBasePrimeStructPtr = matched ;
here->BJTcolPrimeBasePrimePtr = matched->CSC ;
}
if ((here->BJTcolPrimeNode != 0) && (here->BJTemitPrimeNode != 0))
{
i = here->BJTcolPrimeEmitPrimePtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTcolPrimeEmitPrimeStructPtr = matched ;
here->BJTcolPrimeEmitPrimePtr = matched->CSC ;
}
if ((here->BJTbasePrimeNode != 0) && (here->BJTbaseNode != 0))
{
i = here->BJTbasePrimeBasePtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTbasePrimeBaseStructPtr = matched ;
here->BJTbasePrimeBasePtr = matched->CSC ;
}
if ((here->BJTbasePrimeNode != 0) && (here->BJTcolPrimeNode != 0))
{
i = here->BJTbasePrimeColPrimePtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTbasePrimeColPrimeStructPtr = matched ;
here->BJTbasePrimeColPrimePtr = matched->CSC ;
}
if ((here->BJTbasePrimeNode != 0) && (here->BJTemitPrimeNode != 0))
{
i = here->BJTbasePrimeEmitPrimePtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTbasePrimeEmitPrimeStructPtr = matched ;
here->BJTbasePrimeEmitPrimePtr = matched->CSC ;
}
if ((here->BJTemitPrimeNode != 0) && (here->BJTemitNode != 0))
{
i = here->BJTemitPrimeEmitPtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTemitPrimeEmitStructPtr = matched ;
here->BJTemitPrimeEmitPtr = matched->CSC ;
}
if ((here->BJTemitPrimeNode != 0) && (here->BJTcolPrimeNode != 0))
{
i = here->BJTemitPrimeColPrimePtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTemitPrimeColPrimeStructPtr = matched ;
here->BJTemitPrimeColPrimePtr = matched->CSC ;
}
if ((here->BJTemitPrimeNode != 0) && (here->BJTbasePrimeNode != 0))
{
i = here->BJTemitPrimeBasePrimePtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTemitPrimeBasePrimeStructPtr = matched ;
here->BJTemitPrimeBasePrimePtr = matched->CSC ;
}
if ((here->BJTcolNode != 0) && (here->BJTcolNode != 0))
{
i = here->BJTcolColPtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTcolColStructPtr = matched ;
here->BJTcolColPtr = matched->CSC ;
}
if ((here->BJTbaseNode != 0) && (here->BJTbaseNode != 0))
{
i = here->BJTbaseBasePtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTbaseBaseStructPtr = matched ;
here->BJTbaseBasePtr = matched->CSC ;
}
if ((here->BJTemitNode != 0) && (here->BJTemitNode != 0))
{
i = here->BJTemitEmitPtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTemitEmitStructPtr = matched ;
here->BJTemitEmitPtr = matched->CSC ;
}
if ((here->BJTcolPrimeNode != 0) && (here->BJTcolPrimeNode != 0))
{
i = here->BJTcolPrimeColPrimePtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTcolPrimeColPrimeStructPtr = matched ;
here->BJTcolPrimeColPrimePtr = matched->CSC ;
}
if ((here->BJTbasePrimeNode != 0) && (here->BJTbasePrimeNode != 0))
{
i = here->BJTbasePrimeBasePrimePtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTbasePrimeBasePrimeStructPtr = matched ;
here->BJTbasePrimeBasePrimePtr = matched->CSC ;
}
if ((here->BJTemitPrimeNode != 0) && (here->BJTemitPrimeNode != 0))
{
i = here->BJTemitPrimeEmitPrimePtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTemitPrimeEmitPrimeStructPtr = matched ;
here->BJTemitPrimeEmitPrimePtr = matched->CSC ;
}
if ((here->BJTsubstNode != 0) && (here->BJTsubstNode != 0))
{
i = here->BJTsubstSubstPtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTsubstSubstStructPtr = matched ;
here->BJTsubstSubstPtr = matched->CSC ;
}
if ((here->BJTsubstConNode != 0) && (here->BJTsubstNode != 0))
{
i = here->BJTsubstConSubstPtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTsubstConSubstStructPtr = matched ;
here->BJTsubstConSubstPtr = matched->CSC ;
}
if ((here->BJTsubstNode != 0) && (here->BJTsubstConNode != 0))
{
i = here->BJTsubstSubstConPtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTsubstSubstConStructPtr = matched ;
here->BJTsubstSubstConPtr = matched->CSC ;
}
if ((here->BJTbaseNode != 0) && (here->BJTcolPrimeNode != 0))
{
i = here->BJTbaseColPrimePtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTbaseColPrimeStructPtr = matched ;
here->BJTbaseColPrimePtr = matched->CSC ;
}
if ((here->BJTcolPrimeNode != 0) && (here->BJTbaseNode != 0))
{
i = here->BJTcolPrimeBasePtr ;
matched = (BindElement *) bsearch (&i, BindStruct, nz, sizeof(BindElement), BindCompare) ;
here->BJTcolPrimeBaseStructPtr = matched ;
here->BJTcolPrimeBasePtr = matched->CSC ;
}
}
}
return(OK);
return (OK) ;
}
int
BJTbindCSCComplex (GENmodel *inModel, CKTcircuit *ckt)
{
BJTmodel *model = (BJTmodel *)inModel ;
BJTinstance *here ;
NG_IGNORE (ckt) ;
/* loop through all the BJT models */
for ( ; model != NULL ; model = model->BJTnextModel)
{
/* loop through all the instances of the model */
for (here = model->BJTinstances ; here != NULL ; here = here->BJTnextInstance)
{
if ((here->BJTcolNode != 0) && (here->BJTcolPrimeNode != 0))
here->BJTcolColPrimePtr = here->BJTcolColPrimeStructPtr->CSC_Complex ;
if ((here->BJTbaseNode != 0) && (here->BJTbasePrimeNode != 0))
here->BJTbaseBasePrimePtr = here->BJTbaseBasePrimeStructPtr->CSC_Complex ;
if ((here->BJTemitNode != 0) && (here->BJTemitPrimeNode != 0))
here->BJTemitEmitPrimePtr = here->BJTemitEmitPrimeStructPtr->CSC_Complex ;
if ((here->BJTcolPrimeNode != 0) && (here->BJTcolNode != 0))
here->BJTcolPrimeColPtr = here->BJTcolPrimeColStructPtr->CSC_Complex ;
if ((here->BJTcolPrimeNode != 0) && (here->BJTbasePrimeNode != 0))
here->BJTcolPrimeBasePrimePtr = here->BJTcolPrimeBasePrimeStructPtr->CSC_Complex ;
if ((here->BJTcolPrimeNode != 0) && (here->BJTemitPrimeNode != 0))
here->BJTcolPrimeEmitPrimePtr = here->BJTcolPrimeEmitPrimeStructPtr->CSC_Complex ;
if ((here->BJTbasePrimeNode != 0) && (here->BJTbaseNode != 0))
here->BJTbasePrimeBasePtr = here->BJTbasePrimeBaseStructPtr->CSC_Complex ;
if ((here->BJTbasePrimeNode != 0) && (here->BJTcolPrimeNode != 0))
here->BJTbasePrimeColPrimePtr = here->BJTbasePrimeColPrimeStructPtr->CSC_Complex ;
if ((here->BJTbasePrimeNode != 0) && (here->BJTemitPrimeNode != 0))
here->BJTbasePrimeEmitPrimePtr = here->BJTbasePrimeEmitPrimeStructPtr->CSC_Complex ;
if ((here->BJTemitPrimeNode != 0) && (here->BJTemitNode != 0))
here->BJTemitPrimeEmitPtr = here->BJTemitPrimeEmitStructPtr->CSC_Complex ;
if ((here->BJTemitPrimeNode != 0) && (here->BJTcolPrimeNode != 0))
here->BJTemitPrimeColPrimePtr = here->BJTemitPrimeColPrimeStructPtr->CSC_Complex ;
if ((here->BJTemitPrimeNode != 0) && (here->BJTbasePrimeNode != 0))
here->BJTemitPrimeBasePrimePtr = here->BJTemitPrimeBasePrimeStructPtr->CSC_Complex ;
if ((here->BJTcolNode != 0) && (here->BJTcolNode != 0))
here->BJTcolColPtr = here->BJTcolColStructPtr->CSC_Complex ;
if ((here->BJTbaseNode != 0) && (here->BJTbaseNode != 0))
here->BJTbaseBasePtr = here->BJTbaseBaseStructPtr->CSC_Complex ;
if ((here->BJTemitNode != 0) && (here->BJTemitNode != 0))
here->BJTemitEmitPtr = here->BJTemitEmitStructPtr->CSC_Complex ;
if ((here->BJTcolPrimeNode != 0) && (here->BJTcolPrimeNode != 0))
here->BJTcolPrimeColPrimePtr = here->BJTcolPrimeColPrimeStructPtr->CSC_Complex ;
if ((here->BJTbasePrimeNode != 0) && (here->BJTbasePrimeNode != 0))
here->BJTbasePrimeBasePrimePtr = here->BJTbasePrimeBasePrimeStructPtr->CSC_Complex ;
if ((here->BJTemitPrimeNode != 0) && (here->BJTemitPrimeNode != 0))
here->BJTemitPrimeEmitPrimePtr = here->BJTemitPrimeEmitPrimeStructPtr->CSC_Complex ;
if ((here->BJTsubstNode != 0) && (here->BJTsubstNode != 0))
here->BJTsubstSubstPtr = here->BJTsubstSubstStructPtr->CSC_Complex ;
if ((here->BJTsubstConNode != 0) && (here->BJTsubstNode != 0))
here->BJTsubstConSubstPtr = here->BJTsubstConSubstStructPtr->CSC_Complex ;
if ((here->BJTsubstNode != 0) && (here->BJTsubstConNode != 0))
here->BJTsubstSubstConPtr = here->BJTsubstSubstConStructPtr->CSC_Complex ;
if ((here->BJTbaseNode != 0) && (here->BJTcolPrimeNode != 0))
here->BJTbaseColPrimePtr = here->BJTbaseColPrimeStructPtr->CSC_Complex ;
if ((here->BJTcolPrimeNode != 0) && (here->BJTbaseNode != 0))
here->BJTcolPrimeBasePtr = here->BJTcolPrimeBaseStructPtr->CSC_Complex ;
}
}
return (OK) ;
}
int
@ -340,176 +322,86 @@ BJTbindCSCComplexToReal (GENmodel *inModel, CKTcircuit *ckt)
{
BJTmodel *model = (BJTmodel *)inModel ;
BJTinstance *here ;
int i ;
/* loop through all the bjt models */
NG_IGNORE (ckt) ;
/* loop through all the BJT models */
for ( ; model != NULL ; model = model->BJTnextModel)
{
/* loop through all the instances of the model */
for (here = model->BJTinstances ; here != NULL ; here = here->BJTnextInstance)
{
i = 0 ;
if ((here->BJTcolNode != 0) && (here->BJTcolPrimeNode != 0))
{
while (here->BJTcolColPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTcolColPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTcolColPrimePtr = here->BJTcolColPrimeStructPtr->CSC ;
i = 0 ;
if ((here->BJTbaseNode != 0) && (here->BJTbasePrimeNode != 0))
{
while (here->BJTbaseBasePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTbaseBasePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTbaseBasePrimePtr = here->BJTbaseBasePrimeStructPtr->CSC ;
i = 0 ;
if ((here->BJTemitNode != 0) && (here->BJTemitPrimeNode != 0))
{
while (here->BJTemitEmitPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTemitEmitPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTemitEmitPrimePtr = here->BJTemitEmitPrimeStructPtr->CSC ;
i = 0 ;
if ((here->BJTcolPrimeNode != 0) && (here->BJTcolNode != 0))
{
while (here->BJTcolPrimeColPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTcolPrimeColPtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTcolPrimeColPtr = here->BJTcolPrimeColStructPtr->CSC ;
i = 0 ;
if ((here->BJTcolPrimeNode != 0) && (here->BJTbasePrimeNode != 0))
{
while (here->BJTcolPrimeBasePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTcolPrimeBasePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTcolPrimeBasePrimePtr = here->BJTcolPrimeBasePrimeStructPtr->CSC ;
i = 0 ;
if ((here->BJTcolPrimeNode != 0) && (here->BJTemitPrimeNode != 0))
{
while (here->BJTcolPrimeEmitPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTcolPrimeEmitPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTcolPrimeEmitPrimePtr = here->BJTcolPrimeEmitPrimeStructPtr->CSC ;
i = 0 ;
if ((here->BJTbasePrimeNode != 0) && (here->BJTbaseNode != 0))
{
while (here->BJTbasePrimeBasePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTbasePrimeBasePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTbasePrimeBasePtr = here->BJTbasePrimeBaseStructPtr->CSC ;
i = 0 ;
if ((here->BJTbasePrimeNode != 0) && (here->BJTcolPrimeNode != 0))
{
while (here->BJTbasePrimeColPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTbasePrimeColPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTbasePrimeColPrimePtr = here->BJTbasePrimeColPrimeStructPtr->CSC ;
i = 0 ;
if ((here->BJTbasePrimeNode != 0) && (here->BJTemitPrimeNode != 0))
{
while (here->BJTbasePrimeEmitPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTbasePrimeEmitPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTbasePrimeEmitPrimePtr = here->BJTbasePrimeEmitPrimeStructPtr->CSC ;
i = 0 ;
if ((here->BJTemitPrimeNode != 0) && (here->BJTemitNode != 0))
{
while (here->BJTemitPrimeEmitPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTemitPrimeEmitPtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTemitPrimeEmitPtr = here->BJTemitPrimeEmitStructPtr->CSC ;
i = 0 ;
if ((here->BJTemitPrimeNode != 0) && (here->BJTcolPrimeNode != 0))
{
while (here->BJTemitPrimeColPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTemitPrimeColPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTemitPrimeColPrimePtr = here->BJTemitPrimeColPrimeStructPtr->CSC ;
i = 0 ;
if ((here->BJTemitPrimeNode != 0) && (here->BJTbasePrimeNode != 0))
{
while (here->BJTemitPrimeBasePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTemitPrimeBasePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTemitPrimeBasePrimePtr = here->BJTemitPrimeBasePrimeStructPtr->CSC ;
i = 0 ;
if ((here->BJTcolNode != 0) && (here->BJTcolNode != 0))
{
while (here->BJTcolColPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTcolColPtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTcolColPtr = here->BJTcolColStructPtr->CSC ;
i = 0 ;
if ((here->BJTbaseNode != 0) && (here->BJTbaseNode != 0))
{
while (here->BJTbaseBasePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTbaseBasePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTbaseBasePtr = here->BJTbaseBaseStructPtr->CSC ;
i = 0 ;
if ((here->BJTemitNode != 0) && (here->BJTemitNode != 0))
{
while (here->BJTemitEmitPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTemitEmitPtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTemitEmitPtr = here->BJTemitEmitStructPtr->CSC ;
i = 0 ;
if ((here->BJTcolPrimeNode != 0) && (here->BJTcolPrimeNode != 0))
{
while (here->BJTcolPrimeColPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTcolPrimeColPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTcolPrimeColPrimePtr = here->BJTcolPrimeColPrimeStructPtr->CSC ;
i = 0 ;
if ((here->BJTbasePrimeNode != 0) && (here->BJTbasePrimeNode != 0))
{
while (here->BJTbasePrimeBasePrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTbasePrimeBasePrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTbasePrimeBasePrimePtr = here->BJTbasePrimeBasePrimeStructPtr->CSC ;
i = 0 ;
if ((here->BJTemitPrimeNode != 0) && (here->BJTemitPrimeNode != 0))
{
while (here->BJTemitPrimeEmitPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTemitPrimeEmitPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTemitPrimeEmitPrimePtr = here->BJTemitPrimeEmitPrimeStructPtr->CSC ;
i = 0 ;
if ((here->BJTsubstNode != 0) && (here->BJTsubstNode != 0))
{
while (here->BJTsubstSubstPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTsubstSubstPtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTsubstSubstPtr = here->BJTsubstSubstStructPtr->CSC ;
i = 0 ;
if ((here->BJTsubstConNode != 0) && (here->BJTsubstNode != 0))
{
while (here->BJTsubstConSubstPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTsubstConSubstPtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTsubstConSubstPtr = here->BJTsubstConSubstStructPtr->CSC ;
i = 0 ;
if ((here->BJTsubstNode != 0) && (here->BJTsubstConNode != 0))
{
while (here->BJTsubstSubstConPtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTsubstSubstConPtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTsubstSubstConPtr = here->BJTsubstSubstConStructPtr->CSC ;
i = 0 ;
if ((here->BJTbaseNode != 0) && (here->BJTcolPrimeNode != 0))
{
while (here->BJTbaseColPrimePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTbaseColPrimePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTbaseColPrimePtr = here->BJTbaseColPrimeStructPtr->CSC ;
i = 0 ;
if ((here->BJTcolPrimeNode != 0) && (here->BJTbaseNode != 0))
{
while (here->BJTcolPrimeBasePtr != ckt->CKTmatrix->CKTbind_CSC_Complex [i]) i ++ ;
here->BJTcolPrimeBasePtr = ckt->CKTmatrix->CKTbind_CSC [i] ;
}
here->BJTcolPrimeBasePtr = here->BJTcolPrimeBaseStructPtr->CSC ;
}
}
return (OK) ;
}
}

View File

@ -283,6 +283,33 @@ typedef struct sBJTinstance {
#endif /*NONOISE*/
/* the above to avoid allocating memory when it is not needed */
#ifdef KLU
BindElement *BJTcolColPrimeStructPtr ;
BindElement *BJTbaseBasePrimeStructPtr ;
BindElement *BJTemitEmitPrimeStructPtr ;
BindElement *BJTcolPrimeColStructPtr ;
BindElement *BJTcolPrimeBasePrimeStructPtr ;
BindElement *BJTcolPrimeEmitPrimeStructPtr ;
BindElement *BJTbasePrimeBaseStructPtr ;
BindElement *BJTbasePrimeColPrimeStructPtr ;
BindElement *BJTbasePrimeEmitPrimeStructPtr ;
BindElement *BJTemitPrimeEmitStructPtr ;
BindElement *BJTemitPrimeColPrimeStructPtr ;
BindElement *BJTemitPrimeBasePrimeStructPtr ;
BindElement *BJTcolColStructPtr ;
BindElement *BJTbaseBaseStructPtr ;
BindElement *BJTemitEmitStructPtr ;
BindElement *BJTcolPrimeColPrimeStructPtr ;
BindElement *BJTbasePrimeBasePrimeStructPtr ;
BindElement *BJTemitPrimeEmitPrimeStructPtr ;
BindElement *BJTsubstSubstStructPtr ;
BindElement *BJTsubstConSubstStructPtr ;
BindElement *BJTsubstSubstConStructPtr ;
BindElement *BJTsubstConSubstConStructPtr ;
BindElement *BJTbaseColPrimeStructPtr ;
BindElement *BJTcolPrimeBaseStructPtr ;
#endif
} BJTinstance ;
/* entries in the state vector for bjt: */