@ -11,6 +11,7 @@ Author: 1985 Thomas L. Quarles
# include "ngspice/suffix.h"
# include "ngspice/missing_math.h"
# include "ngspice/1-f-code.h"
# include "ngspice/compatmode.h"
# ifndef HAVE_LIBFFTW3
extern void fftFree ( void ) ;
@ -56,6 +57,7 @@ ISRCaccept(CKTcircuit *ckt, GENmodel *inModel)
double PHASE ;
double phase ;
double deltat ;
double tmax = 1e99 ;
TD = here - > ISRCfunctionOrder > 2
? here - > ISRCcoeffs [ 2 ] : 0.0 ;
@ -78,60 +80,79 @@ ISRCaccept(CKTcircuit *ckt, GENmodel *inModel)
time = ckt - > CKTtime - TD ;
tshift = TD ;
/* normalize phase to 0 - 360° */
/* normalize phase to cycles */
phase = PHASE / 360.0 ;
phase = fmod ( phase , 1.0 ) ;
deltat = phase * PER ;
while ( deltat > 0 )
deltat - = PER ;
time + = deltat ;
tshift = TD - deltat ;
if ( time > = PER ) {
/* repeating signal - figure out where we are */
/* in period */
basetime = PER * floor ( time / PER ) ;
time - = basetime ;
if ( newcompat . xs ) {
/* normalize phase to 0 - 360° */
/* normalize phase to cycles */
phase = PHASE / 360.0 ;
phase = fmod ( phase , 1.0 ) ;
deltat = phase * PER ;
while ( deltat > 0 )
deltat - = PER ;
time + = deltat ;
tshift = TD - deltat ;
}
else if ( PHASE > 0.0 ) {
tmax = PHASE * PER ;
}
if ( time < = 0.0 | | time > = TR + PW + TF ) {
if ( ckt - > CKTbreak & & SAMETIME ( time , 0.0 ) ) {
error = CKTsetBreak ( ckt , basetime + TR + tshift ) ;
if ( error ) return ( error ) ;
} else if ( ckt - > CKTbreak & & SAMETIME ( TR + PW + TF , time ) ) {
error = CKTsetBreak ( ckt , basetime + PER + tshift ) ;
if ( error ) return ( error ) ;
} else if ( ckt - > CKTbreak & & ( time = = - tshift ) ) {
error = CKTsetBreak ( ckt , basetime + tshift ) ;
if ( error ) return ( error ) ;
} else if ( ckt - > CKTbreak & & SAMETIME ( PER , time ) ) {
error = CKTsetBreak ( ckt , basetime + tshift + TR + PER ) ;
if ( error ) return ( error ) ;
if ( ! newcompat . xs & & time > tmax ) {
/* Do nothing */
}
else {
if ( time > = PER ) {
/* repeating signal - figure out where we are */
/* in period */
basetime = PER * floor ( time / PER ) ;
time - = basetime ;
}
} else if ( time > = TR & & time < = TR + PW ) {
if ( ckt - > CKTbreak & & SAMETIME ( time , TR ) ) {
error = CKTsetBreak ( ckt , basetime + tshift + TR + PW ) ;
if ( error ) return ( error ) ;
} else if ( ckt - > CKTbreak & & SAMETIME ( TR + PW , time ) ) {
error = CKTsetBreak ( ckt , basetime + tshift + TR + PW + TF ) ;
if ( error ) return ( error ) ;
if ( time < = 0.0 | | time > = TR + PW + TF ) {
if ( ckt - > CKTbreak & & SAMETIME ( time , 0.0 ) ) {
error = CKTsetBreak ( ckt , basetime + TR + tshift ) ;
if ( error ) return ( error ) ;
}
else if ( ckt - > CKTbreak & & SAMETIME ( TR + PW + TF , time ) ) {
error = CKTsetBreak ( ckt , basetime + PER + tshift ) ;
if ( error ) return ( error ) ;
}
else if ( ckt - > CKTbreak & & ( time = = - tshift ) ) {
error = CKTsetBreak ( ckt , basetime + tshift ) ;
if ( error ) return ( error ) ;
}
else if ( ckt - > CKTbreak & & SAMETIME ( PER , time ) ) {
error = CKTsetBreak ( ckt , basetime + tshift + TR + PER ) ;
if ( error ) return ( error ) ;
}
}
} else if ( time > 0 & & time < TR ) {
if ( ckt - > CKTbreak & & SAMETIME ( time , 0 ) ) {
error = CKTsetBreak ( ckt , basetime + tshift + TR ) ;
if ( error ) return ( error ) ;
} else if ( ckt - > CKTbreak & & SAMETIME ( time , TR ) ) {
error = CKTsetBreak ( ckt , basetime + tshift + TR + PW ) ;
if ( error ) return ( error ) ;
else if ( time > = TR & & time < = TR + PW ) {
if ( ckt - > CKTbreak & & SAMETIME ( time , TR ) ) {
error = CKTsetBreak ( ckt , basetime + tshift + TR + PW ) ;
if ( error ) return ( error ) ;
}
else if ( ckt - > CKTbreak & & SAMETIME ( TR + PW , time ) ) {
error = CKTsetBreak ( ckt , basetime + tshift + TR + PW + TF ) ;
if ( error ) return ( error ) ;
}
}
} else { /* time > TR + PW && < TR + PW + TF */
if ( ckt - > CKTbreak & & SAMETIME ( time , TR + PW ) ) {
error = CKTsetBreak ( ckt , basetime + tshift + TR + PW + TF ) ;
if ( error ) return ( error ) ;
} else if ( ckt - > CKTbreak & & SAMETIME ( time , TR + PW + TF ) ) {
error = CKTsetBreak ( ckt , basetime + tshift + PER ) ;
if ( error ) return ( error ) ;
else if ( time > 0 & & time < TR ) {
if ( ckt - > CKTbreak & & SAMETIME ( time , 0 ) ) {
error = CKTsetBreak ( ckt , basetime + tshift + TR ) ;
if ( error ) return ( error ) ;
}
else if ( ckt - > CKTbreak & & SAMETIME ( time , TR ) ) {
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 ) ) {
error = CKTsetBreak ( ckt , basetime + tshift + TR + PW + TF ) ;
if ( error ) return ( error ) ;
}
else if ( ckt - > CKTbreak & & SAMETIME ( time , TR + PW + TF ) ) {
error = CKTsetBreak ( ckt , basetime + tshift + PER ) ;
if ( error ) return ( error ) ;
}
}
}
}