From 2b3caacc2144bbdab043c279cab7dedeb044a597 Mon Sep 17 00:00:00 2001 From: Francesco Lannutti Date: Mon, 24 Jun 2013 10:00:23 +0200 Subject: [PATCH] Fixed the KCL Resistor Model. Added the Source and Drain Resistances to the KCL BSIM4 Model --- src/spicelib/devices/bsim4/b4ld.c | 98 +++++++++++++++------------ src/spicelib/devices/bsim4/b4node.c | 92 +++++++++++++------------ src/spicelib/devices/bsim4/bsim4def.h | 65 ++++++++++-------- src/spicelib/devices/res/resinit.c | 2 +- 4 files changed, 142 insertions(+), 115 deletions(-) diff --git a/src/spicelib/devices/bsim4/b4ld.c b/src/spicelib/devices/bsim4/b4ld.c index 88c4077dd..c849d6393 100644 --- a/src/spicelib/devices/bsim4/b4ld.c +++ b/src/spicelib/devices/bsim4/b4ld.c @@ -5349,81 +5349,95 @@ line900: #ifdef KIRCHHOFF /////////////////////////////////////////// + /* KCL - Non-Linear and Dynamic Linear Parts */ *(ckt->CKTfvk+here->BSIM4dNodePrime) -= m * (ceqjd_fvk - ceqbd_fvk - ceqdrn_fvk - ceqqd_fvk + Idtoteq_fvk) ; /* NO ceqgdtot in FVK */ - *(here->KCLcurrentdNodePrime_1) = -(m * ceqjd_fvk) ; - *(here->KCLcurrentdNodePrime_2) = m * ceqbd_fvk ; - *(here->KCLcurrentdNodePrime_3) = m * ceqdrn_fvk ; - *(here->KCLcurrentdNodePrime_4) = m * ceqqd_fvk ; - *(here->KCLcurrentdNodePrime_5) = -(m * Idtoteq_fvk) ; + *(here->KCLcurrentdNodePrimeRHS_1) = -(m * ceqjd_fvk) ; + *(here->KCLcurrentdNodePrimeRHS_2) = m * ceqbd_fvk ; + *(here->KCLcurrentdNodePrimeRHS_3) = m * ceqdrn_fvk ; + *(here->KCLcurrentdNodePrimeRHS_4) = m * ceqqd_fvk ; + *(here->KCLcurrentdNodePrimeRHS_5) = -(m * Idtoteq_fvk) ; *(ckt->CKTfvk+here->BSIM4gNodePrime) += m * (ceqqg_fvk + Igtoteq_fvk) ; /* NO ceqgcrg in FVK */ - *(here->KCLcurrentgNodePrime_1) = m * ceqqg_fvk ; - *(here->KCLcurrentgNodePrime_2) = m * Igtoteq_fvk ; + *(here->KCLcurrentgNodePrimeRHS_1) = m * ceqqg_fvk ; + *(here->KCLcurrentgNodePrimeRHS_2) = m * Igtoteq_fvk ; if (here->BSIM4rgateMod == 3) { *(ckt->CKTfvk+here->BSIM4gNodeMid) += m * ceqqgmid_fvk ; /* NO ceqgcrg in FVK */ - *(here->KCLcurrentgNodeMid) = m * ceqqgmid_fvk ; + *(here->KCLcurrentgNodeMidRHS) = m * ceqqgmid_fvk ; } if (!here->BSIM4rbodyMod) { *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * (ceqbd_fvk + ceqbs_fvk - ceqjd_fvk - ceqjs_fvk - ceqqb_fvk + Ibtoteq_fvk) ; - *(here->KCLcurrentbNodePrime_1) = -(m * ceqbd_fvk) ; - *(here->KCLcurrentbNodePrime_2) = -(m * ceqbs_fvk) ; - *(here->KCLcurrentbNodePrime_3) = m * ceqjd_fvk ; - *(here->KCLcurrentbNodePrime_4) = m * ceqjs_fvk ; - *(here->KCLcurrentbNodePrime_5) = m * ceqqb_fvk ; - *(here->KCLcurrentbNodePrime_6) = -(m * Ibtoteq_fvk) ; + *(here->KCLcurrentbNodePrimeRHS_1) = -(m * ceqbd_fvk) ; + *(here->KCLcurrentbNodePrimeRHS_2) = -(m * ceqbs_fvk) ; + *(here->KCLcurrentbNodePrimeRHS_3) = m * ceqjd_fvk ; + *(here->KCLcurrentbNodePrimeRHS_4) = m * ceqjs_fvk ; + *(here->KCLcurrentbNodePrimeRHS_5) = m * ceqqb_fvk ; + *(here->KCLcurrentbNodePrimeRHS_6) = -(m * Ibtoteq_fvk) ; *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (ceqdrn_fvk - ceqbs_fvk + ceqjs_fvk + ceqqg_fvk + ceqqb_fvk + ceqqd_fvk + ceqqgmid_fvk + Istoteq_fvk) ; /* NO ceqgstot in FVK */ - *(here->KCLcurrentsNodePrime_1) = -(m * ceqdrn_fvk) ; - *(here->KCLcurrentsNodePrime_2) = m * ceqbs_fvk ; - *(here->KCLcurrentsNodePrime_3) = -(m * ceqjs_fvk) ; - *(here->KCLcurrentsNodePrime_4) = -(m * ceqqg_fvk) ; - *(here->KCLcurrentsNodePrime_5) = -(m * ceqqb_fvk) ; - *(here->KCLcurrentsNodePrime_6) = -(m * ceqqd_fvk) ; - *(here->KCLcurrentsNodePrime_7) = -(m * ceqqgmid_fvk) ; - *(here->KCLcurrentsNodePrime_8) = -(m * Istoteq_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_1) = -(m * ceqdrn_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_2) = m * ceqbs_fvk ; + *(here->KCLcurrentsNodePrimeRHS_3) = -(m * ceqjs_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_4) = -(m * ceqqg_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_5) = -(m * ceqqb_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_6) = -(m * ceqqd_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_7) = -(m * ceqqgmid_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_8) = -(m * Istoteq_fvk) ; } else { *(ckt->CKTfvk+here->BSIM4dbNode) += m * (ceqjd_fvk + ceqqjd_fvk) ; - *(here->KCLcurrentdbNode_1) = m * ceqjd_fvk ; - *(here->KCLcurrentdbNode_2) = m * ceqqjd_fvk ; + *(here->KCLcurrentdbNodeRHS_1) = m * ceqjd_fvk ; + *(here->KCLcurrentdbNodeRHS_2) = m * ceqqjd_fvk ; *(ckt->CKTfvk+here->BSIM4bNodePrime) -= m * (ceqbd_fvk + ceqbs_fvk - ceqqb_fvk + Ibtoteq_fvk) ; - *(here->KCLcurrentbNodePrime_1) = -(m * ceqbd_fvk) ; - *(here->KCLcurrentbNodePrime_2) = -(m * ceqbs_fvk) ; - *(here->KCLcurrentbNodePrime_3) = m * ceqqb_fvk ; - *(here->KCLcurrentbNodePrime_4) = -(m * Ibtoteq_fvk) ; + *(here->KCLcurrentbNodePrimeRHS_1) = -(m * ceqbd_fvk) ; + *(here->KCLcurrentbNodePrimeRHS_2) = -(m * ceqbs_fvk) ; + *(here->KCLcurrentbNodePrimeRHS_3) = m * ceqqb_fvk ; + *(here->KCLcurrentbNodePrimeRHS_4) = -(m * Ibtoteq_fvk) ; *(ckt->CKTfvk+here->BSIM4sbNode) += m * (ceqjs_fvk + ceqqjs_fvk) ; - *(here->KCLcurrentsbNode_1) = m * ceqjs_fvk ; - *(here->KCLcurrentsbNode_2) = m * ceqqjs_fvk ; + *(here->KCLcurrentsbNodeRHS_1) = m * ceqjs_fvk ; + *(here->KCLcurrentsbNodeRHS_2) = m * ceqqjs_fvk ; *(ckt->CKTfvk+here->BSIM4sNodePrime) -= m * (ceqdrn_fvk - ceqbs_fvk + ceqjs_fvk + ceqqd_fvk + ceqqg_fvk + ceqqb_fvk + ceqqjd_fvk + ceqqjs_fvk + ceqqgmid_fvk + Istoteq_fvk) ; /* NO ceqgstot in FVK */ - *(here->KCLcurrentsNodePrime_1) = -(m * ceqdrn_fvk) ; - *(here->KCLcurrentsNodePrime_2) = m * ceqbs_fvk ; - *(here->KCLcurrentsNodePrime_3) = -(m * ceqjs_fvk) ; - *(here->KCLcurrentsNodePrime_4) = -(m * ceqqd_fvk) ; - *(here->KCLcurrentsNodePrime_5) = -(m * ceqqg_fvk) ; - *(here->KCLcurrentsNodePrime_6) = -(m * ceqqb_fvk) ; - *(here->KCLcurrentsNodePrime_7) = -(m * ceqqjd_fvk) ; - *(here->KCLcurrentsNodePrime_8) = -(m * ceqqjs_fvk) ; - *(here->KCLcurrentsNodePrime_9) = -(m * ceqqgmid_fvk) ; - *(here->KCLcurrentsNodePrime_10) = -(m * Istoteq_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_1) = -(m * ceqdrn_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_2) = m * ceqbs_fvk ; + *(here->KCLcurrentsNodePrimeRHS_3) = -(m * ceqjs_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_4) = -(m * ceqqd_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_5) = -(m * ceqqg_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_6) = -(m * ceqqb_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_7) = -(m * ceqqjd_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_8) = -(m * ceqqjs_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_9) = -(m * ceqqgmid_fvk) ; + *(here->KCLcurrentsNodePrimeRHS_10) = -(m * Istoteq_fvk) ; } if (here->BSIM4trnqsMod) { *(ckt->CKTfvk+here->BSIM4qNode) -= m * (cqcheq_fvk - cqdef_fvk) ; - *(here->KCLcurrentqNode_1) = -(m * cqcheq_fvk) ; - *(here->KCLcurrentqNode_2) = m * cqdef_fvk ; + *(here->KCLcurrentqNodeRHS_1) = -(m * cqcheq_fvk) ; + *(here->KCLcurrentqNodeRHS_2) = m * cqdef_fvk ; } + + /* KCL - Static Linear Part */ + *(ckt->CKTfvk+here->BSIM4dNodePrime) += m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode)) ; + *(here->KCLcurrentdNodePrime) = m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode)) ; + + *(ckt->CKTfvk+here->BSIM4dNode) -= m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode)) ; + *(here->KCLcurrentdNode) = -(m * gdpr * (*(ckt->CKTrhsOld+here->BSIM4dNodePrime) - *(ckt->CKTrhsOld+here->BSIM4dNode))) ; + + *(ckt->CKTfvk+here->BSIM4sNodePrime) += m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode)) ; + *(here->KCLcurrentsNodePrime) = m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode)) ; + + *(ckt->CKTfvk+here->BSIM4sNode) -= m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode)) ; + *(here->KCLcurrentsNode) = -(m * gspr * (*(ckt->CKTrhsOld+here->BSIM4sNodePrime) - *(ckt->CKTrhsOld+here->BSIM4sNode))) ; /////////////////////////////////////////// #endif diff --git a/src/spicelib/devices/bsim4/b4node.c b/src/spicelib/devices/bsim4/b4node.c index e5511085a..1f4f9355e 100644 --- a/src/spicelib/devices/bsim4/b4node.c +++ b/src/spicelib/devices/bsim4/b4node.c @@ -42,57 +42,65 @@ BSIM4nodeIsNonLinear (GENmodel *inModel, CKTcircuit *ckt) ckt->CKTnodeIsLinear [here->BSIM4qNode] = 0 ; - error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime_1)) ; - error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime_2)) ; - error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime_3)) ; - error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime_4)) ; - error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime_5)) ; - error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrime_1)) ; - error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrime_2)) ; + /* KCL - Non-Linear and Dynamic Linear Parts */ + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrimeRHS_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrimeRHS_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrimeRHS_3)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrimeRHS_4)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrimeRHS_5)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrimeRHS_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodePrime, &(here->KCLcurrentgNodePrimeRHS_2)) ; if (here->BSIM4rgateMod == 3) - error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMid)) ; + error = CKTmkCurKCL (ckt, here->BSIM4gNodeMid, &(here->KCLcurrentgNodeMidRHS)) ; if (!here->BSIM4rbodyMod) { - error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_1)) ; - error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_2)) ; - error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_3)) ; - error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_4)) ; - error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_5)) ; - error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_6)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_1)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_2)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_3)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_4)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_5)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_6)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_7)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_8)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_3)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_4)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_5)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_6)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_3)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_4)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_5)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_6)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_7)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_8)) ; } else { - error = CKTmkCurKCL (ckt, here->BSIM4dbNode, &(here->KCLcurrentdbNode_1)) ; - error = CKTmkCurKCL (ckt, here->BSIM4dbNode, &(here->KCLcurrentdbNode_2)) ; - error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_1)) ; - error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_2)) ; - error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_3)) ; - error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrime_4)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sbNode, &(here->KCLcurrentsbNode_1)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sbNode, &(here->KCLcurrentsbNode_2)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_1)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_2)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_3)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_4)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_5)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_6)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_7)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_8)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_9)) ; - error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime_10)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dbNode, &(here->KCLcurrentdbNodeRHS_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dbNode, &(here->KCLcurrentdbNodeRHS_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_3)) ; + error = CKTmkCurKCL (ckt, here->BSIM4bNodePrime, &(here->KCLcurrentbNodePrimeRHS_4)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sbNode, &(here->KCLcurrentsbNodeRHS_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sbNode, &(here->KCLcurrentsbNodeRHS_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_3)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_4)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_5)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_6)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_7)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_8)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_9)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrimeRHS_10)) ; } if (here->BSIM4trnqsMod) - error = CKTmkCurKCL (ckt, here->BSIM4qNode, &(here->KCLcurrentqNode_1)) ; - error = CKTmkCurKCL (ckt, here->BSIM4qNode, &(here->KCLcurrentqNode_2)) ; + error = CKTmkCurKCL (ckt, here->BSIM4qNode, &(here->KCLcurrentqNodeRHS_1)) ; + error = CKTmkCurKCL (ckt, here->BSIM4qNode, &(here->KCLcurrentqNodeRHS_2)) ; + + + /* KCL - Static Linear Part */ + error = CKTmkCurKCL (ckt, here->BSIM4dNodePrime, &(here->KCLcurrentdNodePrime)) ; + error = CKTmkCurKCL (ckt, here->BSIM4dNode, &(here->KCLcurrentdNode)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNodePrime, &(here->KCLcurrentsNodePrime)) ; + error = CKTmkCurKCL (ckt, here->BSIM4sNode, &(here->KCLcurrentsNode)) ; } } diff --git a/src/spicelib/devices/bsim4/bsim4def.h b/src/spicelib/devices/bsim4/bsim4def.h index bd0a7860a..b76064b59 100644 --- a/src/spicelib/devices/bsim4/bsim4def.h +++ b/src/spicelib/devices/bsim4/bsim4def.h @@ -570,36 +570,41 @@ typedef struct sBSIM4instance #endif /* NONOISE */ #ifdef KIRCHHOFF - double *KCLcurrentdNodePrime_1 ; - double *KCLcurrentdNodePrime_2 ; - double *KCLcurrentdNodePrime_3 ; - double *KCLcurrentdNodePrime_4 ; - double *KCLcurrentdNodePrime_5 ; - double *KCLcurrentgNodePrime_1 ; - double *KCLcurrentgNodePrime_2 ; - double *KCLcurrentgNodeMid ; - double *KCLcurrentbNodePrime_1 ; - double *KCLcurrentbNodePrime_2 ; - double *KCLcurrentbNodePrime_3 ; - double *KCLcurrentbNodePrime_4 ; - double *KCLcurrentbNodePrime_5 ; - double *KCLcurrentbNodePrime_6 ; - double *KCLcurrentsNodePrime_1 ; - double *KCLcurrentsNodePrime_2 ; - double *KCLcurrentsNodePrime_3 ; - double *KCLcurrentsNodePrime_4 ; - double *KCLcurrentsNodePrime_5 ; - double *KCLcurrentsNodePrime_6 ; - double *KCLcurrentsNodePrime_7 ; - double *KCLcurrentsNodePrime_8 ; - double *KCLcurrentsNodePrime_9 ; - double *KCLcurrentsNodePrime_10 ; - double *KCLcurrentdbNode_1 ; - double *KCLcurrentdbNode_2 ; - double *KCLcurrentsbNode_1 ; - double *KCLcurrentsbNode_2 ; - double *KCLcurrentqNode_1 ; - double *KCLcurrentqNode_2 ; + double *KCLcurrentdNodePrimeRHS_1 ; + double *KCLcurrentdNodePrimeRHS_2 ; + double *KCLcurrentdNodePrimeRHS_3 ; + double *KCLcurrentdNodePrimeRHS_4 ; + double *KCLcurrentdNodePrimeRHS_5 ; + double *KCLcurrentgNodePrimeRHS_1 ; + double *KCLcurrentgNodePrimeRHS_2 ; + double *KCLcurrentgNodeMidRHS ; + double *KCLcurrentbNodePrimeRHS_1 ; + double *KCLcurrentbNodePrimeRHS_2 ; + double *KCLcurrentbNodePrimeRHS_3 ; + double *KCLcurrentbNodePrimeRHS_4 ; + double *KCLcurrentbNodePrimeRHS_5 ; + double *KCLcurrentbNodePrimeRHS_6 ; + double *KCLcurrentsNodePrimeRHS_1 ; + double *KCLcurrentsNodePrimeRHS_2 ; + double *KCLcurrentsNodePrimeRHS_3 ; + double *KCLcurrentsNodePrimeRHS_4 ; + double *KCLcurrentsNodePrimeRHS_5 ; + double *KCLcurrentsNodePrimeRHS_6 ; + double *KCLcurrentsNodePrimeRHS_7 ; + double *KCLcurrentsNodePrimeRHS_8 ; + double *KCLcurrentsNodePrimeRHS_9 ; + double *KCLcurrentsNodePrimeRHS_10 ; + double *KCLcurrentdbNodeRHS_1 ; + double *KCLcurrentdbNodeRHS_2 ; + double *KCLcurrentsbNodeRHS_1 ; + double *KCLcurrentsbNodeRHS_2 ; + double *KCLcurrentqNodeRHS_1 ; + double *KCLcurrentqNodeRHS_2 ; + + double *KCLcurrentdNodePrime ; + double *KCLcurrentdNode ; + double *KCLcurrentsNodePrime ; + double *KCLcurrentsNode ; #endif } BSIM4instance ; diff --git a/src/spicelib/devices/res/resinit.c b/src/spicelib/devices/res/resinit.c index 49150c08c..42859077d 100644 --- a/src/spicelib/devices/res/resinit.c +++ b/src/spicelib/devices/res/resinit.c @@ -75,7 +75,7 @@ SPICEdev RESinfo = { /* DEVmodSize */ &RESmSize, #ifdef KIRCHHOFF - /* DEVnodeIsNonLinear */ NULL + /* DEVnodeIsNonLinear */ RESnodeIsNonLinear #endif };