From f2626d48e0c36fd61ed5a1d3d7b7372abdf0a178 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sun, 2 Oct 2011 08:29:03 +0000 Subject: [PATCH] multiple .model section in altermod --- ChangeLog | 4 ++ src/frontend/device.c | 126 +++++++++++++++++++++++++++++------------- 2 files changed, 91 insertions(+), 39 deletions(-) diff --git a/ChangeLog b/ChangeLog index 87ad769d9..55d5f104a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2011-10-02 Holger Vogt + * device.c updates to altermod command, allow reading from file with + multiple .model sections + 2011-09-18 Holger Vogt * com_fft.c: fft now uses faster Green's method (may be deselected by unsetting #define GREEN swirch diff --git a/src/frontend/device.c b/src/frontend/device.c index 5c35e77d3..60196b051 100644 --- a/src/frontend/device.c +++ b/src/frontend/device.c @@ -20,6 +20,7 @@ Modified: 2000 AlansFixes #include "variable.h" #include "com_commands.h" #include "../misc/util.h" /* ngdirname() */ +#include "error.h" /* controlled_ext() */ #include "gens.h" /* wl_forall */ @@ -1375,26 +1376,48 @@ devexpand(char *name) return (wl); } -/* altermod nch file=modelparam.mod - load model file and overwrite model nch with - all new parameters */ +/* altermod mod_1 [mod_nn] file=modelparam.mod + load model file and overwrite models mod_1 till mod_nn with + all new parameters (limited to 16 models) */ static void com_alter_mod(wordlist *wl) { +#define MODLIM 16 /* max number of models */ FILE *modfile; - wordlist *nword, *newcommand; - char *filename=NULL, *modelname, *eqword, *input, *modelline=NULL, *inptoken, *newtype; + char *modellist[MODLIM]={NULL}, *modellines[MODLIM]={NULL}, *newmodelname, *newmodelline; + char *filename=NULL, *eqword, *input, *modelline=NULL, *inptoken; + int modno = 0, molineno = 0, i, j; + wordlist *newcommand; struct line *modeldeck, *tmpdeck; char *readmode = "r"; - modelname = copy(wl->wl_word); - nword = wl->wl_next; - input = wl_flatten(nword); + char **arglist; + bool modelfound = FALSE; + int ij[MODLIM]; + + /* initialize */ + for (i = 0; i < MODLIM; i++) + ij[i] = -1; + + /* read all model names */ + while (!ciprefix("file", wl->wl_word)) { + if (modno == MODLIM) { + fprintf(cp_err, "Error: too many model names in altermod command\n"); + controlled_exit(1); + } + modellist[modno] = copy(wl->wl_word); + modno++; + wl = wl->wl_next; + } + input = wl_flatten(wl); + /* get the file name */ eqword = strstr(input, "="); if (eqword) { eqword++; while(*eqword == ' ') eqword++; - if(eqword=='\0') + if(eqword=='\0') { fprintf(cp_err, "Error: no filename given\n"); + controlled_exit(1); + } filename = copy(eqword); } else { @@ -1402,34 +1425,69 @@ static void com_alter_mod(wordlist *wl) eqword += 4; while(*eqword == ' ') eqword++; - if(eqword=='\0') + if(eqword=='\0') { fprintf(cp_err, "Error: no filename given\n"); + controlled_exit(1); + } filename = copy(eqword); } modfile = inp_pathopen(filename, readmode); inp_readall(modfile, &modeldeck, 0, ngdirname(filename), 0); tfree(input); tfree(filename); - /* get the first line starting with *model */ + /* get all lines starting with *model */ for (tmpdeck = modeldeck; tmpdeck; tmpdeck = tmpdeck->li_next) if (ciprefix("*model", tmpdeck->li_line)) { - modelline = tmpdeck->li_line; - break; + if (molineno == MODLIM){ + fprintf(cp_err, "Error: more than %d models in deck, rest ignored\n", molineno); + break; + } + modellines[molineno] = tmpdeck->li_line; + molineno++; } - if (modelline) { - char **arglist; - char *newmodelname; - arglist = TMALLOC(char*, 4); - inptoken = gettok(&modelline); /* *model */ + /* Check if all models named in altermod command are to be found in input deck. + Exit if not successfull */ + for (i = 0; i < modno; i++) { + for (j=0; j < molineno; j++) { + newmodelline = modellines[j]; + /* get model name from model line */ + inptoken = gettok(&newmodelline); /* *model */ + tfree(inptoken); + newmodelname = gettok(&newmodelline); /* modelname */ + if (cieq(newmodelname,modellist[i])) { + modelfound = TRUE; + tfree(newmodelname); + break; + } + tfree(newmodelname); + } + if (modelfound) { + modelfound = FALSE; + ij[i] = j; /* model in altermod, found in model line */ + continue; + } + else { + fprintf(cp_err, "Error: could not find model %s in input deck\n", modellist[i]); + controlled_exit(1); + } + } + /* read the model line, generate the altermod commands as a wordlist, + and call com_alter_common() */ + arglist = TMALLOC(char*, 4); + arglist[0] = copy("altermod"); + arglist[3] = NULL; + /* for each model name of altermod command */ + for (i = 0; i < modno; i++) { + /* model name */ + arglist[1] = copy(modellist[i]); + /* parse model line from deck */ + modelline = modellines[ij[i]]; + inptoken = gettok(&modelline); /* skip *model */ + tfree(inptoken); + inptoken = gettok(&modelline); /* skip modelname */ + tfree(inptoken); + inptoken = gettok(&modelline); /* skip model type */ tfree(inptoken); - newmodelname = gettok(&modelline); /* modelname */ - newtype = gettok(&modelline); /* model type */ - /* test if level and type are o.k. */ - /* FIXME: don't know how to do that! */ - /* call each token and do altermod */ - arglist[0] = copy("altermod"); - arglist[1] = modelname; - arglist[3] = NULL; while ((inptoken = gettok(&modelline)) != NULL) { /* exclude level and version */ if (ciprefix("version", inptoken) || ciprefix("level", inptoken)) { @@ -1443,18 +1501,8 @@ static void com_alter_mod(wordlist *wl) wl_free(newcommand); tfree(inptoken); } - tfree(newmodelname); - tfree(newtype); + tfree(arglist[1]); } + tfree(arglist[0]); + tfree(arglist[3]); } - - /* Figure out if right hand side is a model - if (names && (do_model == 1)) { - INPmodel *inpmod = NULL; - if_setparam_model(ft_curckt->ci_ckt, &dev, words->wl_word); - INPgetMod( ft_curckt->ci_ckt, words->wl_word, &inpmod, ft_curckt->ci_symtab ); - if ( inpmod == NULL ) { - fprintf(cp_err, "Error: no such model %s.\n", words->wl_word); - return; - } - }*/