Jspice3
proc2mod.c
Go to the documentation of this file.
1 /**********
2 Copyright 1990 Regents of the University of California. All rights reserved.
3 **********/
4 /* convert .process file to set of .model cards */
5 
6 #include "spice.h"
7 #include <stdio.h>
8 #include "inpdefs.h"
9 #include "misc.h"
10 
11 #ifndef HAVE_PERROR
12 void perror();
13 #endif
14 
15 #ifdef __STDC__
16 void getdata(double*,int,int);
17 #else /* stdc */
18 void getdata();
19 #endif /* stdc */
20 
21 typedef struct snmod {
22  struct snmod *nnext;
23  char *nname;
24  double nparms[69];
25 } nmod;
26 typedef struct spmod {
27  struct spmod *pnext;
28  char *pname;
29  double pparms[69];
30 } pmod;
31 typedef struct sdmod {
32  struct sdmod *dnext;
33  char *dname;
34  double dparms[10];
35 } dmod;
36 typedef struct symod {
37  struct symod *ynext;
38  char *yname;
39  double yparms[10];
40 } ymod;
41 typedef struct smmod {
42  struct smmod *mnext;
43  char *mname;
44  double mparms[10];
45 } mmod;
46 
47 FILE *m = NULL;
48 FILE *p = NULL;
49 char *dataline;
50 
51 
52 int
53 main() {
54  char *typeline;
55  char *prname;
56  nmod *nlist=NULL,*ncur;
57  pmod *plist=NULL,*pcur;
58  dmod *dlist=NULL,*dcur;
59  ymod *ylist=NULL,*ycur;
60  mmod *mlist=NULL,*mcur;
61  char *filename;
62 
63 
64  filename = (char *)malloc(1024);
65  typeline = (char *)malloc(1024);
66  dataline = (char *)malloc(1024);
67 
68  while(p == NULL) {
69  printf("name of process file (input): ");
70  if(scanf("%s",filename)!=1) {
71  printf("error reading process file name\n");
72  return (1);
73  }
74  p = fopen(filename,"r");
75  if(p==NULL) {
76  printf("can't open %s:",filename);
77  perror("");
78  }
79  }
80  while(m == NULL) {
81  printf("name of .model file (output): ");
82  if(scanf("%s",filename)!=1) {
83  printf("error reading model file name\n");
84  return (1);
85  }
86  m = fopen(filename,"w");
87  if(m==NULL) {
88  printf("can't open %s:",filename);
89  perror("");
90  }
91  }
92  printf("process name : ");
93  if(scanf("%s",filename)!=1) {
94  printf("error reading process name\n");
95  return (1);
96  }
97  prname = filename;
98  if(fgets(typeline,1023,p)==NULL) {
99  printf("error reading input description line\n");
100  return (1);
101  }
102  strtolower(typeline);
103  while(1) {
104  while(*typeline == ' ' || *typeline == '\t' || *typeline == ',' ||
105  *typeline == '\n' ) {
106  typeline ++;
107  }
108  if(*typeline == '\0') break;
109  if(strncmp("nm",typeline,2) == 0) {
110  ncur = (nmod *)malloc(sizeof(nmod));
111  ncur->nnext = NULL;
112  ncur->nname = typeline;
113  *(typeline+3) = (char)NULL;
114  typeline += 4;
115  getdata(ncur->nparms,69,3);
116  ncur->nnext = nlist;
117  nlist = ncur;
118  } else if(strncmp("pm",typeline,2) == 0) {
119  pcur = (pmod *)malloc(sizeof(pmod));
120  pcur->pnext = NULL;
121  pcur->pname = typeline;
122  *(typeline+3) = (char)NULL;
123  typeline += 4;
124  getdata(pcur->pparms,69,3);
125  pcur->pnext = plist;
126  plist = pcur;
127  } else if(strncmp("py",typeline,2) == 0) {
128  ycur = (ymod *)malloc(sizeof(ymod));
129  ycur->ynext = NULL;
130  ycur->yname = typeline;
131  *(typeline+3) = (char)NULL;
132  typeline += 4;
133  getdata(ycur->yparms,10,5);
134  ycur->ynext = ylist;
135  ylist = ycur;
136  } else if(strncmp("du",typeline,2) == 0) {
137  dcur = (dmod *)malloc(sizeof(dmod));
138  dcur->dnext = NULL;
139  dcur->dname = typeline;
140  *(typeline+3) = (char)NULL;
141  typeline += 4;
142  getdata(dcur->dparms,10,5);
143  dcur->dnext = dlist;
144  dlist = dcur;
145  } else if(strncmp("ml",typeline,2) == 0) {
146  mcur = (mmod *)malloc(sizeof(mmod));
147  mcur->mnext = NULL;
148  mcur->mname = typeline;
149  *(typeline+3) = (char)NULL;
150  typeline += 4;
151  getdata(mcur->mparms,10,5);
152  mcur->mnext = mlist;
153  mlist = mcur;
154  } else {
155  printf(" illegal header line in process file: run terminated\n");
156  printf(" error occurred while parsing %s\n",typeline);
157  return (1);
158  }
159  }
160  for(dcur=dlist;dcur;dcur=dcur->dnext) {
161  fprintf(m,".model %s_%s r rsh = %g defw = %g narrow = %g\n",
162  prname,dcur->dname,dcur->dparms[0],dcur->dparms[8],dcur->dparms[9]);
163  fprintf(m,".model %s_%s c cj = %g cjsw = %g defw = %g narrow = %g\n",
164  prname,dcur->dname,dcur->dparms[1],dcur->dparms[2],dcur->dparms[8],
165  dcur->dparms[9]);
166  }
167  for(ycur=ylist;ycur;ycur=ycur->ynext) {
168  fprintf(m,".model %s_%s r rsh = %g defw = %g narrow = %g\n",
169  prname,ycur->yname,ycur->yparms[0],ycur->yparms[8],ycur->yparms[9]);
170  fprintf(m,".model %s_%s c cj = %g cjsw = %g defw = %g narrow = %g\n",
171  prname,ycur->yname,ycur->yparms[1],ycur->yparms[2],ycur->yparms[8],
172  ycur->yparms[9]);
173  }
174  for(mcur=mlist;mcur;mcur=mcur->mnext) {
175  fprintf(m,".model %s_%s r rsh = %g defw = %g narrow = %g\n",
176  prname,mcur->mname,mcur->mparms[0],mcur->mparms[8],mcur->mparms[9]);
177  fprintf(m,".model %s_%s c cj = %g cjsw = %g defw = %g narrow = %g\n",
178  prname,mcur->mname,mcur->mparms[1],mcur->mparms[2],mcur->mparms[8],
179  mcur->mparms[9]);
180  }
181  for(pcur=plist;pcur;pcur=pcur->pnext) {
182  for(dcur=dlist;dcur;dcur=dcur->dnext) {
183  fprintf(m,".model %s_%s_%s pmos level=4\n",prname,pcur->pname,
184  dcur->dname);
185  fprintf(m,"+ vfb = %g lvfb = %g wvfb = %g\n",
186  pcur->pparms[0],pcur->pparms[1],pcur->pparms[2]);
187  fprintf(m,"+ phi = %g lphi = %g wphi = %g\n",
188  pcur->pparms[3],pcur->pparms[4],pcur->pparms[5]);
189  fprintf(m,"+ k1 = %g lk1 = %g wk1 = %g\n",
190  pcur->pparms[6],pcur->pparms[7],pcur->pparms[8]);
191  fprintf(m,"+ k2 = %g lk2 = %g wk2 = %g\n",
192  pcur->pparms[9],pcur->pparms[10],pcur->pparms[11]);
193  fprintf(m,"+ eta = %g leta = %g weta = %g\n",
194  pcur->pparms[12],pcur->pparms[13],pcur->pparms[14]);
195  fprintf(m,"+ muz = %g dl = %g dw = %g\n",
196  pcur->pparms[15],pcur->pparms[16],pcur->pparms[17]);
197  fprintf(m,"+ u0 = %g lu0 = %g wu0 = %g\n",
198  pcur->pparms[18],pcur->pparms[19],pcur->pparms[20]);
199  fprintf(m,"+ u1 = %g lu1 = %g wu1 = %g\n",
200  pcur->pparms[21],pcur->pparms[22],pcur->pparms[23]);
201  fprintf(m,"+ x2mz = %g lx2mz = %g wx2mz = %g\n",
202  pcur->pparms[24],pcur->pparms[25],pcur->pparms[26]);
203  fprintf(m,"+ x2e = %g lx2e = %g wx2e = %g\n",
204  pcur->pparms[27],pcur->pparms[28],pcur->pparms[29]);
205  fprintf(m,"+ x3e = %g lx3e = %g wx3e = %g\n",
206  pcur->pparms[30],pcur->pparms[31],pcur->pparms[32]);
207  fprintf(m,"+ x2u0 = %g lx2u0 = %g wx2u0 = %g\n",
208  pcur->pparms[33],pcur->pparms[34],pcur->pparms[35]);
209  fprintf(m,"+ x2u1 = %g lx2u1 = %g wx2u1 = %g\n",
210  pcur->pparms[36],pcur->pparms[37],pcur->pparms[38]);
211  fprintf(m,"+ mus = %g lmus = %g wmus = %g\n",
212  pcur->pparms[39],pcur->pparms[40],pcur->pparms[41]);
213  fprintf(m,"+ x2ms = %g lx2ms = %g wx2ms = %g\n",
214  pcur->pparms[42],pcur->pparms[43],pcur->pparms[44]);
215  fprintf(m,"+ x3ms = %g lx3ms = %g wx3ms = %g\n",
216  pcur->pparms[45],pcur->pparms[46],pcur->pparms[47]);
217  fprintf(m,"+ x3u1 = %g lx3u1 = %g wx3u1 = %g\n",
218  pcur->pparms[48],pcur->pparms[49],pcur->pparms[50]);
219  fprintf(m,"+ tox = %g temp = %g vdd = %g\n",
220  pcur->pparms[51],pcur->pparms[52],pcur->pparms[53]);
221  fprintf(m,"+ cgdo = %g cgso = %g cgbo = %g\n",
222  pcur->pparms[54],pcur->pparms[55],pcur->pparms[56]);
223  fprintf(m,"+ xpart = %g \n",
224  pcur->pparms[57]);
225  fprintf(m,"+ n0 = %g ln0 = %g wn0 = %g\n",
226  pcur->pparms[60],pcur->pparms[61],pcur->pparms[62]);
227  fprintf(m,"+ nb = %g lnb = %g wnb = %g\n",
228  pcur->pparms[63],pcur->pparms[64],pcur->pparms[65]);
229  fprintf(m,"+ nd = %g lnd = %g wnd = %g\n",
230  pcur->pparms[66],pcur->pparms[67],pcur->pparms[68]);
231  fprintf(m,"+ rsh = %g cj = %g cjsw = %g\n",
232  dcur->dparms[0], dcur->dparms[1], dcur->dparms[2]);
233  fprintf(m,"+ js = %g pb = %g pbsw = %g\n",
234  dcur->dparms[3], dcur->dparms[4], dcur->dparms[5]);
235  fprintf(m,"+ mj = %g mjsw = %g wdf = %g\n",
236  dcur->dparms[6], dcur->dparms[7], dcur->dparms[8]);
237  fprintf(m,"+ dell = %g\n",
238  dcur->dparms[9]);
239  }
240  }
241  for(ncur=nlist;ncur;ncur=ncur->nnext) {
242  for(dcur=dlist;dcur;dcur=dcur->dnext) {
243  fprintf(m,".model %s_%s_%s nmos level=4\n",prname,ncur->nname,
244  dcur->dname);
245  fprintf(m,"+ vfb = %g lvfb = %g wvfb = %g\n",
246  ncur->nparms[0],ncur->nparms[1],ncur->nparms[2]);
247  fprintf(m,"+ phi = %g lphi = %g wphi = %g\n",
248  ncur->nparms[3],ncur->nparms[4],ncur->nparms[5]);
249  fprintf(m,"+ k1 = %g lk1 = %g wk1 = %g\n",
250  ncur->nparms[6],ncur->nparms[7],ncur->nparms[8]);
251  fprintf(m,"+ k2 = %g lk2 = %g wk2 = %g\n",
252  ncur->nparms[9],ncur->nparms[10],ncur->nparms[11]);
253  fprintf(m,"+ eta = %g leta = %g weta = %g\n",
254  ncur->nparms[12],ncur->nparms[13],ncur->nparms[14]);
255  fprintf(m,"+ muz = %g dl = %g dw = %g\n",
256  ncur->nparms[15],ncur->nparms[16],ncur->nparms[17]);
257  fprintf(m,"+ u0 = %g lu0 = %g wu0 = %g\n",
258  ncur->nparms[18],ncur->nparms[19],ncur->nparms[20]);
259  fprintf(m,"+ u1 = %g lu1 = %g wu1 = %g\n",
260  ncur->nparms[21],ncur->nparms[22],ncur->nparms[23]);
261  fprintf(m,"+ x2mz = %g lx2mz = %g wx2mz = %g\n",
262  ncur->nparms[24],ncur->nparms[25],ncur->nparms[26]);
263  fprintf(m,"+ x2e = %g lx2e = %g wx2e = %g\n",
264  ncur->nparms[27],ncur->nparms[28],ncur->nparms[29]);
265  fprintf(m,"+ x3e = %g lx3e = %g wx3e = %g\n",
266  ncur->nparms[30],ncur->nparms[31],ncur->nparms[32]);
267  fprintf(m,"+ x2u0 = %g lx2u0 = %g wx2u0 = %g\n",
268  ncur->nparms[33],ncur->nparms[34],ncur->nparms[35]);
269  fprintf(m,"+ x2u1 = %g lx2u1 = %g wx2u1 = %g\n",
270  ncur->nparms[36],ncur->nparms[37],ncur->nparms[38]);
271  fprintf(m,"+ mus = %g lmus = %g wmus = %g\n",
272  ncur->nparms[39],ncur->nparms[40],ncur->nparms[41]);
273  fprintf(m,"+ x2ms = %g lx2ms = %g wx2ms = %g\n",
274  ncur->nparms[42],ncur->nparms[43],ncur->nparms[44]);
275  fprintf(m,"+ x3ms = %g lx3ms = %g wx3ms = %g\n",
276  ncur->nparms[45],ncur->nparms[46],ncur->nparms[47]);
277  fprintf(m,"+ x3u1 = %g lx3u1 = %g wx3u1 = %g\n",
278  ncur->nparms[48],ncur->nparms[49],ncur->nparms[50]);
279  fprintf(m,"+ tox = %g temp = %g vdd = %g\n",
280  ncur->nparms[51],ncur->nparms[52],ncur->nparms[53]);
281  fprintf(m,"+ cgdo = %g cgso = %g cgbo = %g\n",
282  ncur->nparms[54],ncur->nparms[55],ncur->nparms[56]);
283  fprintf(m,"+ xpart = %g \n",
284  ncur->nparms[57]);
285  fprintf(m,"+ n0 = %g ln0 = %g wn0 = %g\n",
286  ncur->nparms[60],ncur->nparms[61],ncur->nparms[62]);
287  fprintf(m,"+ nb = %g lnb = %g wnb = %g\n",
288  ncur->nparms[63],ncur->nparms[64],ncur->nparms[65]);
289  fprintf(m,"+ nd = %g lnd = %g wnd = %g\n",
290  ncur->nparms[66],ncur->nparms[67],ncur->nparms[68]);
291  fprintf(m,"+ rsh = %g cj = %g cjsw = %g\n",
292  dcur->dparms[0], dcur->dparms[1], dcur->dparms[2]);
293  fprintf(m,"+ js = %g pb = %g pbsw = %g\n",
294  dcur->dparms[3], dcur->dparms[4], dcur->dparms[5]);
295  fprintf(m,"+ mj = %g mjsw = %g wdf = %g\n",
296  dcur->dparms[6], dcur->dparms[7], dcur->dparms[8]);
297  fprintf(m,"+ dell = %g\n",
298  dcur->dparms[9]);
299  }
300  }
301  return (0);
302 }
303 
304 void
305 getdata(vals,count,width)
306  double vals[];
307  int count;
308  int width; /* maximum number of values to accept per line */
309 {
310  int i;
311  int error;
312  int start;
313  char *c;
314 
315  do {
316  if(fgets(dataline,1023,p)==NULL) {
317  printf("premature end of file getting input data line\n");
318  exit(1);
319  }
320  start=0;
321  } while (*dataline == '*') ;
322  c = dataline;
323  for(i=0;i<count;i++) {
324 retry:
325  vals[i] = INPevaluate(&c,&error,1);
326  start++;
327  if(error || (start>width)) { /* end of line, so read another one */
328  do {
329  if(fgets(dataline,1023,p)==NULL) {
330  printf("premature end of file reading input data line \n");
331  exit(1);
332  }
333  start=0;
334  } while (*dataline == '*') ;
335  c = dataline;
336  goto retry;
337  }
338  }
339 }
static void mlist()
struct snmod nmod
Definition: proc2mod.c:26
double yparms[10]
Definition: proc2mod.c:39
char * nname
Definition: proc2mod.c:23
Definition: proc2mod.c:21
double pparms[69]
Definition: proc2mod.c:29
void getdata()
char * malloc()
double INPevaluate()
Definition: proc2mod.c:36
double mparms[10]
Definition: proc2mod.c:44
Definition: cddefs.h:215
struct sdmod dmod
Definition: proc2mod.c:41
char * pname
Definition: proc2mod.c:28
static char start[32]
Definition: subckt.c:76
double dparms[10]
Definition: proc2mod.c:34
Definition: polyclip.c:32
#define NULL
Definition: spdefs.h:121
struct symod * ynext
Definition: proc2mod.c:37
struct sdmod * dnext
Definition: proc2mod.c:32
void strtolower()
struct spmod pmod
double nparms[69]
Definition: proc2mod.c:24
char * yname
Definition: proc2mod.c:38
struct snmod * nnext
Definition: proc2mod.c:22
int main()
Definition: proc2mod.c:53
static double c
Definition: vectors.c:16
void perror()
struct spmod * pnext
Definition: proc2mod.c:27
struct smmod * mnext
Definition: proc2mod.c:42
char * dataline
Definition: proc2mod.c:49
struct smmod mmod
char * mname
Definition: proc2mod.c:43
int count
Definition: output.c:152
Definition: proc2mod.c:31
struct symod ymod
Definition: cddefs.h:109
char * dname
Definition: proc2mod.c:33