From 4ef61a65cf96622487e28367fcd491d8df00ec56 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sat, 2 May 2009 09:40:33 +0000 Subject: [PATCH] SIGSEGV handling for Windows --- ChangeLog | 7 + configure.in | 1 + src/frontend/signal_handler.c | 7 + src/main.c | 7 +- src/spicelib/analysis/dctrcurv.c | 355 ++++++++++++++++--------------- visualc/vngspice.vcproj | 6 +- 6 files changed, 207 insertions(+), 176 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0659e3cdd..1bc96377b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2009-05-02 Holger Vogt + * configure.in: new flag NGDEBUG + main.c, signal_handler.c, visualc/vngspice.vcproj: + restore SIGSEGV signal handling for error message after seg fault + (not in debug mode, now only for Windows) + dctrcurv: winmessage about dc + 2009-05-01 Holger Vogt * cktdojob.c, cktsopt.c: moved to cktsopt.c: maxord set to min 2 or max 6 diff --git a/configure.in b/configure.in index 845dbd065..8323499ff 100644 --- a/configure.in +++ b/configure.in @@ -211,6 +211,7 @@ if test "$enable_debug" = "no"; then CFLAGS="$ext_CFLAGS -O2" fi else + AC_DEFINE(NGDEBUG,1,[Compile with debug info]) if test "x$GCC" = "xyes"; then CFLAGS="$ext_CFLAGS -g -O0 -Wall" else diff --git a/src/frontend/signal_handler.c b/src/frontend/signal_handler.c index 9cc447a7d..1f9292c91 100644 --- a/src/frontend/signal_handler.c +++ b/src/frontend/signal_handler.c @@ -17,6 +17,10 @@ Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group #include #include "signal_handler.h" +#ifdef HAS_WINDOWS +void winmessage(char* new_msg); +#endif + #ifdef HAVE_GNUREADLINE /* Added GNU Readline Support 11/3/97 -- Andrew Veliath */ /* from spice3f4 patch to ng-spice. jmr */ @@ -133,6 +137,9 @@ RETSIGTYPE sigsegv(void) { fprintf(cp_err, "\ninternal error -- segmentation violation\n"); +#ifdef HAS_WINDOWS + winmessage("Fatal error in NGSPICE"); +#endif fatal(); } diff --git a/src/main.c b/src/main.c index 74e55d613..6a6ccaa1a 100644 --- a/src/main.c +++ b/src/main.c @@ -939,10 +939,9 @@ main(int argc, char **argv) #ifdef SIGBUS signal(SIGBUS, (SIGNAL_FUNCTION) sigbus); #endif -#ifdef SIGSEGV -/* Want core files! - * signal(SIGSEGV, sigsegv); - */ +#if defined(SIGSEGV) && !defined(NGDEBUG) && defined(HAS_WINDOWS) +/* Allow a comment and graceful shutdown after seg fault */ + signal(SIGSEGV, sigsegv); #endif #ifdef SIGSYS signal(SIGSYS, (SIGNAL_FUNCTION) sig_sys); diff --git a/src/spicelib/analysis/dctrcurv.c b/src/spicelib/analysis/dctrcurv.c index 9e075c6ea..aa22fd316 100644 --- a/src/spicelib/analysis/dctrcurv.c +++ b/src/spicelib/analysis/dctrcurv.c @@ -25,6 +25,11 @@ Modified: 1999 Paolo Nenzi #include extern SPICEdev **DEVices; +#ifdef HAS_WINDOWS +void SetAnalyse( char * Analyse, int Percent); +static double actval, actdiff; +#endif + int DCtrCurv(CKTcircuit *ckt, int restart) @@ -61,10 +66,10 @@ DCtrCurv(CKTcircuit *ckt, int restart) if(!restart && cv->TRCVnestState >= 0) { /* continuing */ i = cv->TRCVnestState; - /* resume to work? saj*/ - error = (*(SPfrontEnd->OUTpBeginPlot))((void *)ckt, - (void*)ckt->CKTcurJob, ckt->CKTcurJob->JOBname, - varUid,IF_REAL,666,nameList, 666,&plot); + /* resume to work? saj*/ + error = (*(SPfrontEnd->OUTpBeginPlot))((void *)ckt, + (void*)ckt->CKTcurJob, ckt->CKTcurJob->JOBname, + varUid,IF_REAL,666,nameList, 666,&plot); goto resume; } ckt->CKTtime = 0; @@ -85,17 +90,17 @@ DCtrCurv(CKTcircuit *ckt, int restart) RESmodel *model; for(model = (RESmodel *)ckt->CKThead[rcode];model != NULL; - model=model->RESnextModel){ + model=model->RESnextModel){ for(here=model->RESinstances;here!=NULL; - here=here->RESnextInstance) { + here=here->RESnextInstance) { if(here->RESname == cv->TRCVvName[i]) { cv->TRCVvElt[i] = (GENinstance *)here; cv->TRCVvSave[i] = here->RESresist; - cv->TRCVgSave[i] = here->RESresGiven; + cv->TRCVgSave[i] = here->RESresGiven; cv->TRCVvType[i] = rcode; here->RESresist = cv->TRCVvStart[i]; here->RESresGiven = 1; - CKTtemp(ckt); + CKTtemp(ckt); goto found; } } @@ -113,7 +118,7 @@ DCtrCurv(CKTcircuit *ckt, int restart) if(here->VSRCname == cv->TRCVvName[i]) { cv->TRCVvElt[i] = (GENinstance *)here; cv->TRCVvSave[i] = here->VSRCdcValue; - cv->TRCVgSave[i] = here->VSRCdcGiven; + cv->TRCVgSave[i] = here->VSRCdcGiven; cv->TRCVvType[i] = vcode; here->VSRCdcValue = cv->TRCVvStart[i]; here->VSRCdcGiven = 1; @@ -134,7 +139,7 @@ DCtrCurv(CKTcircuit *ckt, int restart) if(here->ISRCname == cv->TRCVvName[i]) { cv->TRCVvElt[i] = (GENinstance *)here; cv->TRCVvSave[i] = here->ISRCdcValue; - cv->TRCVgSave[i] = here->ISRCdcGiven; + cv->TRCVgSave[i] = here->ISRCdcGiven; cv->TRCVvType[i] = icode; here->ISRCdcValue = cv->TRCVvStart[i]; here->ISRCdcGiven = 1; @@ -143,16 +148,16 @@ DCtrCurv(CKTcircuit *ckt, int restart) } } } - + if(!strcmp(cv->TRCVvName[i], "temp")) { cv->TRCVvSave[i]=ckt->CKTtemp; /* Saves the old circuit temperature */ cv->TRCVvType[i]=TEMP_CODE; /* Set the sweep type code */ ckt->CKTtemp = cv->TRCVvStart[i] + CONSTCtoK; /* Set the new circuit temp */ - CKTtemp(ckt); + CKTtemp(ckt); goto found; } - + (*(SPfrontEnd->IFerror))(ERR_FATAL, "DCtrCurv: source / resistor %s not in circuit", &(cv->TRCVvName[i])); return(E_NODEV); @@ -160,16 +165,21 @@ DCtrCurv(CKTcircuit *ckt, int restart) found:; } +#ifdef HAS_WINDOWS + actval = cv->TRCVvStart[cv->TRCVnestLevel]; + actdiff = cv->TRCVvStart[cv->TRCVnestLevel] - cv->TRCVvStop[cv->TRCVnestLevel]; +#endif + #ifdef XSPICE /* gtri - add - wbk - 12/19/90 - Add IPC stuff and anal_init and anal_type */ - /* Tell the beginPlot routine what mode we're in */ - g_ipc.anal_type = IPC_ANAL_DCTRCURVE; + /* Tell the beginPlot routine what mode we're in */ + g_ipc.anal_type = IPC_ANAL_DCTRCURVE; - /* Tell the code models what mode we're in */ - g_mif_info.circuit.anal_type = MIF_DC; + /* Tell the code models what mode we're in */ + g_mif_info.circuit.anal_type = MIF_DC; - g_mif_info.circuit.anal_init = MIF_TRUE; + g_mif_info.circuit.anal_init = MIF_TRUE; /* gtri - end - wbk */ #endif @@ -180,35 +190,35 @@ found:; if(error) return(error); - if (cv->TRCVvType[i]==vcode) - (*(SPfrontEnd->IFnewUid))((void *)ckt,&varUid,(IFuid )NULL, + if (cv->TRCVvType[i]==vcode) + (*(SPfrontEnd->IFnewUid))((void *)ckt,&varUid,(IFuid )NULL, "v-sweep", UID_OTHER, (void **)NULL); - else { - if (cv->TRCVvType[i]==icode) - (*(SPfrontEnd->IFnewUid))((void *)ckt,&varUid,(IFuid )NULL, + else { + if (cv->TRCVvType[i]==icode) + (*(SPfrontEnd->IFnewUid))((void *)ckt,&varUid,(IFuid )NULL, "i-sweep", UID_OTHER, (void **)NULL); - else { - if (cv->TRCVvType[i]==TEMP_CODE) - (*(SPfrontEnd->IFnewUid))((void *)ckt,&varUid,(IFuid )NULL, - "temp-sweep", UID_OTHER, (void **)NULL); - - else { - if (cv->TRCVvType[i]==rcode) - (*(SPfrontEnd->IFnewUid))((void *)ckt,&varUid,(IFuid )NULL, - "res-sweep", UID_OTHER, (void **)NULL); + else { + if (cv->TRCVvType[i]==TEMP_CODE) + (*(SPfrontEnd->IFnewUid))((void *)ckt,&varUid,(IFuid )NULL, + "temp-sweep", UID_OTHER, (void **)NULL); + + else { + if (cv->TRCVvType[i]==rcode) + (*(SPfrontEnd->IFnewUid))((void *)ckt,&varUid,(IFuid )NULL, + "res-sweep", UID_OTHER, (void **)NULL); - else - (*(SPfrontEnd->IFnewUid))((void *)ckt,&varUid,(IFuid )NULL, - "?-sweep", UID_OTHER, (void **)NULL); - } /* icode */ - } /* TEMP_CODE */ - } /* rcode*/ + else + (*(SPfrontEnd->IFnewUid))((void *)ckt,&varUid,(IFuid )NULL, + "?-sweep", UID_OTHER, (void **)NULL); + } /* icode */ + } /* TEMP_CODE */ + } /* rcode*/ error = (*(SPfrontEnd->OUTpBeginPlot))((void *)ckt, - (void*)ckt->CKTcurJob, ckt->CKTcurJob->JOBname, - varUid,IF_REAL,numNames,nameList, IF_REAL,&plot); + (void*)ckt->CKTcurJob, ckt->CKTcurJob->JOBname, + varUid,IF_REAL,numNames,nameList, IF_REAL,&plot); if(error) return(error); /* now have finished the initialization - can start doing hard part */ @@ -221,58 +231,58 @@ resume: if(cv->TRCVvType[i]==vcode) { /* voltage source */ if((((VSRCinstance*)(cv->TRCVvElt[i]))->VSRCdcValue)* - SIGN(1.,cv->TRCVvStep[i]) - - SIGN(1.,cv->TRCVvStep[i]) * cv->TRCVvStop[i] > - DBL_EPSILON*1e+03) - { - i++ ; - firstTime=1; - ckt->CKTmode = (ckt->CKTmode & MODEUIC) | - MODEDCTRANCURVE | MODEINITJCT ; - if (i > cv->TRCVnestLevel ) break ; - goto nextstep; - } + SIGN(1.,cv->TRCVvStep[i]) - + SIGN(1.,cv->TRCVvStep[i]) * cv->TRCVvStop[i] > + DBL_EPSILON*1e+03) + { + i++ ; + firstTime=1; + ckt->CKTmode = (ckt->CKTmode & MODEUIC) | + MODEDCTRANCURVE | MODEINITJCT ; + if (i > cv->TRCVnestLevel ) break ; + goto nextstep; + } } else if(cv->TRCVvType[i]==icode) { /* current source */ if((((ISRCinstance*)(cv->TRCVvElt[i]))->ISRCdcValue)* SIGN(1.,cv->TRCVvStep[i]) - SIGN(1.,cv->TRCVvStep[i]) * cv->TRCVvStop[i] > - DBL_EPSILON*1e+03) - { - i++ ; - firstTime=1; - ckt->CKTmode = (ckt->CKTmode & MODEUIC) | - MODEDCTRANCURVE | MODEINITJCT ; - if (i > cv->TRCVnestLevel ) break ; - goto nextstep; - } - - } else if(cv->TRCVvType[i]==rcode) { /* resistance */ + DBL_EPSILON*1e+03) + { + i++ ; + firstTime=1; + ckt->CKTmode = (ckt->CKTmode & MODEUIC) | + MODEDCTRANCURVE | MODEINITJCT ; + if (i > cv->TRCVnestLevel ) break ; + goto nextstep; + } + + } else if(cv->TRCVvType[i]==rcode) { /* resistance */ if((((RESinstance*)(cv->TRCVvElt[i]))->RESresist)* SIGN(1.,cv->TRCVvStep[i]) - SIGN(1.,cv->TRCVvStep[i]) * cv->TRCVvStop[i] - > DBL_EPSILON*1e+03) - { - i++ ; - firstTime=1; - ckt->CKTmode = (ckt->CKTmode & MODEUIC) | - MODEDCTRANCURVE | MODEINITJCT ; - if (i > cv->TRCVnestLevel ) break ; - goto nextstep; - } + > DBL_EPSILON*1e+03) + { + i++ ; + firstTime=1; + ckt->CKTmode = (ckt->CKTmode & MODEUIC) | + MODEDCTRANCURVE | MODEINITJCT ; + if (i > cv->TRCVnestLevel ) break ; + goto nextstep; + } } else if(cv->TRCVvType[i]==TEMP_CODE) { /* temp sweep */ if(((ckt->CKTtemp) - CONSTCtoK) * SIGN(1.,cv->TRCVvStep[i]) - - SIGN(1.,cv->TRCVvStep[i]) * cv->TRCVvStop[i] > - DBL_EPSILON*1e+03) - { - i++ ; - firstTime=1; - ckt->CKTmode = (ckt->CKTmode & MODEUIC) | - MODEDCTRANCURVE | MODEINITJCT ; - if (i > cv->TRCVnestLevel ) break ; - goto nextstep; - - } - + SIGN(1.,cv->TRCVvStep[i]) * cv->TRCVvStop[i] > + DBL_EPSILON*1e+03) + { + i++ ; + firstTime=1; + ckt->CKTmode = (ckt->CKTmode & MODEUIC) | + MODEDCTRANCURVE | MODEINITJCT ; + if (i > cv->TRCVnestLevel ) break ; + goto nextstep; + + } + } /* else not possible */ while (i > 0) { /* init(i); */ @@ -280,30 +290,30 @@ resume: if(cv->TRCVvType[i]==vcode) { /* voltage source */ ((VSRCinstance *)(cv->TRCVvElt[i]))->VSRCdcValue = cv->TRCVvStart[i]; - + } else if(cv->TRCVvType[i]==icode) { /* current source */ ((ISRCinstance *)(cv->TRCVvElt[i]))->ISRCdcValue = cv->TRCVvStart[i]; - + } else if(cv->TRCVvType[i]==TEMP_CODE) { ckt->CKTtemp = cv->TRCVvStart[i] + CONSTCtoK; CKTtemp(ckt); - - } else if(cv->TRCVvType[i]==rcode) { + + } else if(cv->TRCVvType[i]==rcode) { ((RESinstance *)(cv->TRCVvElt[i]))->RESresist = cv->TRCVvStart[i]; - ((RESinstance *)(cv->TRCVvElt[i]))->RESconduct = - 1/(((RESinstance *)(cv->TRCVvElt[i]))->RESresist); - /* Note: changing the resistance does nothing */ - /* changing the conductance 1/r instead */ - DEVices[rcode]->DEVload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); - - /* - * RESload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); - */ - - - } /* else not possible */ + ((RESinstance *)(cv->TRCVvElt[i]))->RESconduct = + 1/(((RESinstance *)(cv->TRCVvElt[i]))->RESresist); + /* Note: changing the resistance does nothing */ + /* changing the conductance 1/r instead */ + DEVices[rcode]->DEVload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); + + /* + * RESload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); + */ + + + } /* else not possible */ } /* Rotate state vectors. */ @@ -316,69 +326,69 @@ resume: /* do operation */ #ifdef XSPICE /* gtri - begin - wbk - Do EVTop if event instances exist */ - if(ckt->evt->counts.num_insts == 0) { + if(ckt->evt->counts.num_insts == 0) { /* If no event-driven instances, do what SPICE normally does */ #endif - converged = NIiter(ckt,ckt->CKTdcTrcvMaxIter); - if(converged != 0) { - converged = CKTop(ckt, - (ckt->CKTmode&MODEUIC)|MODEDCTRANCURVE | MODEINITJCT, - (ckt->CKTmode&MODEUIC)|MODEDCTRANCURVE | MODEINITFLOAT, - ckt->CKTdcMaxIter); + converged = NIiter(ckt,ckt->CKTdcTrcvMaxIter); if(converged != 0) { - return(converged); + converged = CKTop(ckt, + (ckt->CKTmode&MODEUIC)|MODEDCTRANCURVE | MODEINITJCT, + (ckt->CKTmode&MODEUIC)|MODEDCTRANCURVE | MODEINITFLOAT, + ckt->CKTdcMaxIter); + if(converged != 0) { + return(converged); + } } - } #ifdef XSPICE - } - else { + } + else { /* else do new algorithm */ /* first get the current step in the analysis */ - if(cv->TRCVvType[0] == vcode) { - g_mif_info.circuit.evt_step = ((VSRCinstance *)(cv->TRCVvElt[i])) + if(cv->TRCVvType[0] == vcode) { + g_mif_info.circuit.evt_step = ((VSRCinstance *)(cv->TRCVvElt[i])) ->VSRCdcValue ; - } else if(cv->TRCVvType[0] == icode) { - g_mif_info.circuit.evt_step = ((ISRCinstance *)(cv->TRCVvElt[i])) + } else if(cv->TRCVvType[0] == icode) { + g_mif_info.circuit.evt_step = ((ISRCinstance *)(cv->TRCVvElt[i])) ->ISRCdcValue ; - } else if(cv->TRCVvType[0] == rcode) { - g_mif_info.circuit.evt_step = ((RESinstance*)(cv->TRCVvElt[i]->GENmodPtr)) + } else if(cv->TRCVvType[0] == rcode) { + g_mif_info.circuit.evt_step = ((RESinstance*)(cv->TRCVvElt[i]->GENmodPtr)) ->RESresist; - } else if(cv->TRCVvType[0] == TEMP_CODE) { - g_mif_info.circuit.evt_step = ckt->CKTtemp - CONSTCtoK; - } + } else if(cv->TRCVvType[0] == TEMP_CODE) { + g_mif_info.circuit.evt_step = ckt->CKTtemp - CONSTCtoK; + } - /* if first time through, call EVTop immediately and save event results */ - if(firstTime) { - converged = EVTop(ckt, + /* if first time through, call EVTop immediately and save event results */ + if(firstTime) { + converged = EVTop(ckt, (ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITJCT, (ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITFLOAT, ckt->CKTdcMaxIter, MIF_TRUE); - EVTdump(ckt, IPC_ANAL_DCOP, g_mif_info.circuit.evt_step); - EVTop_save(ckt, MIF_FALSE, g_mif_info.circuit.evt_step); - if(converged != 0) - return(converged); - } - /* else, call NIiter first with mode = MODEINITPRED */ - /* to attempt quick analog solution. Then call all hybrids and call */ - /* EVTop only if event outputs have changed, or if non-converged */ - else { - converged = NIiter(ckt,ckt->CKTdcTrcvMaxIter); - EVTcall_hybrids(ckt); - if((converged != 0) || (ckt->evt->queue.output.num_changed != 0)) { - converged = EVTop(ckt, - (ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITJCT, - (ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITFLOAT, - ckt->CKTdcMaxIter, - MIF_FALSE); - EVTdump(ckt, IPC_ANAL_DCTRCURVE, g_mif_info.circuit.evt_step); + EVTdump(ckt, IPC_ANAL_DCOP, g_mif_info.circuit.evt_step); EVTop_save(ckt, MIF_FALSE, g_mif_info.circuit.evt_step); if(converged != 0) return(converged); } + /* else, call NIiter first with mode = MODEINITPRED */ + /* to attempt quick analog solution. Then call all hybrids and call */ + /* EVTop only if event outputs have changed, or if non-converged */ + else { + converged = NIiter(ckt,ckt->CKTdcTrcvMaxIter); + EVTcall_hybrids(ckt); + if((converged != 0) || (ckt->evt->queue.output.num_changed != 0)) { + converged = EVTop(ckt, + (ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITJCT, + (ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITFLOAT, + ckt->CKTdcMaxIter, + MIF_FALSE); + EVTdump(ckt, IPC_ANAL_DCTRCURVE, g_mif_info.circuit.evt_step); + EVTop_save(ckt, MIF_FALSE, g_mif_info.circuit.evt_step); + if(converged != 0) + return(converged); + } + } } - } /* gtri - end - wbk - Do EVTop if event instances exist */ #endif @@ -394,9 +404,9 @@ resume: ->RESresist; } /* PN Temp sweep */ - else + else { - ckt->CKTtime = ckt->CKTtemp - CONSTCtoK ; + ckt->CKTtime = ckt->CKTtemp - CONSTCtoK ; } #ifdef XSPICE @@ -419,7 +429,7 @@ resume: if(!ckt->CKTsenInfo) printf("sensitivity structure does not exist\n"); */ if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode&DCSEN) ){ - int senmode; + int senmode; #ifdef SENSDEBUG if(cv->TRCVvType[i]==vcode) { /* voltage source */ @@ -430,15 +440,15 @@ resume: printf("Current Source Value : %.5e A\n", ((ISRCinstance*)(cv->TRCVvElt[i]))->ISRCdcValue); } - if(cv->TRCVvType[i]==rcode) { /* resistance */ + if(cv->TRCVvType[i]==rcode) { /* resistance */ printf("Current Resistance Value : %.5e Ohm\n", ((RESinstance*)(cv->TRCVvElt[i]->GENmodPtr))->RESresist); } - if(cv->TRCVvType[i]==TEMP_CODE) { /* Temperature */ + if(cv->TRCVvType[i]==TEMP_CODE) { /* Temperature */ printf("Current Circuit Temperature : %.5e C\n", ckt-CKTtemp - CONSTCtoK); } - + #endif /* SENSDEBUG */ senmode = ckt->CKTsenInfo->SENmode; @@ -474,35 +484,42 @@ resume: } nextstep:; + if(cv->TRCVvType[i]==vcode) { /* voltage source */ ((VSRCinstance*)(cv->TRCVvElt[i]))->VSRCdcValue += cv->TRCVvStep[i]; } else if(cv->TRCVvType[i]==icode) { /* current source */ ((ISRCinstance*)(cv->TRCVvElt[i]))->ISRCdcValue += cv->TRCVvStep[i]; - } else if(cv->TRCVvType[i]==rcode) { /* resistance */ + } else if(cv->TRCVvType[i]==rcode) { /* resistance */ ((RESinstance*)(cv->TRCVvElt[i]))->RESresist += cv->TRCVvStep[i]; - /* This code should update resistance and conductance */ - ((RESinstance*)(cv->TRCVvElt[i]))->RESconduct = - 1/(((RESinstance*)(cv->TRCVvElt[i]))->RESresist); + /* This code should update resistance and conductance */ + ((RESinstance*)(cv->TRCVvElt[i]))->RESconduct = + 1/(((RESinstance*)(cv->TRCVvElt[i]))->RESresist); DEVices[rcode]->DEVload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); /* - * RESload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); - */ - } - /* PN Temp Sweep - serban */ + * RESload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); + */ + } + /* PN Temp Sweep - serban */ else if (cv->TRCVvType[i]==TEMP_CODE) { - ckt->CKTtemp += cv->TRCVvStep[i]; + ckt->CKTtemp += cv->TRCVvStep[i]; CKTtemp(ckt); } /* else not possible */ - if( (*(SPfrontEnd->IFpauseTest))() ) { + if( (*(SPfrontEnd->IFpauseTest))() ) { /* user asked us to pause, so save state */ cv->TRCVnestState = i; return(E_PAUSE); } +#ifdef HAS_WINDOWS + if (i == cv->TRCVnestLevel) { + actval += cv->TRCVvStep[cv->TRCVnestLevel]; + SetAnalyse( "dc", (int)abs(((actval * 100.) / actdiff))); + } +#endif } /* all done, lets put everything back */ @@ -519,21 +536,21 @@ nextstep:; } else if(cv->TRCVvType[i] == rcode) /* Resistance */ { ((RESinstance*)(cv->TRCVvElt[i]))->RESresist = cv->TRCVvSave[i]; - /* We restore both resistance and conductance */ - ((RESinstance*)(cv->TRCVvElt[i]))->RESconduct = - 1/(((RESinstance*)(cv->TRCVvElt[i]))->RESresist); - + /* We restore both resistance and conductance */ + ((RESinstance*)(cv->TRCVvElt[i]))->RESconduct = + 1/(((RESinstance*)(cv->TRCVvElt[i]))->RESresist); + ((RESinstance*)(cv->TRCVvElt[i]))->RESresGiven = cv->TRCVgSave[i]; - DEVices[rcode]->DEVload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); - - /* - * RESload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); - */ + DEVices[rcode]->DEVload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); + + /* + * RESload((GENmodel*)(cv->TRCVvElt[i]->GENmodPtr),ckt); + */ } - else if(cv->TRCVvType[i] == TEMP_CODE) { + else if(cv->TRCVvType[i] == TEMP_CODE) { ckt->CKTtemp = cv->TRCVvSave[i]; - CKTtemp(ckt); - } /* else not possible */ + CKTtemp(ckt); + } /* else not possible */ } (*(SPfrontEnd->OUTendPlot))(plot); diff --git a/visualc/vngspice.vcproj b/visualc/vngspice.vcproj index f57c2fbf3..f4bf414ce 100644 --- a/visualc/vngspice.vcproj +++ b/visualc/vngspice.vcproj @@ -40,7 +40,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories=""$(ProjectDir)..\src\maths\poly";"$(ProjectDir)..\src\frontend";"$(ProjectDir)..\src\spicelib\devices";"$(ProjectDir)..\src\include";"$(ProjectDir)include"" - PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;SIMULATOR;OUTDECK" + PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;SIMULATOR;OUTDECK;NGDEBUG" MinimalRebuild="true" ExceptionHandling="0" BasicRuntimeChecks="0" @@ -1100,11 +1100,11 @@ >