From c05cb7a437ebf17567cb5915756b7f9caccdefac Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Tue, 2 Jul 2013 15:21:30 +0200 Subject: [PATCH] Fixed Rg(V) for the KCL Verification --- src/spicelib/devices/bsim4/b4ld.c | 30 ++++++++++++++++----------- src/spicelib/devices/bsim4/b4node.c | 16 +++++++------- src/spicelib/devices/bsim4/bsim4def.h | 15 +++++++------- 3 files changed, 34 insertions(+), 27 deletions(-) diff --git a/src/spicelib/devices/bsim4/b4ld.c b/src/spicelib/devices/bsim4/b4ld.c index ef08bc422..6ccf7d857 100644 --- a/src/spicelib/devices/bsim4/b4ld.c +++ b/src/spicelib/devices/bsim4/b4ld.c @@ -5341,7 +5341,6 @@ line900: } #ifdef KIRCHHOFF -/////////////////////////////////////////// /* KCL - Non-Linear and Dynamic Linear Parts */ ceqgdtot_fvk_dNodePrime = (- gdtotd * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) @@ -5359,19 +5358,14 @@ line900: *(here->KCLcurrentdNodePrimeRHS_5) = m * ceqqd_fvk ; *(here->KCLcurrentdNodePrimeRHS_6) = -(m * Idtoteq_fvk) ; - *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (ceqqg_fvk - ceqgcrg + Igtoteq_fvk) ; + *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (ceqqg_fvk + Igtoteq_fvk) ; *(here->KCLcurrentgNodePrimeRHS_1) = m * ceqqg_fvk ; - *(here->KCLcurrentgNodePrimeRHS_2) = -(m * ceqgcrg) ; - *(here->KCLcurrentgNodePrimeRHS_3) = m * Igtoteq_fvk ; + *(here->KCLcurrentgNodePrimeRHS_2) = m * Igtoteq_fvk ; - if (here->BSIM4rgateMod == 2) + if (here->BSIM4rgateMod == 3) { - *(ckt->CKTfvk+here->BSIM4gNodeExt) += m * ceqgcrg ; - *(here->KCLcurrentgNodeExtRHS) = m * ceqgcrg ; - } else if (here->BSIM4rgateMod == 3) { - *(ckt->CKTfvk+here->BSIM4gNodeMid) += m * (ceqqgmid_fvk + ceqgcrg) ; - *(here->KCLcurrentgNodeMidRHS_1) = m * ceqqgmid_fvk ; - *(here->KCLcurrentgNodeMidRHS_2) = m * ceqgcrg ; + *(ckt->CKTfvk+here->BSIM4gNodeMid) += m * ceqqgmid_fvk ; + *(here->KCLcurrentgNodeMidRHS) = m * ceqqgmid_fvk ; } ceqgstot_fvk_sNodePrime = (- gstotd * *(ckt->CKTrhsOld+here->BSIM4dNodePrime) @@ -5487,12 +5481,24 @@ line900: *(ckt->CKTfvk+here->BSIM4gNodePrime) -= m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; *(here->KCLcurrentgNodePrime) = -(m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime))) ; + } else if (here->BSIM4rgateMod == 2) { + *(ckt->CKTfvk+here->BSIM4gNodeExt) += m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; + *(here->KCLcurrentgNodeExt) = m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; + + *(ckt->CKTfvk+here->BSIM4gNodePrime) -= m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; + *(here->KCLcurrentgNodePrime) = -(m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime))) ; } else if (here->BSIM4rgateMod == 3) { *(ckt->CKTfvk+here->BSIM4gNodeExt) += m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodeMid)) ; *(here->KCLcurrentgNodeExt) = m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodeMid)) ; *(ckt->CKTfvk+here->BSIM4gNodeMid) -= m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodeMid)) ; - *(here->KCLcurrentgNodeMid) = -(m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodeMid))) ; + *(here->KCLcurrentgNodeMid_1) = -(m * geltd * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodeMid))) ; + + *(ckt->CKTfvk+here->BSIM4gNodeMid) += m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeMid) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; + *(here->KCLcurrentgNodeMid_2) = m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeMid) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; + + *(ckt->CKTfvk+here->BSIM4gNodePrime) -= m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime)) ; + *(here->KCLcurrentgNodePrime) = -(m * gcrg * (*(ckt->CKTrhsOld+here->BSIM4gNodeExt) - *(ckt->CKTrhsOld+here->BSIM4gNodePrime))) ; } if (here->BSIM4rbodyMod) diff --git a/src/spicelib/devices/bsim4/b4node.c b/src/spicelib/devices/bsim4/b4node.c index 2b87aacd3..07fec5948 100644 --- a/src/spicelib/devices/bsim4/b4node.c +++ b/src/spicelib/devices/bsim4/b4node.c @@ -65,14 +65,10 @@ BSIM4nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrimeRHS_1)) ; error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrimeRHS_2)) ; - error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrimeRHS_3)) ; - if (here->BSIM4rgateMod == 2) + if (here->BSIM4rgateMod == 3) { - error = CKTmkCurKCL (ckt, here->BSIM4gNodeExt, &(here->KCLcurrentgNodeExtRHS)) ; - } else if (here->BSIM4rgateMod == 3) { - error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMidRHS_1)) ; - error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMidRHS_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMidRHS)) ; } if (!here->BSIM4rbodyMod) @@ -137,16 +133,20 @@ BSIM4nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) error = CKTmkCurKCL (ckt, here->BSIM4dNode, &(here->KCLcurrentdNode)) ; error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime)) ; error = CKTmkCurKCL (ckt, here->BSIM4sNode, &(here->KCLcurrentsNode)) ; - } else { } if (here->BSIM4rgateMod == 1) { error = CKTmkCurKCL (ckt, here->BSIM4gNodeExt, &(here->KCLcurrentgNodeExt)) ; error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrime)) ; + } else if (here->BSIM4rgateMod == 2) { + error = CKTmkCurKCL (ckt, here->BSIM4gNodeExt, &(here->KCLcurrentgNodeExt)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrime)) ; } else if (here->BSIM4rgateMod == 3) { error = CKTmkCurKCL (ckt, here->BSIM4gNodeExt, &(here->KCLcurrentgNodeExt)) ; - error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMid)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMid_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMid_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrime)) ; } if (here->BSIM4rbodyMod) diff --git a/src/spicelib/devices/bsim4/bsim4def.h b/src/spicelib/devices/bsim4/bsim4def.h index c0d071aee..0ec5b5b98 100644 --- a/src/spicelib/devices/bsim4/bsim4def.h +++ b/src/spicelib/devices/bsim4/bsim4def.h @@ -580,12 +580,8 @@ typedef struct sBSIM4instance double *KCLcurrentgNodePrimeRHS_1 ; double *KCLcurrentgNodePrimeRHS_2 ; - double *KCLcurrentgNodePrimeRHS_3 ; - double *KCLcurrentgNodeExtRHS ; - - double *KCLcurrentgNodeMidRHS_1 ; - double *KCLcurrentgNodeMidRHS_2 ; + double *KCLcurrentgNodeMidRHS ; double *KCLcurrentbNodePrimeRHS_1 ; double *KCLcurrentbNodePrimeRHS_2 ; @@ -624,9 +620,14 @@ typedef struct sBSIM4instance double *KCLcurrentdNode ; double *KCLcurrentsNodePrime ; double *KCLcurrentsNode ; - double *KCLcurrentgNodePrime ; - double *KCLcurrentgNodeMid ; + double *KCLcurrentgNodeExt ; + + double *KCLcurrentgNodePrime ; + + double *KCLcurrentgNodeMid_1 ; + double *KCLcurrentgNodeMid_2 ; + double *KCLcurrentdbNode_1 ; double *KCLcurrentdbNode_2 ; double *KCLcurrentbNodePrime_1 ;