diff --git a/src/spicelib/devices/vsrc/vsrcacct.c b/src/spicelib/devices/vsrc/vsrcacct.c index ef17b0a36..640b5051c 100644 --- a/src/spicelib/devices/vsrc/vsrcacct.c +++ b/src/spicelib/devices/vsrc/vsrcacct.c @@ -49,6 +49,7 @@ VSRCaccept(CKTcircuit *ckt, GENmodel *inModel) double phase; double deltat; double basephase; + double tshift; #endif double time = 0.; //hvogt double basetime = 0; @@ -83,7 +84,8 @@ VSRCaccept(CKTcircuit *ckt, GENmodel *inModel) /* compute equivalent delta time and add to time */ deltat = (phase / (2 * M_PI)) * PER; time += deltat; - TD -= deltat; + tshift = TD - deltat; + while (tshift < 0) tshift += PER; #endif /* gtri - end - wbk - add PHASE parameter */ @@ -96,49 +98,49 @@ VSRCaccept(CKTcircuit *ckt, GENmodel *inModel) if( time <= 0 || time >= TR + PW + TF) { if(ckt->CKTbreak && SAMETIME(time,0)) { /* set next breakpoint */ - error = CKTsetBreak(ckt,basetime + TR +TD); + error = CKTsetBreak(ckt,basetime + TR + tshift); if(error) return(error); } else if(ckt->CKTbreak && SAMETIME(TR+PW+TF,time) ) { /* set next breakpoint */ - error = CKTsetBreak(ckt,basetime + PER + TD); + error = CKTsetBreak(ckt,basetime + PER + tshift); if(error) return(error); - } else if (ckt->CKTbreak && (time == -TD) ) { + } else if (ckt->CKTbreak && (time == -tshift) ) { /* set next breakpoint */ - error = CKTsetBreak(ckt,basetime + TD); + error = CKTsetBreak(ckt,basetime + tshift); if(error) return(error); } else if (ckt->CKTbreak && SAMETIME(PER,time) ) { /* set next breakpoint */ - error = CKTsetBreak(ckt,basetime + TD + TR + PER); + error = CKTsetBreak(ckt,basetime + tshift + TR + PER); if(error) return(error); } } else if ( time >= TR && time <= TR + PW) { if(ckt->CKTbreak && SAMETIME(time,TR) ) { /* set next breakpoint */ - error = CKTsetBreak(ckt,basetime + TD+TR + PW); + error = CKTsetBreak(ckt,basetime + tshift + TR + PW); if(error) return(error); } else if(ckt->CKTbreak && SAMETIME(TR+PW,time) ) { /* set next breakpoint */ - error = CKTsetBreak(ckt,basetime + TD+TR + PW + TF); + error = CKTsetBreak(ckt,basetime + tshift + TR + PW + TF); if(error) return(error); } } else if (time > 0 && time < TR) { if(ckt->CKTbreak && SAMETIME(time,0) ) { /* set next breakpoint */ - error = CKTsetBreak(ckt,basetime + TD+TR); + error = CKTsetBreak(ckt,basetime + tshift + TR); if(error) return(error); } else if(ckt->CKTbreak && SAMETIME(time,TR)) { /* set next breakpoint */ - error = CKTsetBreak(ckt,basetime + TD+TR + PW); + error = CKTsetBreak(ckt,basetime + tshift + TR + PW); if(error) return(error); } } else { /* time > TR + PW && < TR + PW + TF */ if(ckt->CKTbreak && SAMETIME(time,TR+PW) ) { /* set next breakpoint */ - error = CKTsetBreak(ckt,basetime + TD+TR + PW +TF); + error = CKTsetBreak(ckt,basetime + tshift+TR + PW +TF); if(error) return(error); } else if(ckt->CKTbreak && SAMETIME(time,TR+PW+TF) ) { /* set next breakpoint */ - error = CKTsetBreak(ckt,basetime + TD+PER); + error = CKTsetBreak(ckt,basetime + tshift + PER); if(error) return(error); } }