Jspice3
urcsetup.c File Reference
#include "spice.h"
#include <stdio.h>
#include <math.h>
#include "urcdefs.h"
#include "sperror.h"
#include "util.h"
#include "cktext.h"
Include dependency graph for urcsetup.c:

Go to the source code of this file.

Functions

int URCsetup (SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *state)
 

Function Documentation

int URCsetup ( SMPmatrix matrix,
GENmodel inModel,
CKTcircuit ckt,
int *  state 
)

Definition at line 19 of file urcsetup.c.

26 {
27  register URCmodel *model = (URCmodel *)inModel;
28  register URCinstance *here;
29  int rtype;
30  int ctype;
31  int dtype;
32  CKTnode * lowl;
33  CKTnode * lowr;
34  CKTnode * hil;
35  CKTnode * hir;
36  char *nameelt;
37  char *namehi;
38  CKTnode *nodehi;
39  CKTnode *nodelo;
40  char *namelo;
41  double r;
42  double c;
43  IFvalue ptemp;
44  double p;
45  double r0;
46  double c0;
47  double i0;
48  double r1;
49  double c1;
50  double i1;
51  double rd;
52  double wnorm;
53  double prop;
54  int i;
55  GENinstance *fast;
56  GENmodel *modfast; /* capacitor or diode model */
57  GENmodel *rmodfast; /* resistor model */
58  int error;
59  IFuid dioUid;
60  IFuid resUid;
61  IFuid capUid;
62  IFuid eltUid;
63 
64 
65  rtype = CKTtypelook("Resistor");
66  ctype = CKTtypelook("Capacitor");
67  dtype = CKTtypelook("Diode");
68  /* loop through all the URC models */
69  for( ; model != NULL; model = model->URCnextModel ) {
70  if(!model->URCkGiven)
71  model->URCk = 1.5;
72  if(!model->URCfmaxGiven)
73  model->URCfmax = 1e9;
74  if(!model->URCrPerLGiven)
75  model->URCrPerL = 1000;
76  if(!model->URCcPerLGiven)
77  model->URCcPerL = 1e-12;
78 
79 /* may need to put in limits: k>=1.1, freq <=1e9, rperl >=.1 */
80 
81  /* loop through all the instances of the model */
82  for (here = model->URCinstances; here != NULL ;
83  here=here->URCnextInstance) {
84  p = model->URCk;
85  r0 = here->URClength * model->URCrPerL;
86  c0 = here->URClength * model->URCcPerL;
87  i0 = here->URClength * model->URCisPerL;
88  if(!here->URClumpsGiven) {
89  wnorm = model->URCfmax * r0 * c0 * 2.0 * M_PI;
90  here->URClumps=MAX(3.0,log(wnorm*(((p-1)/p)*((p-1)/p)))/log(p));
91  if(wnorm <35) here->URClumps=3;
92  /* may want to limit lumps to <= 100 or something like that */
93  }
94  r1 = (r0*(p-1))/((2*(pow(p,(double)here->URClumps)))-2);
95  c1 = (c0 * (p-1))/((pow(p,(double)(here->URClumps-1)))*(p+1)-2);
96  i1 = (i0 * (p-1))/((pow(p,(double)(here->URClumps-1)))*(p+1)-2);
97  rd = here->URClength * here->URClumps * model->URCrsPerL;
98  /* may want to check that c1 > 0 */
99  prop=1;
100  if(model->URCisPerLGiven) {
101  error = (*(SPfrontEnd->IFnewUid))(ckt,&dioUid,here->URCname,
102  "diodemod",UID_MODEL,(GENERIC**)NULL);
103  if(error) return(error);
104  modfast = (GENmodel *)NULL;
105  error = CKTmodCrt((GENERIC *)ckt,dtype,(GENERIC**)&modfast,
106  dioUid);
107  if(error) return(error);
108  ptemp.rValue = c1;
109  error= CKTpModName("cjo",&ptemp,ckt,dtype,dioUid,&modfast);
110  if(error) return(error);
111  ptemp.rValue = rd;
112  error = CKTpModName("rs",&ptemp,ckt,dtype,dioUid,&modfast);
113  if(error) return(error);
114  ptemp.rValue = i1;
115  error = CKTpModName("is",&ptemp,ckt,dtype,dioUid,&modfast);
116  if(error) return(error);
117  } else {
118  error = (*(SPfrontEnd->IFnewUid))((GENERIC*)ckt,&capUid,
119  here->URCname, "capmod",UID_MODEL,(GENERIC**)NULL);
120  if(error) return(error);
121  modfast = (GENmodel *)NULL;
122  error = CKTmodCrt((GENERIC *)ckt,ctype,(GENERIC**)&modfast,
123  capUid);
124  if(error) return(error);
125  }
126  error = (*(SPfrontEnd->IFnewUid))(ckt,&resUid,here->URCname,
127  "resmod",UID_MODEL,(GENERIC**)NULL);
128  if(error) return(error);
129  rmodfast = (GENmodel *)NULL;
130  error = CKTmodCrt((GENERIC *)ckt,rtype,(GENERIC**)&rmodfast,resUid);
131  if(error) return(error);
132  lowl = CKTnum2nod(ckt,here->URCposNode);
133  hir = CKTnum2nod(ckt,here->URCnegNode);
134  for(i=1;i<=here->URClumps;i++) {
135  namehi = (char *)MALLOC(10*sizeof(char));
136  (void)sprintf(namehi,"hi%d",i);
137  error = CKTmkVolt(ckt,(CKTnode**)&nodehi,here->URCname,namehi);
138  if(error) return(error);
139  hil = nodehi;
140  if(i==here->URClumps) {
141  lowr = hil;
142  } else {
143  namelo = (char *)MALLOC(10*sizeof(char));
144  (void)sprintf(namelo,"lo%d",i);
145  error = CKTmkVolt(ckt,(CKTnode**)&nodelo,here->URCname,
146  namelo);
147  if(error) return(error);
148  lowr = nodelo;
149  }
150  r = prop*r1;
151  c = prop*c1;
152 
153  nameelt = (char *)MALLOC(10*sizeof(char));
154  (void)sprintf(nameelt,"rlo%d",i);
155  error = (*(SPfrontEnd->IFnewUid))(ckt,&eltUid,here->URCname,
156  nameelt,UID_INSTANCE, (GENERIC **)NULL);
157  if(error) return(error);
158  error = CKTcrtElt((GENERIC *)ckt,(GENERIC*)rmodfast,
159  (GENERIC**)&fast,eltUid);
160  if(error) return(error);
161  error = CKTbindNode((GENERIC*)ckt,(GENERIC*)fast,1,lowl);
162  if(error) return(error);
163  error = CKTbindNode((GENERIC*)ckt,(GENERIC*)fast,2,lowr);
164  if(error) return(error);
165  ptemp.rValue = r;
166  error = CKTpName("resistance",&ptemp,ckt,rtype,nameelt,&fast);
167  if(error) return(error);
168 
169  nameelt = (char *)MALLOC(10*sizeof(char));
170  (void)sprintf(nameelt,"rhi%d",i);
171  error = (*(SPfrontEnd->IFnewUid))(ckt,&eltUid,here->URCname,
172  nameelt,UID_INSTANCE, (GENERIC **)NULL);
173  if(error) return(error);
174  error = CKTcrtElt((GENERIC *)ckt,(GENERIC *)rmodfast,
175  (GENERIC**)&fast,eltUid);
176  if(error) return(error);
177  error = CKTbindNode((GENERIC*)ckt,(GENERIC*)fast,1,hil);
178  if(error) return(error);
179  error = CKTbindNode((GENERIC*)ckt,(GENERIC*)fast,2,hir);
180  if(error) return(error);
181  ptemp.rValue = r;
182  error = CKTpName("resistance",&ptemp,ckt,rtype,nameelt,&fast);
183  if(error) return(error);
184 
185  if(model->URCisPerLGiven) {
186  /* use diode */
187  nameelt = (char *)MALLOC(10*sizeof(char));
188  (void)sprintf(nameelt,"dlo%d",i);
189  error = (*(SPfrontEnd->IFnewUid))(ckt,&eltUid,
190  here->URCname,nameelt,UID_INSTANCE,
191  (GENERIC **)NULL);
192  if(error) return(error);
193  error = CKTcrtElt((GENERIC *)ckt,(GENERIC*)modfast,
194  (GENERIC**)&fast, eltUid);
195  if(error) return(error);
196  error = CKTbindNode((GENERIC*)ckt,(GENERIC*)fast,1,lowr);
197  if(error) return(error);
198  error = CKTbindNode((GENERIC*)ckt,(GENERIC*)fast,2,
199  (GENERIC *)CKTnum2nod(ckt, here->URCgndNode));
200  if(error) return(error);
201  ptemp.rValue = prop;
202  error = CKTpName("area",&ptemp,ckt,dtype,nameelt,&fast);
203  if(error) return(error);
204  } else {
205  /* use simple capacitor */
206  nameelt = (char *)MALLOC(10*sizeof(char));
207  (void)sprintf(nameelt,"clo%d",i);
208  error = (*(SPfrontEnd->IFnewUid))(ckt,&eltUid,here->URCname
209  ,nameelt,UID_INSTANCE, (GENERIC **)NULL);
210  if(error) return(error);
211  error = CKTcrtElt((GENERIC *)ckt,(GENERIC*)modfast,
212  (GENERIC**)&fast, eltUid);
213  if(error) return(error);
214  error = CKTbindNode((GENERIC*)ckt,(GENERIC*)fast,1,lowr);
215  if(error) return(error);
216  error = CKTbindNode((GENERIC*)ckt,(GENERIC*)fast,2,
217  (GENERIC *)CKTnum2nod(ckt, here->URCgndNode));
218  if(error) return(error);
219  ptemp.rValue = c;
220  error = CKTpName("capacitance",&ptemp,ckt,ctype,nameelt,
221  &fast);
222  if(error) return(error);
223  }
224 
225  if(i!=here->URClumps){
226  if(model->URCisPerLGiven) {
227  /* use diode */
228  nameelt = (char *)MALLOC(10*sizeof(char));
229  (void)sprintf(nameelt,"dhi%d",i);
230  error = (*(SPfrontEnd->IFnewUid))(ckt,&eltUid,
231  here->URCname,nameelt,UID_INSTANCE,
232  (GENERIC **)NULL);
233  if(error) return(error);
234  error = CKTcrtElt((GENERIC *)ckt,(GENERIC *)modfast,
235  (GENERIC**) &fast,eltUid);
236  if(error) return(error);
237  error = CKTbindNode((GENERIC*)ckt,(GENERIC*)fast,1,hil);
238  if(error) return(error);
239  error = CKTbindNode((GENERIC*)ckt,(GENERIC*)fast,2,
240  (GENERIC *)CKTnum2nod(ckt, here->URCgndNode));
241  if(error) return(error);
242  ptemp.rValue = prop;
243  error=CKTpName("area",&ptemp,ckt,dtype,nameelt,&fast);
244  if(error) return(error);
245  } else {
246  /* use simple capacitor */
247  nameelt = (char *)MALLOC(10*sizeof(char));
248  (void)sprintf(nameelt,"chi%d",i);
249  error = (*(SPfrontEnd->IFnewUid))(ckt,&eltUid,
250  here->URCname,nameelt,UID_INSTANCE,
251  (GENERIC **)NULL);
252  if(error) return(error);
253  error = CKTcrtElt((GENERIC *)ckt,(GENERIC *)modfast,
254  (GENERIC**)&fast,eltUid);
255  if(error) return(error);
256  error = CKTbindNode((GENERIC*)ckt,(GENERIC*)fast,1,hil);
257  if(error) return(error);
258  error = CKTbindNode((GENERIC*)ckt,(GENERIC*)fast,2,
259  (GENERIC*)CKTnum2nod(ckt, here->URCgndNode));
260  if(error) return(error);
261  ptemp.rValue = c;
262  error =CKTpName("capacitance",&ptemp,ckt,ctype,nameelt,
263  &fast);
264  if(error) return(error);
265  }
266  }
267  prop *= p;
268  lowl = lowr;
269  hir = hil;
270  }
271  }
272  }
273  return(OK);
274 }
double URCfmax
Definition: urcdefs.h:48
int CKTmodCrt()
unsigned URCfmaxGiven
Definition: urcdefs.h:54
#define MAX(a, b)
Definition: spdefs.h:135
unsigned URCrPerLGiven
Definition: urcdefs.h:55
int URClumps
Definition: urcdefs.h:31
#define M_PI
Definition: spice.h:132
int URCnegNode
Definition: urcdefs.h:27
#define UID_MODEL
Definition: ifsim.h:83
static double e
Definition: vectors.c:17
FILE * p
Definition: proc2mod.c:48
int CKTpModName()
IFfrontEnd * SPfrontEnd
Definition: main.c:917
int CKTtypelook()
CKTnode * CKTnum2nod()
double URCisPerL
Definition: urcdefs.h:51
double rValue
Definition: ifsim.h:233
unsigned URCisPerLGiven
Definition: urcdefs.h:57
IFuid URCname
Definition: urcdefs.h:24
unsigned URCkGiven
Definition: urcdefs.h:53
unsigned URClumpsGiven
Definition: urcdefs.h:33
#define OK
Definition: iferrmsg.h:17
GENERIC * IFuid
Definition: ifsim.h:72
int URCgndNode
Definition: urcdefs.h:28
int CKTcrtElt()
#define MALLOC(x)
Definition: util.h:9
#define NULL
Definition: spdefs.h:121
unsigned URCcPerLGiven
Definition: urcdefs.h:56
static double c
Definition: vectors.c:16
double URCrsPerL
Definition: urcdefs.h:52
int CKTpName()
static char model[32]
Definition: subckt.c:76
URCinstance * URCinstances
Definition: urcdefs.h:43
double URCcPerL
Definition: urcdefs.h:50
Definition: subckt.c:35
#define UID_INSTANCE
Definition: ifsim.h:82
Definition: cddefs.h:162
double URCk
Definition: urcdefs.h:47
struct sURCinstance * URCnextInstance
Definition: urcdefs.h:22
double URClength
Definition: urcdefs.h:30
double URCrPerL
Definition: urcdefs.h:49
int URCposNode
Definition: urcdefs.h:26
int CKTmkVolt()
struct sURCmodel * URCnextModel
Definition: urcdefs.h:41
char GENERIC
Definition: ifsim.h:27
int CKTbindNode()