#+TITLE: Readme * Overview Extends org-babel capabilities to support spice simulations using ngspice. Simulations are executed using an interactive ngspice process running in emacs. The running ngspice process can be used to manipulate the simulation results directly or spread a simulation into multiple src blocks. Spice source blocks are interpreted as circuit descriptions until an '.end' line is encountered. After that a control part may follow (surrounded by '.control' and '.endc' lines). *If there is no '.end'* *line all of the src block is interpreted as a control block!* * Use cases ** Just load some circuit for later simulation: #+BEGIN_SRC spice :results output ,* RC r1 1 0 10k c1 1 0 1p .IC V(1)=1 .tran 1n 0.1u .end #+END_SRC #+RESULTS: : Circuit: * rc ** Execute some stuff #+BEGIN_SRC spice echo "Hello world" #+END_SRC #+RESULTS: : Hello world #+BEGIN_SRC spice echo "0,1,2,3" #+END_SRC #+RESULTS: | 0 | 1 | 2 | 3 | ** Plot some voltages and return png #+BEGIN_SRC spice :var file="/tmp/xzy" :results file ,*RC circuit r1 1 0 10k c1 1 0 1p .IC V(1)=1 .tran 1n 0.1u .end .control run set gnuplot_terminal=png gnuplot $file v(1) .endc #+END_SRC #+RESULTS: [[file:/tmp/xzy.png]] ** Do measurements and return results #+BEGIN_SRC spice :session spicetest :results value ,*Time Constant Measurement r1 1 0 10k c1 1 0 1p .IC V(1)=1 .tran 1n 0.1u .print tran v(1) .end .control run meas tran value_at_tau find V(1) at=1e-8 meas tran value_at_five_tau find V(1) at=5e-8 echo $&value_at_tau ,$&value_at_five_tau .endc #+END_SRC #+RESULTS: | 0.36798 | 0.00671732 | ** Write simulation data to file and return file name #+BEGIN_SRC spice :var file="/tmp/xyz" :post plot_stuff[:file /tmp/xyz.png](data=*this*) :results file ,*RC circuit r1 1 0 10k c1 1 0 1p .IC V(1)=1 .tran 1n 0.1u .end .control run wrdata $file v(1) .endc #+END_SRC #+RESULTS: [[file:/tmp/xyz.png]] #+NAME: plot_stuff #+BEGIN_SRC gnuplot :var data="x" :file "/tmp/ignored.png" :results silent plot data u 1:2 w l ls 1 #+END_SRC ** Use calculation results of other src blocks as parameters #+NAME: dim1_params #+BEGIN_SRC ruby :exports none [7.3260073260073255e-06,1.3215597400496679e-05,5.411787135503391e-06,2.344322344322345e-05,2.4e-06, 100.0] #+END_SRC #+RESULTS: dim1_params | 7.3260073260073255e-06 | 1.3215597400496679e-05 | 5.411787135503391e-06 | 2.344322344322345e-05 | 2.4e-06 | 100.0 | #+NAME: dim1_plot #+BEGIN_SRC gnuplot :var data="x" :file /tmp/ignored.png :results silent :exports none set terminal pngcairo size 640,300 enhanced set format y "%.0s%cV" set format x "%.0s%cs" set xrange [190e-9:260e-9] set ytics 5e-3 set xlabel "t" plot data using 1:2 w l ls 2 t "V_{out}" #+END_SRC #+BEGIN_SRC spice :session test :var dim=dim1_params :results output ,* DAC.asc .model NMOS NMOS .model PMOS PMOS .lib /home/fred/spice/library/ngspice/CM5/CM5-N.phy CM5 M1 0 VDD N005 N005 MP7 l=$dim[5] w=$dim[4] M2 VOUT VCTRL N005 N005 MP7 l=$dim[5] w=$dim[4] M4 N003 N002 VDD VDD MP7 l=$dim[3] w=$dim[2] M3 N002 N002 VDD VDD MP7 l=$dim[3] w=$dim[2] M5 N005 N004 N003 N003 MP7 l=$dim[3] w=$dim[2] M6 N004 N004 N002 N002 MP7 l=$dim[3] w=$dim[2] RL VOUT 0 $dim[6] CL VOUT 0 10p VDD VDD 0 5 IREF N004 0 7.3u V1 VBIAS 0 2.5 V2 VCTRL 0 PULSE(0 5 0 1n 1n 200n 420n) VM VDD N001 0 .tran 1n 300n 190n .end #+END_SRC #+RESULTS: : Circuit: * dac.asc #+NAME: dim1 #+BEGIN_SRC spice :session test :var file="/tmp/dim1" dim=dim1_params :post dim1_plot[:file /tmp/dim1.png](data=*this*) :results file save all run wrdata $file v(vout) #+END_SRC #+RESULTS: dim1 [[file:/tmp/dim1.png]] * Current supported Flags ** :dir Working directory to run the src block in. Default is the value of `default-directory'.