From bc84b06b24e87c8dbc815e4b1e3ba8fd30a6cd08 Mon Sep 17 00:00:00 2001 From: rlar Date: Mon, 8 Jan 2018 21:38:46 +0100 Subject: [PATCH] make struct GENinstance truly generic drop the GENnode struct member, which is actually part of the derived instance structs --- src/include/ngspice/gendefs.h | 13 ++++++++++++- src/spicelib/analysis/ckti2nod.c | 2 +- src/spicelib/analysis/tfanal.c | 8 ++++---- src/spicelib/devices/cktbindnode.c | 2 +- src/spicelib/devices/urc/urcsetup.c | 2 +- src/spicelib/parser/inp2m.c | 2 +- 6 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/include/ngspice/gendefs.h b/src/include/ngspice/gendefs.h index a8f1cd5fb..5b4007795 100644 --- a/src/include/ngspice/gendefs.h +++ b/src/include/ngspice/gendefs.h @@ -21,10 +21,21 @@ struct GENinstance { * current model*/ IFuid GENname; /* pointer to character string naming this instance */ int GENstate; /* state index number */ - int GENnode[7]; /* node numbers to which this instance is connected to */ + + /* The actual devices have to place their node elements + * right after the the end of struct GENinstance + * where there can be accessed by generic GENnode()[] + * A notable exception is the XSPICE MIF device + */ +#if 0 + int GENnode[]; /* node numbers to which this instance is connected to */ /* carefull, thats overlayed into the actual device structs */ +#endif }; +static inline int *GENnode(struct GENinstance *inst) +{ return (int*)(inst + 1); } + /* per model data */ diff --git a/src/spicelib/analysis/ckti2nod.c b/src/spicelib/analysis/ckti2nod.c index edf730566..baafb4931 100644 --- a/src/spicelib/analysis/ckti2nod.c +++ b/src/spicelib/analysis/ckti2nod.c @@ -26,7 +26,7 @@ CKTinst2Node(CKTcircuit *ckt, void *instPtr, int terminal, CKTnode **node, IFuid if (*(DEVices[type]->DEVpublic.terms) >= terminal && terminal > 0) { /* argh, terminals are counted from 1 */ - int nodenum = inst->GENnode[terminal - 1]; + int nodenum = GENnode(inst)[terminal - 1]; for (here = ckt->CKTnodes; here; here = here->next) if (here->number == nodenum) { diff --git a/src/spicelib/analysis/tfanal.c b/src/spicelib/analysis/tfanal.c index f9c33c715..4e4acd817 100644 --- a/src/spicelib/analysis/tfanal.c +++ b/src/spicelib/analysis/tfanal.c @@ -76,8 +76,8 @@ TFanal(CKTcircuit *ckt, int restart) } if (job->TFinIsI) { - ckt->CKTrhs[ptr->GENnode[0]] -= 1; - ckt->CKTrhs[ptr->GENnode[1]] += 1; + ckt->CKTrhs[GENnode(ptr)[0]] -= 1; + ckt->CKTrhs[GENnode(ptr)[1]] += 1; } else { insrc = CKTfndBranch(ckt, job->TFinSrc); ckt->CKTrhs[insrc] += 1; @@ -119,8 +119,8 @@ TFanal(CKTcircuit *ckt, int restart) /* now for input resistance */ if (job->TFinIsI) { - outputs[1] = ckt->CKTrhs[ptr->GENnode[1]] - - ckt->CKTrhs[ptr->GENnode[0]]; + outputs[1] = ckt->CKTrhs[GENnode(ptr)[1]] - + ckt->CKTrhs[GENnode(ptr)[0]]; } else { if(fabs(ckt->CKTrhs[insrc])<1e-20) { outputs[1]=1e20; diff --git a/src/spicelib/devices/cktbindnode.c b/src/spicelib/devices/cktbindnode.c index 62f7e225f..519b0d8a1 100644 --- a/src/spicelib/devices/cktbindnode.c +++ b/src/spicelib/devices/cktbindnode.c @@ -26,7 +26,7 @@ CKTbindNode(CKTcircuit *ckt, GENinstance *instance, int term, CKTnode *node) if (*(devs[type]->DEVpublic.terms) >= term && term > 0) { /* argh, terminals are counted from 1 */ - instance->GENnode[term - 1] = node->number; + GENnode(instance)[term - 1] = node->number; return OK; } else { return E_NOTERM; diff --git a/src/spicelib/devices/urc/urcsetup.c b/src/spicelib/devices/urc/urcsetup.c index 772580a4b..c0e408455 100644 --- a/src/spicelib/devices/urc/urcsetup.c +++ b/src/spicelib/devices/urc/urcsetup.c @@ -302,7 +302,7 @@ URCunsetup(GENmodel *inModel, CKTcircuit *ckt) return E_NOMOD; for (in = modfast->GENinstances; in; in = in->GENnextInstance) - CKTdltNNum(ckt, in->GENnode[0]); + CKTdltNNum(ckt, GENnode(in)[0]); CKTdltMod(ckt, modfast); /* Does the elements too */ diff --git a/src/spicelib/parser/inp2m.c b/src/spicelib/parser/inp2m.c index b2cf6b609..abc538a45 100644 --- a/src/spicelib/parser/inp2m.c +++ b/src/spicelib/parser/inp2m.c @@ -142,7 +142,7 @@ INP2M(CKTcircuit *ckt, INPtables *tab, card *current) if (i < numnodes) IFC (bindNode, (ckt, fast, i + 1, node[i])); else - fast->GENnode[i] = -1; + GENnode(fast)[i] = -1; PARSECALL ((&line, ckt, type, fast, &leadval, &waslead, tab)); if (waslead)