ngspice/examples/tclspice/tcl-testbench4/vspicechart.tcl

251 lines
6.1 KiB
Tcl

############ spice chart program ###########
############ programmer: stephan thiel ###########
############ thiel@mikro.ee.tu-berlin.de ###########
############ (c) 2008 Berlin, Germany ###########
############ Don't trust any version ###########
############ before 1.0 ###########
package require BLT
load "../../src/.libs/libspice.so"
source selectfromlist.tcl
source bltGraph.tcl
namespace import blt::*
wm title . "vspicechart 0.01"
wm geometry . 800x450+40+40
pack propagate . false
set globals(colors) { red green blue orange yellow white gray lightblue pink darkblue \
lightred lightgray darkgray darkblue darkgreen darkred violet salmon \
gray100 gold SeaGreen RoyalBlue RosyBrown orchid MintCream magenta LimeGreen \
gray33 DeepSkyBlue DarkGoldenrod chocolate gray77 aquamarine brown coral \
DarkOliveGreen DarkOrange DarkSlateGray gray99 HotPink IndianRed LemonChiffon \
LightSteelBlue PaleGreen peru sienna seashell SpringGreen tomato wheat WhiteSmoke}
proc replacechar { str pat pat1} {
set erg ""
for { set i 0 } { $i < [string length $str] } {incr i 1 } {
if { [ string index $str $i ] == $pat } {
append erg $pat1
} else {
append erg [string index $str $i ]
}
}
return $erg
}
proc realtostr { r } {
set b [ expr abs($r) ]
set mul 1e-18
set prefix a
if { $b > 9.9999999999e-16 } {
set mul 1e15
set prefix f
}
if { $b > 9.9999999999e-13 } {
set mul 1e12
set prefix p
}
if { $b > 9.9999999999e-10 } {
set mul 1e9
set prefix n
}
if { $b > 9.9999999999e-7 } {
set mul 1e6
set prefix u
}
if { $b > 9.9999999999e-4 } {
set mul 1e3
set prefix m
}
if { $b > 0.999999999999999 } {
set mul 1
set prefix ""
}
if { $b > 999 } {
set mul 1e-3
set prefix K
}
if { $b > 9.999999999e5 } {
set mul 1e-6
set prefix MEG
}
if { $b > 9.9999999999e8 } {
set mul 1e-9
set prefix G
}
if { $b > 9.99999999999e11 } {
set mul 1e-12
set prefix T
}
set str [ format "%1.8g$prefix" [expr $r*$mul] ]
if { $str=="0a" } { set str "0" }
return $str
}
proc realtostr1 { elem r } {
scan $r "%f" erg
return [ realtostr $erg ]
}
set globals(signals) {};
proc readconfigfile { } {
global globals
global const
if { [file exists $globals(CONFIGFILE)] } {
set fid [open $globals(CONFIGFILE) r]
while { ![eof $fid] } {
gets $fid tempstring
if { [string first "PACK-PATH=" $tempstring]==0 } {
scan $tempstring "PACK-PATH=%s" globals(PACK-PATH)
}
if { [string first "SIMULATOR=" $tempstring]==0 } {
scan $tempstring "SIMULATOR=%s" globals(SIMULATOR)
}
}
close $fid
} else {
set globals(PACK-PATH) ""
set globals(SIMULATOR) "INTERNAL"
}
}
proc select_vector { } {
global globals
set thissignals [spice::spice_data]
set signals {}
foreach sig $thissignals {
if { [lindex $sig 0] != "time" } {
lappend signals [lindex $sig 0]
}
}
set selectedsignal [selectionwindow::selectfromlist .select "Select Signal" $signals ]
if { ( [string trim $selectedsignal] != "") && ([lsearch -exact $globals(signals) $selectedsignal] == -1) } {
eval "$globals(LSELECTEDSIGNALS) insert end $selectedsignal"
vector create [replacechar $selectedsignal "\#" "_"]
}
}
proc start_new_sel { } {
global globals
set elemlist [ eval "$globals(chart0) element show" ]
for { set j 0 } {$j < [llength $elemlist] } {incr j 1} {
$globals(chart0) element delete [lindex $elemlist $j ]
}
set i 0
foreach sig $globals(signals) {
set nsig [replacechar $sig "\#" "_"]
vector create $nsig
spice::spicetoblt $sig $nsig
$globals(chart0) element create $sig -color [lindex $globals(colors) $i] -xdata stime -ydata $nsig -symbol none
incr i 1
}
}
proc delete_selected { } {
global globals
set elem [$globals(LSELECTEDSIGNALS) curselection]
if { $elem != "" } {
$globals(LSELECTEDSIGNALS) delete $elem
}
}
set filename [ lindex $argv 0]
if { [file exists $filename ] } {
spice::source $filename
spice::bg run
after 1000
frame .f1
pack .f1 -side left -expand true -fill both
listbox .f1.blistbox -listvariable globals(signals)
pack .f1.blistbox -side top -fill both -expand true
set globals(LSELECTEDSIGNALS) .f1.blistbox
button .f1.baddvec -text "Select Vector" -command "select_vector"
pack .f1.baddvec -side top -fill x -expand true
button .f1.bdelvec -text "Delete Vector" -command "delete_selected"
pack .f1.bdelvec -side top -fill x -expand true
button .f1.bstartsel -text "Start with new selection" -command start_new_sel
pack .f1.bstartsel -side top -fill x -expand true
button .f1.simstop -text "Simulation Stop" -command "spice::stop"
pack .f1.simstop -side top -fill x -expand true
button .f1.simresume -text "Simulation Resume" -command "spice::bg resume"
pack .f1.simresume -side top -fill x -expand true
button .f1.bexit -text "Exit" -command "exit"
pack .f1.bexit -side top -fill x -expand true
frame .f2
pack .f2 -side left -expand true -fill both
stripchart .f2.chart
pack .f2.chart -side top -fill both -expand true
.f2.chart axis configure x -title "Time in s"
.f2.chart grid configure -hide no
Blt_ZoomStack .f2.chart
Blt_Crosshairs .f2.chart
Blt_ClosestPoint .f2.chart
Blt_PrintKey .f2.chart
Blt_ActiveLegend .f2.chart
.f2.chart crosshairs configure -color lightblue
.f2.chart axis configure x -command realtostr1
.f2.chart axis configure y -command realtostr1
set globals(chart0) .f2.chart
vector create stime
proc bltupdate {} {
global globals
spice::spicetoblt time stime
foreach sig $globals(signals) {
set nsig [replacechar $sig "\#" "_"]
spice::spicetoblt $sig $nsig
}
after 100 bltupdate
}
bltupdate
} else {
exit;
}