1 /**********
2 Copyright 1990 Regents of the University of California. All rights reserved.
3 **********/
4
5 #include "ngspice/ngspice.h"
6 #include "ngspice/trandefs.h"
7 #include "ngspice/cktdefs.h"
8 #include "ngspice/devdefs.h"
9 #include "vsrc/vsrcdefs.h"
10 #include "isrc/isrcdefs.h"
11 #include "ngspice/jobdefs.h"
12
13 #include "analysis.h"
14
15
16 extern SPICEanalysis *analInfo[];
17
18 char *
CKTtrouble(CKTcircuit * ckt,char * optmsg)19 CKTtrouble(CKTcircuit *ckt, char *optmsg)
20 {
21 char msg_buf[513];
22 char *emsg;
23 TRCV *cv;
24 int vcode, icode;
25 char *msg_p;
26 SPICEanalysis *an;
27 int i;
28
29 if (!ckt || !ckt->CKTcurJob)
30 return NULL;
31
32 an = analInfo[ckt->CKTcurJob->JOBtype];
33
34 if (optmsg && *optmsg) {
35 sprintf(msg_buf, "%s: %s; ", an->if_analysis.name, optmsg);
36 } else {
37 sprintf(msg_buf, "%s: ", an->if_analysis.name);
38 }
39
40 msg_p = msg_buf + strlen(msg_buf);
41
42 switch (an->domain) {
43 case TIMEDOMAIN:
44 if (ckt->CKTtime == 0.0)
45 sprintf(msg_p, "initial timepoint: ");
46 else
47 sprintf(msg_p, "time = %g, timestep = %g: ", ckt->CKTtime,
48 ckt->CKTdelta);
49 break;
50
51 case FREQUENCYDOMAIN:
52 sprintf(msg_p, "frequency = %g: ", ckt->CKTomega / (2.0 * M_PI));
53 break;
54
55 case SWEEPDOMAIN:
56 cv = (TRCV*) ckt->CKTcurJob;
57 vcode = CKTtypelook("Vsource");
58 icode = CKTtypelook("Isource");
59
60 for (i = 0; i <= cv->TRCVnestLevel; i++) {
61 msg_p += strlen(msg_p);
62 if(cv->TRCVvType[i]==vcode) { /* voltage source */
63 sprintf(msg_p, " %s = %g: ", cv->TRCVvName[i],
64 ((VSRCinstance*)(cv->TRCVvElt[i]))->VSRCdcValue);
65 } else {
66 sprintf(msg_p, " %s = %g: ", cv->TRCVvName[i],
67 ((ISRCinstance*)(cv->TRCVvElt[i]))->ISRCdcValue);
68 }
69 }
70 break;
71
72 case NODOMAIN:
73 default:
74 break;
75 }
76
77 msg_p += strlen(msg_p);
78
79 if (ckt->CKTtroubleNode) {
80 sprintf(msg_p, "trouble with node \"%s\"\n",
81 CKTnodName(ckt, ckt->CKTtroubleNode));
82 } else if (ckt->CKTtroubleElt) {
83 /* "-" for dop */
84 sprintf(msg_p, "trouble with %s-instance %s\n",
85 ckt->CKTtroubleElt->GENmodPtr->GENmodName,
86 ckt->CKTtroubleElt->GENname);
87 } else {
88 sprintf(msg_p, "cause unrecorded.\n");
89 }
90
91 emsg = TMALLOC(char, strlen(msg_buf) + 1);
92 strcpy(emsg,msg_buf);
93
94 return emsg;
95 }
96