From e6265a3eed18d1d09d93a853173a00ebe76d4f02 Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Sat, 12 Nov 2022 16:40:14 +0100 Subject: [PATCH] Move reference designator from A to N replace inp2n by a copy of inp2a OSDI is now called in case N: in inppas2 --- src/spicelib/parser/inp2n.c | 191 +++++++++++++++------------------- src/spicelib/parser/inppas2.c | 9 +- 2 files changed, 84 insertions(+), 116 deletions(-) diff --git a/src/spicelib/parser/inp2n.c b/src/spicelib/parser/inp2n.c index 164375aaf..e76e41c8d 100644 --- a/src/spicelib/parser/inp2n.c +++ b/src/spicelib/parser/inp2n.c @@ -1,127 +1,100 @@ /********** -Permit to use it as your wish. -Author: 2007 Gong Ding, gdiso@ustc.edu -University of Science and Technology of China +Copyright 1990 Regents of the University of California. All rights reserved. +Author: 1988 Thomas L. Quarles +Modified: 2001 Paolo Nenzi (Cider Integration) **********/ #include "ngspice/ngspice.h" -#ifdef NDEV - -#include +#include "ngspice/devdefs.h" +#include "ngspice/fteext.h" #include "ngspice/ifsim.h" #include "ngspice/inpdefs.h" -#include "../devices/ndev/ndevdefs.h" #include "ngspice/inpmacs.h" -#include "ngspice/fteext.h" + #include "inpxx.h" +#include -void INP2N(CKTcircuit *ckt, INPtables * tab, struct card *current) -{ -/* parse a numerical device card */ -/* Nname [ ...] [] */ -/* The NUMD should have a private .model card */ +void INP2N(CKTcircuit *ckt, INPtables *tab, struct card *current) { + /* Mname [L=] + * [W=] [AD=] [AS=] [PD=] + * [PS=] [NRD=] [NRS=] [OFF] + * [IC=,,] + */ - int mytype; /* the type we determine NDEV are */ - int type = 0; /* the type the model says it is */ - char *line; /* the part of the current line left to parse */ - char *saveline; /* ... just in case we need to go back... */ - char *name; /* the NDEV's name */ - char *model; /* the name of the NDEV's model */ - - int term; /* the number of node */ - char *nnamex; /* serve as a temporary name */ - char *nname[7]; /* the array of CKT node's name */ - char *bname[7]; /* the array of NDEV electrode's name */ - CKTnode *node[7]; /* the array of CKT node's node pointer */ - - int error; /* error code temporary */ - int i; - INPmodel *thismodel; /* pointer to model structure describing our model */ - GENmodel *mdfast = NULL; /* pointer to the actual model */ - GENinstance *fast; /* pointer to the actual instance */ - NDEVinstance *pinst; - int waslead; /* flag to indicate that funny unlabeled number was found */ - double leadval; /* actual value of unlabeled number */ + int type; /* the type the model says it is */ + char *line; /* the part of the current line left to parse */ + char *name; /* the resistor's name */ + // limit to at most 20 nodes + const int max_i = 20; + CKTnode *node[20]; + int error; /* error code temporary */ + int numnodes; /* flag indicating 4 or 5 (or 6 or 7) nodes */ + GENinstance *fast; /* pointer to the actual instance */ + int waslead; /* flag to indicate that funny unlabeled number was found */ + double leadval; /* actual value of unlabeled number */ + INPmodel *thismodel; /* pointer to model description for user's model */ + GENmodel *mdfast; /* pointer to the actual model */ + int i; - mytype = INPtypelook("NDEV"); - if (mytype < 0) { - LITERR("Device type NDEV not supported by this binary\n"); - return; + line = current->line; + + INPgetNetTok(&line, &name, 1); + INPinsert(&name, tab); + + for (i = 0;; i++) { + char *token; + INPgetNetTok(&line, &token, 1); + + if (i >= 2) { + txfree(INPgetMod(ckt, token, &thismodel, tab)); + + /* /1* check if using model binning -- pass in line since need 'l' and 'w' *1/ */ + /* if (!thismodel) */ + /* txfree(INPgetModBin(ckt, token, &thismodel, tab, line)); */ + + if (thismodel) { + INPinsert(&token, tab); + break; + } } - line = current->line; - INPgetTok(&line, &name, 1); - INPinsert(&name, tab); - - /* get the node number here */ - saveline=line; - term = 0; - do { - INPgetNetTok(&line, &nnamex, 1); - term++; - }while(*nnamex); - line=saveline; - term=(term-2)/2; - if (term > 7) { - LITERR("Numerical device has too many nodes, the limitation is 7\n"); - return; + if (i >= max_i) { + LITERR("could not find a valid modelname"); + return; } - for(i=0;iINPmodType; + mdfast = thismodel->INPmodfast; + IFdevice *dev = ft_sim->devices[type]; - INPgetNetTok(&line, &model, 1); - - if (*model) { - /* token isn't null */ - if (INPlookMod(model)) { - /* If this is a valid model connect it */ - INPinsert(&model, tab); - current->error = INPgetMod(ckt, model, &thismodel, tab); - if (thismodel != NULL) { - if (mytype != thismodel->INPmodType) { - LITERR("incorrect model type"); - return; - } - mdfast = thismodel->INPmodfast; - type = thismodel->INPmodType; - } - } else { - LITERR("Numerical device should always have a model card\n"); - return; - } - IFC(newInstance, (ckt, mdfast, &fast, name)); - } else { - LITERR("Numerical device should always have a model card\n"); - return; - } - - for(i=0;iterm = term; - for(i=0;ibname[i]=bname[i]; - pinst->node[i]=node[i]; - } - - PARSECALL((&line, ckt, type, fast, &leadval, &waslead, tab)); - if (waslead) { - LITERR("The numerical device was lead berfor.\n"); - return; - } - - + if (!dev->registry_entry) { + LITERR("incorrect model type! Expected OSDI device"); return; + } + + if (i == 0) { + LITERR("not enough nodes"); + return; + } + + if (i > *dev->terms) { + LITERR("too many nodes connected to instance"); + return; + } + + numnodes = i; + + IFC(newInstance, (ckt, mdfast, &fast, name)); + + for (i = 0; i < *dev->terms; i++) + if (i < numnodes) + IFC(bindNode, (ckt, fast, i + 1, node[i])); + else + GENnode(fast)[i] = -1; + + PARSECALL((&line, ckt, type, fast, &leadval, &waslead, tab)); + if (waslead) + LITERR(" error: no unlabeled parameter permitted on osdi devices\n"); } -#else - -int Dummy1; - -#endif diff --git a/src/spicelib/parser/inppas2.c b/src/spicelib/parser/inppas2.c index 11e32aafb..989fc6d5f 100644 --- a/src/spicelib/parser/inppas2.c +++ b/src/spicelib/parser/inppas2.c @@ -99,12 +99,7 @@ void INPpas2(CKTcircuit *ckt, struct card *data, INPtables * tab, TSKtask *task) /* blank line (tab leading) */ break; -#ifdef OSDI - case 'A': /* Aname */ - // OSDI handles xspice - INP2A(ckt, tab, current); - break; -#elif XSPICE +#ifdef XSPICE /* gtri - add - wbk - 10/23/90 - add case for 'A' devices */ case 'A': /* Aname */ @@ -174,7 +169,7 @@ void INPpas2(CKTcircuit *ckt, struct card *data, INPtables * tab, TSKtask *task) [IC=,,] */ INP2M(ckt, tab, current); break; -#ifdef NDEV +#ifdef OSDI case 'N': /* Nname [...] [] */ INP2N(ckt, tab, current);