Jspice3
cktload.c
Go to the documentation of this file.
1 /***************************************************************************
2 JSPICE3 adaptation of Spice3f2 - Copyright (c) Stephen R. Whiteley 1992
3 Copyright 1990 Regents of the University of California. All rights reserved.
4 Authors: 1985 Thomas L. Quarles
5  1993 Stephen R. Whiteley
6 ****************************************************************************/
7 
8  /* CKTload(ckt)
9  * this is a driver program to iterate through all the various
10  * load functions provided for the circuit elements in the
11  * given circuit
12  */
13 
14 #include "spice.h"
15 #include <stdio.h>
16 #include "devdefs.h"
17 #include "optdefs.h"
18 #include "sperror.h"
19 #include "cktext.h"
20 
21 
22 int
23 CKTload(ckt)
24 
25 CKTcircuit *ckt;
26 {
27  extern SPICEdev *DEVices[];
28  int i;
29  int size;
30  int error;
31  int (*func)();
32  double startTime;
33  CKTnode *node;
34  struct sCKTmodHead *mh;
35 #ifdef STEPDEBUG
36  int noncon;
37 #endif /* STEPDEBUG */
38 
39  startTime = (*(SPfrontEnd->IFseconds))();
40  size = spGetSize(ckt->CKTmatrix,1);
41  for (i = 0; i <= size; i++) {
42  *(ckt->CKTrhs + i) = 0;
43  }
44 
45  /* Reset the real part of the matrix by loading the imaginary
46  * part, in which things might be cached.
47  */
48  spItoR((char*)ckt->CKTmatrix);
49 
50 #ifdef STEPDEBUG
51  noncon = ckt->CKTnoncon;
52 #endif /* STEPDEBUG */
53 
54  for (mh = ckt->CKTheadList; mh != NULL; mh = mh->next) {
55  if ((func = DEVices[mh->type]->DEVload) != NULL) {
56  error = (*func)(mh->head,ckt);
57 
58 #ifdef STEPDEBUG
59  if(noncon != ckt->CKTnoncon) {
60  printf("device type %s nonconvergence\n",
61  DEVices[mh->type]->DEVpublic.name);
62  noncon = ckt->CKTnoncon;
63  }
64 #endif /* STEPDEBUG */
65 
66  if (error) return (error);
67  }
68  }
69  if (ckt->CKTmode & MODEDC) {
70  /* consider doing nodeset & ic assignments */
71  if (ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) {
72  /* do nodesets */
73  for (node = ckt->CKTnodes; node; node = node->next) {
74  if (node->nsGiven) {
75  *(ckt->CKTrhs + node->number) += node->nodeset;
76  *(node->ptr) += 1;
77  }
78  }
79  }
80  if ((ckt->CKTmode & MODETRANOP) && (!(ckt->CKTmode & MODEUIC))) {
81  for (node = ckt->CKTnodes; node; node = node->next) {
82  if (node->icGiven) {
83  *(ckt->CKTrhs + node->number) += node->ic;
84  *(node->ptr) += 1;
85  }
86  }
87  }
88  }
89  ((STATistics*)ckt->CKTstat)->STATloadTime +=
90  (*(SPfrontEnd->IFseconds))() - startTime;
91  return (OK);
92 }
unsigned int nsGiven
Definition: cktdefs.h:45
#define MODEDC
Definition: cktdefs.h:149
struct sCKTmodHead * next
Definition: cktdefs.h:58
SPICEdev * DEVices[]
Definition: sconfig.c:109
unsigned int icGiven
Definition: cktdefs.h:44
double nodeset
Definition: cktdefs.h:41
IFfrontEnd * SPfrontEnd
Definition: main.c:917
IFdevice DEVpublic
Definition: devdefs.h:44
#define OK
Definition: iferrmsg.h:17
int CKTload(CKTcircuit *ckt)
Definition: cktload.c:23
#define NULL
Definition: spdefs.h:121
struct sCKTnode * next
Definition: cktdefs.h:43
int number
Definition: cktdefs.h:39
#define MODETRANOP
Definition: cktdefs.h:151
double * ptr
Definition: cktdefs.h:42
int spGetSize()
char * name
Definition: ifsim.h:293
#define MODEINITFIX
Definition: cktdefs.h:158
Definition: fteparse.h:37
void spItoR()
int type
Definition: cktdefs.h:56
GENmodel * head
Definition: cktdefs.h:57
int(* DEVload)()
Definition: devdefs.h:92
#define MODEINITJCT
Definition: cktdefs.h:157
double ic
Definition: cktdefs.h:40
#define MODEUIC
Definition: cktdefs.h:166