ngspice/examples/Monte_Carlo/MC_2_control.sp

48 lines
1.8 KiB
SourcePawn

*ng_script
* Perform Monte Carlo simulation in ngspice
* script for use with 25 stage Ring-Osc. BSIM3
* circuit is in MC_2_circ.sp
* edit 'setcs sourcepath' for your path to circuit file
* start script by 'ngspice -o MC_2_control.log MC_2_control.sp'
*
.control
let mc_runs = 10 $ number of runs for monte carlo
let run = 1 $ number of the actual run
* Where to find the circuit netlist file MC_2_circ.sp
setcs sourcepath = ( D:\Spice_general\ngspice\examples\Monte_Carlo )
* create file for frequency information
echo Monte Carlo, frequency of R.O. > MC_frequ.log
* run the simulation loop
dowhile run <= mc_runs
* without the reset switch there is some strange drift
* towards lower and lower frequencies
set run = $&run $ create a variable from the vector
setseed $run $ set the rnd seed value to the loop index
if run = 1
source MC_2_circ.sp $ load the circuit once from file, including model data
else
mc_source $ re-load the circuit from internal storage
end
save buf $ we just need output vector buf, save memory by more than 10x
tran 15p 200n 0
write mc_ring{$run}.out buf $ write each sim output to its own rawfile
linearize buf $ lienarize buf to allow fft
fft buf $ run fft on vector buf
let buf2=db(mag(buf))
* find the frequency where buf has its maximum of the fft signal
meas sp fft_max MAX_AT buf2 from=0.1G to=0.7G
print fft_max >> MC_frequ.log $ print frequency to file
destroy all $ delete all output vectors
remcirc $ delete circuit
let run = run + 1 $ increase loop counter
end
quit
.endc
.end