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