home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk1.iso / altsrc / articles / 11116 < prev    next >
Text File  |  1994-08-13  |  64KB  |  2,039 lines

  1. Newsgroups: alt.sources
  2. Path: wupost!math.ohio-state.edu!usc!cs.utexas.edu!convex!news.duke.edu!eff!news.kei.com!travelers.mail.cornell.edu!cornell!rochester!rit!atd
  3. From: atd@cs.rit.edu (Albert T Davis)
  4. Subject: ACS (Al's Circuit Simulator) patch02
  5. Message-ID: <1994Aug13.022249.25894@cs.rit.edu>
  6. Sender: news@cs.rit.edu (USENET News Admin)
  7. Nntp-Posting-Host: cobalt
  8. Organization: Rochester Institute of Technology, Rochester, NY
  9. Date: Sat, 13 Aug 1994 02:22:49 GMT
  10. Lines: 2027
  11.  
  12. Submitted-By: atd@cs.rit.edu (Al Davis)
  13. Archive-Name: acs-0.14/patch02
  14. Environment: UNIX, MS-DOS, VMS
  15.  
  16. This is a patch to ACS 0.14 making ACS 0.15.
  17.  
  18. From rn, say "| patch -d DIR", where DIR is your acs root directory
  19. (the one containing man and src).  Outside of rn, say "cd DIR;
  20. patch <thisarticle".  If you don't have the patch program, apply
  21. the following by hand, or get patch (version 2.0, latest patchlevel).
  22.  
  23. This is the second of two parts.  Apply them both, then recompile.
  24. Both the manual and program have been changed.
  25. =================================
  26. diff -cN ../acs-0.14/src/ac_setup.c src/ac_setup.c
  27. *** ../acs-0.14/src/ac_setup.c    Wed Jul  6 12:11:47 1994
  28. --- src/ac_setup.c    Sun Jul 31 23:09:47 1994
  29. ***************
  30. *** 1,4 ****
  31. ! /* ac_setup.c  93.12.19
  32.    * Copyright 1983-1992   Albert Davis
  33.    * ac analysis setup
  34.    */
  35. --- 1,4 ----
  36. ! /* ac_setup.c  94.07.29
  37.    * Copyright 1983-1992   Albert Davis
  38.    * ac analysis setup
  39.    */
  40. ***************
  41. *** 69,75 ****
  42.             ac->stop = ac->start;
  43.          if (isfloat(cmd[*cnt]))
  44.             ac_optby(cmd,cnt);
  45. !     }else if (outset(cmd,cnt,(char*)NULL,"ac ")){
  46.       ;
  47.       }else{
  48.       syntax_check(cmd,cnt,bWARNING);
  49. --- 69,75 ----
  50.             ac->stop = ac->start;
  51.          if (isfloat(cmd[*cnt]))
  52.             ac_optby(cmd,cnt);
  53. !     }else if (outset(cmd,cnt,"","")){
  54.       ;
  55.       }else{
  56.       syntax_check(cmd,cnt,bWARNING);
  57. diff -cN ../acs-0.14/src/branch.h src/branch.h
  58. *** ../acs-0.14/src/branch.h    Wed Jul  6 12:11:36 1994
  59. --- src/branch.h    Sun Jul 31 23:09:38 1994
  60. ***************
  61. *** 1,4 ****
  62. ! /* branch.h  94.07.01
  63.    * Copyright 1983-1992   Albert Davis
  64.    * branch structure type definitions
  65.    * device types (enumeration type?)
  66. --- 1,4 ----
  67. ! /* branch.h  94.07.11
  68.    * Copyright 1983-1992   Albert Davis
  69.    * branch structure type definitions
  70.    * device types (enumeration type?)
  71. ***************
  72. *** 58,63 ****
  73. --- 58,64 ----
  74.      double   ic;        /* initial condition            */
  75.      unsigned bypass:1,    /* is bypassing now            */
  76.            tracesubckt:1,/* trace subckt fanout            */
  77. +         nodamp:1,    /* don't apply iteration damping    */
  78.             converged:1;/* convergence status            */
  79.      int        method_a;    /* actual integration method (auto)    */
  80.      int      method_u;    /* method to use for this part per user    */
  81. ***************
  82. *** 77,85 ****
  83.      cpoly1_t m0;        /* matrix parameters, new        */
  84.      cpoly1_t m1;        /* matrix parameters, 1 fill ago    */
  85.      cpoly1_t mt1;    /* matrix parameters, 1 time ago    */
  86. - #ifdef KEEP_OLD_TIME_INFO
  87. -    cpoly1_t mt2;    /* matrix parameters, 2 time ago    */
  88. - #endif
  89.   
  90.      complex_t  ev;    /* ac effective value (usually real)    */
  91.      complex_t  acg;    /* ac admittance matrix values        */   
  92. --- 78,83 ----
  93. diff -cN ../acs-0.14/src/ctostr.c src/ctostr.c
  94. *** ../acs-0.14/src/ctostr.c    Wed Jul  6 12:11:49 1994
  95. --- src/ctostr.c    Sun Jul 31 23:09:50 1994
  96. ***************
  97. *** 1,4 ****
  98. ! /* ctostr.c  93.12.19
  99.    * Copyright 1983-1992   Albert Davis
  100.    * get string from string
  101.    */
  102. --- 1,4 ----
  103. ! /* ctostr.c  94.07.13
  104.    * Copyright 1983-1992   Albert Davis
  105.    * get string from string
  106.    */
  107. ***************
  108. *** 5,11 ****
  109.   #include "ecah.h"
  110.   #include "declare.h"
  111.   /*--------------------------------------------------------------------------*/
  112. !     char    *ctostr(const char*,int*,char*,int);
  113.   /*--------------------------------------------------------------------------*/
  114.   /* ctostr: character input to string
  115.    * scan (and eat) an input string (cmd) using index (cnt).
  116. --- 5,11 ----
  117.   #include "ecah.h"
  118.   #include "declare.h"
  119.   /*--------------------------------------------------------------------------*/
  120. !     char    *ctostr(const char*,int*,char*,int,const char*);
  121.   /*--------------------------------------------------------------------------*/
  122.   /* ctostr: character input to string
  123.    * scan (and eat) an input string (cmd) using index (cnt).
  124. ***************
  125. *** 16,22 ****
  126.    * skips leading whitespace.  skips trailing whitespace and comma
  127.    * skips parts of input word too big for destination
  128.    */
  129. ! char *ctostr(const char *cmd, int *cnt, char *des, int len)
  130.   {
  131.    char chr;
  132.    int dind;
  133. --- 16,22 ----
  134.    * skips leading whitespace.  skips trailing whitespace and comma
  135.    * skips parts of input word too big for destination
  136.    */
  137. ! char *ctostr(const char *cmd, int *cnt, char *des, int len, const char *term)
  138.   {
  139.    char chr;
  140.    int dind;
  141. ***************
  142. *** 24,36 ****
  143.    skipbl(cmd,cnt);
  144.    for (dind = 0;  dind < len;  (*cnt)++, dind++){
  145.       chr = cmd[*cnt];
  146. !     if (isterm(chr))
  147.          break;
  148.       des[dind] = chr;
  149.    }
  150.    des[dind] = '\0';
  151.   
  152. !  while (!isterm(cmd[*cnt]))
  153.       (*cnt)++;
  154.    skipcom(cmd,cnt);
  155.    return des;
  156. --- 24,36 ----
  157.    skipbl(cmd,cnt);
  158.    for (dind = 0;  dind < len;  (*cnt)++, dind++){
  159.       chr = cmd[*cnt];
  160. !     if (isterm(chr,term))
  161.          break;
  162.       des[dind] = chr;
  163.    }
  164.    des[dind] = '\0';
  165.   
  166. !  while (!isterm(cmd[*cnt],term))
  167.       (*cnt)++;
  168.    skipcom(cmd,cnt);
  169.    return des;
  170. diff -cN ../acs-0.14/src/d_bjt.c src/d_bjt.c
  171. *** ../acs-0.14/src/d_bjt.c    Wed Jul  6 12:11:52 1994
  172. --- src/d_bjt.c    Sun Jul 31 23:09:52 1994
  173. ***************
  174. *** 1,4 ****
  175. ! /* d_bjt.c  93.12.22
  176.    * Copyright 1983-1992   Albert Davis
  177.    * bjt model.
  178.    * this is not really a bjt, but a diode
  179. --- 1,4 ----
  180. ! /* d_bjt.c  94.07.18
  181.    * Copyright 1983-1992   Albert Davis
  182.    * bjt model.
  183.    * this is not really a bjt, but a diode
  184. ***************
  185. *** 99,106 ****
  186.    x = (struct bjt*)brh->x;
  187.   
  188.    parselabel(brh,cmd,cnt);
  189. !  (void)parsenodes(brh,cmd,cnt,2);
  190. !  (void)ctostr(cmd, cnt, x->modelname, LABELEN);
  191.    x->m = (struct qmod*)NULL;
  192.    if (isdigit(cmd[*cnt])  ||  cmd[*cnt] == '.')
  193.       x->area = fabs(ctof(cmd,cnt));
  194. --- 99,106 ----
  195.    x = (struct bjt*)brh->x;
  196.   
  197.    parselabel(brh,cmd,cnt);
  198. !  (void)parsenodes(brh,cmd,cnt);
  199. !  (void)ctostr(cmd, cnt, x->modelname, LABELEN, TOKENTERM);
  200.    x->m = (struct qmod*)NULL;
  201.    if (isdigit(cmd[*cnt])  ||  cmd[*cnt] == '.')
  202.       x->area = fabs(ctof(cmd,cnt));
  203. ***************
  204. *** 185,191 ****
  205.   
  206.    m = (struct qmod*)brh->x;
  207.   
  208. !  (void)ctostr(cmd, cnt, brh->label, LABELEN);
  209.    skiparg(cmd,cnt);    /* skip known "d" */
  210.   
  211.    for (;;){
  212. --- 185,191 ----
  213.   
  214.    m = (struct qmod*)brh->x;
  215.   
  216. !  (void)ctostr(cmd, cnt, brh->label, LABELEN, TOKENTERM);
  217.    skiparg(cmd,cnt);    /* skip known "d" */
  218.   
  219.    for (;;){
  220. diff -cN ../acs-0.14/src/d_cap.c src/d_cap.c
  221. *** ../acs-0.14/src/d_cap.c    Wed Jul  6 12:11:52 1994
  222. --- src/d_cap.c    Sun Jul 31 23:09:52 1994
  223. ***************
  224. *** 1,4 ****
  225. ! /* d_cap.c  94.07.01
  226.    * Copyright 1983-1992   Albert Davis
  227.    * capacitor models
  228.    * two levels: linear (lin) and nonlinear (nl)
  229. --- 1,4 ----
  230. ! /* d_cap.c  94.07.25
  231.    * Copyright 1983-1992   Albert Davis
  232.    * capacitor models
  233.    * two levels: linear (lin) and nonlinear (nl)
  234. ***************
  235. *** 199,205 ****
  236.    if (brh->time3 <= 0.){
  237.       return BIGBIG;
  238.    }else{
  239. !     double factor = 12.;      /* 1/coefficient of 3rd der, trapezoid rule */
  240.       double dt0 = brh->time0 - brh->time1;
  241.       double dt1 = brh->time1 - brh->time2;    /* BUG: these values should */
  242.       double dt2 = brh->time2 - brh->time3;    /* be stored */
  243. --- 199,205 ----
  244.    if (brh->time3 <= 0.){
  245.       return BIGBIG;
  246.    }else{
  247. !     double factor = 1./12.;      /* coefficient of 3rd der, trapezoid rule */
  248.       double dt0 = brh->time0 - brh->time1;
  249.       double dt1 = brh->time1 - brh->time2;    /* BUG: these values should */
  250.       double dt2 = brh->time2 - brh->time3;    /* be stored */
  251. ***************
  252. *** 229,235 ****
  253.       double chargetol = MAX(opt.chgtol,MAX(fabs(q0),fabs(qt1)))
  254.                  * opt.reltol / dt0;
  255.       double tol = MAX(currenttol,chargetol);
  256. !     double timestep = opt.trtol * sqrt(factor * tol / fabs(dddqdddt));
  257.   
  258.       if (timestep <= tr->dtmin){
  259.          error(bDANGER,"step control error:%s %g\n",printlabel(brh,0),timestep);
  260. --- 229,236 ----
  261.       double chargetol = MAX(opt.chgtol,MAX(fabs(q0),fabs(qt1)))
  262.                  * opt.reltol / dt0;
  263.       double tol = MAX(currenttol,chargetol);
  264. !     double denom = MAX(opt.abstol, (factor *fabs(dddqdddt)));  /* avoid / 0 */
  265. !     double timestep = opt.trtol * sqrt(tol / denom);
  266.   
  267.       if (timestep <= tr->dtmin){
  268.          error(bDANGER,"step control error:%s %g\n",printlabel(brh,0),timestep);
  269. ***************
  270. *** 237,243 ****
  271.          error(bTRACE, "it=%g qt=%g tol=%g\n", currenttol, chargetol, tol);
  272.          timestep = tr->dtmin;
  273.       }
  274. !     if (timestep < (brh->time0 - brh->time1) * opt.trreject){
  275.          error(bTRACE, "step rejected:%s\n", printlabel(brh,0));
  276.          error(bTRACE, "new=%g  old=%g  rej=%g\n",
  277.                  timestep, dt0, dt0 * opt.trreject);
  278. --- 238,244 ----
  279.          error(bTRACE, "it=%g qt=%g tol=%g\n", currenttol, chargetol, tol);
  280.          timestep = tr->dtmin;
  281.       }
  282. !     if (timestep < dt0 * opt.trreject){
  283.          error(bTRACE, "step rejected:%s\n", printlabel(brh,0));
  284.          error(bTRACE, "new=%g  old=%g  rej=%g\n",
  285.                  timestep, dt0, dt0 * opt.trreject);
  286. diff -cN ../acs-0.14/src/d_coil.c src/d_coil.c
  287. *** ../acs-0.14/src/d_coil.c    Wed Jul  6 12:11:52 1994
  288. --- src/d_coil.c    Sun Jul 31 23:09:53 1994
  289. ***************
  290. *** 1,4 ****
  291. ! /* d_coil.c  94.06.23
  292.    * Copyright 1983-1992   Albert Davis
  293.    * inductors
  294.    * two levels: linear (lin) and nonlinear (nl) (not really)
  295. --- 1,4 ----
  296. ! /* d_coil.c  94.07.25
  297.    * Copyright 1983-1992   Albert Davis
  298.    * inductors
  299.    * two levels: linear (lin) and nonlinear (nl) (not really)
  300. ***************
  301. *** 216,225 ****
  302.   /*--------------------------------------------------------------------------*/
  303.   static double tr_review_coil(branch_t *brh)
  304.   {
  305. !  if (brh->time2 <= 0.){
  306.       return BIGBIG;
  307.    }else{
  308. !     double factor = 12.;      /* 1/coefficient of 3rd der, trapezoid rule */
  309.       double dt0 = brh->time0 - brh->time1;
  310.       double dt1 = brh->time1 - brh->time2;    /* BUG: these values should */
  311.       double dt2 = brh->time2 - brh->time3;    /* be stored */
  312. --- 216,225 ----
  313.   /*--------------------------------------------------------------------------*/
  314.   static double tr_review_coil(branch_t *brh)
  315.   {
  316. !  if (brh->time3 <= 0.){
  317.       return BIGBIG;
  318.    }else{
  319. !     double factor = 1./12.;      /* coefficient of 3rd der, trapezoid rule */
  320.       double dt0 = brh->time0 - brh->time1;
  321.       double dt1 = brh->time1 - brh->time2;    /* BUG: these values should */
  322.       double dt2 = brh->time2 - brh->time3;    /* be stored */
  323. ***************
  324. *** 249,255 ****
  325.       double chargetol = MAX(opt.chgtol,MAX(fabs(q0),fabs(qt1)))
  326.                  * opt.reltol / dt0;
  327.       double tol = MAX(currenttol,chargetol);
  328. !     double timestep = opt.trtol * sqrt(factor * tol / fabs(dddqdddt));
  329.   
  330.       if (timestep <= tr->dtmin){
  331.          error(bDANGER,"step control error:%s %g\n",printlabel(brh,0),timestep);
  332. --- 249,256 ----
  333.       double chargetol = MAX(opt.chgtol,MAX(fabs(q0),fabs(qt1)))
  334.                  * opt.reltol / dt0;
  335.       double tol = MAX(currenttol,chargetol);
  336. !     double denom = MAX(opt.abstol, (factor *fabs(dddqdddt)));  /* avoid / 0 */
  337. !     double timestep = opt.trtol * sqrt(tol / denom);
  338.   
  339.       if (timestep <= tr->dtmin){
  340.          error(bDANGER,"step control error:%s %g\n",printlabel(brh,0),timestep);
  341. diff -cN ../acs-0.14/src/d_diode.c src/d_diode.c
  342. *** ../acs-0.14/src/d_diode.c    Wed Jul  6 12:11:53 1994
  343. --- src/d_diode.c    Sun Jul 31 23:09:54 1994
  344. ***************
  345. *** 1,4 ****
  346. ! /* d_diode.c  94.04.28
  347.    * Copyright 1983-1992   Albert Davis
  348.    * diode model.
  349.    * netlist syntax:
  350. --- 1,4 ----
  351. ! /* d_diode.c  94.07.18
  352.    * Copyright 1983-1992   Albert Davis
  353.    * diode model.
  354.    * netlist syntax:
  355. ***************
  356. *** 107,114 ****
  357.    x = (struct diode*)brh->x;
  358.   
  359.    parselabel(brh,cmd,cnt);
  360. !  (void)parsenodes(brh,cmd,cnt,2);
  361. !  (void)ctostr(cmd, cnt, x->modelname, LABELEN);
  362.    x->m = (struct dmod*)NULL;
  363.    if (isdigit(cmd[*cnt])  ||  cmd[*cnt] == '.')
  364.       x->area = fabs(ctof(cmd,cnt));
  365. --- 107,114 ----
  366.    x = (struct diode*)brh->x;
  367.   
  368.    parselabel(brh,cmd,cnt);
  369. !  (void)parsenodes(brh,cmd,cnt);
  370. !  (void)ctostr(cmd, cnt, x->modelname, LABELEN, TOKENTERM);
  371.    x->m = (struct dmod*)NULL;
  372.    if (isdigit(cmd[*cnt])  ||  cmd[*cnt] == '.')
  373.       x->area = fabs(ctof(cmd,cnt));
  374. ***************
  375. *** 193,199 ****
  376.   
  377.    m = (struct dmod*)brh->x;
  378.   
  379. !  (void)ctostr(cmd, cnt, brh->label, LABELEN);
  380.    skiparg(cmd,cnt);    /* skip known "d" */
  381.    (void)skiplparen(cmd,cnt);
  382.    for (;;){
  383. --- 193,199 ----
  384.   
  385.    m = (struct dmod*)brh->x;
  386.   
  387. !  (void)ctostr(cmd, cnt, brh->label, LABELEN, TOKENTERM);
  388.    skiparg(cmd,cnt);    /* skip known "d" */
  389.    (void)skiplparen(cmd,cnt);
  390.    for (;;){
  391. diff -cN ../acs-0.14/src/d_dot.c src/d_dot.c
  392. *** ../acs-0.14/src/d_dot.c    Wed Jul  6 12:11:53 1994
  393. --- src/d_dot.c    Sun Jul 31 23:09:54 1994
  394. ***************
  395. *** 1,4 ****
  396. ! /* d_dot.c  93.12.22
  397.    * Copyright 1983-1992   Albert Davis
  398.    * processing for DOTCARD netlist item (pseudo-device)
  399.    */
  400. --- 1,4 ----
  401. ! /* d_dot.c  94.07.13
  402.    * Copyright 1983-1992   Albert Davis
  403.    * processing for DOTCARD netlist item (pseudo-device)
  404.    */
  405. ***************
  406. *** 69,75 ****
  407.   
  408.    newbrh = brh;
  409.    labelcnt = *cnt;
  410. !  (void)ctostr(cmd, cnt, brh->label, LABELEN);
  411.    setmatch(cmd,cnt);
  412.         if (rematch("D"    ))  newbrh = create_branch(&model_diode);
  413.    else if (rematch("NPn"    ))  newbrh = create_branch(&model_bjt);
  414. --- 69,75 ----
  415.   
  416.    newbrh = brh;
  417.    labelcnt = *cnt;
  418. !  (void)ctostr(cmd, cnt, brh->label, LABELEN, TOKENTERM);
  419.    setmatch(cmd,cnt);
  420.         if (rematch("D"    ))  newbrh = create_branch(&model_diode);
  421.    else if (rematch("NPn"    ))  newbrh = create_branch(&model_bjt);
  422. ***************
  423. *** 79,84 ****
  424. --- 79,85 ----
  425.    else if (rematch("NMos"))  newbrh = create_branch(&model_mos);
  426.    else if (rematch("PMos"))  newbrh = create_branch(&model_mos);
  427.    else if (rematch("Logic")) newbrh = create_branch(&model_logic);
  428. +  else if (rematch("SW"))    newbrh = create_branch(&model_vswtch);
  429.    else                newbrh = create_branch(&model_subckt);
  430.    if (newbrh != brh){
  431.       *brh = *newbrh;
  432. diff -cN ../acs-0.14/src/d_logic.c src/d_logic.c
  433. *** ../acs-0.14/src/d_logic.c    Wed Jul  6 12:11:54 1994
  434. --- src/d_logic.c    Sun Jul 31 23:09:54 1994
  435. ***************
  436. *** 1,4 ****
  437. ! /* d_logic.c  94.05.30
  438.    * Copyright 1983-1992   Albert Davis
  439.    * logic model.
  440.    */
  441. --- 1,4 ----
  442. ! /* d_logic.c  94.07.22
  443.    * Copyright 1983-1992   Albert Davis
  444.    * logic model.
  445.    */
  446. ***************
  447. *** 129,136 ****
  448.    x = (struct logic*)brh->x;
  449.   
  450.    parselabel(brh,cmd,cnt);
  451. !  x->incount = parsenodes(brh,cmd,cnt,PORTSPERGATE);
  452. !  (void)ctostr(cmd, cnt, x->modelname, LABELEN);
  453.    if (argparse(cmd,cnt,ONEPASS,
  454.           "AND",    aENUM,        &x->type,    lAND,
  455.       "NAND",    aENUM,        &x->type,    lNAND,
  456. --- 129,136 ----
  457.    x = (struct logic*)brh->x;
  458.   
  459.    parselabel(brh,cmd,cnt);
  460. !  x->incount = parsenodes(brh,cmd,cnt);
  461. !  (void)ctostr(cmd, cnt, x->modelname, LABELEN, TOKENTERM);
  462.    if (argparse(cmd,cnt,ONEPASS,
  463.           "AND",    aENUM,        &x->type,    lAND,
  464.       "NAND",    aENUM,        &x->type,    lNAND,
  465. ***************
  466. *** 176,182 ****
  467.    struct lmod *m;
  468.    m = (struct lmod*)brh->x;
  469.   
  470. !  (void)ctostr(cmd, cnt, brh->label, LABELEN);
  471.    skiparg(cmd,cnt);    /* skip known "logic" */
  472.    (void)skiplparen(cmd,cnt);
  473.    for (;;){
  474. --- 176,182 ----
  475.    struct lmod *m;
  476.    m = (struct lmod*)brh->x;
  477.   
  478. !  (void)ctostr(cmd, cnt, brh->label, LABELEN, TOKENTERM);
  479.    skiparg(cmd,cnt);    /* skip known "logic" */
  480.    (void)skiplparen(cmd,cnt);
  481.    for (;;){
  482. ***************
  483. *** 276,284 ****
  484.    m = x->m;
  485.    n = &(nstat[brh->n[1].m]);
  486.   
  487. !  if ((x->gatemode == mANALOG)
  488.    ||  (opt.mode == mMIXED && sim_phase == pINIT_DC)
  489. !  ||  (opt.mode == mANALOG)){
  490.       x->gatemode = n->nodemode = mANALOG;
  491.       return brh->converged = tr_fill_rl(brh->subckt);
  492.    }
  493. --- 276,284 ----
  494.    m = x->m;
  495.    n = &(nstat[brh->n[1].m]);
  496.   
  497. !  if (brh->subckt  &&  ((x->gatemode == mANALOG)
  498.    ||  (opt.mode == mMIXED && sim_phase == pINIT_DC)
  499. !  ||  (opt.mode == mANALOG))){
  500.       x->gatemode = n->nodemode = mANALOG;
  501.       return brh->converged = tr_fill_rl(brh->subckt);
  502.    }
  503. ***************
  504. *** 289,296 ****
  505.   
  506.    brh->bypass = YES;
  507.    x->gatemode = n->nodemode = mDIGITAL;
  508. !                     /* in transition */
  509. !  if (trtime0 >= n->finaltime){            /* time to propagate */
  510.       brh->bypass = NO;
  511.       n->lv0 = n->lv1;
  512.       n->ls0 = n->ls1;
  513. --- 289,301 ----
  514.   
  515.    brh->bypass = YES;
  516.    x->gatemode = n->nodemode = mDIGITAL;
  517. !  if (sim_phase == pINIT_DC){
  518. !     (void)tr_review_logic(brh);
  519. !     n->finaltime = 0.;
  520. !  }
  521. !  if (trtime0 >= n->finaltime){    /* in transition, time to propagate */
  522.       brh->bypass = NO;
  523.       n->lv0 = n->lv1;
  524.       n->ls0 = n->ls1;
  525. ***************
  526. *** 469,475 ****
  527.    /* count == number of connections, now const */
  528.    /* if lastchangenode == 1, no new changes, bypass */
  529.   
  530. !  if ((opt.mode == mANALOG)  ||  (opt.mode == mMIXED && quality != qGOOD)){
  531.       if (x->gatemode == mDIGITAL){
  532.          error(bTRACE, "%s:%u:%g switch to analog (review), %s\n",
  533.                  printlabel(brh,0), stats.iter[iTOTAL], trtime0, failuremode);
  534. --- 474,481 ----
  535.    /* count == number of connections, now const */
  536.    /* if lastchangenode == 1, no new changes, bypass */
  537.   
  538. !  if (brh->subckt  &&  
  539. !  ((opt.mode == mANALOG)  ||  (opt.mode == mMIXED && quality != qGOOD))){
  540.       if (x->gatemode == mDIGITAL){
  541.          error(bTRACE, "%s:%u:%g switch to analog (review), %s\n",
  542.                  printlabel(brh,0), stats.iter[iTOTAL], trtime0, failuremode);
  543. diff -cN ../acs-0.14/src/d_mos.c src/d_mos.c
  544. *** ../acs-0.14/src/d_mos.c    Wed Jul  6 12:11:54 1994
  545. --- src/d_mos.c    Sun Jul 31 23:09:55 1994
  546. ***************
  547. *** 1,4 ****
  548. ! /* d_mos.c  94.05.27
  549.    * Copyright 1983-1992   Albert Davis
  550.    * mos model basics
  551.    * netlist syntax:
  552. --- 1,4 ----
  553. ! /* d_mos.c  94.07.29
  554.    * Copyright 1983-1992   Albert Davis
  555.    * mos model basics
  556.    * netlist syntax:
  557. ***************
  558. *** 39,45 ****
  559.   extern const int inc_mode;    /* make incremental changes            */
  560.   extern const int sim_mode;
  561.   extern const int bypass_ok;
  562. - extern const int *nm;
  563.   extern struct nodestuff ns;
  564.   extern const struct options opt;
  565.   extern const struct status stats;
  566. --- 39,44 ----
  567. ***************
  568. *** 148,155 ****
  569.    x = (struct mos*)brh->x;
  570.   
  571.    parselabel(brh,cmd,cnt);
  572. !  (void)parsenodes(brh,cmd,cnt,4);
  573. !  (void)ctostr(cmd, cnt, x->modelname, LABELEN);
  574.    x->m = (struct mmod*)NULL;
  575.    if (isdigit(cmd[*cnt])  ||  cmd[*cnt] == '.'){
  576.       x->wo = fabs(ctof(cmd,cnt)) * SCALE;
  577. --- 147,154 ----
  578.    x = (struct mos*)brh->x;
  579.   
  580.    parselabel(brh,cmd,cnt);
  581. !  (void)parsenodes(brh,cmd,cnt);
  582. !  (void)ctostr(cmd, cnt, x->modelname, LABELEN, TOKENTERM);
  583.    x->m = (struct mmod*)NULL;
  584.    if (isdigit(cmd[*cnt])  ||  cmd[*cnt] == '.'){
  585.       x->wo = fabs(ctof(cmd,cnt)) * SCALE;
  586. ***************
  587. *** 235,241 ****
  588.    
  589.    m = (struct mmod*)brh->x;
  590.   
  591. !  (void)ctostr(cmd, cnt, brh->label, LABELEN);
  592.    if (argparse(cmd,cnt,ONEPASS,
  593.       "NMos",    aENUM,        &m->polarity,    pN,
  594.       "PMos",    aENUM,        &m->polarity,    pP,
  595. --- 234,240 ----
  596.    
  597.    m = (struct mmod*)brh->x;
  598.   
  599. !  (void)ctostr(cmd, cnt, brh->label, LABELEN, TOKENTERM);
  600.    if (argparse(cmd,cnt,ONEPASS,
  601.       "NMos",    aENUM,        &m->polarity,    pN,
  602.       "PMos",    aENUM,        &m->polarity,    pP,
  603. diff -cN ../acs-0.14/src/d_subckt.c src/d_subckt.c
  604. *** ../acs-0.14/src/d_subckt.c    Wed Jul  6 12:11:57 1994
  605. --- src/d_subckt.c    Sun Jul 31 23:09:59 1994
  606. ***************
  607. *** 1,4 ****
  608. ! /* d_subckt.c  94.01.01
  609.    * Copyright 1983-1992   Albert Davis
  610.    * subcircuit stuff
  611.    * netlist syntax:
  612. --- 1,4 ----
  613. ! /* d_subckt.c  94.07.18
  614.    * Copyright 1983-1992   Albert Davis
  615.    * subcircuit stuff
  616.    * netlist syntax:
  617. ***************
  618. *** 139,146 ****
  619.    x = (struct subckt*)brh->x;
  620.   
  621.    parselabel(brh,cmd,cnt);
  622. !  (void)parsenodes(brh,cmd,cnt,PORTSPERSUBCKT);
  623. !  (void)ctostr(cmd, cnt, x->modelname, LABELEN);
  624.   }
  625.   /*--------------------------------------------------------------------------*/
  626.   static void print_subckt(const branch_t *brh, int where, int detail)
  627. --- 139,146 ----
  628.    x = (struct subckt*)brh->x;
  629.   
  630.    parselabel(brh,cmd,cnt);
  631. !  (void)parsenodes(brh,cmd,cnt);
  632. !  (void)ctostr(cmd, cnt, x->modelname, LABELEN, TOKENTERM);
  633.   }
  634.   /*--------------------------------------------------------------------------*/
  635.   static void print_subckt(const branch_t *brh, int where, int detail)
  636. ***************
  637. *** 185,192 ****
  638.    if (nestlevel >= RECURSE)
  639.       error(bERROR,"%s: subckt nesting too deep\n", printlabel(brh,NO));
  640.   
  641. !  (void)ctostr(cmd, cnt, brh->label, LABELEN);
  642. !  (void)parsenodes(brh,cmd,cnt,PORTSPERSUBCKT);
  643.   
  644.    strcpy(namestack[nestlevel], brh->label);
  645.    neststack[nestlevel] = insertbefore;
  646. --- 185,192 ----
  647.    if (nestlevel >= RECURSE)
  648.       error(bERROR,"%s: subckt nesting too deep\n", printlabel(brh,NO));
  649.   
  650. !  (void)ctostr(cmd, cnt, brh->label, LABELEN, TOKENTERM);
  651. !  (void)parsenodes(brh,cmd,cnt);
  652.   
  653.    strcpy(namestack[nestlevel], brh->label);
  654.    neststack[nestlevel] = insertbefore;
  655. diff -cN ../acs-0.14/src/d_trln.c src/d_trln.c
  656. *** ../acs-0.14/src/d_trln.c    Wed Jul  6 12:11:58 1994
  657. --- src/d_trln.c    Sun Jul 31 23:09:55 1994
  658. ***************
  659. *** 55,61 ****
  660.    x = (struct trnlin*)brh->x;
  661.   
  662.    parselabel(brh,cmd,cnt);
  663. !  (void)parsenodes(brh,cmd,cnt,4);
  664.    for (;;){
  665.       if (argparse(cmd,cnt,REPEAT,
  666.       "Z",    a2DOUBLE,   &x->z0,    &x->z0,
  667. --- 55,61 ----
  668.    x = (struct trnlin*)brh->x;
  669.   
  670.    parselabel(brh,cmd,cnt);
  671. !  (void)parsenodes(brh,cmd,cnt);
  672.    for (;;){
  673.       if (argparse(cmd,cnt,REPEAT,
  674.       "Z",    a2DOUBLE,   &x->z0,    &x->z0,
  675. diff -cN ../acs-0.14/src/d_vswtch.c src/d_vswtch.c
  676. *** ../acs-0.14/src/d_vswtch.c
  677. --- src/d_vswtch.c    Sun Jul 31 23:10:00 1994
  678. ***************
  679. *** 0 ****
  680. --- 1,267 ----
  681. + /* d_vswtch.c  94.07.23
  682. +  * Copyright 1994   Albert Davis
  683. +  * voltage controlled switch model.
  684. +  * netlist syntax:
  685. +  * device:  sxxxx n+ n- mname <on>|<off> <model-card-args>
  686. +  * model:   .model mname SW <args>
  687. +  */
  688. + #include "ecah.h"
  689. + #include "argparse.h"
  690. + #include "branch.h"
  691. + #include "d_vswtch.h"
  692. + #include "error.h"
  693. + #include "mode.h"
  694. + #include "status.h"
  695. + #include "types.h"
  696. + #include "declare.h"
  697. + /*--------------------------------------------------------------------------*/
  698. + static     void    parse_vswtch(branch_t*,const char*,int*);
  699. + static     void    print_vswtch(const branch_t*,int,int);
  700. + static    branch_t *create_model_vswtch(const functions_t*);
  701. + static    branch_t *copy_model_vswtch(const branch_t*);
  702. + static     void    parse_model_vswtch(branch_t*,const char*,int*);
  703. + static     void    print_model_vswtch(const branch_t*,int,int);
  704. + static     void    expand_vswtch(branch_t*);
  705. + static     int    tr_vswtch(branch_t*);
  706. + static     void    ac_vswtch(branch_t*);
  707. + /*--------------------------------------------------------------------------*/
  708. + extern const int sim_phase;
  709. + extern const struct status stats;
  710. + static struct vswtch defalt = {(generic_t*)NULL, sizeof(struct vswtch),
  711. +     (struct vswtchmod*)NULL, vswDEFDEV_modelname, vswDEFDEV_ic, /*more*/};
  712. + static struct vswtchmod defaltmodel = {(generic_t*)NULL, 
  713. +     sizeof(struct vswtchmod), vswDEFMOD_vt, vswDEFMOD_vh, vswDEFMOD_ron,
  714. +     vswDEFMOD_roff};
  715. + static branch_t modellist = {(generic_t*)&defaltmodel, sizeof(branch_t),
  716. +     &model_vswtch, &modellist, &modellist, &modellist, &modellist,
  717. +     (branch_t*)NULL, (branch_t*)NULL, vswDEFMOD_modelname, /*more*/};
  718. + /*--------------------------------------------------------------------------*/
  719. + functions_t dev_vswtch = {
  720. +    (generic_t*)&defalt,    /* x */
  721. +    sizeof(functions_t),    /* ssize */
  722. +    sizeof(branch_t),    /* elementsize */
  723. +    (functions_t*)NULL,    /* super */
  724. +    4,             /* numnodes */
  725. +    rnTWOPORT,        /* refnode */
  726. +    rnONEPORT,        /* isdevice */
  727. +    create_std,        /* create */
  728. +    copy_std,        /* copy */
  729. +    parse_vswtch,    /* parse */
  730. +    print_vswtch,    /* print */
  731. +    expand_vswtch,    /* expand */
  732. +    probe_std,        /* probe */
  733. +    tr_vswtch,        /* dotr */
  734. +    unloadpassive,    /* untr */
  735. +    ac_vswtch,        /* doac */
  736. +    NULL,        /* trfun1 */
  737. +    NULL,        /* trfun0 */
  738. +    NULL,        /* acfun */
  739. +    NULL,        /* tr_guess */
  740. +    NULL,        /* tr_advance */
  741. +    NULL            /* tr_review */
  742. + };
  743. + functions_t model_vswtch = {
  744. +    (generic_t*)&defaltmodel,    /* x */
  745. +    sizeof(functions_t),    /* ssize */
  746. +    sizeof(branch_t),    /* elementsize */
  747. +    (functions_t*)NULL,    /* super */
  748. +    0,             /* numnodes */
  749. +    rnMODEL,        /* refnode */
  750. +    NO,            /* isdevice */
  751. +    create_model_vswtch,    /* create */
  752. +    copy_model_vswtch,    /* copy */
  753. +    parse_model_vswtch,    /* parse */
  754. +    print_model_vswtch,    /* print */
  755. +    NULL,        /* expand */
  756. +    NULL,        /* probe */
  757. +    NULL,        /* dotr */
  758. +    NULL,        /* untr */
  759. +    NULL,        /* doac */
  760. +    NULL,        /* trfun1 */
  761. +    NULL,        /* trfun0 */
  762. +    NULL,        /* acfun */
  763. +    NULL,        /* tr_guess */
  764. +    NULL,        /* tr_advance */
  765. +    NULL            /* tr_review */
  766. + };
  767. + /*--------------------------------------------------------------------------*/
  768. + static void parse_vswtch(branch_t *brh, const char *cmd, int *cnt)
  769. + {
  770. +  struct vswtch *x;
  771. +  x = (struct vswtch*)brh->x;
  772. +  parselabel(brh,cmd,cnt);
  773. +  (void)parsenodes(brh,cmd,cnt);
  774. +  (void)ctostr(cmd, cnt, x->modelname, LABELEN, TOKENTERM);
  775. +  x->m = (struct vswtchmod*)NULL;
  776. +  for (;;){
  777. +     if (argparse(cmd,cnt,REPEAT,
  778. +     "OFF",    aENUM,        &x->ic,        swOFF,
  779. +     "ON",    aENUM,        &x->ic,        swON,
  780. +     ""))
  781. +     ;
  782. +     else{
  783. +        syntax_check(cmd,cnt,bWARNING);
  784. +        break;
  785. +     }
  786. +  }
  787. + }
  788. + /*--------------------------------------------------------------------------*/
  789. + static void print_vswtch(const branch_t *brh, int where, int detail)
  790. + {
  791. +  const struct vswtch *x;
  792. +  x = (const struct vswtch*)brh->x;
  793. +  (void)printlabel(brh,where);
  794. +  printnodes(brh,where);
  795. +  mprintf(where, " %s ", x->modelname);
  796. +  if (x->ic == swOFF)
  797. +     mprintf(where, " off ");
  798. +  else if (x->ic == swON)
  799. +     mprintf(where, " on ");
  800. +  /* else (x->ic == swUNKNOWN) */
  801. +  mprintf(where, "\n");
  802. + }
  803. + /*--------------------------------------------------------------------------*/
  804. + static branch_t *create_model_vswtch(const functions_t *func)
  805. + {
  806. +  branch_t *brh;
  807. +  brh = create_std(func);
  808. +  brh->stprev = &modellist;
  809. +  return brh;
  810. + }
  811. + /*--------------------------------------------------------------------------*/
  812. + static branch_t *copy_model_vswtch(const branch_t *proto)
  813. + {
  814. +  branch_t *brh;
  815. +  brh = copy_std(proto);
  816. +  brh->stprev = &modellist;
  817. +  return brh;
  818. + }
  819. + /*--------------------------------------------------------------------------*/
  820. + static void parse_model_vswtch(branch_t *brh, const char *cmd, int *cnt)
  821. + {
  822. +  struct vswtchmod *m;
  823. +  m = (struct vswtchmod*)brh->x;
  824. +  (void)ctostr(cmd, cnt, brh->label, LABELEN, TOKENTERM);
  825. +  skiparg(cmd,cnt);    /* skip known "sw" */
  826. +  (void)skiplparen(cmd,cnt);
  827. +  for (;;){
  828. +     if (argparse(cmd,cnt,REPEAT,
  829. +     "VT",    aDOUBLE,    &m->vt,
  830. +     "VH",    aUDOUBLE,    &m->vh,
  831. +     "RON",    aDOUBLE,    &m->ron,
  832. +     "ROFF",    aDOUBLE,    &m->roff,
  833. +      ""))
  834. +        ;
  835. +     else{
  836. +        (void)skiprparen(cmd,cnt);
  837. +        syntax_check(cmd,cnt,bWARNING);
  838. +        break;
  839. +     }
  840. +  }
  841. + }
  842. + /*--------------------------------------------------------------------------*/
  843. + static void print_model_vswtch(const branch_t *brh, int where, int detail)
  844. + {
  845. +  const struct vswtchmod *m;
  846. +  m = (const struct vswtchmod*)brh->x;
  847. +  mprintf(where, ".model  %s  sw  (", brh->label);
  848. +  mprintf(where, " vt=%s ",  ftos(m->vt,  "", 7, 0));
  849. +  mprintf(where, " vh=%s ",  ftos(m->vh,  "", 7, 0));
  850. +  mprintf(where, " ron=%s ",   ftos(m->ron,   "", 7, 0));
  851. +  mprintf(where, " roff=%s ",  ftos(m->roff,  "", 7, 0));
  852. +  mprintf(where, ")\n");
  853. + }
  854. + /*--------------------------------------------------------------------------*/
  855. + static void expand_vswtch(branch_t *brh)
  856. + {
  857. +  struct vswtch *x;
  858. +  const struct vswtchmod *m;
  859. +  expandgeneric(brh,&modellist);
  860. +  x = (struct vswtch*)brh->x;
  861. +  m = x->m;
  862. +  brh->val = m->ron;
  863. +  brh->y0.f0 = LINEAR;
  864. +  if (x->ic == swON){
  865. +     brh->y0.f1 = m->ron;
  866. +  }else{            /* unknown is off */
  867. +     brh->y0.f1 = m->roff;
  868. +  }
  869. +  x->previous_state = x->current_state = x->ic;
  870. +  brh->m0.f1 = 1./brh->y0.f1;
  871. +  brh->m0.c0 = 0.;
  872. +  brh->ev.x  = brh->y0.f1;
  873. +  brh->ev.y  = 0.;
  874. +  brh->acg.x = brh->m0.f1;
  875. +  brh->acg.y = 0.;
  876. +  brh->nodamp = YES;
  877. + }
  878. + /*--------------------------------------------------------------------------*/
  879. + static int tr_vswtch(branch_t *brh)
  880. + {
  881. +  struct vswtch *x;
  882. +  const struct vswtchmod *m;
  883. +  double control;
  884. +  int new_state;
  885. +  
  886. +  x = (struct vswtch*)brh->x;
  887. +  m = x->m;
  888. +  
  889. +  if (stats.iter[iSTEP] <= 1){
  890. +     if (sim_phase == pINIT_DC){   
  891. +        if (x->ic == swON){
  892. +       brh->y0.f1 = m->ron;
  893. +        }else{
  894. +       brh->y0.f1 = m->roff;
  895. +        }
  896. +        x->current_state = x->ic;
  897. +        brh->m0.f1 = 1./brh->y0.f1;
  898. +     }
  899. +     x->previous_state = x->current_state;
  900. +  }
  901. +  
  902. +  control = tr_volts(&(brh->n[IN1]),&(brh->n[IN2]));
  903. +  if (control > m->vt + m->vh){
  904. +     new_state = swON;
  905. +  }else if (control < m->vt - m->vh){
  906. +     new_state = swOFF;
  907. +  }else{
  908. +     new_state = x->previous_state;
  909. +  }
  910. +  if (new_state != x->current_state){
  911. +     if (new_state == swON){
  912. +        brh->y0.f1 = m->ron;
  913. +     }else{
  914. +        brh->y0.f1 = m->roff;
  915. +     }
  916. +     x->current_state = new_state;
  917. +     brh->m0.f1 = 1./brh->y0.f1;
  918. +     trloadpassive(brh);
  919. +     return NO;
  920. +  }else{
  921. +     trloadpassive(brh);
  922. +     return YES;
  923. +  }
  924. + }
  925. + /*--------------------------------------------------------------------------*/
  926. + static void ac_vswtch(branch_t *brh)
  927. + {
  928. +  brh->ev.x  = brh->y0.f1;
  929. +  brh->ev.y  = 0.;
  930. +  brh->acg.x = brh->m0.f1;
  931. +  brh->acg.y = 0.;
  932. +  acloadpassivereal(brh);
  933. + }
  934. + /*--------------------------------------------------------------------------*/
  935. + /*--------------------------------------------------------------------------*/
  936. diff -cN ../acs-0.14/src/d_vswtch.h src/d_vswtch.h
  937. *** ../acs-0.14/src/d_vswtch.h
  938. --- src/d_vswtch.h    Sun Jul 31 23:09:40 1994
  939. ***************
  940. *** 0 ****
  941. --- 1,37 ----
  942. + /* d_vswtch.h  94.07.13
  943. +  * Copyright 1994  Albert Davis
  944. +  * data structures for voltage controlled switch
  945. +  */
  946. + #define vswDEFMOD_modelname    "-sw-"
  947. + #define vswDEFMOD_vt    0.0
  948. + #define vswDEFMOD_vh    0.0
  949. + #define vswDEFMOD_ron    1.0
  950. + #define vswDEFMOD_roff    1e+12
  951. + #define vswDEFDEV_modelname    vswDEFMOD_modelname
  952. + #define    vswDEFDEV_ic    swUNKNOWN
  953. + #define swUNKNOWN     0
  954. + #define    swON        1
  955. + #define swOFF        -1
  956. + struct vswtch {
  957. +    generic_t    *x;        /* (not used) */
  958. +    size_t    ssize;
  959. +    const struct vswtchmod *m;    /* model params */
  960. +    char     modelname[LABELEN+1];
  961. +    int        ic;        /* initial state */
  962. +    int        current_state;    /* state 1 iter ago (may be bad) */
  963. +    int        previous_state;    /* state 1 time or step ago (known good) */
  964. + };
  965. + struct vswtchmod {
  966. +    generic_t    *x;        /* owned expansion stuff (not used)    */
  967. +    size_t    ssize;        /* spice2 parameters            */
  968. +    double    vt;        /* threshold voltage            */
  969. +    double    vh;        /* hysteresis voltage            */
  970. +    double    ron;        /* on resistance            */
  971. +    double    roff;        /* off resistance            */
  972. + };
  973. diff -cN ../acs-0.14/src/dc_setup.c src/dc_setup.c
  974. *** ../acs-0.14/src/dc_setup.c    Wed Jul  6 12:11:50 1994
  975. --- src/dc_setup.c    Sun Jul 31 23:09:50 1994
  976. ***************
  977. *** 1,4 ****
  978. ! /* dc_setup.c  93.12.19
  979.    * Copyright 1983-1992   Albert Davis
  980.    * dc analysis setup
  981.    */
  982. --- 1,4 ----
  983. ! /* dc_setup.c  94.07.29
  984.    * Copyright 1983-1992   Albert Davis
  985.    * dc analysis setup
  986.    */
  987. ***************
  988. *** 131,137 ****
  989.       ;    
  990.       else if (isfloat(cmd[*cnt]))
  991.           dcoptby(cmd,cnt);
  992. !     else if (outset(cmd,cnt,(char*)NULL,((sim_mode==sOP)?"bi ":"dc ")))
  993.       ;
  994.       else{
  995.          syntax_check(cmd,cnt,bWARNING);
  996. --- 131,137 ----
  997.       ;    
  998.       else if (isfloat(cmd[*cnt]))
  999.           dcoptby(cmd,cnt);
  1000. !     else if (outset(cmd,cnt,"",""))
  1001.       ;
  1002.       else{
  1003.          syntax_check(cmd,cnt,bWARNING);
  1004. diff -cN ../acs-0.14/src/declare.h src/declare.h
  1005. *** ../acs-0.14/src/declare.h    Wed Jul  6 12:11:38 1994
  1006. --- src/declare.h    Sun Jul 31 23:09:40 1994
  1007. ***************
  1008. *** 1,4 ****
  1009. ! /* declare  94.05.06
  1010.    * Copyright 1983-1992   Albert Davis
  1011.    * declarations for type checking
  1012.    */
  1013. --- 1,4 ----
  1014. ! /* declare  94.07.15
  1015.    * Copyright 1983-1992   Albert Davis
  1016.    * declarations for type checking
  1017.    */
  1018. ***************
  1019. *** 61,67 ****
  1020.   /* crtset   */    void      cmd_crtset(const char*,int*);
  1021.           int      testcrt(void);
  1022.           struct graph *initcrt(void);
  1023. ! /* ctostr   */    char      *ctostr(const char*,int*,char*,int);
  1024.   /* ctof     */    double      ctof(const char*,int*);
  1025.           double      x10(int);
  1026.   /* ctoi     */    int      ctoi(const char*,int*);
  1027. --- 61,67 ----
  1028.   /* crtset   */    void      cmd_crtset(const char*,int*);
  1029.           int      testcrt(void);
  1030.           struct graph *initcrt(void);
  1031. ! /* ctostr   */    char      *ctostr(const char*,int*,char*,int,const char*);
  1032.   /* ctof     */    double      ctof(const char*,int*);
  1033.           double      x10(int);
  1034.   /* ctoi     */    int      ctoi(const char*,int*);
  1035. ***************
  1036. *** 130,136 ****
  1037.   /* insert   */    void      cmd_insert(const char*,int*);
  1038.   /* ipow     */    double      ipow(double,int);
  1039.   /* isfloat  */    int      isfloat(int);
  1040. ! /* isterm   */    int      isterm(int);
  1041.   /* itos     */    char      *itos(int,char*,int,int);
  1042.   /* line     */    void      initgraph(struct graph*);
  1043.            void      stext(int,int,const char*,int);
  1044. --- 130,136 ----
  1045.   /* insert   */    void      cmd_insert(const char*,int*);
  1046.   /* ipow     */    double      ipow(double,int);
  1047.   /* isfloat  */    int      isfloat(int);
  1048. ! /* isterm   */    int      isterm(int,const char*);
  1049.   /* itos     */    char      *itos(int,char*,int,int);
  1050.   /* line     */    void      initgraph(struct graph*);
  1051.            void      stext(int,int,const char*,int);
  1052. ***************
  1053. *** 151,157 ****
  1054.           void      cmd_unfault(void);
  1055.   /* nodes    */    int      newnode_subckt(void);
  1056.           int      newnode_model(void);
  1057. !         int      parsenodes(branch_t*,const char*,int*,int);
  1058.           void      printnodes(const branch_t*,int);
  1059.   /* nodeset  */    void      cmd_ic(const char*,int*);
  1060.           void      cmd_nodeset(const char*,int*);
  1061. --- 151,157 ----
  1062.           void      cmd_unfault(void);
  1063.   /* nodes    */    int      newnode_subckt(void);
  1064.           int      newnode_model(void);
  1065. !         int      parsenodes(branch_t*,const char*,int*);
  1066.           void      printnodes(const branch_t*,int);
  1067.   /* nodeset  */    void      cmd_ic(const char*,int*);
  1068.           void      cmd_nodeset(const char*,int*);
  1069. diff -cN ../acs-0.14/src/dev.c src/dev.c
  1070. *** ../acs-0.14/src/dev.c    Wed Jul  6 12:11:51 1994
  1071. --- src/dev.c    Sun Jul 31 23:09:51 1994
  1072. ***************
  1073. *** 1,4 ****
  1074. ! /* dev.c  94.07.03
  1075.    * Copyright 1983-1992   Albert Davis
  1076.    * top level device functions that call the specific one and
  1077.    * standard device functions to be used where nothing else is needed
  1078. --- 1,4 ----
  1079. ! /* dev.c  94.07.15
  1080.    * Copyright 1983-1992   Albert Davis
  1081.    * top level device functions that call the specific one and
  1082.    * standard device functions to be used where nothing else is needed
  1083. ***************
  1084. *** 149,155 ****
  1085.   void parse_std(branch_t *brh, const char *cmd, int *cnt)
  1086.   {
  1087.    parselabel(brh,cmd,cnt);
  1088. !  (void)parsenodes(brh,cmd,cnt,brh->f->numnodes);
  1089.    parseexpr(brh,cmd,cnt);
  1090.    if (brh->f->super)
  1091.       brh->f = brh->f->super;
  1092. --- 149,155 ----
  1093.   void parse_std(branch_t *brh, const char *cmd, int *cnt)
  1094.   {
  1095.    parselabel(brh,cmd,cnt);
  1096. !  (void)parsenodes(brh,cmd,cnt);
  1097.    parseexpr(brh,cmd,cnt);
  1098.    if (brh->f->super)
  1099.       brh->f = brh->f->super;
  1100. ***************
  1101. *** 160,166 ****
  1102.    */
  1103.   void parselabel(branch_t *brh, const char *cmd, int *cnt)
  1104.   {
  1105. !  (void)ctostr(cmd, cnt, brh->label, LABELEN);
  1106.    brh->label[0] = to_upper(brh->label[0]);
  1107.   }
  1108.   /*--------------------------------------------------------------------------*/
  1109. --- 160,166 ----
  1110.    */
  1111.   void parselabel(branch_t *brh, const char *cmd, int *cnt)
  1112.   {
  1113. !  (void)ctostr(cmd, cnt, brh->label, LABELEN, TOKENTERM);
  1114.    brh->label[0] = to_upper(brh->label[0]);
  1115.   }
  1116.   /*--------------------------------------------------------------------------*/
  1117. ***************
  1118. *** 315,329 ****
  1119.       double i0  = (brh->m0.f1  * brh->m0.x  + brh->m0.c0);
  1120.       double it1 = (brh->mt1.f1 * brh->mt1.x + brh->mt1.c0);
  1121.       return  (i0 - it1) / (brh->time0 - brh->time1);
  1122. - #ifdef KEEP_OLD_TIME_INFO
  1123. -  }else if (rematch("DDIddt")){
  1124. -     double i0  = (brh->m0.f1  * brh->m0.x  + brh->m0.c0);
  1125. -     double it1 = (brh->mt1.f1 * brh->mt1.x + brh->mt1.c0);
  1126. -     double it2 = (brh->mt2.f1 * brh->mt2.x + brh->mt2.c0);
  1127. -     double didt0 = (i0  - it1) / (brh->time0 - brh->time1);
  1128. -     double didt1 = (it1 - it2) / (brh->time1 - brh->time2);
  1129. -     return 2. * (didt0 - didt1) / (brh->time0 - brh->time2);
  1130. - #endif
  1131.    }else if (rematch("DTNew")){
  1132.       return brh->timef - brh->time0;
  1133.    }else if (rematch("DTOld")){
  1134. --- 315,320 ----
  1135. diff -cN ../acs-0.14/src/ecah.h src/ecah.h
  1136. *** ../acs-0.14/src/ecah.h    Wed Jul  6 12:11:39 1994
  1137. --- src/ecah.h    Sun Jul 31 23:09:40 1994
  1138. ***************
  1139. *** 1,4 ****
  1140. ! /* ecah.h  94.04.29
  1141.    * Copyright 1983-1992   Albert Davis
  1142.    * define assorted stuff
  1143.    */
  1144. --- 1,4 ----
  1145. ! /* ecah.h  94.07.13
  1146.    * Copyright 1983-1992   Albert Davis
  1147.    * define assorted stuff
  1148.    */
  1149. ***************
  1150. *** 27,32 ****
  1151. --- 27,33 ----
  1152.   #define DBVOLTMIN   (20.*log10(VOLTMIN))
  1153.   #define PWRMIN        (1.0e-100)
  1154.   #define DBPWRMIN    (10.*log10(PWRMIN))
  1155. + #define TOKENTERM   ",=()[]"
  1156.   
  1157.   #define    YES    (1)
  1158.   #define    NO    (0)
  1159. diff -cN ../acs-0.14/src/fanout.c src/fanout.c
  1160. *** ../acs-0.14/src/fanout.c    Wed Jul  6 12:12:01 1994
  1161. --- src/fanout.c    Sun Jul 31 23:10:01 1994
  1162. ***************
  1163. *** 1,4 ****
  1164. ! /* fanout.c  93.12.19
  1165.    * Copyright 1983-1992   Albert Davis
  1166.    * Prints out a list of all node connections.
  1167.    */
  1168. --- 1,4 ----
  1169. ! /* fanout.c  94.07.29
  1170.    * Copyright 1983-1992   Albert Davis
  1171.    * Prints out a list of all node connections.
  1172.    */
  1173. ***************
  1174. *** 41,47 ****
  1175.          skipbl(cmd,cnt);
  1176.          if (isdigit(cmd[*cnt]))
  1177.         stop = ctoi(cmd,cnt);
  1178. !     }else if (outset(cmd,cnt,(char*)NULL,"   ")){
  1179.          /*nothing*/;
  1180.       }else{
  1181.          syntax_check(cmd,cnt,bWARNING);
  1182. --- 41,47 ----
  1183.          skipbl(cmd,cnt);
  1184.          if (isdigit(cmd[*cnt]))
  1185.         stop = ctoi(cmd,cnt);
  1186. !     }else if (outset(cmd,cnt,"","")){
  1187.          /*nothing*/;
  1188.       }else{
  1189.          syntax_check(cmd,cnt,bWARNING);
  1190. diff -cN ../acs-0.14/src/fft.c src/fft.c
  1191. *** ../acs-0.14/src/fft.c    Wed Jul  6 12:12:02 1994
  1192. --- src/fft.c    Sun Jul 31 23:10:01 1994
  1193. ***************
  1194. *** 1,4 ****
  1195. ! /* fft.c  93.12.19
  1196.    * Copyright 1983-1992   Albert Davis
  1197.    * fast fourier transform
  1198.    */
  1199. --- 1,4 ----
  1200. ! /* fft.c  94.07.23
  1201.    * Copyright 1983-1992   Albert Davis
  1202.    * fast fourier transform
  1203.    */
  1204. ***************
  1205. *** 15,21 ****
  1206.    double wpwr, arg;
  1207.    
  1208.    s = (inv) ? 1 : -1;
  1209. !  for (nxp=n  ;    (nxp2=nxp/2)  ;  nxp=nxp2){
  1210.       wpwr = kPIx2 / nxp;
  1211.       for (m=0 ;     m<nxp2 ;  m++){
  1212.          register int j1, j2;
  1213. --- 15,21 ----
  1214.    double wpwr, arg;
  1215.    
  1216.    s = (inv) ? 1 : -1;
  1217. !  for (nxp=n  ;    (nxp2=nxp/2) > 0  ;  nxp=nxp2){
  1218.       wpwr = kPIx2 / nxp;
  1219.       for (m=0 ;     m<nxp2 ;  m++){
  1220.          register int j1, j2;
  1221. diff -cN ../acs-0.14/src/file.c src/file.c
  1222. *** ../acs-0.14/src/file.c    Wed Jul  6 12:12:02 1994
  1223. --- src/file.c    Sun Jul 31 23:10:02 1994
  1224. ***************
  1225. *** 1,4 ****
  1226. ! /* file.c  93.12.19
  1227.    * Copyright 1983-1992   Albert Davis
  1228.    * route output to & from files, get command
  1229.    */
  1230. --- 1,4 ----
  1231. ! /* file.c  94.07.29
  1232.    * Copyright 1983-1992   Albert Davis
  1233.    * route output to & from files, get command
  1234.    */
  1235. ***************
  1236. *** 41,47 ****
  1237.             ++*cnt;
  1238.             skipbl(cmd,cnt);
  1239.          }
  1240. !        files[nest] = xopen(cmd,cnt,"eca",access);
  1241.          if (files[nest]){
  1242.             mlog |= 1<<fileno(files[nest]);
  1243.             nest++;
  1244. --- 41,47 ----
  1245.             ++*cnt;
  1246.             skipbl(cmd,cnt);
  1247.          }
  1248. !        files[nest] = xopen(cmd,cnt,"",access);
  1249.          if (files[nest]){
  1250.             mlog |= 1<<fileno(files[nest]);
  1251.             nest++;
  1252. ***************
  1253. *** 82,88 ****
  1254.             ++*cnt;
  1255.             skipbl(cmd,cnt);
  1256.          }
  1257. !        files[nest] = xopen(cmd,cnt,"   ",access);
  1258.          if (files[nest]){
  1259.             mout       |= 1<<fileno(files[nest]);
  1260.             io.mstdout |= 1<<fileno(files[nest]);
  1261. --- 82,88 ----
  1262.             ++*cnt;
  1263.             skipbl(cmd,cnt);
  1264.          }
  1265. !        files[nest] = xopen(cmd,cnt,"",access);
  1266.          if (files[nest]){
  1267.             mout       |= 1<<fileno(files[nest]);
  1268.             io.mstdout |= 1<<fileno(files[nest]);
  1269. diff -cN ../acs-0.14/src/findbr.c src/findbr.c
  1270. *** ../acs-0.14/src/findbr.c    Wed Jul  6 12:12:02 1994
  1271. --- src/findbr.c    Sun Jul 31 23:10:02 1994
  1272. ***************
  1273. *** 1,4 ****
  1274. ! /* findbr.c  94.01.02
  1275.    * Copyright 1983-1992   Albert Davis
  1276.    * find a branch with matching label
  1277.    * returns the branch pointer
  1278. --- 1,4 ----
  1279. ! /* findbr.c  94.07.13
  1280.    * Copyright 1983-1992   Albert Davis
  1281.    * find a branch with matching label
  1282.    * returns the branch pointer
  1283. ***************
  1284. *** 30,36 ****
  1285.    char *wanted;
  1286.   
  1287.    save = *cnt;                /* copy the name to local space        */
  1288. !  (void)ctostr(cmd, cnt, labelwanted, BUFLEN);
  1289.   
  1290.    if (!labelwanted[1]){
  1291.       *cnt = save;            /* don't match single letter        */
  1292. --- 30,36 ----
  1293.    char *wanted;
  1294.   
  1295.    save = *cnt;                /* copy the name to local space        */
  1296. !  (void)ctostr(cmd, cnt, labelwanted, BUFLEN, TOKENTERM);
  1297.   
  1298.    if (!labelwanted[1]){
  1299.       *cnt = save;            /* don't match single letter        */
  1300. ***************
  1301. *** 50,56 ****
  1302.    brh = start;
  1303.    do {
  1304.       int dummy = 0;
  1305. !     (void)ctostr( brh->label, &dummy, thislabel, BUFLEN );
  1306.       if (wmatch(wanted,thislabel)){
  1307.          if (!dot){                /* found it */
  1308.             return (branch_t*)brh;
  1309. --- 50,56 ----
  1310.    brh = start;
  1311.    do {
  1312.       int dummy = 0;
  1313. !     (void)ctostr( brh->label, &dummy, thislabel, BUFLEN, TOKENTERM );
  1314.       if (wmatch(wanted,thislabel)){
  1315.          if (!dot){                /* found it */
  1316.             return (branch_t*)brh;
  1317. diff -cN ../acs-0.14/src/findfile.c src/findfile.c
  1318. *** ../acs-0.14/src/findfile.c    Wed Jul  6 12:12:03 1994
  1319. --- src/findfile.c    Sun Jul 31 23:10:02 1994
  1320. ***************
  1321. *** 1,4 ****
  1322. ! /* findfile.c  93.12.19
  1323.    * Modified by AD.  Sent to me by C-WARE
  1324.    * This file contains the routine to locate a file,
  1325.    *    using a path string for the directories to search.
  1326. --- 1,4 ----
  1327. ! /* findfile.c  94.07.13
  1328.    * Modified by AD.  Sent to me by C-WARE
  1329.    * This file contains the routine to locate a file,
  1330.    *    using a path string for the directories to search.
  1331. ***************
  1332. *** 34,41 ****
  1333.       t_ptr = target_buf;                /* copy the directory name        */
  1334.       while (*p_ptr != PATHSEP  &&  *p_ptr != '\0')
  1335.          *t_ptr++ = *p_ptr++;
  1336. !     if (t_ptr != target_buf  &&  t_ptr[-1] != '/'  &&  t_ptr[-1] != '\\')
  1337. !        *t_ptr++ = '/';                /* append '/' if needed        */
  1338.       *t_ptr = '\0';
  1339.       
  1340.       strcat(target_buf, filename);
  1341. --- 34,41 ----
  1342.       t_ptr = target_buf;                /* copy the directory name        */
  1343.       while (*p_ptr != PATHSEP  &&  *p_ptr != '\0')
  1344.          *t_ptr++ = *p_ptr++;
  1345. !     if (t_ptr != target_buf  &&  !strchr(ENDDIR,t_ptr[-1]))
  1346. !        *t_ptr++ = *ENDDIR;            /* append '/' if needed        */
  1347.       *t_ptr = '\0';
  1348.       
  1349.       strcat(target_buf, filename);
  1350. diff -cN ../acs-0.14/src/getckt.c src/getckt.c
  1351. *** ../acs-0.14/src/getckt.c    Wed Jul  6 12:12:04 1994
  1352. --- src/getckt.c    Sun Jul 31 23:10:03 1994
  1353. ***************
  1354. *** 1,4 ****
  1355. ! /* getckt.c  93.12.19
  1356.    * Copyright 1983-1992   Albert Davis
  1357.    * build, get, merge, "<" commands
  1358.    * process circuit files, and keyboard entry
  1359. --- 1,4 ----
  1360. ! /* getckt.c  94.07.29
  1361.    * Copyright 1983-1992   Albert Davis
  1362.    * build, get, merge, "<" commands
  1363.    * process circuit files, and keyboard entry
  1364. ***************
  1365. *** 116,122 ****
  1366.    stats.iter[iTOTAL] = 1;
  1367.    dealloc(YES);
  1368.    xclose(&filen);
  1369. !  filen = xopen(cmd,cnt,"ckt","r");
  1370.    if (!filen)
  1371.       error(bERROR, "");
  1372.   
  1373. --- 116,122 ----
  1374.    stats.iter[iTOTAL] = 1;
  1375.    dealloc(YES);
  1376.    xclose(&filen);
  1377. !  filen = xopen(cmd,cnt,"","r");
  1378.    if (!filen)
  1379.       error(bERROR, "");
  1380.   
  1381. ***************
  1382. *** 167,196 ****
  1383.   static branch_t *parsebranch(char *buffer, int alwaysdupcheck)
  1384.   {
  1385.    branch_t *brh;            /* place for cparse to return data        */
  1386. -  branch_t *old;            /* possible replace this one            */
  1387.    branch_t *before;        /* actually insert here                */
  1388.   
  1389.    before = insertbefore;        /* save insert place in case something like */
  1390.                    /* a subckt changes it                */
  1391.   
  1392. !  brh = cparse(buffer);                /* parse it                     */
  1393.    if (exists(brh)){
  1394. !     if (opt.dupcheck ||  alwaysdupcheck){
  1395. !        int dummy;            /* string index for parse package   */
  1396. !        dummy = 0;
  1397. !        old = findbranch(brh->label, &dummy, insertbefore, insertbefore->prev);
  1398. !        if (exists(old)){            /* already exists, replace it   */
  1399. !           error(bWARNING, "replacing: %s\n", brh->label);
  1400. !           brh->next = old->next;        /* set link so new is in same   */
  1401. !           (void)deletebranch(old);        /* place, then delete.        */
  1402. !        }else{
  1403. !           brh->next = before;
  1404. !        }
  1405. !     }else{
  1406.          brh->next = before;
  1407.       }
  1408. -     brh = insertbranch(brh);
  1409.    }
  1410.    if (isdevice(brh)){
  1411.       dealloc(YES);
  1412.    }
  1413. --- 167,195 ----
  1414.   static branch_t *parsebranch(char *buffer, int alwaysdupcheck)
  1415.   {
  1416.    branch_t *brh;            /* place for cparse to return data        */
  1417.    branch_t *before;        /* actually insert here                */
  1418.   
  1419. +  brh = (branch_t*)NULL;
  1420.    before = insertbefore;        /* save insert place in case something like */
  1421.                    /* a subckt changes it                */
  1422.   
  1423. !  if (opt.dupcheck ||  alwaysdupcheck){
  1424. !     int dummy = 0;
  1425. !     brh = findbranch(buffer, &dummy, insertbefore, insertbefore->prev);
  1426. !  }
  1427. !  
  1428.    if (exists(brh)){
  1429. !     int dummy = 0;
  1430. !     error(bWARNING, "replacing: %s\n", brh->label);
  1431. !     parse_branch(brh,buffer,&dummy);
  1432. !  }else{
  1433. !     brh = cparse(buffer);
  1434. !     if (exists(brh)){
  1435.          brh->next = before;
  1436. +        brh = insertbranch(brh);
  1437.       }
  1438.    }
  1439.    if (isdevice(brh)){
  1440.       dealloc(YES);
  1441.    }
  1442. ***************
  1443. *** 237,243 ****
  1444.       case 'P':    syntax_msg(cmd,cnt,bWARNING);        break;
  1445.       case 'Q':    brh = create_branch(&dev_bjt);        break;
  1446.       case 'R':    brh = create_branch(&dev_resistor);    break;
  1447. !     case 'S':    syntax_msg(cmd,cnt,bWARNING);        break;
  1448.       case 'T':    brh = create_branch(&dev_trnlin);    break;
  1449.       case 'U':    brh = create_branch(&dev_logic);    break;
  1450.       case 'V':    brh = create_branch(&dev_vs);        break;
  1451. --- 236,242 ----
  1452.       case 'P':    syntax_msg(cmd,cnt,bWARNING);        break;
  1453.       case 'Q':    brh = create_branch(&dev_bjt);        break;
  1454.       case 'R':    brh = create_branch(&dev_resistor);    break;
  1455. !     case 'S':    brh = create_branch(&dev_vswtch);    break;
  1456.       case 'T':    brh = create_branch(&dev_trnlin);    break;
  1457.       case 'U':    brh = create_branch(&dev_logic);    break;
  1458.       case 'V':    brh = create_branch(&dev_vs);        break;
  1459. diff -cN ../acs-0.14/src/isterm.c src/isterm.c
  1460. *** ../acs-0.14/src/isterm.c    Wed Jul  6 12:12:06 1994
  1461. --- src/isterm.c    Sun Jul 31 23:10:05 1994
  1462. ***************
  1463. *** 1,4 ****
  1464. ! /* isterm.c  93.12.19
  1465.    * Copyright 1983-1992   Albert Davis
  1466.    * return 1 if terminator (space, comma, =, or null)
  1467.    * else 0
  1468. --- 1,4 ----
  1469. ! /* isterm.c  94.07.13
  1470.    * Copyright 1983-1992   Albert Davis
  1471.    * return 1 if terminator (space, comma, =, or null)
  1472.    * else 0
  1473. ***************
  1474. *** 6,12 ****
  1475.   #include "ecah.h"
  1476.   #include "declare.h"
  1477.   
  1478. ! int isterm(int chr)
  1479.   {
  1480. !  return (chr=='\0' || isspace(chr) || strchr(",=()[]",chr));
  1481.   }
  1482. --- 6,12 ----
  1483.   #include "ecah.h"
  1484.   #include "declare.h"
  1485.   
  1486. ! int isterm(int chr, const char *term)
  1487.   {
  1488. !  return (chr=='\0' || isspace(chr) || strchr(term,chr));
  1489.   }
  1490. diff -cN ../acs-0.14/src/list.c src/list.c
  1491. *** ../acs-0.14/src/list.c    Wed Jul  6 12:12:07 1994
  1492. --- src/list.c    Sun Jul 31 23:10:06 1994
  1493. ***************
  1494. *** 1,4 ****
  1495. ! /* list.c  93.12.19
  1496.    * Copyright 1983-1992   Albert Davis
  1497.    * list and save commands.
  1498.    * save is list with direction to file
  1499. --- 1,4 ----
  1500. ! /* list.c  94.07.29
  1501.    * Copyright 1983-1992   Albert Davis
  1502.    * list and save commands.
  1503.    * save is list with direction to file
  1504. ***************
  1505. *** 25,31 ****
  1506.   void cmd_save(const char *cmd, int *cnt)
  1507.   {
  1508.    *cnt = 0;              /* back up to beginning of input line        */
  1509. !  (void)outset(cmd,cnt,(char*)NULL,"ckt");
  1510.                     /* (outset will re-eat words save or list)*/
  1511.                     /* its purpose is to set up where to send */
  1512.                     /* the stuff.                    */
  1513. --- 25,31 ----
  1514.   void cmd_save(const char *cmd, int *cnt)
  1515.   {
  1516.    *cnt = 0;              /* back up to beginning of input line        */
  1517. !  (void)outset(cmd,cnt,"","");
  1518.                     /* (outset will re-eat words save or list)*/
  1519.                     /* its purpose is to set up where to send */
  1520.                     /* the stuff.                    */
  1521. diff -cN ../acs-0.14/src/nodes.c src/nodes.c
  1522. *** ../acs-0.14/src/nodes.c    Wed Jul  6 12:12:08 1994
  1523. --- src/nodes.c    Sun Jul 31 23:10:08 1994
  1524. ***************
  1525. *** 1,4 ****
  1526. ! /* nodes.c  93.12.20
  1527.    * Copyright 1983-1992   Albert Davis
  1528.    * functions to handle node mapping
  1529.    */
  1530. --- 1,4 ----
  1531. ! /* nodes.c  94.07.23
  1532.    * Copyright 1983-1992   Albert Davis
  1533.    * functions to handle node mapping
  1534.    */
  1535. ***************
  1536. *** 9,15 ****
  1537.   /*--------------------------------------------------------------------------*/
  1538.       int    newnode_subckt(void);
  1539.       int    newnode_model(void);
  1540. !     int    parsenodes(branch_t*,const char*,int*,int);
  1541.       void    printnodes(const branch_t*,int);
  1542.   static    int    name2number(const char*,int*);
  1543.   static    char*    number2name(char*,int);
  1544. --- 9,15 ----
  1545.   /*--------------------------------------------------------------------------*/
  1546.       int    newnode_subckt(void);
  1547.       int    newnode_model(void);
  1548. !     int    parsenodes(branch_t*,const char*,int*);
  1549.       void    printnodes(const branch_t*,int);
  1550.   static    int    name2number(const char*,int*);
  1551.   static    char*    number2name(char*,int);
  1552. ***************
  1553. *** 34,47 ****
  1554.   /*--------------------------------------------------------------------------*/
  1555.   /* parsenodes: parse circuit connections from input string
  1556.    * result in brh.
  1557. !  * n array must hold at least nodecount+1
  1558.    * cnt updated.
  1559.    */
  1560. ! int parsenodes(branch_t *brh, const char *cmd, int *cnt, int nodecount)
  1561.   {
  1562.    int ii;
  1563.    int count = 0;
  1564. !  for (ii = 0;  ii < nodecount;  ii++){
  1565.       brh->n[ii].t = brh->n[ii].e = name2number(cmd,cnt);
  1566.       if (brh->n[ii].e != INVALIDNODE)
  1567.          count = ii+1;
  1568. --- 34,47 ----
  1569.   /*--------------------------------------------------------------------------*/
  1570.   /* parsenodes: parse circuit connections from input string
  1571.    * result in brh.
  1572. !  * n array must hold at least numnodes+1
  1573.    * cnt updated.
  1574.    */
  1575. ! int parsenodes(branch_t *brh, const char *cmd, int *cnt)
  1576.   {
  1577.    int ii;
  1578.    int count = 0;
  1579. !  for (ii = 0;  ii < brh->f->numnodes;  ii++){
  1580.       brh->n[ii].t = brh->n[ii].e = name2number(cmd,cnt);
  1581.       if (brh->n[ii].e != INVALIDNODE)
  1582.          count = ii+1;
  1583. diff -cN ../acs-0.14/src/patchlev.h src/patchlev.h
  1584. *** ../acs-0.14/src/patchlev.h    Wed Jul  6 12:11:41 1994
  1585. --- src/patchlev.h    Sun Jul 31 23:09:43 1994
  1586. ***************
  1587. *** 1,3 ****
  1588. ! /* patchlev.h  94.05.27
  1589.    */
  1590. ! #define PATCHLEVEL 14
  1591. --- 1,3 ----
  1592. ! /* patchlev.h  94.07.31
  1593.    */
  1594. ! #define PATCHLEVEL 15
  1595. diff -cN ../acs-0.14/src/probe.c src/probe.c
  1596. *** ../acs-0.14/src/probe.c    Wed Jul  6 12:12:13 1994
  1597. --- src/probe.c    Sun Jul 31 23:10:12 1994
  1598. ***************
  1599. *** 1,4 ****
  1600. ! /* probe.c  94.05.06
  1601.    * Copyright 1983-1992   Albert Davis
  1602.    * probe and plot commands
  1603.    * set up print and plot (select points, maintain probe lists)
  1604. --- 1,4 ----
  1605. ! /* probe.c  94.07.13
  1606.    * Copyright 1983-1992   Albert Davis
  1607.    * probe and plot commands
  1608.    * set up print and plot (select points, maintain probe lists)
  1609. ***************
  1610. *** 161,167 ****
  1611.    int oldcount = probecount;
  1612.    int paren = 0;
  1613.    prb.lo = prb.hi = 0.;
  1614. !  (void)ctostr(cmd,cnt,prb.what,LABELEN);    /* parameter */
  1615.    if (!*(prb.what))
  1616.       syntax_msg(cmd,cnt,bWARNING);
  1617.    paren += skiplparen(cmd,cnt);            /* device, node, etc. */
  1618. --- 161,167 ----
  1619.    int oldcount = probecount;
  1620.    int paren = 0;
  1621.    prb.lo = prb.hi = 0.;
  1622. !  (void)ctostr(cmd,cnt,prb.what,LABELEN,TOKENTERM);    /* parameter */
  1623.    if (!*(prb.what))
  1624.       syntax_msg(cmd,cnt,bWARNING);
  1625.    paren += skiplparen(cmd,cnt);            /* device, node, etc. */
  1626. ***************
  1627. *** 315,325 ****
  1628.    int dropcount = 0;
  1629.    int savecnt;
  1630.    savecnt = *cnt;
  1631. !  (void)ctostr(cmd,cnt,parameter,BUFLEN);
  1632.    strcat(parameter,"(");
  1633.    paren += skiplparen(cmd,cnt);            /* device, node, etc. */
  1634.    (void)ctostr(cmd, cnt, &(parameter[strlen(parameter)]), 
  1635. !                  BUFLEN-(int)strlen(parameter));
  1636.    strcat(parameter,")");
  1637.    paren -= skiprparen(cmd,cnt);
  1638.    if (paren != 0  || !*parameter)
  1639. --- 315,325 ----
  1640.    int dropcount = 0;
  1641.    int savecnt;
  1642.    savecnt = *cnt;
  1643. !  (void)ctostr(cmd,cnt,parameter,BUFLEN,TOKENTERM);
  1644.    strcat(parameter,"(");
  1645.    paren += skiplparen(cmd,cnt);            /* device, node, etc. */
  1646.    (void)ctostr(cmd, cnt, &(parameter[strlen(parameter)]), 
  1647. !                  BUFLEN-(int)strlen(parameter), TOKENTERM);
  1648.    strcat(parameter,")");
  1649.    paren -= skiprparen(cmd,cnt);
  1650.    if (paren != 0  || !*parameter)
  1651. diff -cN ../acs-0.14/src/syscall.c src/syscall.c
  1652. *** ../acs-0.14/src/syscall.c    Wed Jul  6 12:12:24 1994
  1653. --- src/syscall.c    Sun Jul 31 23:10:20 1994
  1654. ***************
  1655. *** 1,4 ****
  1656. ! /* syscall.c  93.12.21
  1657.    * Copyright 1983-1992   Albert Davis
  1658.    * system calls: change directory, invoke another program, invoke editor, etc.
  1659.    */
  1660. --- 1,4 ----
  1661. ! /* syscall.c  94.07.31
  1662.    * Copyright 1983-1992   Albert Davis
  1663.    * system calls: change directory, invoke another program, invoke editor, etc.
  1664.    */
  1665. ***************
  1666. *** 34,44 ****
  1667.    }else{
  1668.       strcpy(name, EDITFILE);
  1669.       (void)mktemp(name);
  1670. !     sprintf(args, "save %s\n", name);
  1671.       (void)cmdproc(args);
  1672. !     sprintf(args, "%s %s\n", editor, name);
  1673.       system(args);
  1674. !     sprintf(args, "get %s quiet\n", name);
  1675.       (void)cmdproc(args);
  1676.       (void)unlink(name);
  1677.    }
  1678. --- 34,44 ----
  1679.    }else{
  1680.       strcpy(name, EDITFILE);
  1681.       (void)mktemp(name);
  1682. !     sprintf(args, "save %s", name);
  1683.       (void)cmdproc(args);
  1684. !     sprintf(args, "%s %s", editor, name);
  1685.       system(args);
  1686. !     sprintf(args, "get %s quiet", name);
  1687.       (void)cmdproc(args);
  1688.       (void)unlink(name);
  1689.    }
  1690. ***************
  1691. *** 64,70 ****
  1692.    char buf[BUFLEN];
  1693.   
  1694.    if (cmd[*cnt])
  1695. !     (void)chdir(ctostr(cmd, cnt, buf, BUFLEN-1));
  1696.    if (getcwd(buf,BUFLEN))
  1697.       mprintf(io.mstderr, "%s\n", buf);
  1698.    else
  1699. --- 64,70 ----
  1700.    char buf[BUFLEN];
  1701.   
  1702.    if (cmd[*cnt])
  1703. !     (void)chdir(ctostr(cmd, cnt, buf, BUFLEN-1, ""));
  1704.    if (getcwd(buf,BUFLEN))
  1705.       mprintf(io.mstderr, "%s\n", buf);
  1706.    else
  1707. diff -cN ../acs-0.14/src/tr_adv.c src/tr_adv.c
  1708. *** ../acs-0.14/src/tr_adv.c    Wed Jul  6 12:12:16 1994
  1709. --- src/tr_adv.c    Sun Jul 31 23:10:14 1994
  1710. ***************
  1711. *** 1,4 ****
  1712. ! /* tr_adv.c  94.07.01
  1713.    * Copyright 1983-1992   Albert Davis
  1714.    * Functions to set up the next time step, and next iteration
  1715.    */
  1716. --- 1,4 ----
  1717. ! /* tr_adv.c  94.07.14
  1718.    * Copyright 1983-1992   Albert Davis
  1719.    * Functions to set up the next time step, and next iteration
  1720.    */
  1721. ***************
  1722. *** 24,42 ****
  1723.    brh->y1 = brh->y0;
  1724.    if (sim_mode == sDC  ||  sim_phase == pINIT_DC){    /* initial dc */
  1725.       brh->mt1 = brh->m0;
  1726. - #ifdef KEEP_OLD_TIME_INFO
  1727. -     brh->mt2 = brh->mt1;
  1728. - #endif
  1729.       brh->time0 = brh->time1 = brh->time2 = trtime0;
  1730.    }else if (brh->time0 != trtime0){    /* new time step */
  1731.       if (brh->time0 < trtime0){        /* forward */
  1732. - #ifdef KEEP_OLD_TIME_INFO
  1733. -        brh->mt2 = brh->mt1;
  1734. - #endif
  1735.          brh->mt1 = brh->m0;
  1736.          brh->yt3 = brh->yt2;
  1737.          brh->yt2 = brh->yt1;
  1738.          brh->yt1 = brh->y0;
  1739.          brh->time2 = brh->time1;
  1740.          brh->time1 = brh->time0;
  1741.       }                    /* else backward, don't save */
  1742. --- 24,37 ----
  1743.    brh->y1 = brh->y0;
  1744.    if (sim_mode == sDC  ||  sim_phase == pINIT_DC){    /* initial dc */
  1745.       brh->mt1 = brh->m0;
  1746.       brh->time0 = brh->time1 = brh->time2 = trtime0;
  1747.    }else if (brh->time0 != trtime0){    /* new time step */
  1748.       if (brh->time0 < trtime0){        /* forward */
  1749.          brh->mt1 = brh->m0;
  1750.          brh->yt3 = brh->yt2;
  1751.          brh->yt2 = brh->yt1;
  1752.          brh->yt1 = brh->y0;
  1753. +        brh->time3 = brh->time2;
  1754.          brh->time2 = brh->time1;
  1755.          brh->time1 = brh->time0;
  1756.       }                    /* else backward, don't save */
  1757. diff -cN ../acs-0.14/src/tr_load.c src/tr_load.c
  1758. *** ../acs-0.14/src/tr_load.c    Wed Jul  6 12:12:19 1994
  1759. --- src/tr_load.c    Sun Jul 31 23:10:16 1994
  1760. ***************
  1761. *** 1,4 ****
  1762. ! /* tr_load.c  94.05.26
  1763.    * Copyright 1983-1992   Albert Davis
  1764.    * Load matrix from pre-computed values
  1765.    */
  1766. --- 1,4 ----
  1767. ! /* tr_load.c  94.07.11
  1768.    * Copyright 1983-1992   Albert Davis
  1769.    * Load matrix from pre-computed values
  1770.    */
  1771. ***************
  1772. *** 36,42 ****
  1773.       error(bDANGER, "%s: double load\n", printlabel(brh,0));
  1774.    brh->loaditer = stats.iter[iTOTAL];
  1775.    
  1776. !  if (stats.iter[iSTEP] > 1){
  1777.       dc0 = opt.damp * (brh->m0.c0 - brh->m1.c0);
  1778.       brh->m0.c0 = brh->m1.c0 + dc0;
  1779.       if (!inc_mode){
  1780. --- 36,42 ----
  1781.       error(bDANGER, "%s: double load\n", printlabel(brh,0));
  1782.    brh->loaditer = stats.iter[iTOTAL];
  1783.    
  1784. !  if (stats.iter[iSTEP] > 1  &&  !brh->nodamp){
  1785.       dc0 = opt.damp * (brh->m0.c0 - brh->m1.c0);
  1786.       brh->m0.c0 = brh->m1.c0 + dc0;
  1787.       if (!inc_mode){
  1788. ***************
  1789. *** 70,76 ****
  1790.       error(bDANGER, "%s: double load\n", printlabel(brh,0));
  1791.    brh->loaditer = stats.iter[iTOTAL];
  1792.    
  1793. !  if (stats.iter[iSTEP] > 1){
  1794.       dc0 = opt.damp * (brh->m0.c0 - brh->m1.c0);
  1795.       brh->m0.c0 = brh->m1.c0 + dc0;
  1796.       df1 = opt.damp * (brh->m0.f1 - brh->m1.f1);
  1797. --- 70,76 ----
  1798.       error(bDANGER, "%s: double load\n", printlabel(brh,0));
  1799.    brh->loaditer = stats.iter[iTOTAL];
  1800.    
  1801. !  if (stats.iter[iSTEP] > 1  &&  !brh->nodamp){
  1802.       dc0 = opt.damp * (brh->m0.c0 - brh->m1.c0);
  1803.       brh->m0.c0 = brh->m1.c0 + dc0;
  1804.       df1 = opt.damp * (brh->m0.f1 - brh->m1.f1);
  1805. ***************
  1806. *** 123,129 ****
  1807.       error(bDANGER, "%s: double load\n", printlabel(brh,0));
  1808.    brh->loaditer = stats.iter[iTOTAL];
  1809.   
  1810. !  if (stats.iter[iSTEP] > 1){
  1811.       dc0 = opt.damp * (brh->m0.c0 - brh->m1.c0);
  1812.       brh->m0.c0 = brh->m1.c0 + dc0;
  1813.       df1 = opt.damp * (brh->m0.f1 - brh->m1.f1);
  1814. --- 123,129 ----
  1815.       error(bDANGER, "%s: double load\n", printlabel(brh,0));
  1816.    brh->loaditer = stats.iter[iTOTAL];
  1817.   
  1818. !  if (stats.iter[iSTEP] > 1  &&  !brh->nodamp){
  1819.       dc0 = opt.damp * (brh->m0.c0 - brh->m1.c0);
  1820.       brh->m0.c0 = brh->m1.c0 + dc0;
  1821.       df1 = opt.damp * (brh->m0.f1 - brh->m1.f1);
  1822. diff -cN ../acs-0.14/src/tr_reviw.c src/tr_reviw.c
  1823. *** ../acs-0.14/src/tr_reviw.c    Wed Jul  6 12:12:20 1994
  1824. --- src/tr_reviw.c    Sun Jul 31 23:10:17 1994
  1825. ***************
  1826. *** 1,4 ****
  1827. ! /* tr_reviw.c  94.06.05
  1828.    * Copyright 1983-1992   Albert Davis
  1829.    * review the solution after solution at a time point
  1830.    * Set up events, evaluate logic inputs, truncation error.
  1831. --- 1,4 ----
  1832. ! /* tr_reviw.c  94.07.23
  1833.    * Copyright 1983-1992   Albert Davis
  1834.    * review the solution after solution at a time point
  1835.    * Set up events, evaluate logic inputs, truncation error.
  1836. ***************
  1837. *** 81,98 ****
  1838.   
  1839.    worsttime = BIGBIG;
  1840.    if (exists(brh)){
  1841. -     const branch_t *controller;
  1842. -     controller = brh;
  1843.       stop = brh;
  1844.       do {
  1845.          devicetime = tr_review_branch(brh);
  1846.          if (devicetime < worsttime){
  1847.             worsttime = devicetime;
  1848. -       controller = brh;
  1849.          }
  1850.       } while (brh=nextbranch_dev(brh),  brh != stop);
  1851. -     error(bTRACE,"%s: t-1=%e  t-0=%e  t+1=%e\n", printlabel(controller,0),
  1852. -              controller->time1, controller->time0, worsttime);
  1853.    }
  1854.    return worsttime;
  1855.   }
  1856. --- 81,93 ----
  1857. diff -cN ../acs-0.14/src/tr_setup.c src/tr_setup.c
  1858. *** ../acs-0.14/src/tr_setup.c    Wed Jul  6 12:12:21 1994
  1859. --- src/tr_setup.c    Sun Jul 31 23:10:18 1994
  1860. ***************
  1861. *** 1,4 ****
  1862. ! /* tr_setup.c  94.06.23
  1863.    * Copyright 1983-1992   Albert Davis
  1864.    * set up transient and fourier analysis
  1865.    */
  1866. --- 1,4 ----
  1867. ! /* tr_setup.c  94.07.29
  1868.    * Copyright 1983-1992   Albert Davis
  1869.    * set up transient and fourier analysis
  1870.    */
  1871. ***************
  1872. *** 206,212 ****
  1873.       "WAtch",    aENUM,        &tr->trace,    tITERATION,
  1874.       ""))
  1875.       ;    
  1876. !     else if (outset(cmd,cnt,(char*)NULL,((sim_mode==sTRAN)?"tr ":"fo ")))
  1877.       ;
  1878.       else{
  1879.          syntax_check(cmd,cnt,bWARNING);
  1880. --- 206,212 ----
  1881.       "WAtch",    aENUM,        &tr->trace,    tITERATION,
  1882.       ""))
  1883.       ;    
  1884. !     else if (outset(cmd,cnt,"",""))
  1885.       ;
  1886.       else{
  1887.          syntax_check(cmd,cnt,bWARNING);
  1888. diff -cN ../acs-0.14/src/types.h src/types.h
  1889. *** ../acs-0.14/src/types.h    Wed Jul  6 12:11:43 1994
  1890. --- src/types.h    Sun Jul 31 23:09:45 1994
  1891. ***************
  1892. *** 1,4 ****
  1893. ! /* types.h  11/19/91
  1894.    * Copyright 1983-1992   Albert Davis
  1895.    * external declarations for device models
  1896.    */
  1897. --- 1,4 ----
  1898. ! /* types.h  94.07.12
  1899.    * Copyright 1983-1992   Albert Davis
  1900.    * external declarations for device models
  1901.    */
  1902. ***************
  1903. *** 18,25 ****
  1904. --- 18,27 ----
  1905.   extern functions_t dev_vccs;
  1906.   extern functions_t dev_vcvs;
  1907.   extern functions_t dev_vs;
  1908. + extern functions_t dev_vswtch;
  1909.   extern functions_t model_bjt;
  1910.   extern functions_t model_diode;
  1911.   extern functions_t model_logic;
  1912.   extern functions_t model_mos;
  1913.   extern functions_t model_subckt;
  1914. + extern functions_t model_vswtch;
  1915. diff -cN ../acs-0.14/src/xopen.c src/xopen.c
  1916. *** ../acs-0.14/src/xopen.c    Wed Jul  6 12:12:25 1994
  1917. --- src/xopen.c    Sun Jul 31 23:10:21 1994
  1918. ***************
  1919. *** 1,4 ****
  1920. ! /* xopen.c  93.12.21
  1921.    * Copyright 1983-1992   Albert Davis
  1922.    * scan a string for a file name
  1923.    * fill in extension, if necessary
  1924. --- 1,4 ----
  1925. ! /* xopen.c  94.07.13
  1926.    * Copyright 1983-1992   Albert Davis
  1927.    * scan a string for a file name
  1928.    * fill in extension, if necessary
  1929. ***************
  1930. *** 22,32 ****
  1931.    }
  1932.   }
  1933.   /*--------------------------------------------------------------------------*/
  1934.   FILE *xopen(const char *cmd, int *cnt, const char *ext, const char *how)
  1935.   {
  1936. !  int i;
  1937. !  int defalt;
  1938. !  FILE *code;
  1939.    char fname[BUFLEN+5];
  1940.   
  1941.    skipbl(cmd,cnt);
  1942. --- 22,38 ----
  1943.    }
  1944.   }
  1945.   /*--------------------------------------------------------------------------*/
  1946. + /* xopen: open a file from a command string
  1947. +  *     scan and eat up the name from the command
  1948. +  *    add default extension if appropriate
  1949. +  *    if there is no name, prompt for one
  1950. +  *    trap errors of not found and clobber
  1951. +  */
  1952.   FILE *xopen(const char *cmd, int *cnt, const char *ext, const char *how)
  1953.   {
  1954. !  int i;        /* an index */
  1955. !  int defalt;    /* flag: we need to add the default extension */
  1956. !  FILE *code;    /* a file pointer for the file we found */
  1957.    char fname[BUFLEN+5];
  1958.   
  1959.    skipbl(cmd,cnt);
  1960. ***************
  1961. *** 36,62 ****
  1962.       loccount = 0;
  1963.       cnt = &loccount;
  1964.    }
  1965.    skipbl(cmd,cnt);            /* find out if we want to add the   */
  1966.    defalt = YES;                /* default extension            */
  1967.    for (i = 0;   i < BUFLEN;   ){
  1968.       char c;
  1969.       c = cmd[(*cnt)++];
  1970. !     if (isterm(c))
  1971.          break;
  1972.       if (c == '$'){
  1973.          sprintf(&(fname[i]), "%ld", (long)time((time_t*)NULL));
  1974.          i = strlen(fname);
  1975. !     }else{
  1976. !        fname[i++] = c;
  1977. !        if (c == '.')
  1978. !           defalt = NO;
  1979. !        else if (c == '\\'  ||  c == '/')
  1980. !           defalt = YES;
  1981. !     }
  1982. !  }
  1983.    (*cnt)--;
  1984. !  if (defalt){                /* add the extension            */
  1985.       fname[i++] = '.';
  1986.       strcpy(&fname[i],ext);
  1987.    }else{
  1988. --- 42,69 ----
  1989.       loccount = 0;
  1990.       cnt = &loccount;
  1991.    }
  1992. !                     /* copy the name            */
  1993. !                     /* and while we're at it ...        */
  1994.    skipbl(cmd,cnt);            /* find out if we want to add the   */
  1995.    defalt = YES;                /* default extension            */
  1996.    for (i = 0;   i < BUFLEN;   ){
  1997.       char c;
  1998.       c = cmd[(*cnt)++];
  1999. !     if (!c || isspace(c))
  2000.          break;
  2001.       if (c == '$'){
  2002.          sprintf(&(fname[i]), "%ld", (long)time((time_t*)NULL));
  2003.          i = strlen(fname);
  2004. !     }else{                /* we want to add the extension        */
  2005. !        fname[i++] = c;            /* if it doesn't already have one,  */
  2006. !        if (c == '.')            /* as determined by a '.'        */
  2007. !           defalt = NO;            /* not before the directory        */
  2008. !        else if (strchr(ENDDIR,c))    /* separator-terminator character   */
  2009. !           defalt = YES;            /* '\' or '/' for msdos,        */
  2010. !     }                      /* ']' or '/' for vms,            */
  2011. !  }                    /* '/' for unix  (in ENDDIR)        */
  2012.    (*cnt)--;
  2013. !  if (defalt && ext && *ext){        /* add the extension (maybe)        */
  2014.       fname[i++] = '.';
  2015.       strcpy(&fname[i],ext);
  2016.    }else{
  2017.