You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
2.5 KiB
104 lines
2.5 KiB
/**********
|
|
Copyright 1990 Regents of the University of California. All rights reserved.
|
|
**********/
|
|
|
|
#include "ngspice/ngspice.h"
|
|
#include "ngspice/trandefs.h"
|
|
#include "ngspice/cktdefs.h"
|
|
#include "ngspice/devdefs.h"
|
|
#include "vsrc/vsrcdefs.h"
|
|
#include "isrc/isrcdefs.h"
|
|
#include "res/resdefs.h"
|
|
#include "ngspice/jobdefs.h"
|
|
|
|
#include "analysis.h"
|
|
|
|
|
|
extern SPICEanalysis *analInfo[];
|
|
|
|
char *
|
|
CKTtrouble(CKTcircuit *ckt, char *optmsg)
|
|
{
|
|
char msg_buf[513];
|
|
char *emsg;
|
|
TRCV *cv;
|
|
int vcode, icode, rcode;
|
|
char *msg_p;
|
|
SPICEanalysis *an;
|
|
int i;
|
|
|
|
if (!ckt || !ckt->CKTcurJob)
|
|
return NULL;
|
|
|
|
an = analInfo[ckt->CKTcurJob->JOBtype];
|
|
|
|
if (optmsg && *optmsg) {
|
|
sprintf(msg_buf, "%s: %s; ", an->if_analysis.name, optmsg);
|
|
} else {
|
|
sprintf(msg_buf, "%s: ", an->if_analysis.name);
|
|
}
|
|
|
|
msg_p = msg_buf + strlen(msg_buf);
|
|
|
|
switch (an->domain) {
|
|
case TIMEDOMAIN:
|
|
if (ckt->CKTtime == 0.0)
|
|
sprintf(msg_p, "initial timepoint: ");
|
|
else
|
|
sprintf(msg_p, "time = %g, timestep = %g: ", ckt->CKTtime,
|
|
ckt->CKTdelta);
|
|
break;
|
|
|
|
case FREQUENCYDOMAIN:
|
|
sprintf(msg_p, "frequency = %g: ", ckt->CKTomega / (2.0 * M_PI));
|
|
break;
|
|
|
|
case SWEEPDOMAIN:
|
|
cv = (TRCV*) ckt->CKTcurJob;
|
|
vcode = CKTtypelook("Vsource");
|
|
icode = CKTtypelook("Isource");
|
|
rcode = CKTtypelook("Resistor");
|
|
|
|
for (i = 0; i <= cv->TRCVnestLevel; i++) {
|
|
msg_p += strlen(msg_p);
|
|
if (cv->TRCVvType[i] == vcode) { /* voltage source */
|
|
sprintf(msg_p, " %s = %g: ", cv->TRCVvName[i],
|
|
((VSRCinstance*)(cv->TRCVvElt[i]))->VSRCdcValue);
|
|
}
|
|
else if (cv->TRCVvType[i] == TEMP_CODE) { /* temp sweep, if optran fails) */
|
|
sprintf(msg_p, " %s = %g: ", cv->TRCVvName[i], ckt->CKTtemp - CONSTCtoK);
|
|
}
|
|
else if (cv->TRCVvType[i] == rcode) {
|
|
sprintf(msg_p, " %s = %g: ", cv->TRCVvName[i],
|
|
((RESinstance*)(cv->TRCVvElt[i]))->RESresist);
|
|
} else {
|
|
sprintf(msg_p, " %s = %g: ", cv->TRCVvName[i],
|
|
((ISRCinstance*)(cv->TRCVvElt[i]))->ISRCdcValue);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case NODOMAIN:
|
|
default:
|
|
break;
|
|
}
|
|
|
|
msg_p += strlen(msg_p);
|
|
|
|
if (ckt->CKTtroubleNode) {
|
|
sprintf(msg_p, "trouble with node \"%s\"\n",
|
|
CKTnodName(ckt, ckt->CKTtroubleNode));
|
|
} else if (ckt->CKTtroubleElt) {
|
|
/* "-" for dop */
|
|
sprintf(msg_p, "trouble with %s-instance %s\n",
|
|
ckt->CKTtroubleElt->GENmodPtr->GENmodName,
|
|
ckt->CKTtroubleElt->GENname);
|
|
} else {
|
|
sprintf(msg_p, "cause unrecorded.\n");
|
|
}
|
|
|
|
emsg = TMALLOC(char, strlen(msg_buf) + 1);
|
|
strcpy(emsg,msg_buf);
|
|
|
|
return emsg;
|
|
}
|