move everything out of trunk
[lttv.git] / verif / Spin / Xspin5.1 / xspin510.tcl
diff --git a/verif/Spin/Xspin5.1/xspin510.tcl b/verif/Spin/Xspin5.1/xspin510.tcl
new file mode 100755 (executable)
index 0000000..3597ebe
--- /dev/null
@@ -0,0 +1,7095 @@
+#!/bin/sh
+# the next line restarts using wish \
+exec wish c:/cygwin/bin/xspin -- $*
+
+# cd   ;# enable to cd to home directory by default
+
+# on PCs:
+# adjust the first argument to wish above with the name and
+# location of this tcl/tk file on your system, if different.
+#
+# Cygwin:
+# if you use cygwin, do not refer to the file as /usr/bin/xspin
+# /usr/bin is a symbolic link to /bin, which really
+# lives in c:/cygwin, hence the contortions above
+#
+# on Unix/Linux/Solaris systems
+# replace the first line with something like
+#      #!/usr/bin/wish -f
+# using the pathname for the wish executable on your system
+
+#======================================================================#
+# Tcl/Tk Spin Controller, written by Gerard J. Holzmann, 1995-2005.    #
+# See the README.html file for full installation notes.                #
+#        http://spinroot.com/spin/whatispin.html                       #
+#======================================================================#
+set xversion "5.1.0 -- 24 April 2008"
+
+# -- Xspin Installation Notes (see also README.html):
+
+# 1. On Unix systems: change the first line of this file to point to the wish
+#    executable you want to use (e.g., wish4.2 or /usr/local/bin/wish8.0)
+#    ==> be careful, the pathname should be 30 characters or less
+#
+# 2. If you use another C compiler than gcc, change the set CC line below
+#
+# 3. Browse the configurable options below if you would like to
+#    change or adjust the visual appearance of the GUI
+#
+# 4. If you run on a PC, and have an ancient version of tcl/tk,
+#    you must set the values fo Unix, CMD, and Go32 by hand below
+#    => with Tcl/Tk 7.5/4.1 or later, this happens automatically
+
+# set CC   "cc -w -Wl -woff,84"        ;# ANSI-C compiler, suppress warnings
+# set CC   "cl -w -nologo"     ;# Visual Studio C/C++ compiler, prefered on PCs
+  set CC   "gcc -w"            ;# standard gcc compiler - no warnings
+  set CC0  "gcc"
+
+# set CPP  "cpp"               ;# the normal default C preprocessor
+  set CPP  "gcc -E -x c"       ;# c preprocessor, assuming we have gcc
+
+  set SPIN "spin"      ;# use a full path-name if necessary, e.g. c:/cygwin/bin/spin.exe
+  set DOT  "dot"       ;# optional, graph layout interface
+                       ;# no prob if dot is not available
+  set BG   "white"     ;# default background color for text
+  set FG   "black"     ;# default foreground color for text
+  set CMD  ""          ;# default is empty, and adjusted below
+  set Unix 1           ;# default is Unix, but this is adjusted below
+  set Ptype "color"    ;# printer-type: mono, color, or gray
+  set NT 0             ;# scratch variable, ignore
+
+  set debug_on 0
+  if {$debug_on} {
+       toplevel .debug ;   #debugging window
+       text .debug.txt -width 80 -height 60 -relief raised -bd 2 \
+               -yscrollcommand ".debug.scroll set"
+       scrollbar .debug.scroll -command ".debug.txt yview"
+       pack .debug.scroll -side right -fill y
+       pack .debug.txt -side left
+  }
+  proc debug {txt} {
+       global debug_on
+       if {$debug_on} {
+       catch { .debug.txt insert end "\n$txt" }
+  }    }
+
+  if [info exists tcl_platform] {
+       set sys $tcl_platform(platform)
+#      if {$sys == "macintosh"} {
+#              ... no adjustments needed? ...
+#      }
+        if {[string match windows $sys]} {
+               set Unix 0      ;# means Windows95/98/2000/NT/XP
+
+#              if {[auto_execok cl] != ""} {
+#                      set CC   "cl -w -nologo"        ;# Visual Studio compiler, PCs
+#                      set CC0  "cl"
+#              }
+
+               if {$tcl_platform(os) == "Windows 95"} {
+                       set CMD  "command.com"  ;# Windows95
+               } else {
+                       set CMD  "cmd"
+                       set NT 1
+  }    }       }
+
+#-- GUI configuration options - by Leszek Holenderski <lhol@win.tue.nl>
+#-- basic text size:
+       set HelvBig     -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*
+# mscs:
+       if {$NT} {      ;# on a windows nt machine
+       set SmallFont   "-*-Courier-Bold-R-Normal--*-110-*"
+       set BigFont     "-*-Courier-Bold-R-Normal--*-110-*"
+       } else {
+       set SmallFont   "-*-Courier-Bold-R-Normal--*-80-*"
+       set BigFont     "-*-Courier-Bold-R-Normal--*-80-*"
+       }
+
+# Some visual aspects of Xspin GUI can be configured by the user.
+# On PCs, the values of configuration options that are hard-coded
+# into this script can be modified (see below). On Unix, in addition to
+# (or rather, instead of) the manual modification, the values can be set in
+# an Xspin resource file ($HOME/.xspinrc) and/or in the X11 default resource
+# file (usually, $HOME/.Xdefaults).
+
+# Since the same option can be specified in several places, options can have
+# several, possibly inconsistent, values. The value which takes effect is
+# determined by the order in which options are scanned. The values specified
+# later in the order have higher priority. First, hard-coded options are
+# scanned, then options specified in .Xdefaults, and finally options
+# specified in .xspinrc.
+
+# When setting configuration options in an .xspinrc file, convert the 
+# settings below to the format of an X11 resource file. For example,
+#
+#      # width of scrollbars (any Tk dimension, default 15 pixels)
+#      option add *Scrollbar.width     13      startupFile
+#
+# should be converted to
+#
+#      ! width of scrollbars (any Tk dimension, default 15 pixels)
+#      *Scrollbar.width        13
+# In .Xdefaults file, configuration options should be preceded by the
+# application's name, so the above option should be converted to
+#
+#      ! width of scrollbars (any Tk dimension, default 15 pixels)
+#      xspin*Scrollbar.width   13
+# side on which side scrollbars are put (left or right, default=right)
+
+option add *Scrollbar.side     left    startupFile
+
+#--- sizes
+       # width of scrollbars (any Tk dimension, default 15 pixels)
+       option add *Scrollbar.width     13      startupFile
+       # width of borders (in pixels, typically 1 or 2, default 2)
+       option add *borderWidth         1       startupFile
+       # initial width of the input/log area (in characters, default 80)
+       option add *Input*Text.width    72      startupFile
+       option add *Log*Text.width      72      startupFile
+       # initial height of the input area (in lines, default 24)
+       option add *Input*Text.height   20      startupFile
+       # initial height of the log area (in lines, default 24)
+       option add *Log*Text.height     5       startupFile
+       # size of the handle used to adjust the height of the log area
+       # (in pixels, default 0)
+       option add *Handle.width        10      startupFile
+       option add *Handle.height       10      startupFile
+#--- colors
+       # colors for the input/log area
+       option add *Input*Text.background       white   startupFile
+       option add *Input*Text.foreground       black   startupFile
+       option add *Log*Text.background         gray95  startupFile
+       option add *Log*Text.foreground         black   startupFile
+       # colors for the editable/read-only area
+       option add *Entry.background            white   startupFile
+       option add *Edit*Text.background        white   startupFile
+       option add *Edit*Text.foreground        black   startupFile
+       # colors for the editable/read-only area
+       option add *Read*Text.background        gray95  startupFile
+       option add *Read*Text.foreground        black   startupFile
+#--- fonts
+       # fonts for the input/log area (default is system dependent,
+       # usually -*-Courier-Medium-R-Normal--*-120-*)
+option add *Input*Text.font    -*-Helvetica-Medium-R-Normal--*-120-*   startupFile
+#option add *Input*Text.font   -schumacher-clean-medium-r-normal--*-120-*-60-* startupFile
+#option add *Log*Text.font     -schumacher-clean-medium-r-normal--*-120-*-60-* startupFile
+
+#--- widgets
+       # simple texts (dialogs which present read-only texts, such as help)
+       option add *SimpleText.Text.width 60
+       option add *SimpleText.Text.height 30
+       option add *SimpleText.Text.background white
+
+       # sections (decorated frames for grouping related buttons)
+       option add *Section*Title.font          -*-Helvetica-Bold-R-Normal--*-100-*     startupFile
+
+#option add *Section*Checkbutton.font  -*-Helvetica-Medium-R-Normal--*-100-*   startupFile
+#option add *Section*Radiobutton.font  -*-Helvetica-Medium-R-Normal--*-100-*   startupFile
+#option add *Section*Label.font                -*-Helvetica-Medium-R-Normal--*-100-*   startupFile
+
+################ end of configurable parameters #######################
+
+wm title . "SPIN CONTROL $xversion"
+wm iconname . "SPIN"
+wm geometry . +41+50
+wm minsize  . 400 200
+
+set Fname ""
+set firstime 1
+set notignored 0
+
+#### seed the advanced parameters settings
+
+set e(0)       "Physical Memory Available (in Mbytes): "
+set ival(0)    128
+set expl(0)    "explain"
+
+set e(1)       "Estimated State Space Size (states x 10^3): "
+set ival(1)    500
+set expl(1)    "explain"
+
+set e(2)       "Maximum Search Depth (steps): "
+set ival(2)    10000
+set expl(2)    "explain"
+
+set e(7)       "Nr of hash-functions in Bitstate mode: "
+set ival(7)    2
+set expl(7)    "explain"
+
+set e(3)       "Extra Compile-Time Directives (Optional): "
+set ival(3)    ""
+set expl(3)    "Choose"
+
+set e(4)       "Extra Run-Time Options (Optional): "
+set ival(4)    ""
+set expl(4)    "Choose"
+
+set e(5)       "Extra Verifier Generation Options: "
+set ival(5)    ""
+set expl(5)    "Choose"
+
+set ival(6)    1       ;# which error is reported, default is 1st
+
+
+# allow no more than one entry per selection
+catch { tk_listboxSingleSelect Listbox }
+
+proc msg_file {f nowarn} {
+       set msg ""
+       set ef [open $f r]
+
+       while {[gets $ef line] > -1} {
+               if {$nowarn} {
+                       if {[string first "warning" $line] < 0} {
+                               set msg "$msg\n$line"
+                       }
+               } else {
+                       set msg "$msg\n$line"
+       }       }
+       close $ef
+       return $msg
+}
+
+       scan $tk_version "%d.%d" tk_major tk_minor
+
+       set version ""
+
+       if {[auto_execok $SPIN] == "" \
+       ||  [auto_execok $SPIN] == 0} {
+               set version "Error: No executable $SPIN found..."
+       } else {
+               if {$Unix} {
+                       set version [exec $SPIN -V]
+               } else {
+                       catch { exec $SPIN -V >&pan.tmp } err
+                       if {$err == ""} {
+                               set version [msg_file pan.tmp 1]
+                       } else {
+                               puts "error: $err"
+                               puts "is there a $SPIN and a go32.exe?"
+                               exit
+               }       }
+               if {[string first "Spin Version 5" $version] < 0 \
+               &&  [string first "Spin Version 4" $version] < 0 \
+               &&  [string first "Spin Version 3" $version] < 0 } {
+                       set version "Spin Version not recognized: $version"
+               }
+       }
+
+frame .menu
+       # top level menu bar
+       menubutton .menu.file -text "File.." \
+               -relief raised -menu .menu.file.m
+       menubutton .menu.run -text "Run.." -fg red \
+               -relief raised -menu .menu.run.m
+       menubutton .menu.edit -text "Edit.." \
+               -relief raised -menu .menu.edit.m
+       menubutton .menu.view -text "View.." \
+               -relief raised -menu .menu.view.m
+       label .menu.title -text "SPIN  DESIGN  VERIFICATION" -fg blue
+
+       set lno 1
+       label .menu.lno -text "Line#:" -relief raised 
+       entry .menu.ent -width 6 -textvariable lno \
+               -relief sunken -background white -foreground black
+       bind  .menu.ent <Return> {
+               .inp.t tag remove hilite 0.0 end
+               .inp.t tag add hilite $lno.0 $lno.1000
+               .inp.t tag configure hilite -background $FG -foreground $BG
+               .inp.t yview -pickplace [expr $lno-4]
+       }
+
+       label .menu.fnd1 -text "Find:" -relief raised 
+       entry .menu.fnd2 -width 8 -textvariable pat \
+               -relief sunken -background white -foreground black
+       bind  .menu.fnd2 <Return> {
+               .inp.t tag remove hilite 0.0 end
+               forAllMatches .inp.t $pat
+       }
+
+       menubutton .menu.help -text "Help" -relief raised \
+               -menu .menu.help.m
+
+       pack append .menu \
+               .menu.file {left frame w} \
+               .menu.edit {left frame w} \
+               .menu.view {left frame w} \
+               .menu.run {left frame w} \
+               .menu.help {left frame w} \
+               .menu.title {left frame c expand} \
+               .menu.fnd2 {right frame e} \
+               .menu.fnd1 {right frame e} \
+               .menu.ent {right frame e} \
+               .menu.lno {right frame e}
+
+set loglines 5
+frame .log
+       text .log.t -bd 2 -height $loglines -background $FG -foreground $BG
+frame .log.b
+       button .log.b.pl -text "+" \
+               -command {incr loglines  1; .log.t configure -height $loglines}
+       button .log.b.mn -text "-" \
+               -command {incr loglines -1; .log.t configure -height $loglines}
+       pack append .log.b .log.b.pl {top}
+       pack append .log.b .log.b.mn {top}
+       pack append .log .log.b {left filly}
+       pack append .log .log.t {right expand fill}
+
+proc dopaste {} {
+       global FG BG
+       set from [.inp.t index insert]
+       tk_textPaste .inp.t
+       set upto [.inp.t index insert]
+       .inp.t tag add sel $from $upto
+#      .inp.t tag configure hilite -background $FG -foreground $BG
+}
+
+#- fetch the value of user-defined configuration options
+
+proc fetchOption {name default args} {
+
+  set class Dummy
+  set fullName $name
+
+  # class encoded in name ?
+  switch -glob -- $name *.* {
+    set list [split $name .]
+    switch [llength $list] 2 {} default { error "wrong option \"$name\" }
+    set class [lindex $list 0]
+    set name  [lindex $list 1]
+  }
+
+  # create a unique dummy frame of requested class and get the option's value
+  set dummy .0
+  while {[winfo exists $dummy]} { append dummy 0 }
+  frame $dummy -class $class
+  set value [option get $dummy $name $class]
+  destroy $dummy
+
+  # option not defined ?
+  switch -- $value "" { return $default }
+
+  # check a restriction on option's value
+  switch [llength $args] {
+    0 { # no restriction
+      }
+    1 { # restriction is given as a list of allowed values
+        switch -- [lsearch -exact [lindex $args 0] $value] -1 {
+          set msg "wrong value \"$value\" of option \"$fullName\"\
+                   (should be one of $args)"
+          return -code error -errorinfo $msg $msg
+        }
+      }
+    2 { # restriction is given as a range (min and max)
+        set min [lindex $args 0]
+        set max [lindex $args 1]
+        if {$value < $min} { set $value $min }
+        if {$value > $max} { set $value $max }
+      }
+    default {
+      error "internal error in fetchOption: wrong restriction \"$args\""
+    }
+  }
+
+  return $value
+}
+
+# width of borders
+set BD [fetchOption borderWidth 1 0 4]
+#option add *Text.highlightThickness $BD startupFile
+
+# scrollbar's side
+set scrollbarSide [fetchOption Scrollbar.side right {left right}]
+
+frame .inp
+       # view of spin input
+       scrollbar .inp.s  -command ".inp.t yview"
+       text .inp.t -bd 2  -font $HelvBig -yscrollcommand ".inp.s set" -wrap word
+
+       pack .inp.s -side $scrollbarSide -fill y
+       pack append .inp \
+               .inp.t {left expand fill}
+
+       menu .inp.t.edit -tearoff 0
+       .inp.t.edit add command -label "Cut" \
+               -command {tk_textCopy .inp.t; tk_textCut .inp.t}
+       .inp.t.edit add command -label "Copy" \
+               -command {tk_textCopy .inp.t}
+       .inp.t.edit add command -label "Paste" \
+               -command {dopaste}
+
+       bind .inp.t <ButtonPress-3> {
+               tk_popup .inp.t.edit %X %Y
+       }
+       bind .inp.t <ButtonRelease-1> { setlno }
+
+
+set l_typ 0;   # used by both simulator and validator
+set lt_typ 0;  # used by ltl panel
+set ol_typ -1; # remembers setting last used in compilation
+set m_typ 2;   # used by simulator
+
+menu .menu.file.m
+       .menu.file.m add command -label "New"  \
+               -command ".inp.t delete 0.0 end"
+#      .menu.file.m add command -label "UnSelect" \
+#              -command ".inp.t tag remove hilite 0.0 end;\
+#                        .inp.t tag remove Rev 0.0 end;\
+#                        .inp.t tag remove sel 0.0 end"
+       .menu.file.m add command -label "ReOpen" -command "open_spec"
+       .menu.file.m add command -label "Open.." -command "open_spec 0"
+       .menu.file.m add command -label "Save As.." -command "save_spec 0"
+       .menu.file.m add command -label "Save" -command "save_spec"
+       .menu.file.m add command -label "Quit" \
+               -command "cleanup 1; destroy .; exit"
+
+menu .menu.help.m
+       .menu.help.m add command -label "About Spin" \
+               -command "aboutspin"
+       .menu.help.m add separator
+       .menu.help.m add command -label "Promela Usage" \
+               -command "promela"
+       .menu.help.m add command -label "Xspin Usage" \
+               -command "helper"
+       .menu.help.m add command -label "Simulation" \
+               -command "roadmap1"
+       .menu.help.m add command -label "Verification" \
+               -command "roadmap2"
+       .menu.help.m add command -label "LTL Formulae" \
+               -command "roadmap4"
+       .menu.help.m add command -label "Spin Automata View" \
+               -command "roadmap5"
+       .menu.help.m add command -label "Reducing Complexity" \
+               -command "roadmap3"
+
+menu .menu.run.m
+       .menu.run.m add command -label "Run Syntax Check" \
+               -command {syntax_check "-a -v" "Syntax Check"}
+       .menu.run.m add command -label "Run Slicing Algorithm" \
+               -command {syntax_check "-A" "Property-Specific Slicing"}
+       .menu.run.m add separator
+       .menu.run.m add command -label "Set Simulation Parameters.." \
+               -command simulation
+       .menu.run.m add command -label "(Re)Run Simulation" \
+               -command Rewind -state disabled
+       .menu.run.m add separator
+       .menu.run.m add command -label "Set Verification Parameters.." \
+               -command "basicval"
+       .menu.run.m add command -label "(Re)Run Verification" \
+               -command {runval "0"} -state disabled
+       .menu.run.m add separator
+       .menu.run.m add command -label "LTL Property manager.." \
+               -command call_tl
+       .menu.run.m add separator
+       .menu.run.m add command -label "View Spin Automaton for each Proctype.." \
+               -command fsmview
+
+
+menu .menu.edit.m
+       .menu.edit.m add command -label "Cut" \
+               -command {tk_textCopy .inp.t; tk_textCut .inp.t}
+       .menu.edit.m add command -label "Copy" \
+               -command {tk_textCopy .inp.t}
+       .menu.edit.m add command -label "Paste" \
+               -command {tk_textPaste .inp.t}
+
+set FSz 110
+
+menu .menu.view.m
+       .menu.view.m add command -label "Larger" \
+               -command {
+                       incr FSz 10
+                       set HelvBig "-Adobe-Helvetica-Medium-R-Normal--*-$FSz-*-*-*-*-*-*"
+                       .inp.t configure -font $HelvBig
+               }
+       .menu.view.m add command -label "Default text size" \
+               -command {
+                       set FSz 110
+                       set HelvBig "-Adobe-Helvetica-Medium-R-Normal--*-$FSz-*-*-*-*-*-*"
+                       .inp.t configure -font $HelvBig
+               }
+       .menu.view.m add command -label "Smaller" \
+               -command {
+                       incr FSz -10
+                       set HelvBig "-Adobe-Helvetica-Medium-R-Normal--*-$FSz-*-*-*-*-*-*"
+                       .inp.t configure -font $HelvBig
+               }
+       .menu.view.m add separator
+       .menu.view.m add command -label "Clear Selections" \
+               -command ".inp.t tag remove hilite 0.0 end;\
+                         .inp.t tag remove Rev 0.0 end;\
+                         .inp.t tag remove sel 0.0 end"
+
+proc setlno {} {
+       scan [.inp.t index insert] "%d.%d" lno cno
+       .menu.ent delete 0 end
+       .menu.ent insert end $lno
+       .inp.t tag remove hilite $lno.0 $lno.end        ;# or else cursor is invis
+       update
+}
+
+proc add_log {{y ""}} {
+
+       if {$y == "\n"} { return }
+       .log.t insert end "\n$y"
+       .log.t yview -pickplace end
+}
+
+proc cleanup {how} {
+       global Unix
+       if {$Unix == 0 && $how == 1} {
+               add_log "removing temporary files, please wait.."; update
+       }
+       rmfile "pan.h pan.c pan.t pan.m pan.b pan.tmp pan.ltl"
+       rmfile "pan.oin pan.pre pan.out pan.exe pan.otl"
+       rmfile "pan_in pan_in.trail trail.out pan"
+       rmfile "_tmp1_ _tmp2_ pan.o pan.obj pan.exe"
+       if {$Unix == 0 && $how == 1} { add_log "done.." }
+}
+
+
+pack append . \
+       .log  {bot frame w fillx} \
+       .inp  {bot frame w expand fill} \
+       .menu {top fillx}
+
+# simulation parameters - initial settings
+       set fvars 1
+       set msc   1;    set svars 1
+       set rvars 1
+       set stop  0;    set tsc 0
+       set seed        "1";    # random sumulation
+       set jumpsteps   "0";    # guided simulation
+
+       set s_typ 0
+       # meaning s_type values:
+       # 0 - Random Simulation (using seed)
+       # 1 - Guided Simulation (using pan.trail)
+       # 2 - Interactive Simulation
+
+       set whichsim 0
+       # meaning of whichsim values:
+       # 0 - use pan_in.tra(il)
+       # 1 - use user specified file
+
+tkwait visibility .log
+add_log "SPIN LOG:"
+add_log " $version"
+add_log "Xspin Version $xversion"
+add_log "TclTk Version [info tclversion]/$tk_version\n"
+
+       if {$Unix == 0} {
+       if {[auto_execok $CC0] == "" \
+       ||  [auto_execok $CC0] == 0} {
+               set m "Error: no C compiler found: $CC"
+               add_log $m
+               catch { tk_messageBox -icon info -message $m }
+       }}
+
+.inp.t configure -background $BG -foreground $FG
+
+# process execution barchart
+
+set Data(0) 0
+set Name(0) "-"
+set n 0
+set bar_handle 0
+set PlaceBar   ""
+
+proc stopbar {} {
+       global Data Name n PlaceBar
+       for {set i 0} {$i <= $n} {incr i} {
+               set Data($i) 0
+               set Name($i) ""
+       }
+       set n 0
+       set PlaceBar [wm geometry .bar]
+       set k [string first "\+" $PlaceBar]
+       if {$k > 0} {
+               set PlaceBar [string range $PlaceBar $k end]
+       }
+       catch { destroy .bar }
+}
+
+proc growbar {v} {
+       global n Data
+       set Data($n) $v
+       incr n
+       catch { fillbar }
+}
+
+proc shrinkbar {} {
+       global n
+       incr n -1
+       set Data($n) 0
+       catch { fillbar }
+}
+
+proc stepbar {v nm} {
+       global n Data Name
+
+       if {$v >= 0} {
+               if { [info exists Data($v)] } {
+                       incr Data($v)
+               } else {
+                       set Data($v) 1
+               }
+               if {$v >= $n} {
+                       set n [expr $v+1]
+               }
+               if { [string length $nm] > 4} {
+                       set Name($v) [string range $nm 0 4]
+               } else {
+                       set Name($v) $nm
+               }
+               catch { fillbar }
+       }
+}
+
+proc adjustbar {v w} {
+       global Data
+
+       set Data($v) $w
+       catch { fillbar }
+}
+
+proc startbar {tl} {
+       global n Data bar_handle Ptype PlaceBar
+
+       catch { destroy .bar }
+       toplevel .bar
+       wm minsize .bar 200 200
+       wm title .bar "$tl"
+
+       set maxy [expr [winfo screenheight .] - 200]
+       if {$PlaceBar == ""} {
+               set PlaceBar "+[expr [winfo rootx .]+150]+$maxy"
+       }
+       wm geometry .bar $PlaceBar
+
+       set bar_handle [canvas .bar.c -height 410 -width 410 -relief raised]
+       frame  .bar.buts
+
+       button .bar.buts.s1 -text "Save in:  panbar.ps" \
+               -command ".bar.c postscript -file panbar.ps -colormode $Ptype"
+
+       button .bar.buts.b -text " Close " -command "stopbar"
+       pack .bar.buts.b .bar.buts.s1 -side right
+       pack append .bar  .bar.c {top expand fill}  .bar.buts {bot frame e}
+}
+
+proc fillbar {} {
+       global n Data Name
+
+       .bar.c delete grid
+       .bar.c delete data
+       set sum 0
+       for {set i 0} {$i < $n} {incr i} {
+               if { [info exists Data($i)] } {
+                       incr sum $Data($i)
+               } else {
+                       set Data($i) 0
+                       set Name($i) "-"
+               }
+       }
+       for {set i 0} {$i < $n} {incr i} {
+               .bar.c create line \
+                       $i 0 \
+                       $i 100 \
+                       -fill #222222 -tags grid
+               .bar.c create text $i 105 \
+                       -text $i -tags grid
+               .bar.c create text $i 110 \
+                       -text "$Name($i)" \
+                       -fill blue -tags grid
+
+               if { [info exists Data($i)] } {
+                       set y [expr ($Data($i)*100)/$sum]
+                       .bar.c create line \
+                               $i 100  \
+                               $i [expr 100-$y] \
+                               -width 35 -fill red -tags data
+                       if {$y > 6} {
+                               set nrcol "yellow"
+                       } else {
+                               set nrcol "red"
+                       }
+                       .bar.c create text $i 95 \
+                               -text "$Data($i)" \
+                               -fill $nrcol -tags grid
+               }
+       }
+
+       .bar.c create text [expr ($n)/2.0] -15 -text "Percentage of $sum System Steps" \
+               -anchor c -justify center -tags grid
+       .bar.c create text [expr ($n)/2.0] -8 -text "Executed Per Process ($n total)" \
+               -anchor c -justify center -tags grid
+       .bar.c scale all 0 0 55 3
+       if {$n <= 5} {
+               .bar.c move all 100 60
+       } else {
+               .bar.c move all 50 60
+       }
+}
+
+proc barscales {} {
+       global bar_handle
+
+       catch {
+               button .bar.buts.b4 -text "Larger" \
+                       -command "$bar_handle scale all 0 0 1.1 1.1"
+               button .bar.buts.b5 -text "Smaller" \
+                       -command "$bar_handle scale all 0 0 0.9 0.9"
+               pack append .bar.buts \
+                       .bar.buts.b4 {right padx 5} \
+                       .bar.buts.b5 {right padx 5}
+       }
+}
+
+# Files and Generic Boxes
+
+set file ""
+set boxnr 0
+
+proc rmfile {f} {
+       global Unix CMD tk_major tk_minor
+
+       set err ""
+       catch { eval file delete -force $f } err
+       if {$err == "" } { return }
+
+       if {$Unix} {
+               catch {exec rm -f $f}
+       } else {
+               set n [llength $f]
+               for {set i 0} {$i < $n} {incr i} {
+                       set g [lindex $f $i]
+                       add_log "rm $g"
+                       if {$tk_major >= 4 && $tk_minor >= 2} {
+                               catch {exec $CMD /c del $g}
+                       } else {
+                               catch {exec $CMD >&@stdout /c del $g}
+                       }
+       }       }
+}
+
+proc mvfile {f g} {
+       global Unix CMD tk_major tk_minor
+
+       set err ""
+       catch { file rename -force $f $g } err
+       if {$err == "" } { return }
+
+       if {$Unix} {
+               catch {exec mv $f $g}
+       } else {
+               if {$tk_major >= 4 && $tk_minor >= 2} {
+                       catch {exec $CMD /c move $f $g}
+               } else {
+                       catch {exec $CMD >&@stdout /c move $f $g}
+               }
+       }
+}
+
+proc cpfile {f g} {
+       global Unix CMD tk_major tk_minor
+
+       set err ""
+       catch { file copy -force $f $g } err
+       if {$err == "" } { return }
+
+       if {$Unix} {
+               catch {exec cp $f $g}
+       } else {
+               if {$tk_major >= 4 && $tk_minor >= 2} {
+               catch {exec $CMD /c copy $f $g}
+               } else {
+               catch {exec $CMD >&@stdout /c copy $f $g}
+       }       }
+}
+
+proc cmpfile {f g} {
+       global Unix
+
+       set err ""
+       if {$Unix} {
+               catch {exec cmp $f $g} err
+       } else {
+               if {[file exists $f] == 0 \
+               ||  [file exists $g] == 0} {
+                       return "error"
+               }
+               set fd1 [open $f r]
+               set fd2 [open $g r]
+               while {1} {
+                       set n1 [gets $fd1 line1]
+                       set n2 [gets $fd2 line2]
+                       if {$n1 != $n2 \
+                       ||  [string compare $line1 $line2] != 0} {
+                               set err "files differ"
+                               break
+                       }
+                       if {$n1 < 0} { break }
+               }
+               close $fd1
+               close $fd2
+       }
+       return $err
+}
+
+proc file_ok {f} {
+       if {[file exists $f]} {
+               if {![file isfile $f] || ![file writable $f]} {
+                       set m "error: file $f is not writable"
+                       add_log $m
+                       catch { tk_messageBox -icon info -message $m }
+                       return 0
+       }       }
+       return 1
+}
+
+proc mkpan_in {} {
+       global HasNever
+       set fd [open pan_in w]
+
+       fconfigure $fd -translation lf
+       puts $fd [.inp.t get 0.0 end] nonewline
+
+       if {$HasNever != ""} {
+               if [catch {set fdn [open $HasNever r]} errmsg] {
+                       add_log $errmsg
+                       catch { tk_messageBox -icon info -message $errmsg }
+               } else {
+                       while {[gets $fdn line] > -1} {
+                               puts $fd $line
+                       }
+                       catch "close $fdn"
+       }       }
+       catch "flush $fd"
+       catch "close $fd"
+}
+
+proc no_ltlchange {} {
+
+       if {![file exists pan.ltl]} {
+               return 1
+       }
+       if {![file exists pan.otl]} {
+               cpfile pan.ltl pan.otl
+               return 0                ; first time
+       }
+       set err [cmpfile pan.ltl pan.otl]
+       if {[string length $err] > 0} {
+               cpfile pan.ltl pan.otl
+               return 0                ;# different
+       }
+       return 1                        ;# unchanged
+}
+
+proc no_change {} {
+       global nv_typ
+
+       mkpan_in        ;# keep this up to date
+       if {![file exists pan.oin]} {
+               cpfile pan_in pan.oin
+               return 0                ; first time
+       }
+       set err [cmpfile pan_in pan.oin]
+       if {[string length $err] > 0} {
+               cpfile pan_in pan.oin
+               return 0                ;# different
+       }
+       if {$nv_typ == 0} {
+               return 1
+       }
+       return [no_ltlchange]           ;# unchanged
+}
+
+proc mk_exec {} {
+       global Unix CC SPIN notignored
+
+       set nochange [no_change]
+       if {$nochange == 1 && [file exists "pan"]} {
+               add_log "<no recompilation needed>"
+               return 1
+       }
+
+       add_log "<compiling executable>"
+       catch {
+       warner "Compiling" "Please wait until compilation of the \
+executable produced by spin completes." 300
+       }
+       add_log "$SPIN -a pan_in"
+
+       catch {exec $SPIN -a pan_in >&pan.tmp}
+       set errmsg [msg_file pan.tmp 1]
+
+       if {[string length $errmsg]>0} {
+               add_log "$errmsg"
+               catch { tk_messageBox -icon info -message $errmsg }
+               add_log "<stopped compilation attempt>"
+               catch { destroy .warn }
+               return 0
+       }
+
+       add_log "$CC -o pan -D_POSIX_SOURCE pan.c"; update
+       if {$Unix} {
+               catch { eval exec $CC -o pan -D_POSIX_SOURCE pan.c >pan.tmp 2>pan.err} errmsg
+       } else {
+               catch { eval exec $CC -o pan -D_POSIX_SOURCE pan.c >pan.tmp 2>pan.err}
+       }
+       set errmsg [msg_file pan.tmp 0]
+       set errmsg "$errmsg \n [msg_file pan.err 0]"
+
+               if {[string length $errmsg]>0 && $notignored} {
+                       add_log "$errmsg"
+                       catch { tk_messageBox -icon info -message $errmsg }
+                       catch { destroy .warn }
+                       return 0
+               }
+       add_log "<compilation complete>"
+       catch {destroy .warn}
+       return 1
+}
+
+set PlaceWarn  "+20+20"
+
+proc warner {banner msg w} {
+       global PlaceWarn
+
+       catch {destroy .warn}
+       toplevel .warn
+
+       wm title .warn "$banner"
+       wm iconname .warn "Info"
+       set k [string first "\+" $PlaceWarn]
+       if {$k > 0} {
+               set PlaceWarn [string range $PlaceWarn $k end]
+       }
+       wm geometry .warn $PlaceWarn
+
+       message .warn.t -width $w -text $msg
+       button .warn.ok -text "Ok" \
+               -command "set PlaceWarn [wm geometry .warn]; destroy .warn"
+
+       pack append .warn .warn.t {top expand fill}
+       pack append .warn .warn.ok {bottom}
+
+       update
+}
+
+proc dosave {} {
+       global Fname xversion
+
+       if {[file_ok $Fname]==0} return
+       set fd [open $Fname w]
+       add_log "<saved spec in $Fname>"
+       puts $fd "[.inp.t get 0.0 end]" nonewline
+       catch "flush $fd"
+       catch "close $fd"
+       wm title . "SPIN CONTROL $xversion -- File: $Fname"
+}
+
+proc save_spec {{curr 1}} {
+#-
+#- Save the input area into a file.
+#-
+#- If 'curr' is true then we save to the current file. Otherwise, a file
+#- selection dialog is presented. If a file is selected (note that the
+#- dialog can be canceled) then we try to write to it.
+#-
+
+  global Fname
+
+  if $curr {
+    switch -- $Fname "" {
+      add_log "no file to save to, try \"Save as ...\""
+      return
+    }
+    writeoutfile .inp.t $Fname
+  } else {
+    # try to use the predefined file selection dialog
+    switch [info commands tk_getSaveFile] "" {
+      # some old version of Tk so use our own file selection dialog
+      set fileselect "FileSelect save"
+    } default {
+      set fileselect "tk_getSaveFile"
+    }
+  
+    # get the file (return if the file selection dialog canceled)
+    switch -- [set file [eval $fileselect]] "" return
+  
+    # write the file and update Fname if the file written successfully
+    if [writeoutfile .inp.t $file] {
+      set Fname $file
+    }
+  }
+}
+
+proc consider_it {} {
+       global file Fname xversion
+
+       if {[file isdirectory $file]} then {
+               cd $file
+               fillerup ""
+               add_log "cd $file"
+       } else {
+               if {![file isfile $file]} {
+                       set file ""
+               } else {
+                       readinfile .inp.t $file
+
+                       rmfile pan_in.trail
+                       cpfile $file.trail pan_in.trail
+
+                       set dir [pwd]
+                       set Fname $file
+                       wm title . "SPIN CONTROL $xversion -- File: $Fname"
+                       destroy .b
+       }       }
+}
+
+#----------------------------------------------------------------------
+# Improvements - by Leszek Holenderski <lhol@win.tue.nl>
+# GUI configuration and File Selection dialogs
+#----------------------------------------------------------------------
+
+# predefined priorities for options stored in the option data base are
+#      widgetDefault   20
+#      startupFile     40
+#      userDefault     60
+#      interactive     80
+
+# most of frames are used for layout purposes so they should be invisible
+option add *Frame.borderWidth 0 interactive
+
+proc try_with {xspinrc} {
+
+  if ![file exists $xspinrc] return
+
+  if ![file isfile $xspinrc] {
+    puts "xspin warning: the resource file \"$xspinrc\" exists but is not\
+          a normal file"
+    return
+  }
+  if ![file readable $xspinrc] {
+    puts "xspin warning: the resource file \"$xspinrc\" exists but is not\
+          readable"
+    return
+  }
+  if [catch {option readfile $xspinrc userDefault} result] {
+    puts "xspin warning: some problems when trying to load the resource\
+          file \"$xspinrc\"\n$result"
+    return
+  }
+}
+
+if [info exists env(HOME)] {
+  if $Unix {
+    try_with [file join $env(HOME) .xspinrc]
+  } else {
+    try_with [file join $env(HOME) xspinrc]
+  }
+}
+
+proc FileSelect {mode {title ""}} {
+  switch -- $mode open - save {} default { set mode open }
+
+  switch $mode {
+    open {
+      set title Open
+      set okButtonText Open
+    }
+    save {
+      set title Save
+      set okButtonText Save
+    }
+  }
+
+  set w .fileselect
+  upvar #0 $w this
+
+  if [winfo exists $w] {
+    wm title $w $title
+    $this(okButton) config -text $okButtonText
+    catch {wm geom $w $this(geom)}
+    wm deiconify $w
+  } else {
+    toplevel $w -class Fileselect
+    wm title $w $title
+    # the minimal size is given in characters and lines (setgrid is on)
+    wm minsize $w 14 7
+
+    # layout frames
+    pack [set f [frame $w.f]] -padx 5 -pady 5 -fill both -expand yes
+    pack [set buttons [frame $f.b]] -side bottom -fill x
+    pack [set name    [frame $f.n]] -side bottom -fill x -pady 5
+    pack [set path    [frame $f.p]] -side top -fill x
+    pack [set files   [frame $f.f]] -side top -fill both -expand yes
+  
+    # create ok/cancel buttons
+    set okButton [button $buttons.ok -text $okButtonText \
+                       -command "FileSelect.Close $w 1"]
+    pack $okButton -side right
+
+    set cancelButton [button $buttons.cancel -text Cancel \
+                       -command "FileSelect.Close $w 0"]
+    pack $cancelButton -side left
+
+    MakeSameWidth "$okButton $cancelButton"
+  
+    # create path button
+    set pathButton $path.path
+    global $w|currDir
+    set pathMenu [tk_optionMenu $pathButton $w|currDir ""]
+    pack $pathButton -side top
+  
+    # create the list of files
+    global scrollbarSide
+
+    set fileList $files.l
+    set scrollbar $files.s
+    pack [scrollbar $files.s -command "$fileList yview"] \
+        -side $scrollbarSide -fill y
+    pack [listbox $fileList -yscrollcommand "$files.s set" -selectmode single -setgrid on] \
+        -side $scrollbarSide -expand yes -fill both
+  
+    bind $fileList <ButtonPress-1>        "FileSelect.Selected $w %x %y"
+    bind $fileList <Double-ButtonPress-1> "FileSelect.Chosen   $w %x %y"
+
+    set fileEntry $name.e
+    pack [label $name.l -text File:] -side left
+    pack [entry $fileEntry] -side right -expand yes -fill x
+
+    set this(okButton)   $okButton
+    set this(pathButton) $pathButton
+    set this(pathMenu)   $pathMenu
+    set this(fileList)   $fileList
+    set this(fileEntry)  $fileEntry
+
+    foreach widget "$okButton $cancelButton $pathButton $fileList $scrollbar" {
+      $widget config -highlightthickness 0
+    }
+
+    wm protocol $w WM_DELETE_WINDOW [$cancelButton cget -command]
+  }
+
+  # fill in the list of files
+  if ![info exists this(path)] { set this(path) [pwd] }
+  FileSelect.cd $w $this(path)
+
+  # make the dialog modal (set a grab and claim the focus)
+
+  set oldFocus [focus]
+  set oldGrab [grab current $w]
+  if {$oldGrab != ""} { set grabStatus [grab status $oldGrab] }
+  grab $w
+  focus $this(fileEntry)
+
+  # make the contents of file entry selected (for easy deletion)
+  $this(fileEntry) select from 0
+  $this(fileEntry) select to end
+
+  # Wait for the user to respond, then restore the focus and return the
+  # contents of file entry.
+  # Restore the focus before deleting the window, since otherwise the
+  # window manager may take the focus away so we can't redirect it.
+  # Finally, restore any grab that was in effect.
+
+  global $w|response
+  tkwait variable $w|response
+  catch {focus $oldFocus}
+  grab release $w
+  set this(geom) [wm geom $w]
+  wm withdraw $w
+  if {$oldGrab != ""} {
+      if {$grabStatus == "global"} {
+         grab -global $oldGrab
+      } else {
+         grab $oldGrab
+      }
+  }
+  return [set $w|response]
+}
+
+proc CompareNoCase {s1 s2} {
+  return [string compare [string tolower $s1] [string tolower $s2]]
+}
+
+proc FileSelect.LoadFiles {w} {
+    upvar #0 $w this
+
+    # split all names in the current directory into dirs and files
+    set dirs ""
+    set files ""
+    set filter ""
+    if [info exists this(filter)] { set filter $this(filter) }
+    switch -- $filter "" { set filter * }
+    foreach f [lsort -command CompareNoCase [glob -nocomplain .* *]] {
+       if [file isdir $f] {
+         # exclude the '.' and '..' directory
+         switch -- $f . - .. continue
+         lappend dirs $f
+       }
+       if [file isfile $f] {
+         # filter files
+         switch -glob -- $f $filter { lappend files $f }
+       }
+    }
+
+    # Fill in the file list
+    $this(fileList) delete 0 end
+    foreach d $dirs {
+       # append directory mark to the name (tricky)
+       set d [string trimright [file join $d a] a]
+       $this(fileList) insert end $d
+    }
+    foreach f $files { $this(fileList) insert end $f }
+}
+
+proc FileSelect.LoadPath {w} {
+    upvar #0 $w this
+
+    # convert path to list
+    set dirs [file split $this(path)]
+
+    # compute prefix paths
+    set path ""
+    set paths ""
+    foreach d $dirs {
+       set path [file join $path $d]
+       lappend paths $path
+    }
+
+    # reverse dirs and paths
+    set rev_dirs ""
+    foreach d $dirs { set rev_dirs [concat [list $d] $rev_dirs] }
+    set rev_paths ""
+    foreach p $paths { set rev_paths [concat [list $p] $rev_paths] }
+
+    # update the path menubutton
+    global $w|currDir
+    set $w|currDir [lindex $rev_dirs 0]
+
+    # fill in the path menu
+    $this(pathMenu) delete 0 end
+    foreach d [lrange $rev_dirs 1 end] p [lrange $rev_paths 1 end] {
+       $this(pathMenu) add command -label $d -command "FileSelect.cd $w $p"
+    }
+}
+
+proc FileSelect.Selected {w x y} {
+    upvar #0 $w this
+
+    # determine the selected list element
+    set elem [$this(fileList) get [$this(fileList) index @$x,$y]]
+    switch -- $elem "" return
+
+    # directories cannot be selected (they can only be chosen)
+    if [file isdir $elem] return
+
+    $this(fileEntry) delete 0 end
+    $this(fileEntry) insert end $elem
+}
+
+proc FileSelect.Chosen {w x y} {
+    upvar #0 $w this
+
+    # determine the selected list element
+    set elem [$this(fileList) get [$this(fileList) index @$x,$y]]
+    switch -- $elem "" return
+
+    # if directory then cd, otherwise close the dialog
+    if [file isdir $elem] { FileSelect.cd $w $elem } { FileSelect.Close $w 1 }
+}
+
+proc FileSelect.Close {w {ok 1}} {
+  # trigger the end of dialog
+  upvar #0 $w this $w|response response
+  if $ok {
+    set response [file join $this(path) [$this(fileEntry) get]]
+  } else {
+    set response ""
+  }
+}
+
+proc FileSelect.cd {w dir} {
+    upvar #0 $w this
+
+    if [catch {cd $dir} errmsg] {
+       puts "xspin warning: $errmsg"
+       return
+    }
+
+    set this(path) [pwd]
+    FileSelect.LoadFiles $w
+    FileSelect.LoadPath $w
+}
+
+proc open_spec {{curr 1}} {
+  global Fname
+
+  if $curr {
+    switch -- $Fname "" {
+      add_log "no file to reopen, try \"Open ...\""
+      return
+    }
+    readinfile .inp.t $Fname
+  } else {
+    # try to use the predefined file selection dialog
+    switch [info commands tk_getOpenFile] "" {
+      # some old version of Tk so use our own file selection dialog
+      set fileselect "FileSelect open"
+    } default {
+      set fileselect "tk_getOpenFile"
+    }
+    set init_dir [pwd]
+    # get the file (return if the file selection dialog canceled)
+    switch -- [set file [eval $fileselect -initialdir { $init_dir } ]] "" return
+  
+    # load the file and update some items if the file loaded successfully
+    if [readinfile .inp.t $file] {
+      rmfile pan_in.trail
+      cpfile $file.trail pan_in.trail
+      set Fname $file
+      set_path $Fname
+    }
+  }
+}
+
+
+proc set_path {Fname} {
+       #cd to directory in file
+       set fullpath [split $Fname /]
+       set nlen [llength $fullpath]
+       set fullpath [lrange $fullpath 0 [expr $nlen - 2]]      ;# get rid of filename
+       set wd [join $fullpath /]                               ;#put path back together
+       catch {cd $wd}
+}
+
+set defname ""
+
+proc loaddefault_tl {} {
+       global Fname defname
+
+       if {$defname ==""} {
+               set file2 "$Fname.ltl"
+       } else {
+               set file2 $defname
+       }
+       catch {
+               .tl.main.e1 delete 0 end
+               .tl.macros.t delete 0.0 end
+               .tl.notes.t delete 0.0 end
+               .tl.never.t delete 0.0 end
+               .tl.results.t delete 0.0 end
+       }
+       if {![file exists $file2]} {
+               .tl.notes.t insert end "Use Load to open a file or a template."
+               return
+       }
+       catch {
+               .tl.notes.title configure -text "Notes \[file $file2]:"
+       }
+       readinfile .tl.never.t $file2
+       catch { extract_defs }
+}
+
+set suffix "ltl"
+
+proc browse_tl {} {
+       global defname suffix
+
+       set suffix "ltl"
+
+       catch {destroy .b}
+       toplevel .b
+       wm iconname .b "Load"
+
+       frame .b.top
+       frame .b.bot
+       scrollbar .b.top.scroll -command ".b.top.list yview"
+       listbox .b.top.list -yscroll ".b.top.scroll set" -relief raised 
+
+       button .b.zap -text "Cancel" -command "destroy .b"
+       button .b.all -text "Show All Files" \
+               -command {
+                       set suffix ""
+                       fillerup ""
+                       destroy .b.all
+               }
+       message .b.bot.msg -text "Dir: "
+       entry .b.bot.entry -textvariable dir -relief sunken -width 20
+       pack append .b.top \
+               .b.top.scroll {right filly} \
+               .b.top.list {left expand fill}
+       pack append .b.bot \
+               .b.bot.msg {left} \
+               .b.bot.entry {left}
+       pack append .b \
+               .b.top {top fillx} \
+               .b.all {left} \
+               .b.zap {left} \
+               .b.bot {left}
+       
+       bind .b.bot.entry <Return> {
+               set nd [.b.bot.entry get]
+               if {[file isdirectory $nd]} {
+                       cd $nd
+                       fillerup $suffix
+                       add_log "cd $nd"
+               }
+       }
+
+       fillerup  $suffix
+       bind .b.top.list <Double-Button-1> {
+               set file2 [selection get]
+               if {[string first "---" $file2] >= 0} {
+                       # ignore
+               } elseif {[string first "Invariance" $file2] >= 0} {
+                       catch {
+                       .tl.main.e1 delete 0 end
+                       .tl.macros.t delete 0.0 end
+                       .tl.notes.t delete 0.0 end
+                       .tl.never.t delete 0.0 end
+                       .tl.results.t delete 0.0 end
+
+                       .tl.main.e1 insert end "\[\] (p)"
+                       .tl.notes.t insert end "'p' is invariantly true throughout
+an execution"
+                       .tl.notes.title configure \
+                               -text "Notes \[template $file2]:"
+                       do_ltl
+                       destroy .b
+                       }
+               } elseif {[string first "Response" $file2] >= 0} {
+                       catch {
+                       .tl.main.e1 delete 0 end
+                       .tl.macros.t delete 0.0 end
+                       .tl.notes.t delete 0.0 end
+                       .tl.never.t delete 0.0 end
+                       .tl.results.t delete 0.0 end
+
+                       .tl.main.e1 insert end "\[\] ((p) -> (<> (q)))"
+                       .tl.notes.t insert end "if 'p' is true in at least one state,
+then sometime thereafter 'q' must also
+become true at least once."
+                       .tl.notes.title configure \
+                               -text "Notes \[template $file2]:"
+                       do_ltl
+                       destroy .b
+                       }
+               } elseif {[string first "Precedence" $file2] >= 0} {
+                       catch {
+                       .tl.main.e1 delete 0 end
+                       .tl.macros.t delete 0.0 end
+                       .tl.notes.t delete 0.0 end
+                       .tl.never.t delete 0.0 end
+                       .tl.results.t delete 0.0 end
+
+                       .tl.main.e1 insert end "\[\] ((p) -> ((q) U (r)))"
+                       .tl.notes.t insert end "'p' is a trigger, or 'enabling' condition that
+determines when this requirement becomes applicable
+'r' is the fullfillment of the requirement, and
+'q' is a condition that must remain true in the interim."
+                       .tl.notes.title configure \
+                               -text "Notes \[template $file2]:"
+                       do_ltl
+                       destroy .b
+                       }
+               } elseif {[string first "Objective" $file2] >= 0} {
+                       catch {
+                       .tl.main.e1 delete 0 end
+                       .tl.macros.t delete 0.0 end
+                       .tl.notes.t delete 0.0 end
+                       .tl.never.t delete 0.0 end
+                       .tl.results.t delete 0.0 end
+
+                       .tl.main.e1 insert end "\[\] ((p) -> <>((q) || (r)))"
+                       .tl.notes.t insert end "'p' is a trigger, or 'enabling' condition that
+determines when this requirement becomes applicable
+'q' is the fullfillment of the requirement, and
+'r' is a discharging condition that terminates the
+applicability of the requirement."
+
+                       .tl.notes.title configure \
+                               -text "Notes \[template $file2]:"
+                       do_ltl
+                       destroy .b
+                       }
+               } elseif {[file isdirectory $file2]} then {
+                       cd $file2
+                       fillerup $suffix
+                       add_log "cd $file2"
+               } else {
+                       if {![file isfile $file2]} {
+                               set file2 ""
+                       } else {
+                               catch {
+                               .tl.main.e1 delete 0 end
+                               .tl.macros.t delete 0.0 end
+                               .tl.notes.t delete 0.0 end
+                               .tl.never.t delete 0.0 end
+                               .tl.results.t delete 0.0 end
+                               .tl.notes.title configure \
+                                       -text "Notes \[file $file2]:"
+                               }
+                               readinfile .tl.never.t $file2
+                               set defname $file2
+                               catch { extract_defs }
+                               set dir [pwd]
+                               destroy .b
+                       }
+               }
+       }
+}
+
+proc reopen {} {
+       global Fname
+
+       catch {readinfile .inp.t $Fname} ermsg
+       if {[string length $ermsg]<=1} { return }
+       add_log $ermsg
+       catch { tk_messageBox -icon info -message $ermsg }
+}
+
+proc check_xsp {f} {
+       set ff ${f}.xsp
+       if [catch {set fd [open $ff r]} errmsg] {
+               # add_log "no file $ff"
+               return
+       }
+       add_log "reading $ff file"
+       update
+       while {[gets $fd line] > -1} {
+               if {[string first "X:" $line] == 0} {
+                       set C [string range $line 3 end]
+                       add_log "X: $C"
+                       update
+                       catch { eval exec $C } errmsg
+                       if {$errmsg != ""} { add_log $errmsg }
+               }
+               if {[string first "L:" $line] == 0} {
+                       set N [string range $line 3 end]
+                       catch {.log.t configure -height $N -bg black -fg gold}
+               }
+       }
+}
+
+proc writeoutfile {from to} {
+
+  if ![file_ok $to] { return 0 }
+
+  if [catch {set fd [open $to w]} errmsg] {
+    add_log $errmsg
+    catch { tk_messageBox -icon info -message $ermsg }
+    return 0
+  }
+
+  add_log "<saved spec in $to>"
+  puts $fd [string trimright [$from get 0.0 end] "\n"]
+# puts -nonewline $fd [$from get 0.0 end]
+  close $fd
+  return 1
+}
+
+proc readinfile {into from} {
+
+  if [catch {set fd [open $from r]} errmsg] {
+    add_log $errmsg
+    catch { tk_messageBox -icon info -message $ermsg }
+    return 0
+  }
+       
+  $into delete 0.0 end
+  while {[gets $fd line] > -1} { $into insert end $line\n }
+  catch { close $fd }
+  add_log "<open $from>"
+
+  global LastGenerate
+  set LastGenerate ""  ;# used in Validation.tcl
+  return 1
+}
+
+proc fillerup {suffix} {
+       wm title .b [pwd]
+       .b.top.list delete 0 end
+
+       set dotdot 0
+       set l {}
+       catch { if {$suffix != ""} {
+                       set l [lsort [glob *.$suffix]]
+               } else {
+                       set l [lsort [glob *]]
+       }       }
+       foreach i $l {
+               .b.top.list insert end $i
+               if {$i == ".."} { set dotdot 1 }
+       }
+       if {$dotdot == 0} {
+               .b.top.list insert 0 ".."
+       }
+       if {$suffix != ""} {
+               .b.top.list insert 0 "------files:--------"
+               .b.top.list insert 0 "Objective(p,q,r)"
+               .b.top.list insert 0 "Precedence(p,q,r)"
+               .b.top.list insert 0 "Response(p,q)"
+               .b.top.list insert 0 "Invariance(p)"
+               .b.top.list insert 0 "-----templates:-----"
+       }
+}
+
+proc gotoline {} {
+       global BG FG
+
+       catch { destroy .ln }
+       toplevel .ln
+       wm title .ln "Goto Line"
+       wm iconname .ln "Goto"
+
+       label .ln.lab -text "Enter line number:"
+       entry .ln.ent -width 20 -relief sunken -textvariable lno
+       pack append .ln \
+               .ln.lab {left padx 1m} \
+               .ln.ent {right expand}
+       bind .ln.ent <Return> {
+               .inp.t tag remove hilite 0.0 end
+               .inp.t tag add hilite $lno.0 $lno.1000
+               .inp.t tag configure hilite \
+                       -background $FG -foreground $BG
+               .inp.t yview -pickplace [expr $lno-1]
+       }
+       focus .ln.ent
+}
+
+proc savebox {b} {
+       set fname [.c$b.f.e1 get]
+       if {[file_ok $fname]==0} return
+       set fd [open $fname w]
+       add_log "<saved output in $fname>"
+       puts $fd "[.c$b.z.t get 0.0 end]" nonewline
+       catch "flush $fd"
+       catch "close $fd"
+}
+
+proc doplace {a b} {
+       global PlaceBox
+       set PlaceBox($a) [wm geometry .c$b]
+       set k [string first "\+" $PlaceBox($a)]
+       if {$k > 0} {
+               set PlaceBox($a) [string range $PlaceBox($a) $k end]
+       }
+}
+
+proc mkbox {n m p {wd 60} {ht 10} {xp 200} {yp 200}} {
+       global boxnr FG BG PlaceBox HelvBig
+       global ind old_ss old_insert new_insert;# for search capability
+
+       incr boxnr
+
+       toplevel .c$boxnr
+       wm title .c$boxnr $n
+       wm iconname .c$boxnr $m
+
+       if {[info exists PlaceBox($n)] == 0} {
+               set PlaceBox($n) "+$xp+$yp"
+       } 
+       wm geometry .c$boxnr $PlaceBox($n)
+
+       #initialize search parameters
+       set ind 1.0
+       set old_ss ""
+       set old_insert ""
+       set new_insert ""
+       frame .c$boxnr.d ;# search bar
+               label .c$boxnr.d.l -text "Search for: "
+               entry .c$boxnr.d.e -width 15
+               bind .c$boxnr.d.e <KeyPress-Return> "search_sim .c$boxnr.z.t .c$boxnr.d.e .c$boxnr" 
+               button .c$boxnr.d.b -text "Find" -command "search_sim .c$boxnr.z.t .c$boxnr.d.e .c$boxnr"
+
+       pack .c$boxnr.d -side top -fill x
+       pack .c$boxnr.d.b -side right
+       pack .c$boxnr.d.e -side right
+       pack .c$boxnr.d.l -side right
+
+       frame .c$boxnr.z
+       
+       text .c$boxnr.z.t -relief raised -bd 2 -font $HelvBig \
+               -background $BG -foreground $FG \
+               -yscrollcommand ".c$boxnr.z.s set" \
+               -setgrid 1 -width $wd -height $ht -wrap word
+       bind .c$boxnr.z.t <ButtonRelease-1> "+update idletasks; update_insert .c$boxnr.z.t"
+       scrollbar .c$boxnr.z.s \
+               -command ".c$boxnr.z.t yview"
+       pack append .c$boxnr.z \
+               .c$boxnr.z.s {left filly} \
+               .c$boxnr.z.t {left expand fill}
+
+       button .c$boxnr.b -text "Close" \
+       -command "doplace {$n} {$boxnr}; destroy .c$boxnr"
+       button .c$boxnr.c -text "Clear" \
+               -command ".c$boxnr.z.t delete 0.0 end"
+       pack append .c$boxnr \
+               .c$boxnr.z {top expand fill} \
+               .c$boxnr.b {right padx 5} \
+               .c$boxnr.c {right padx 5}
+
+       if {[string length $p]>0} {
+               frame  .c$boxnr.f -relief sunken
+               button .c$boxnr.f.e0 -text "Save in: " \
+                       -command "savebox $boxnr"
+               entry  .c$boxnr.f.e1 -relief flat -width 10
+               .c$boxnr.f.e1 insert end $p
+               pack append .c$boxnr.f \
+                       .c$boxnr.f.e0 {left padx 5} \
+                       .c$boxnr.f.e1 {left}
+               pack append .c$boxnr \
+                       .c$boxnr.f {right padx 5}
+       }
+
+       tkwait visibility .c$boxnr
+       raise .c$boxnr
+       return $boxnr
+}
+proc update_insert {t} {
+       global new_insert
+       update idletasks
+       set new_insert [$t index insert]
+}
+
+proc search_sim {t e b} {
+       global ind old_ss old_insert new_insert
+
+       set ss [$e get]
+
+       if {$ss == ""} {
+               return
+               }
+
+       #if user has selected use that lin.char as 'ind'. otherwise use end of last word found
+       #set new_insert [$t index insert]
+       if {$new_insert != $old_insert} {
+               set ind $new_insert ;# this is where we will start searching
+               set old_insert $new_insert ;# update select location
+       }
+       set cur_ind $ind
+       set ind [$t search $ss $ind]
+
+       set old_ss $ss
+       if {$ind != ""} {
+               $t yview -pickplace $ind
+               $t tag configure hilite -foreground black -background white
+               $t tag delete hilite 
+               set split_ind [split $ind "."]
+               set char [lindex $split_ind 1]  
+               set char [incr char [string length $ss]]
+               set indstart $ind
+               set indend ""
+               append indend [lindex $split_ind 0] "." $char
+               $t tag add hilite $indstart $indend
+               $t tag configure hilite -foreground white -background black
+               set ind $indend
+       } else {
+               # set ind 1.0
+               catch { tk_messageBox -icon info -message "no match for $ss" }
+               set ind $cur_ind ;# restore ind to last good value
+               raise $b
+       }       
+
+}
+
+# Tcl/Tk book, page 219
+proc forAllMatches {w pattern} {
+       global BG FG lno
+
+       scan [$w index end] %d numLines
+       for {set i 1} {$i < $numLines} { incr i} {
+               $w mark set last $i.0
+               if {[regexp -indices $pattern \
+                       [$w get last "last lineend"] indices]} {
+                               $w mark set first \
+                                       "last + [lindex $indices 0] chars"
+                               $w mark set last "last + 1 chars \
+                                       + [lindex $indices 1] chars"
+                       .inp.t tag add hilite $i.0 $i.end
+                       .inp.t tag configure hilite \
+                               -background $FG -foreground $BG
+#                      .inp.t yview -pickplace [expr $i-1]
+       }       }
+
+#      move to the next line that matches
+
+       for {set i [expr $lno+1]} {$i < $numLines} { incr i} {
+               $w mark set last $i.0
+               if {[regexp -indices $pattern \
+                       [$w get last "last lineend"] indices]} {
+                               $w mark set first \
+                                       "last + [lindex $indices 0] chars"
+                               $w mark set last "last + 1 chars \
+                                       + [lindex $indices 1] chars"
+                       .inp.t yview -pickplace [expr $i-5]
+                       set lno $i
+                       return
+       }       }
+       for {set i 1} {$i <= $lno} { incr i} {
+               $w mark set last $i.0
+               if {[regexp -indices $pattern \
+                       [$w get last "last lineend"] indices]} {
+                               $w mark set first \
+                                       "last + [lindex $indices 0] chars"
+                               $w mark set last "last + 1 chars \
+                                       + [lindex $indices 1] chars"
+                       .inp.t yview -pickplace [expr $i-5]
+                       set lno $i
+                       return
+       }       }
+       catch {
+               tk_messageBox -icon info -message "No Match of \"$pattern\""
+       }
+}
+
+set noprep 0
+
+proc hasWord {pattern} {
+       global SPIN noprep
+       set err ""
+       if {![file exists pan.pre] && $noprep == 0} {
+               add_log "$SPIN -Z pan_in ;# preprocess input $pattern"
+               catch {exec $SPIN -Z pan_in >&pan.tmp} err
+               # leaves output in pan.pre
+               add_log "<done preprocess>"
+       }
+
+       if {[string length $err] == 0 && $noprep == 0} {
+               set fd [open pan.pre r]
+               while {[gets $fd line] > -1} {
+                 if {[regexp -indices $pattern $line indices]} {
+                       catch "close $fd"
+                       return 1
+               } }
+               catch "close $fd"
+               return 0
+       }
+
+       # else, there were errors, just ignore the include files:
+       set noprep 1
+       add_log "$err"
+       scan [.inp.t index end] %d numLines
+       for {set i 1} {$i < $numLines} { incr i} {
+               .inp.t mark set last $i.0
+               if {[regexp -indices $pattern \
+                       [.inp.t get last "last lineend"] indices]} {
+                               return 1
+               }
+       }
+       return 0
+}
+
+# FSM view option
+
+set nodeX(0) 0
+set nodeY(0) 0
+set Label(0) 0
+set Transit(0) {}
+set TLabel(0) 0
+set Lab2Node(0) 0
+set Dist(0) 0
+set State(0) 0
+set Edges(0) {}
+set New 0
+set MaxDist 0
+set Maxx 0
+set Maxy 0
+set Minx 50
+set Miny 50
+set reached_end 0
+set Scale 1
+
+set cnr        0
+set x 0
+set y 0
+
+proc fsmview {} {
+       global Unix
+
+       add_log "<fsm view option>"
+
+       if {[mk_exec] != 1} { return }
+
+       catch {destroy .z}
+       toplevel .z
+
+       wm title .z "Double-Click Proc"
+
+       listbox .z.list -setgrid 1
+       button .z.b -text "Cancel" -command "destroy .z"
+
+       pack append .z \
+               .z.list {top expand fill} \
+               .z.b {right padx 5}
+
+       if {$Unix} {
+               add_log "./pan -d       # find proc names"; update
+               set fd [open "|./pan -d" w+]
+       } else {
+               add_log "pan -d # find proc names"; update
+               catch { eval exec pan -d >&pan.tmp } err
+               if {$err != ""} {
+                       add_log "error: $err"
+               }
+               set fd [open pan.tmp r]
+       }
+       while {[gets $fd line] > -1} {
+               if {[string first "proctype" $line] >= 0 } {
+                       .z.list insert end \
+                       [string trim [string range $line 9 end]]
+       }       }
+       catch { close $fd }
+
+       bind .z.list <Double-Button-1> {
+               set pfind [selection get]
+               catch { destroy .z }
+               findfsm $pfind
+       }
+       focus .z.list
+}
+
+proc findfsm {pfind} {
+       global Unix New Dist State Edges Label
+       global Transit MaxDist reached_end TLabel DOT
+
+       if {[mk_exec] != 1} { return }
+
+       set src  0; set trn 0; set trg 0
+       set Want 0; set MaxDist 0; set startstate ""
+
+       catch { foreach el [array names State] { unset State($el) } }
+       catch { foreach el [array names Edges] { unset Edges($el) } }
+       catch { foreach el [array names Dist]  { unset Dist($el) } }
+
+       if {$Unix} {
+               add_log "./pan -d       # compute fsm"; update
+               set fd [open "|./pan -d" w+]
+       } else {
+               add_log "pan -d # compute fsm"; update
+               catch { eval exec pan -d >&pan.tmp }
+               set fd [open pan.tmp r]
+       }
+       while {[gets $fd line] > -1} {
+               set k [string first "proctype" $line]
+               if { $k >= 0 } {
+                       if { $Want == 1 } {
+                               break
+                       }
+                       incr k 9
+                       set pname [string range $line $k end]
+
+                       if { [string first $pfind $line] >= 0 \
+                       &&   [string length $pfind] == [string length $pname]} {
+                               set Want 1
+                               set reached_end 0
+                               set nsrc "$pname:0"
+                               set Dist($nsrc) 0
+                               set Label($nsrc) "end"
+                               set Edges($nsrc) {}
+                       }
+               } elseif { $Want == 1 \
+                       && [string first "statement" $line] < 0 
+                       && [string first "state" $line] >= 0} {
+                       scan $line "    state %d -(tr %d)-> state %d" \
+                               src trn trg
+                       if {$trg == 0} { set reached_end 1 }
+
+                       set nsrc "$pname:$src"
+                       set ntrg "$pname:$trg"
+
+                       if {$startstate == ""} { set startstate $nsrc }
+
+                       set k [string first "line" $line]
+                       if { $k > 0 } {
+                               set m [string first "=>" $line]
+                               incr m -1
+                               set lbl [string range $line $k $m]
+                               incr m 3
+                               set action [string range $line $m end]
+                       } else {
+                               set lbl "line 0"
+                               set action "line 0"
+                       }
+                       set Label($nsrc) $lbl
+                       if { [info exists Dist($nsrc)] == 0 } {
+                               set Dist($nsrc) 0
+                               set Edges($nsrc) {}
+                       }
+                       if { [info exists Dist($ntrg)] == 0 } {
+                               set Dist($ntrg) [expr $Dist($nsrc) + 1]
+                               set Edges($ntrg) {}
+                               if {$Dist($ntrg) > $MaxDist } {
+                                       set MaxDist $Dist($ntrg)
+                               }
+                       } else {
+                               if { [expr $Dist($nsrc) + 1] < $Dist($ntrg) } {
+                                       set Dist($ntrg) [expr $Dist($nsrc) + 1]
+                                       if {$Dist($ntrg) > $MaxDist } {
+                                               set MaxDist $Dist($ntrg)
+                                       }
+                       }       }
+if {0 \
+&&  [auto_execok $DOT] != 0 \
+&&  [auto_execok $DOT] != ""} {
+       set z1 [string first "\[" $action]
+       set z2 [string last  "\]" $action]
+       if {$z1 > 0 && $z2 > $z1} {
+               incr z1 -1; incr z2
+               set a1 [string range $action 0 $z1]
+               set a2 [string range $action $z2 end]
+               set action "$a1$a2"
+       }
+                       set kkk "$nsrc;$trg:$action"
+                       lappend Edges($nsrc) "$kkk"
+                       lappend Edges($kkk) $ntrg
+                       lappend Transit($nsrc) "$lbl"
+                       lappend Transit($kkk) ""
+                       set Dist($kkk) $Dist($ntrg)
+                       set Label($kkk) "T3"
+} else {
+                       lappend Edges($nsrc) $ntrg
+                       lappend Transit($nsrc) $action
+}
+               }
+       }
+       if { $Want == 1 } {
+               dograph $pfind $startstate
+       } else {
+               add_log "sorry, $pfind not found..."
+               catch {
+               tk_messageBox -icon info -message "$pfind not found..."
+               }
+       }
+       catch "close $fd"
+       add_log "<done>"
+       update
+}
+
+proc plunknode {el prefix} {
+       global State Label TLabel
+       global x y
+
+       set pn [string range $el $prefix end]
+       set State($el) [mkNode "$Label($el)" $pn $x $y]
+
+       if { $x > 250 } {
+               set x [expr $x - 250]
+               set x [expr 250 - $x]
+       } else {
+               set x [expr 250 - $x]
+               incr x 75
+               set x [expr 250 + $x]
+       }
+}
+
+proc dograph {n s} {
+       global Dist Edges Label Transit MaxDist State ELabel
+       global cnr lcnr reached_end x y Unix DOT
+       set count -1
+
+       set lcnr [mkcanvas "FSM $n" $n 300 300 0]
+       set prefix [string length $n]
+       incr prefix
+       set y 0
+
+       while {$count < $MaxDist} {
+               incr count
+               incr y 50
+               set x 250
+               foreach el [array names Dist] {
+                       if { [ string first $n $el ] >= 0 \
+                       &&   $Dist($el) == $count \
+                       &&   $el != "$n:0" } {
+                               plunknode $el $prefix
+               }       }
+       }
+       if {$reached_end == 1} {
+               # force end state at the bottom
+               incr y 50
+               set x 250
+               plunknode "$n:0" $prefix
+       }
+
+       foreach el [array names Edges] {
+               if { [ string first $n $el ] >= 0 } {
+                       for {set i 0} { [lindex $Edges($el) $i] != "" } {incr i} {
+                               set ntrg [lindex $Edges($el) $i]
+                               set lbl  [lindex $Transit($el) $i]
+                               mkEdge $lbl $State($el) $State($ntrg)
+                               set ELabel($el,$ntrg) "$lbl"
+                       }
+       }       }
+       addscales $lcnr
+
+       .f$cnr.c itemconfigure $State($s) -outline red; update
+
+       if {[auto_execok $DOT] != 0 \
+       &&  [auto_execok $DOT] != ""} {
+               dodot $n
+#              button .f$lcnr.b66 -text "Redraw with Dot"  -command "dodot $n"
+#              pack append .f$lcnr .f$lcnr.b66 {right padx 5}
+       }
+       update
+}
+
+proc mkNode {n t x y} {
+       # tcl book p. 213
+       global cnr NodeWidth NodeHeight HelvBig
+       global nodeX nodeY New TLabel Lab2Node
+
+       if {[string first ";" $t] > 0} {
+               set New [.f$cnr.c create rectangle [expr $x-1] [expr $y-1] \
+                       [expr $x+1] [expr $y+1] \
+                       -outline white \
+                       -fill white \
+                       -tags node]
+               set z [string first ":" $t]; incr z
+               set t [string range $t $z end]
+               set Lab [.f$cnr.c create text $x $y -font $HelvBig -text $n -tags node]
+       } else {
+               set New [.f$cnr.c create oval [expr $x-10] [expr $y-10] \
+                       [expr $x+10] [expr $y+10] \
+                       -outline black \
+                       -fill white \
+                       -tags node]
+               set Lab [.f$cnr.c create text $x $y -font $HelvBig -text $n -tags node]
+       
+               .f$cnr.c bind $Lab <Any-Enter> "
+                       .f$cnr.c itemconfigure {$Lab} -fill black -text {$t}
+                       if {[string first \"end\" $n] < 0 } { set_src {$t} }
+               "
+               .f$cnr.c bind $Lab <Any-Leave> "
+                       .f$cnr.c itemconfigure {$Lab} -fill black -text {$n}
+               "
+       }
+       set nodeX($New) $x
+       set nodeY($New) $y
+       set TLabel($New) $Lab
+       set Lab2Node($Lab) $New
+       set NodeWidth($New) 10
+       set NodeHeight($New) 10
+
+       update
+       return $New
+}
+
+proc set_src {n} {
+       set where 0
+       scan $n "line %d" where
+       .inp.t tag remove hilite 0.0 end
+       src_line $where
+}
+
+proc mkEdge {L a b} {
+       global cnr Xrem Yrem TransLabel HelvBig
+       global nodeX nodeY edgeHead edgeTail
+
+       if { $nodeY($b) > $nodeY($a) } {
+               set ydiff -11
+       } elseif { $nodeY($b) < $nodeY($a) } {
+               set ydiff 11
+       } else {
+               set ydiff 0
+       }
+       if { $nodeX($b) > $nodeX($a) } {
+               set xdiff -6
+       } elseif { $nodeX($b) < $nodeX($a) } {
+               set xdiff 6
+       } else {
+               set xdiff 0
+       }
+       set edge [.f$cnr.c create line \
+               $nodeX($a) $nodeY($a) \
+               [expr $nodeX($b) + $xdiff] \
+               [expr $nodeY($b) + $ydiff] \
+                -arrow both -arrowshape {4 3 3} ]
+       .f$cnr.c lower $edge
+       lappend edgeHead($a) $edge
+       lappend edgeTail($b) $edge
+
+       set Xrem($edge) $xdiff
+       set Yrem($edge) $ydiff
+
+       set midX [expr $nodeX($a) + $nodeX($b)]
+       set midX [expr $midX / 2 ]
+       set midY [expr $nodeY($a) + $nodeY($b)]
+       set midY [expr $midY / 2 ]
+
+       set TransLabel($a,$b) \
+       [.f$cnr.c create text $midX $midY -font $HelvBig -tags texttag]
+
+       .f$cnr.c bind $edge <Button-1> "
+               .f$cnr.c coords $TransLabel($a,$b) \[.f$cnr.c canvasx %x\] \[.f$cnr.c canvasy %y\]
+               .f$cnr.c itemconfigure $TransLabel($a,$b) \
+                       -fill black -text {$L} -font $HelvBig
+       "
+       .f$cnr.c bind $edge <ButtonRelease-1> "
+               .f$cnr.c itemconfigure $TransLabel($a,$b) \
+                       -fill black -text {}
+       "
+}
+
+proc moveNode {cnr node mx my together} {
+       global edgeHead edgeTail TLabel NodeWidth NodeHeight
+       global nodeX nodeY Lab2Node
+       global Xrem Yrem Scale
+
+       set x [.f$cnr.c coords $node]
+       if {[llength $x] == 2} { set node $Lab2Node($node) }
+
+       set mx [.f$cnr.c canvasx $mx]
+       set my [.f$cnr.c canvasy $my]
+
+       set wx $NodeWidth($node)
+       set wy $NodeHeight($node)
+
+       .f$cnr.c coords $node \
+               [expr $mx-$wx] [expr $my-$wy] \
+               [expr $mx+$wx] [expr $my+$wy]
+       .f$cnr.c coords $TLabel($node) $mx $my
+
+       set nodeX($node) $mx
+       set nodeY($node) $my
+       if {$together == 0} { return }
+       catch {
+       foreach edge $edgeHead($node) {
+               set ec [.f$cnr.c coords $edge]
+               set nx [expr $nodeX($node) + $Xrem($edge)*$Scale]
+               set ny [expr $nodeY($node) + $Yrem($edge)*$Scale]
+               .f$cnr.c coords $edge \
+                       $nx $ny \
+                       [lindex $ec 2] [lindex $ec 3]
+       }}
+       catch {
+       foreach edge $edgeTail($node) {
+               set ec [.f$cnr.c coords $edge]
+               set nx [expr $nodeX($node) + $Xrem($edge)*$Scale]
+               set ny [expr $nodeY($node) + $Yrem($edge)*$Scale]
+               .f$cnr.c coords $edge \
+                       [lindex $ec 0] [lindex $ec 1] \
+                       $nx $ny
+       }}
+}
+
+set PlaceCanvas(msc)   ""
+
+proc mkcanvas {n m geox geoy placed} {
+       global cnr tk_version
+       global Chandle Sticky
+       global FG BG Ptype PlaceCanvas
+
+       incr cnr
+       toplevel .f$cnr
+       wm title .f$cnr "$n"
+       wm iconname .f$cnr $m
+       if {$placed} {
+               if {$PlaceCanvas($m) == ""} {
+                       set PlaceCanvas($m) "+$geox+$geoy"
+               }
+               set k [string first "\+" $PlaceCanvas($m)]
+               if {$k > 0} {
+               set PlaceCanvas($m) [string range $PlaceCanvas($m) $k end]
+               }
+               wm geometry .f$cnr $PlaceCanvas($m)
+       }
+       wm minsize .f$cnr 100 100
+
+       if {[string first "4." $tk_version] == 0 \
+       ||  [string first "8." $tk_version] == 0} {
+               set cv [canvas .f$cnr.c  -relief raised -bd 2\
+                       -scrollregion {-15c -5c 30c 40c} \
+                       -background $BG \
+                       -xscrollcommand ".f$cnr.hscroll set" \
+                       -yscrollcommand ".f$cnr.vscroll set"]
+               scrollbar .f$cnr.vscroll -relief sunken \
+                       -command ".f$cnr.c yview"
+               scrollbar .f$cnr.hscroll -relief sunken -orient horiz \
+                       -command ".f$cnr.c xview"
+       } else {
+               set cv [canvas .f$cnr.c  -relief raised -bd 2\
+                       -scrollregion {-15c -5c 30c 40c} \
+                       -background $BG \
+                       -xscroll ".f$cnr.hscroll set" \
+                       -yscroll ".f$cnr.vscroll set"]
+               scrollbar .f$cnr.vscroll -relief sunken \
+                       -command ".f$cnr.c yview"
+               scrollbar .f$cnr.hscroll -relief sunken -orient horiz \
+                       -command ".f$cnr.c xview"
+       }
+       set Chandle($cnr) $cv
+       #-width 500 -height 500
+
+       button .f$cnr.b1 -text "Close" \
+               -command "set PlaceCanvas($m) [wm geometry .f$cnr]; destroy .f$cnr"
+       button .f$cnr.b2 -text "Save in: $m.ps" \
+               -command "$cv postscript -file $m.ps -colormode $Ptype"
+
+       pack append .f$cnr \
+               .f$cnr.vscroll {right filly} \
+               .f$cnr.hscroll {bottom fillx} \
+               .f$cnr.c {top expand fill}
+
+       if {$m == "msc"} {
+               set Sticky($cnr) 0
+               checkbutton .f$cnr.b6 -text "Preserve" \
+                       -variable Sticky($cnr) \
+                       -relief flat
+               pack append .f$cnr \
+                       .f$cnr.b6 { right padx 5}
+       }
+       pack append .f$cnr \
+               .f$cnr.b1 {right padx 5} \
+               .f$cnr.b2 {right padx 5}
+
+       bind $cv <2> "$cv scan mark %x %y"      ;# Geert Janssen, TUE
+       bind $cv <B2-Motion> "$cv scan dragto %x %y"
+
+       .f$cnr.c bind node <B1-Motion> "
+               moveNode $cnr \[.f$cnr.c find withtag current] %x %y 1
+       "
+
+#      .f$cnr.c bind node <B2-Motion> "
+#              moveNode $cnr \[.f$cnr.c find withtag current] %x %y 1
+#      "
+
+       tkwait visibility .f$cnr
+       return $cnr
+}
+
+proc addscales {p} {
+       global Chandle Scale
+
+       catch {
+               set cv $Chandle($p)
+               button .f$p.b4 -text "Larger" \
+                       -command "$cv scale all 0 0 1.1 1.1; set Scale [expr $Scale*1.1]"
+               button .f$p.b5 -text "Smaller" \
+                       -command "$cv scale all 0 0 0.9 0.9; set Scale [expr $Scale*0.9]"
+               pack append .f$p \
+                       .f$p.b4 {right padx 5} \
+                       .f$p.b5 {right padx 5}
+       }
+}
+
+proc dodot {n} {
+       global Edges edgeHead edgeTail NodeWidth NodeHeight Maxx Maxy
+       global State ELabel TransLabel Unix cnr lcnr Xrem Yrem DOT
+
+       add_log "<dot graph layout...>"
+       set fd [open "|$DOT" w+]
+
+       puts $fd "digraph dodot {"
+
+       foreach el [array names Edges] {
+               if { [ string first $n $el ] >= 0 } {
+               for {set i 0} { [lindex $Edges($el) $i] != "" } {incr i} {
+                       set ntrg [lindex $Edges($el) $i]
+                       puts $fd " \"$el\" -> \"$ntrg\"; "
+               }
+       }}
+
+       puts $fd "}"
+       flush $fd
+       set ends ""
+       set nodot 1
+       while {[gets $fd line] > -1} {
+               if {[string first "\}" $line] >= 0} {
+                       break;
+               }
+               set dd [string length $line]; incr dd -1
+               while {[string range $line $dd $dd] == "\\"} {
+                       gets $fd more
+                       set line "[string range $line 0 [expr $dd-1]]$more"
+                       set dd [string length $line]; incr dd -1
+               }
+               if {[string first " -> " $line] >= 0} {
+                       set a [string first "\[pos=\"" $line]; incr a 8
+                       set b [string first "\"\];" $line]; incr b -1
+                       set b2 [string first "->" $line]
+                       set line1 [string range $line 0 [expr $a - 9]]
+                       set src [string range $line1 0 [expr $b2 - 1]]
+                       set src [string trim $src "      \""]
+                       set trg [string range $line1 [expr $b2 + 3] [expr $a - 1]]
+                       set trg [string trim $trg "      \""]
+                       set tp [string range $line [expr $a-2] [expr $a-2]]
+                       set line [string range $line $a $b]
+                       set k [split $line " "]
+                       set j [llength $k]
+                       set j2 [trunc [expr $j/2]]
+                       set coords ".f$cnr.c create line "
+                       set spline "-smooth 1"
+                       set nl $ELabel($src,$trg)
+                       if {$tp == "e"} {
+                               set ends "last"
+                               for {set i 1} {$i < $j} {incr i} {
+                                       scan [lindex $k $i] "%d,%d" x y
+                                       set coords " $coords[expr 50 + $x] [expr 50 + $Maxy - $y] "
+                                       if {$i == $j2} {
+                                               .f$cnr.c coords \
+                                                       $TransLabel($State($src),$State($trg)) \
+                                                       [expr 50 + $x] [expr 50 + $Maxy - $y]
+                                               .f$cnr.c itemconfigure \
+                                                       $TransLabel($State($src),$State($trg)) \
+                                                       -fill black -text "$nl"
+                                       }
+                               }
+                               scan [lindex $k 0] "%d,%d" x y
+                               set coords " $coords[expr 50 + $x] [expr 50 + $Maxy - $y] "
+                       } else {
+                               set ends "first"
+                               for {set i 0} {$i < $j} {incr i} {
+                                       scan [lindex $k $i] "%d,%d" x y
+                                       set coords " $coords[expr 50 + $x] [expr 50 + $Maxy - $y] "
+                                       if {$i == $j2} {
+                                               .f$cnr.c coords \
+                                                       $TransLabel($State($src),$State($trg)) \
+                                                       [expr 50 + $x] [expr 50 + $Maxy - $y]
+                                               .f$cnr.c itemconfigure \
+                                                       $TransLabel($State($src),$State($trg)) \
+                                                       -fill black -text "$nl"
+                       }       }       }
+                       set coords "$coords -arrow $ends $spline -tags connector"
+
+                       set ne [eval $coords]
+                       set Xrem($ne) 10
+                       set Yrem($ne) 10
+
+                       continue
+               }
+               if {[string first "node " $line] >= 0 \
+               ||  [string first "\{" $line]    >= 0} {
+                       continue
+               }
+               if {[string first "graph " $line] >= 0} {
+                       set a [string first "\"" $line]; incr a
+                       set b [string last  "\"" $line]; incr b -1
+                       set line [string range $line $a $b]
+                       set k [split $line ","]
+                       if {[llength $k] == 4} {
+                               set Maxx [lindex $k 2]
+                               set Maxy [lindex $k 3]
+                       } else {
+                               set Maxx [lindex $k 0]
+                               set Maxy [lindex $k 1]
+                       }
+                       set nodot 0
+               } else {        ;# a node
+                       set a [string first "\[" $line]; incr a
+                       set b [string last  "\]" $line]; incr b -1
+                       set line1 [string range $line 0 [expr $a - 2]]
+                       set line  [string range $line $a $b]
+                       set nn [string trim $line1 "     \""]
+
+                       set a [string first "pos=" $line]; incr a 5
+                       set b [string first "\"" [string range $line $a end]]
+                       set b [expr $a + $b - 1]
+                       set line1  [string range $line $a $b]
+                       set k [split $line1 ","]
+                       set x [lindex $k 0]
+                       set y [lindex $k 1]
+
+                       set a [string first "width=" $line]; incr a 7
+                       set b [string first "\"" [string range $line $a end]]
+                       set b [expr $a + $b - 1]
+                       set w [expr 75 * [string range $line $a $b]]
+
+                       set a [string first "height=" $line]; incr a 8
+                       set b [string first "\"" [string range $line $a end]]
+                       set b [expr $a + $b - 1]
+                       set h [expr 75 * [string range $line $a $b]]
+
+               catch {
+                       set NodeWidth($State($nn)) [expr $w/2]
+                       set NodeHeight($State($nn)) [expr $h/2]
+                       moveNode $lcnr $State($nn) \
+                               [expr 50 + $x] [expr 50 + $Maxy - $y] 0
+               } err
+#puts $err
+               }
+       }
+       catch { close $fd }
+
+       if {$nodot} {
+               add_log "<cannot find dot>"
+               catch {
+               tk_messageBox -icon info -message "<cannot find dot>"
+               }
+               return
+       }
+
+       foreach el [array names Edges] {
+               if { [ string first $n $el ] >= 0 } {
+                       catch {
+                       foreach edge $edgeHead($State($el)) {
+                               .f$cnr.c delete $edge
+                       }
+                       unset edgeHead($State($el))
+                       unset edgeTail($State($el))
+                       }
+       }       }
+       .f$cnr.c bind node <B1-Motion> {}       ;# no moving
+       .f$cnr.c bind node <B2-Motion> {}
+       catch { destroy .f$lcnr.b6 }
+#      button .f$lcnr.b6 -text "No Labels" \
+#              -command ".f$lcnr.c delete texttag; destroy .f$lcnr.b6"
+       button .f$lcnr.b6 -text "No Labels" \
+               -command "hide_automata_labels .f$lcnr.b6 .f$cnr.c"
+       pack append .f$lcnr .f$lcnr.b6 {right padx 5}
+}
+
+proc hide_automata_labels {b c} {
+       $b configure -text "Add Labels"
+       $c itemconfigure texttag -fill white
+       $b configure -command "show_automata_labels $b $c"
+}
+
+proc show_automata_labels {b c} {
+       $b configure -text "No Labels"
+       $c itemconfigure texttag -fill black
+       $b configure -command "hide_automata_labels $b $c"
+}
+
+proc trunc {p} {
+       set foo [string first "." $p]
+       if {$foo >= 0} {
+               incr foo -1
+               set p [string range $p 0 $foo]
+       }
+       return $p
+}
+
+# Help menus
+
+proc aboutspin {} {
+       global FG BG HelvBig version xversion
+
+       catch {destroy .h}
+       toplevel .h
+
+       wm title .h "About SPIN"
+       wm iconname .h "About"
+       message .h.t -width 600 -background $BG -foreground $FG -font $HelvBig \
+       -text " $version
+Xspin Version $xversion
+
+Spin is an on-the-fly LTL model checking system
+for proving properties of asynchronous software
+system designs, first distributed in 1991.
+
+The master sources for the latest version of
+this software can always be found via:
+
+http://spinroot.com/spin/whatispin.html
+
+For help:  spin_list@spinroot.com
+
+The Spin sources are (c) 1990-2004 Bell Labs,
+Lucent Technologies, Murray Hill, NJ, USA.
+All rights are reserved. This software is for
+educational and research purposes only.
+No guarantee whatsoever is expressed or implied
+by the distribution of this code.
+"
+       button .h.b -text "Ok" -command {destroy .h}
+       pack append .h .h.t {top expand fill}
+       pack append .h .h.b {top}
+}
+
+proc promela {} {
+       global FG BG HelvBig
+
+       catch {destroy .h}
+       toplevel .h
+
+       wm title .h "Promela URL"
+       wm iconname .h "Promela"
+       message .h.t -width 600 -background $BG -foreground $FG -font $HelvBig \
+       -text "All Promela references are available online:
+
+http://spinroot.com/spin/Man/index.html
+
+"
+       button .h.b -text "Ok" -command {destroy .h}
+       pack append .h .h.t {top expand fill}
+       pack append .h .h.b {top}
+}
+
+proc helper {} {
+       global FG BG HelvBig
+
+       catch {destroy .h}
+       toplevel .h
+
+       wm title .h "Help with Xspin"
+       wm iconname .h "Help"
+       message .h.t -background $BG -foreground $FG -font $HelvBig \
+       -text "\
+Spin Version Controller - (c) 1993-2004 Bell Laboratories
+
+Enter a Promela model into the main text window, or 'Open'
+one via the File Menu (e.g., from Spin's Test directory).
+Once loaded, you can revert to the stored version of the file
+with option ReOpen.  Select Clear to empty the text window.
+
+In the log, just below the text-window, background
+commands are printed that Xspin generates.
+Outputs from Simulation and Verification runs always
+appear in separate windows.
+
+All run-time options are available through the Run menu.
+A typical way of working with Xspin is to use:
+
+- First a Syntax Check to get hints and warnings
+- Random Simulation for further debugging
+- Add the properties to be verified (assertions, never claims)
+- Perform a Slicing Check to check for redundancy
+- Perform Verification for a correctness proof
+- Guided Simulation to inspect errors reported by
+  the Verification option
+
+Clicking Button-1 in the main window updates the
+Line number display at the top of the window -- as a
+simple way of finding out at what line you are.
+
+You can also use another editor to update the
+specifications outside Xspin, and use the ReOpen
+command from the File menu to refresh the Xspin
+edit buffer before starting each new simulation or
+verification run."
+       button .h.b -text "Ok" -command {destroy .h}
+       pack append .h .h.t {top expand fill}
+       pack append .h .h.b {top}
+}
+
+# LTL interface
+
+set formula ""
+set tl_stat 0
+
+proc put_template {s} {
+       .tl.main.e1 delete 0 end
+       .tl.main.e1 insert end "$s"
+}
+
+set PlaceTL    "+100+1"
+
+proc call_tl {} {      ;# expanded interface
+       global formula tl_stat nv_typ an_typ cp_typ
+       global FG BG Fname firstime PlaceTL
+
+       catch {destroy .tl}
+       toplevel .tl
+
+       set k [string first "\+" $PlaceTL]
+       if {$k > 0} {
+               set PlaceTL [string range $PlaceTL $k end]
+       }
+
+       wm title .tl "Linear Time Temporal Logic Formulae"
+       wm iconname .tl "LTL"
+       wm geometry .tl $PlaceTL
+
+       frame .tl.main
+       entry .tl.main.e1 -relief sunken \
+               -background $BG -foreground $FG
+       label .tl.main.e2 -text "Formula: "
+
+       frame .tl.op
+       set alw {\[\] }
+       set eve {\<\> }
+       pack append .tl.op [label .tl.op.s0 -text "Operators: " \
+               -relief flat] {left}
+       pack append .tl.op [button .tl.op.always -width 1 -text "\[\]" \
+               -command ".tl.main.e1 insert insert \"$alw \""] {left}
+       pack append .tl.op [button .tl.op.event -width 1 -text "\<\>" \
+               -command ".tl.main.e1 insert insert \"$eve \""] {left}
+       pack append .tl.op [button .tl.op.until -width 1 -text "U" \
+               -command ".tl.main.e1 insert insert \" U \""] {left}
+       pack append .tl.op [button .tl.op.impl -width 1 -text "->" \
+               -command ".tl.main.e1 insert insert \" -> \""] {left}
+       pack append .tl.op [button .tl.op.and -width 1 -text "and" \
+               -command ".tl.main.e1 insert insert \" && \""] {left}
+       pack append .tl.op [button .tl.op.or -width 1 -text "or" \
+               -command ".tl.main.e1 insert insert \" || \""] {left}
+       pack append .tl.op [button .tl.op.not -width 1 -text "not" \
+               -command ".tl.main.e1 insert insert \" ! \""] {left}
+
+       frame .tl.b -relief ridge -borderwidth 4
+       label .tl.b.s0 -text "Property holds for: "
+       radiobutton .tl.b.s1 -text "All Executions (desired behavior)" \
+               -variable tl_stat -value 0
+       radiobutton .tl.b.s2 -text "No Executions (error behavior)" \
+               -variable tl_stat -value 1
+       pack append .tl.b \
+               .tl.b.s0 {left} \
+               .tl.b.s1 {left} \
+               .tl.b.s2 {left}
+
+       .tl.main.e1 insert end $formula
+
+       button .tl.main.file -text "Load..." \
+               -command "browse_tl"
+
+       bind .tl.main.e1 <Return> { do_ltl }
+
+       pack append .tl.main \
+               .tl.main.e2 {top left}\
+               .tl.main.e1 {top left expand fill} \
+               .tl.main.file {top right}
+
+       pack append .tl .tl.main {top fillx frame e}
+       pack append .tl .tl.op {top frame w}
+       pack append .tl .tl.b {top fillx frame w}
+
+       frame .tl.macros -relief ridge -borderwidth 4
+       label .tl.macros.title -text "Symbol Definitions:" -relief flat
+       scrollbar .tl.macros.s -relief flat \
+               -command ".tl.macros.t yview"
+       text .tl.macros.t -height 4 -relief raised -bd 2 \
+               -yscrollcommand ".tl.macros.s set" \
+               -background $BG -foreground $FG \
+               -setgrid 1 \
+               -wrap word
+
+       pack append .tl.macros \
+               .tl.macros.title {top frame w} \
+               .tl.macros.s {left filly} \
+               .tl.macros.t {left expand fill}
+
+       frame .tl.notes -relief ridge -borderwidth 4
+       label .tl.notes.title -text "Notes: " -relief flat
+       scrollbar .tl.notes.s -relief flat \
+               -command ".tl.notes.t yview"
+       text .tl.notes.t -height 4 -relief raised -bd 2 \
+               -yscrollcommand ".tl.notes.s set" \
+               -background $BG -foreground $FG \
+               -setgrid 1 \
+               -wrap word
+       pack append .tl.notes \
+               .tl.notes.title {top fillx frame w} \
+               .tl.notes.s {left filly} \
+               .tl.notes.t {left expand fill}
+
+       frame .tl.never
+       frame .tl.never.top
+       label .tl.never.top.title -text "Never Claim:"\
+                -relief flat
+       button .tl.never.top.gc -text "Generate" \
+               -command "do_ltl"
+       pack append .tl.never.top \
+               .tl.never.top.gc {right}\
+               .tl.never.top.title {left}
+
+       scrollbar .tl.never.s -relief flat \
+               -command ".tl.never.t yview"
+       text .tl.never.t -height 8 -relief raised -bd 2 \
+               -yscrollcommand ".tl.never.s set" \
+               -setgrid 1 \
+               -wrap word
+       pack append .tl.never \
+               .tl.never.top {top fillx frame w} \
+               .tl.never.s {left filly} \
+               .tl.never.t {left expand fill}
+
+       frame .tl.results
+       frame .tl.results.top
+
+       button .tl.results.top.svp -text "Run Verification" \
+               -command "do_ltl; basicval2"
+       label .tl.results.top.title -text "Verification Result:"\
+                -relief flat
+       pack append .tl.results.top \
+               .tl.results.top.svp {right}\
+               .tl.results.top.title {left}
+
+       scrollbar .tl.results.s -relief flat \
+               -command ".tl.results.t yview"
+       text .tl.results.t -height 7 -relief raised -bd 2 \
+               -yscrollcommand ".tl.results.s set" \
+               -setgrid 1 \
+               -wrap word
+       pack append .tl.results \
+               .tl.results.top {top fillx frame w} \
+               .tl.results.s {left filly} \
+               .tl.results.t {left expand fill}
+
+       pack append .tl \
+               .tl.notes {top expand fill} \
+               .tl.macros {top expand fill} \
+               .tl.never {top expand fill} \
+               .tl.results {top expand fill} \
+
+       pack append .tl [button .tl.sv -text "Save As.." \
+               -command "save_tl"] {right}
+       pack append .tl [button .tl.exit -text "Close" \
+       -command "set PlaceTL [wm geometry .tl]; destroy .tl"] {right}
+
+       pack append .tl [button .tl.help -text "Help" -fg red \
+               -command "roadmap4"] {left}
+       pack append .tl [button .tl.clear -text "Clear" \
+               -command ".tl.main.e1 delete 0 end; .tl.never.t delete 0.0 end"] {left}
+
+       loaddefault_tl
+       focus .tl.main.e1
+}
+
+proc purge_nvr {foo} {
+       set j [llength $foo]; incr j -1
+       for {set i $j} {$i >= 0} {incr i -1} {
+               set k [lindex $foo $i]
+               set kk [expr $k+1]
+               .tl.never.t delete $k.0 $kk.0
+       }
+}
+
+proc grab_nvr {inp target} {
+
+       set pattern $inp
+       scan [.tl.never.t index end] %d numLines
+       set foo {}
+       set yes 0
+
+       for {set i 1} {$i < $numLines} { incr i} {
+               .tl.never.t mark set last $i.0
+               set have [.tl.never.t get last "last lineend + 1 chars"]
+               if {[regexp -indices $pattern $have indices]} {
+                       lappend foo $i
+                       set yes [expr 1 - $yes]
+                       if {$yes} {
+                               set pattern "#endif"
+                       } else {
+                               set pattern $inp
+                       }
+               }
+               if {$yes && [string first $inp $have] != 0} {
+                       $target insert end "$have"
+                       lappend foo $i
+               }
+       }
+       purge_nvr $foo
+}
+
+proc extract_defs {} {
+       global tl_stat
+
+       set pattern "#define "
+       scan [.tl.never.t index end] %d numLines
+       set foo {}
+       set tl_stat 1
+       for {set i 1} {$i < $numLines} { incr i} {
+               .tl.never.t mark set last $i.0
+               set have [.tl.never.t get last "last lineend + 1 chars"]
+               if {[regexp -indices $pattern $have indices]} {
+                       .tl.macros.t insert end "$have"
+                       lappend foo $i
+               }
+               set have [.tl.never.t get last "last lineend"]
+               set k [string first "Formula As Typed: " $have]
+               if {$k > 0} {
+                       set ff [string range $have [expr $k+18] end]
+                       .tl.main.e1 insert end $ff
+               }
+               if {[string first "To The Negated Formula " $have] > 0} {
+                       set tl_stat 0
+               }
+       }
+       purge_nvr $foo
+
+       grab_nvr "#ifdef NOTES"  .tl.notes.t
+       grab_nvr "#ifdef RESULT" .tl.results.t
+}
+
+proc inspect_ltl {} {
+       global formula
+       set formula "[.tl.main.e1 get]"
+
+       set x $formula
+       regsub -all {\&\&} "$x" " " y; set x $y
+       regsub -all {\|\|} "$x" " " y; set x $y
+       regsub -all {\/\\} "$x" " " y; set x $y
+       regsub -all {\\\/} "$x" " " y; set x $y
+       regsub -all {\!}  "$x" " " y; set x $y
+       regsub -all {<->} "$x" " " y; set x $y
+       regsub -all {\->}  "$x" " " y; set x $y
+       regsub -all {\[\]} "$x" " " y; set x $y
+       regsub -all {\<\>} "$x" " " y; set x $y
+       regsub -all {[()]} "$x" " " y; set x $y
+       regsub -all {\ \ *} "$x" " " y; set x $y
+       regsub -all { U} "$x" " " y; set x $y
+       regsub -all { V} "$x" " " y; set x $y
+       regsub -all { X} "$x" " " y; set x $y
+
+       set predefs " np_ true false "
+
+       set k [split $x " "]
+       set j [llength $k]
+       set line [.tl.macros.t get 0.0 end]
+       for {set i 0} {$i < $j} {incr i} {
+               if {[string length [lindex $k $i]] > 0 \
+               &&  [string first " [lindex $k $i] " $predefs] < 0} {
+                 set pattern "#define [lindex $k $i]"
+                 if {[string first $pattern $line] < 0} {
+                       catch {
+                       .tl.macros.t insert end "$pattern\t?\n"
+                       }
+                       set line [.tl.macros.t get 0.0 end]
+       }       } }
+}
+
+proc do_ltl {} {
+       global formula tl_stat SPIN tk_major tk_minor
+
+       set formula "[.tl.main.e1 get]"
+       .tl.never.t delete 0.0 end
+       update
+
+       catch { inspect_ltl }
+
+       set MostSystems 1       ;# change to 0 only if there are problems
+                               ;# see below
+
+       if {$tl_stat == 0} {
+               add_log "$SPIN -f \"!( $formula )\""
+               if {$MostSystems} {
+                       catch {exec $SPIN -f "!($formula)" >&pan.ltl} err
+               } else {
+                       # this variant was needed on some older systems,
+                       # but it causes problems on some of the newer ones...
+                       catch {exec $SPIN -f \"!($formula)\" >&pan.ltl} err
+               }
+       } else {
+               add_log "$SPIN -f \"( $formula )\""
+               if {$MostSystems} {
+               catch {exec $SPIN -f "($formula)" >&pan.ltl} err
+               } else {
+               # see above
+               catch {exec $SPIN -f \"($formula)\" >&pan.ltl} err
+               }
+       }
+       set lno 0
+
+       if {$err != ""} {
+               add_log "<error: $err>"
+               add_log "hint: check the Help Button for syntax rules"
+       } else {
+               .tl.never.t insert end \
+               "       /*\n"
+               .tl.never.t insert end \
+               "        * Formula As Typed: $formula\n"
+               incr lno 2
+               if {$tl_stat == 0} {
+                       .tl.never.t insert end \
+                       "        * The Never Claim Below Corresponds\n"
+                       .tl.never.t insert end \
+                       "        * To The Negated Formula !($formula)\n"
+                       .tl.never.t insert end \
+                       "        * (formalizing violations of the original)\n"
+                       incr lno 3
+               }
+               .tl.never.t insert end \
+               "        */\n\n"
+               incr lno 2
+       }
+       catch {
+               set fd [open pan.ltl r]
+               while {[gets $fd line] > -1} {
+                       .tl.never.t insert end "$line\n"
+               }
+               close $fd
+       }
+       rmfile pan.ltl
+}
+
+proc dump_tl {bb} {
+
+       if {$bb != ""} {
+               set fnm $bb
+       } else {
+               set fnm [.sv_tl.ent get]
+       }
+
+       if {[file_ok $fnm]==0} return
+       set fd [open $fnm w]
+       add_log "<save claim in $fnm>"
+       catch { puts $fd "[.tl.macros.t get 0.0 end]" nonewline }
+
+       puts $fd "[.tl.never.t get 0.0 end]" nonewline
+
+       catch { puts $fd "#ifdef NOTES"
+               puts $fd "[.tl.notes.t get 0.0 end]" nonewline
+               puts $fd "#endif"
+       }
+       catch { puts $fd "#ifdef RESULT"
+               puts $fd "[.tl.results.t get 0.0 end]" nonewline
+               puts $fd "#endif"
+       }
+
+       catch "flush $fd"
+       catch "close $fd"
+       catch "destroy .sv_tl"
+       catch "focus .tl.main.e1"
+}
+
+proc save_tl {} {
+       global Fname PlaceWarn
+       catch {destroy .sv_tl}
+       toplevel .sv_tl
+
+       wm title .sv_tl "Save Claim"
+       wm iconname .sv_tl "Save"
+       wm geometry .sv_tl $PlaceWarn
+
+       label  .sv_tl.msg -text "Name for LTL File: " -relief flat
+       entry  .sv_tl.ent -width 6 -relief sunken -textvariable fnm
+       button .sv_tl.b1 -text "Ok" -command { dump_tl "" }
+       button .sv_tl.b2 -text "Cancel" -command "destroy .sv_tl"
+       bind   .sv_tl.ent <Return> { dump_tl "" }
+
+       set fnm [.sv_tl.ent get]
+       if {$fnm == ""} {
+               .sv_tl.ent insert end "$Fname.ltl"
+       }
+
+       pack append .sv_tl \
+               .sv_tl.msg {top frame w} \
+               .sv_tl.ent {top frame e expand fill} \
+               .sv_tl.b1 {right frame e} \
+               .sv_tl.b2 {right frame e}
+       focus .sv_tl.ent
+}
+
+proc add_tl {} {
+       global BG FG HelvBig PlaceWarn
+       catch {destroy .warn}
+       toplevel .warn
+       set k [string first "\+" $PlaceWarn]
+       if {$k > 0} {
+               set PlaceWarn [string range $PlaceWarn $k end]
+       }
+
+       wm title .warn "Accept"
+       wm iconname .warn "Accept"
+       wm geometry .warn $PlaceWarn
+
+       message .warn.t -width 300 \
+               -background $BG -foreground $FG -font $HelvBig \
+               -text " \
+Instructions:
+
+1. Save the Never Claim in a file, \
+for instance a file called 'never', \
+using the <Save> button.
+
+2. Insert the line
+
+#include \"never\"
+
+(the name of the file with the claim) \
+at the end of the main specification.
+
+3. Insert macro definitions (#define's) for all \
+propositional symbols used in the formula.
+
+For instance, with LTL formula
+'[] p -> <> q'  add the macro defs:
+
+#define p      (cnt == 1)
+#define q      (cnt > 1)
+
+These macros must be defined just above the line \
+with the #include \"never\" directive
+
+4. Perform the verification, and make sure that \
+the box 'Apply Never Claim' is checked in the \
+Verification Panel (or else the claim is ignored).
+You can have a library of claim files that you can \
+choose from for verification, by changing only the \
+name of the include file.
+
+5. Never claims have no effect during simulation runs.
+
+6. See the HELP->LTL menu for more information.
+
+"
+       button .warn.b -text "Ok" \
+               -command {set PlaceWarn [wm geometry .warn]; destroy .warn}
+       pack append .warn .warn.t {top expand fill}
+       pack append .warn .warn.b {right frame e}
+}
+
+proc roadmap4 {} {
+       global FG BG
+
+       catch {destroy .h}
+       toplevel .h
+
+       wm title .h "LTL Help"
+       wm iconname .h "Help"
+       frame .h.z
+       scrollbar .h.z.s -command ".h.z.t yview"
+       text .h.z.t -relief raised -bd 2 \
+               -background $BG -foreground $FG \
+               -yscrollcommand ".h.z.s set" \
+               -setgrid 1 -width 60 -height 30 -wrap word
+       pack append .h.z \
+               .h.z.s {left filly} \
+               .h.z.t {left expand fill}
+       .h.z.t insert end "GUIDELINES:
+You can load an LTL template or a previously saved LTL
+formula from a file via the LOAD button on the upper
+right of the LTL Property Manager panel.
+
+Define a new LTL formula using lowercase names for the
+propositional symbols, for instance:
+       [] (p U q)
+The formula expresses either a positive (desired) or a
+negative (undesired) property of the model.  A positive
+property is negated automatically by the translator to
+convert it in a never claim (which expresses the
+corresponding negative property (the undesired behavior
+that is claimed 'never' to occur).
+
+When you type a <Return> or hit the <Generate> button,
+the formula is translated into an equivalent never-claim.
+
+You must add a macro-definition for each propositional
+symbol used in the LTL formula.  Insert these definitions
+in the symbols window of the LTL panel, they will be
+remembered together with the annotations and verification
+result if the formula is saved in an .ltl file.
+Enclose the symbol definitions in braces, to secure correct
+operator precedence, for instance:
+
+#define p      (a > b)
+#define q      (len(q) < 5)
+
+Valid temporal logic operators are:
+       \[\]  Always (no space between \[ and \])
+       <>  Eventually (no space between < and >)
+       U   (Strong) Until
+       V   The Dual of Until: (p V q) == !(!p U !q)
+
+       All operators are left-associative (incl. U and V).
+
+Boolean Operators:
+       &&  Logical And (alternative form: /\\, no spaces)
+       !   Logical Negation
+       ||  Logical Or  (alternative form: \\/, no spaces)
+       ->  Logical Implication
+       <-> Logical Equivalence
+
+Boolean Predicates:
+       true, false
+       any name that starts with a lowercase letter
+
+Examples:
+       \[\] p
+       !( <> !q )
+       p U q
+       p U (\[\] (q U r))
+
+Generic properties/Templates:
+       Invariance: \[\] p
+       Response:   p -> \<\> q
+       Precedence: p -> (q U r)
+       Objective:  p -> \<\> (q || r)
+
+       Each of the above 4 generic types of properties
+       can (and will generally have to) be prefixed by
+       temporal operators such as
+               \[\], \<\>, \[\]\<\>, \<\>\[\]
+       The last (objective) property can be read to mean
+       that 'p' is a trigger, or 'enabling' condition that
+       determines when the requirement becomes applicable
+       (e.g. the sending of a new data message); then 'q'
+       can be the fullfillment of the requirement (e.g.
+       the arrival of the matching acknowledgement), and
+       'r' could be a discharging condition that voids the
+       applicability of the check (an abort condition).
+"
+       button .h.b -text "Ok" -command {destroy .h}
+       pack append .h .h.z {top expand fill}
+       pack append .h .h.b {top}
+       .h.z.t configure -state disabled 
+       .h.z.t yview -pickplace 1.0      
+       focus .h.z.t
+}
+
+
+
+# Specific Help
+
+proc roadmap1 {} {
+       global FG BG
+
+       catch {destroy .road1}
+       toplevel .road1
+
+       wm title .road1 "Help with Simulation"
+       wm iconname .road1 "SimHelp"
+       frame .road1.z
+       scrollbar .road1.z.s -command ".road1.z.t yview"
+       text .road1.z.t -relief raised -bd 2 \
+               -background $BG -foreground $FG \
+               -yscrollcommand ".road1.z.s set" \
+               -setgrid 1 -width 60 -height 30 -wrap word
+       pack append .road1.z \
+               .road1.z.s {left filly} \
+               .road1.z.t {left expand fill}
+       .road1.z.t insert end "GUIDELINES:
+0.  Always use a Syntax Check before running simulations.\
+It shakes out the more obvious flaws in the model.
+
+1.  Random simulation option is used to debug a model.\
+Other than assert statements, no correctness requirements\
+are checked during simulation runs. All nondeterministic\
+decisions are resolved randomly.  You can of course still\
+force a selection to go into a specific direction by \
+modifying the model.\
+A random run is repeated precisely if the Seed Value\
+for the random number generator is kept the same.
+
+2.  Interactive simulation can be used to force the\
+execution towards a known point.  The user is prompted\
+at every point in the execution where a nondeterministic\
+choice has to be resolved.
+
+3.  A guided simulation is used to follow an error-trail that was\
+produced by the verifier.  If the trail gets to be thousands of execution\
+steps long, this can be time-consuming. \
+You can skip the initial portion of such a long trail by typing\
+a number in  the 'Steps Skipped' box in the Simulation Panel .
+
+4. The options in the Simulations Panel allow you to enable or\
+disable types of displays that are maintained during simulation\
+runs.  Usually, it is not necessary to look at all possible display panels.\
+Experiment to see which displays you find most useful.
+
+5. To track the value changes of Selected variables, in the\
+Message Sequence Chart and in the Variable Values Panel, add a prefix\
+'show ' to the declaration of the selected variables in the Promela\
+specification, e.g. use 'show byte cnt;' instead of 'byte cnt;'"
+
+       button .road1.b -text "Ok" -command {destroy .road1}
+       pack append .road1 .road1.z {top expand fill}
+       pack append .road1 .road1.b {top}
+       .road1.z.t configure -state disabled 
+       .road1.z.t yview -pickplace 1.0      
+       focus .road1.z.t
+}
+
+proc roadmap2a {} {
+       global FG BG
+
+       catch {destroy .road2}
+       toplevel .road2
+
+       wm title .road2 "Help with Verification Parameters"
+       wm iconname .road2 "ValHelp"
+       frame .road2.z
+       scrollbar .road2.z.s -command ".road2.z.t yview"
+       text .road2.z.t -relief raised -bd 2 \
+               -background $BG -foreground $FG \
+               -yscrollcommand ".road2.z.s set" \
+               -setgrid 1 -width 60 -height 18 -wrap word
+       pack append .road2.z \
+               .road2.z.s {left filly} \
+               .road2.z.t {left expand fill}
+       .road2.z.t insert end "Physical Memory Available:
+Set this number to amount of physical (not virtual)
+memory in your system, in MegaBytes, and leave it there for all runs.
+
+When the limit is reached, the verification is stopped to
+avoid trashing.
+
+The number entered here is the number of MegaBytes directly
+(not a power of two, as in previous versions of xspin).
+
+If an exhaustive verification cannot be completed due to
+lack of memory, use compression, or switch to a
+supertrace/bitstate run under basic options."
+
+       button .road2.b -text "Ok" -command {destroy .road2}
+       pack append .road2 .road2.z {top expand fill}
+       pack append .road2 .road2.b {top}
+       .road2.z.t configure -state disabled 
+       .road2.z.t yview -pickplace 1.0      
+       focus .road2.z.t
+}
+proc roadmap2b {} {
+       global FG BG
+
+       catch {destroy .road2}
+       toplevel .road2
+
+       wm title .road2 "Help with Verification"
+       wm iconname .road2 "ValHelp"
+       frame .road2.z
+       scrollbar .road2.z.s -command ".road2.z.t yview"
+       text .road2.z.t -relief raised -bd 2 \
+               -background $BG -foreground $FG \
+               -yscrollcommand ".road2.z.s set" \
+               -setgrid 1 -width 60 -height 15 -wrap word
+       pack append .road2.z \
+               .road2.z.s {left filly} \
+               .road2.z.t {left expand fill}
+       .road2.z.t insert end "Estimated State Space Size:
+This parameter is used to calculate the size of the
+hash-table. It results in a selection of a numeric argument
+for the -w flag of the verifier. Setting it too high may
+cause an out-of-memory error with zero states reached
+(meaning that the verification could not be started).
+Setting it too low can cause inefficiencies due to
+hash collisions.
+
+In Bitstate runs begin with the default estimate for
+this parameter.  After a run completes successfully,
+double the estimate, and see if the number of reached
+stated changes much.  Continue to do this until
+it stops changing, or until you overflow the memory
+bound and run out of memory.
+
+The closest power of two is taken by xspin to set the
+true number used for the number of reachable states.
+(The selected power of two is visible as the number that
+follow the -w flag in the run-line that xspin generates).
+
+To set a specific -w parameter, use the Extra Run-Time Option
+Field. If, for instance, -w32 is specified there, it will
+override the value computed from the Estimated State Space Size."
+
+       button .road2.b -text "Ok" -command {destroy .road2}
+       pack append .road2 .road2.z {top expand fill}
+       pack append .road2 .road2.b {top}
+       .road2.z.t configure -state disabled 
+       .road2.z.t yview -pickplace 1.0      
+       focus .road2.z.t
+}
+proc roadmap2c {} {
+       global FG BG
+
+       catch {destroy .road2}
+       toplevel .road2
+
+       wm title .road2 "Help with Verification"
+       wm iconname .road2 "ValHelp"
+       frame .road2.z
+       scrollbar .road2.z.s -command ".road2.z.t yview"
+       text .road2.z.t -relief raised -bd 2 \
+               -background $BG -foreground $FG \
+               -yscrollcommand ".road2.z.s set" \
+               -setgrid 1 -width 60 -height 20 -wrap word
+       pack append .road2.z \
+               .road2.z.s {left filly} \
+               .road2.z.t {left expand fill}
+       .road2.z.t insert end "Maximum Search Depth:
+This number determines the size of the depth-first
+search stack that is used during the verification.
+The stack uses memory, so a larger number increases
+the memory requirements, and a lower number decreases
+it.  In a tight spot, when there seems not to be
+sufficient memory for the search depth needed, you
+can reduce the estimated state space size to free some
+more memory for the stack.
+
+If you hit the maximum search depth during a verification
+(noted as 'Search not completed' or 'Search Truncated'
+in the verification output) without finding an error,
+double the search depth parameter and repeat the run."
+
+       button .road2.b -text "Ok" -command {destroy .road2}
+       pack append .road2 .road2.z {top expand fill}
+       pack append .road2 .road2.b {top}
+       .road2.z.t configure -state disabled 
+       .road2.z.t yview -pickplace 1.0      
+       focus .road2.z.t
+}
+
+proc roadmap2k {} {
+       global FG BG
+
+       catch {destroy .road2}
+       toplevel .road2
+
+       wm title .road2 "Help with Verification"
+       wm iconname .road2 "ValHelp"
+       frame .road2.z
+       scrollbar .road2.z.s -command ".road2.z.t yview"
+       text .road2.z.t -relief raised -bd 2 \
+               -background $BG -foreground $FG \
+               -yscrollcommand ".road2.z.s set" \
+               -setgrid 1 -width 60 -height 10 -wrap word
+       pack append .road2.z \
+               .road2.z.s {left filly} \
+               .road2.z.t {left expand fill}
+       .road2.z.t insert end "Number of hash functions:
+This number determines how many bits are set per
+state when in Bitstate verification mode. The default is 2.
+At the end of a Bitstate verification run, the verifier
+can issue a recommendation for a different setting of
+this flag (which is the -k flag), it a change can be
+predicted to lead to better coverage."
+
+       button .road2.b -text "Ok" -command {destroy .road2}
+       pack append .road2 .road2.z {top expand fill}
+       pack append .road2 .road2.b {top}
+       .road2.z.t configure -state disabled 
+       .road2.z.t yview -pickplace 1.0      
+       focus .road2.z.t
+}
+
+proc roadmap2d {} {
+       global FG BG
+
+       catch {destroy .road2}
+       toplevel .road2
+
+       wm title .road2 "Help with Verification"
+       wm iconname .road2 "ValHelp"
+       frame .road2.z
+       scrollbar .road2.z.s -command ".road2.z.t yview"
+       text .road2.z.t -relief raised -bd 2 \
+               -background $BG -foreground $FG \
+               -yscrollcommand ".road2.z.s set" \
+               -setgrid 1 -width 60 -height 26 -wrap word
+       pack append .road2.z \
+               .road2.z.s {left filly} \
+               .road2.z.t {left expand fill}
+       .road2.z.t insert end "GENERAL GUIDELINES:
+=> When just starting out, it is safe to leave all parameters in the\
+Verification Options Panel set at their initial value and to simply\
+push the Run button in the Basic Options Panel for a default\
+exhaustive verification.\
+If you run out of memory, adjust the parameter settings as \
+indicated under the 'explain' options.
+
+=> If an error is found, first try to reduce the search depth to \
+find a shorter equivalent.  Once you're content with the length,\
+move on to a guided simulation to inspect the error-trail in detail.\
+Optionally, use the Find Shortest Trail option, but note that this\
+can increase runtime and memory use. So: do not use this option until\
+you are certain that an error exists -- leave it turned off by default).\
+If you are verifying a Safety Property, try the Breadth-First Search\
+mode to find the shortest counter-example. It may run out of memory\
+sooner than the default depth-first search mode, but it often works.
+
+=> It is always safe to leave the Partial Order Reduction option enabled.\
+Turn it off only for debugging purposes, or when warned to do so by the \
+verifier itself.  The Profiling option gathers statistics about the \
+verification hot-spots in the model.
+
+=> If you save all error-trails, you have to copy the one you are\
+interested in inspecting with a guided simulation onto the file\
+pan_in.trail manually (outside xspin) after the run completes.\
+The trails are numbered in order of discovery."
+
+       button .road2.b -text "Ok" -command {destroy .road2}
+       pack append .road2 .road2.z {top expand fill}
+       pack append .road2 .road2.b {top}
+       .road2.z.t configure -state disabled 
+       .road2.z.t yview -pickplace 1.0      
+       focus .road2.z.t
+}
+
+proc roadmap2e {} {
+       global FG BG
+
+       catch {destroy .road2}
+       toplevel .road2
+
+       wm title .road2 "Help with Verification"
+       wm iconname .road2 "ValHelp"
+       frame .road2.z
+       scrollbar .road2.z.s -command ".road2.z.t yview"
+       text .road2.z.t -relief raised -bd 2 \
+               -background $BG -foreground $FG \
+               -yscrollcommand ".road2.z.s set" \
+               -setgrid 1 -width 60 -height 25 -wrap word
+       pack append .road2.z \
+               .road2.z.s {left filly} \
+               .road2.z.t {left expand fill}
+       .road2.z.t insert end "BASIC GUIDELINES:
+When just starting out, it is safe to leave all parameters\
+at their initial value and to push the Run button for a\
+default exhaustive verification.\
+If you run out of memory, adjust the parameter settings\
+under Advanced Options.
+
+=> Safety properties are properties of single states (like\
+deadlocks = invalid endstates, or assertion violations).
+
+=> Liveness properties are properties of sequences of\
+states (typically: infinite sequences, i.e., cycles).\
+There are two types of cycles: non-progress (not passing\
+through any state marked with a 'progress' label) and\
+acceptance (passing infinitely often through a state\
+marked with an 'accept' label).
+
+=> Use the Weak Fairness option only when really necessary,\
+to avoid unwated error reports.  It can increase the CPU-time\
+requirements by a factor roughly equal to twice the number of\
+active processes.
+
+=> It is safe to leave the Reduced Search option enabled.\
+Turn it off only for debugging purposes, or when warned to do so by the \
+verifier itself.   The Profiling option gathers statistics about the \
+verification hot-spots in the model.
+
+=> You can apply a Never Claim even when checking Safety Properties\
+when you want to restrict the search to the sequences that are\
+matched by the claim (a user-guided search pruning technique)."
+
+       button .road2.b -text "Ok" -command {destroy .road2}
+       pack append .road2 .road2.z {top expand fill}
+       pack append .road2 .road2.b {top}
+       .road2.z.t configure -state disabled 
+       .road2.z.t yview -pickplace 1.0      
+       focus .road2.z.t
+}
+
+proc roadmap2f {} {
+       global FG BG
+
+       catch {destroy .road2}
+       toplevel .road2
+
+       wm title .road2 "Help with Verification"
+       wm iconname .road2 "ValHelp"
+       frame .road2.z
+       scrollbar .road2.z.s -command ".road2.z.t yview"
+       text .road2.z.t -relief raised -bd 2 \
+               -background $BG -foreground $FG \
+               -yscrollcommand ".road2.z.s set" \
+               -setgrid 1 -width 60 -height 15 -wrap word
+       pack append .road2.z \
+               .road2.z.s {left filly} \
+               .road2.z.t {left expand fill}
+       .road2.z.t insert end "GUIDELINES:
+This will run a verification for the specific LTL property\
+that was defined in the LTL options panel that brought you\
+here.  The claim was placed in a separate .ltl\
+file, not included in the main specification.\
+(It will be picked up in the verification automatically.)\
+The separate .ltl file combines the notes, formula,\
+macros, results, etc., for easier tracking.
+
+On a first run, leave all choices at their initial\
+value and push the Run button for a default verification.\
+If you run out of memory, adjust the parameter settings\
+under Advanced Options.
+
+Use the Weak Fairness option only when really necessary,\
+to avoid unwated error reports.  It can increase the CPU-time\
+requirements by a factor roughly equal to twice the number of\
+active processes."
+
+       button .road2.b -text "Ok" -command {destroy .road2}
+       pack append .road2 .road2.z {top expand fill}
+       pack append .road2 .road2.b {top}
+       .road2.z.t configure -state disabled 
+       .road2.z.t yview -pickplace 1.0      
+       focus .road2.z.t
+}
+
+proc roadmap2 {} {
+       global FG BG
+
+       catch {destroy .road2}
+       toplevel .road2
+
+       wm title .road2 "Help with Verification"
+       wm iconname .road2 "ValHelp"
+       frame .road2.z
+       scrollbar .road2.z.s -command ".road2.z.t yview"
+       text .road2.z.t -relief raised -bd 2 \
+               -background $BG -foreground $FG \
+               -yscrollcommand ".road2.z.s set" \
+               -setgrid 1 -width 60 -height 20 -wrap word
+       pack append .road2.z \
+               .road2.z.s {left filly} \
+               .road2.z.t {left expand fill}
+       .road2.z.t insert end "GUIDELINES:
+When just starting out, it is safe to leave all
+verification parameters set at their initial values
+and to Run a default verification.
+If you run out of memory, or encounter other problems,
+look at the specific help options in the verification
+settings panel.
+One parameter is important to set correctly right from
+the start: the physical memory size of your system.
+It is by default set to 64 Mbytes.  Set it once to the
+true amount of physical memory on your system, in Megabytes,
+and never change it again (unless you buy more physical
+memory for your machine of course).
+You can find this parameter under advanced options in the
+verification parameters panel.
+Bitstate/Supertrace verifications are approximate, and
+only used for models too large to verify exhaustively.
+This option allows you to get at least an approximate
+answer to the correctness of models that could otherwise
+not be verified by a finite state system."
+
+       button .road2.b -text "Ok" -command {destroy .road2}
+       pack append .road2 .road2.z {top expand fill}
+       pack append .road2 .road2.b {top}
+       .road2.z.t configure -state disabled 
+       .road2.z.t yview -pickplace 1.0      
+       focus .road2.z.t
+}
+
+proc roadmap3 {} {
+       global FG BG
+
+       catch {destroy .road3}
+       toplevel .road3
+
+       wm title .road3 "Reducing Complexity"
+       wm iconname .road3 "CompHelp"
+       frame .road3.z
+       scrollbar .road3.z.s -command ".road3.z.t yview"
+       text .road3.z.t -relief raised -bd 2 \
+               -background $BG -foreground $FG \
+               -yscrollcommand ".road3.z.s set" \
+               -setgrid 1 -width 60 -height 30 -wrap word
+       pack append .road3.z \
+               .road3.z.s {left filly} \
+               .road3.z.t {left expand fill}
+       .road3.z.t insert end "
+When a verification cannot be completed because of\
+computational complexity; here are some strategies that\
+can be applied to combat this problem.
+
+0. Run the Slicing Algorithm (in the Run Menu) to find\
+potential redundancy in your model for the stated properties.
+
+1. Try to make the model more general, more abstract.\
+Remember that you are constructing a verification model and not\
+an implementation.  SPIN's strength is in proving properties of\
+*interactions* in a distributed system (the implicit assumptions\
+that processes make about each other) -- it's strength is not in\
+proving things about local *computations*, data dependencies etc.
+
+2. Remove everything that is not directly related to the property\
+you are trying to prove: redundant computations, redundant data. \
+*Avoid counters*; avoid incrementing variables that are used for\
+only book-keeping purposes.
+The Syntax Check option will warn about the gravest offenses.
+
+3. Asynchronous channels are a significant source of complexity in\
+verification.  Use a synchronous channel where possible.  Reduce the\
+number of slots in asynchronous channels to a minimum (use 2, or 3\
+slots to get started).
+
+4. Look for processes that merely transfer messages. Consider if\
+you can remove processes that only copy incoming messages from\
+one channel into another, by letting the sender generate the\
+final message right away.  If the intermediate process makes\
+choices (e.g., to delete or duplicate, etc.), let the sender\
+make that choice, rather than the intermediate process.
+
+5. Combine local computations into atomic, or d_step, sequences.
+
+6. Avoid leaving scratch data around in variables.  You can reduce\
+the number of states by, for instance, resetting local variables\
+that are used inside atomic sequences to zero at the end of those\
+sequences; so that the scratch values aren't visible outside the\
+sequence.  Alternatively: introduce some extra global 'hidden'\
+variables for these purposes (see the WhatsNew.html document).
+Use the predefined variable \"_\" as a write-only scratch variable\
+wherever possible.
+
+7. If possible to do so: combine the behavior of two processes into\
+a single one.  Generalize behavior;  focus on coordination aspects\
+(i.e., the interfaces between processes, rather than the local\
+computation inside processes).
+
+8. Try to exploit the partial order reduction strategies.\
+Use the xr and xs assertions (see WhatsNew.html); avoid sharing\
+channels between multiple receivers or multiple senders.\
+Avoid merging independent data-streams into a single shared channel."
+
+       button .road3.b -text "Ok" -command {destroy .road3}
+       pack append .road3 .road3.z {top expand fill}
+       pack append .road3 .road3.b {top}
+       .road3.z.t configure -state disabled 
+       .road3.z.t yview -pickplace 1.0      
+       focus .road3.z.t
+}
+
+proc roadmap5 {} {
+       global FG BG
+
+       catch {destroy .road5}
+       toplevel .road5
+
+       wm title .road5 "Spin Automata"
+       wm iconname .road5 "FsmHelp"
+       frame .road5.z
+       scrollbar .road5.z.s -command ".road5.z.t yview"
+       text .road5.z.t -relief raised -bd 2 \
+               -background $BG -foreground $FG \
+               -yscrollcommand ".road5.z.s set" \
+               -setgrid 1 -width 60 -height 30 -wrap word
+       pack append .road5.z \
+               .road5.z.s {left filly} \
+               .road5.z.t {left expand fill}
+       .road5.z.t insert end "
+The Spin Automata view option give a view of the
+structure of the automata models that Spin uses in
+the verification process.
+Each proctype is represented by a unique automaton.
+
+Chosing this option (in the Run menu) will cause Spin to
+first generate a verifier, compile it, and then run it
+(as pan -d) to obtain a description of the proctype
+names and the corresponding automata.
+
+After selecting (double-clicking) the proctype name desired,
+the graph will be produced.  The default graph layout
+algorithm is small and a self-contained part of Xspin,
+but also rather crude.  Be on guard, therefore, for edges
+that overlap (a typical case, for instance, is a backedge
+that hides behind a series of forward edges. Use DOT
+(see the README.html file on Spin) when possible for much
+better graph layout.
+
+In the default layout, the following button actions are
+defined (the first one is not needed when using DOT):
+
+1. Moving Nodes: either Button-1 or Button-2.
+2. Displaying Edge Labels: hold Button-1 down on the edge.
+3. Cross-References: Move the cursor over a Node to see the
+   corresponding line in the Promela source, in the main
+   Xspin window.
+
+If labels look bad -- try changing the font definitions at
+the start of the xspin.tcl file (hints are given there).
+"
+       button .road5.b -text "Ok" -command {destroy .road5}
+       pack append .road5 .road5.z {top expand fill}
+       pack append .road5 .road5.b {top}
+       .road5.z.t configure -state disabled 
+       .road5.z.t yview -pickplace 1.0      
+       focus .road5.z.t
+}
+
+proc roadmap6 {} {
+       global FG BG
+
+       catch {destroy .road6}
+       toplevel .road6
+
+       wm title .road6 "Optional Compiler Directives"
+       wm iconname .road6 "Optional"
+       frame .road6.z
+       scrollbar .road6.z.s -command ".road6.z.t yview"
+       text .road6.z.t -relief raised -bd 2 \
+               -background $BG -foreground $FG \
+               -yscrollcommand ".road6.z.s set" \
+               -setgrid 1 -width 80 -height 30 -wrap word
+       pack append .road6.z \
+               .road6.z.s {left filly} \
+               .road6.z.t {left expand fill}
+       .road6.z.t insert end "
+               Use only when prompted:
+
+NFAIR=N                size memory used for enforcing weak fairness (default N=2)
+VECTORSZ=N     allocates memory (in bytes) for state vector (default N=1024)
+
+               Related to partial order reduction:
+
+CTL            limit p.o.reduction to subset consistent with branching time logic
+GLOB_ALPHA     consider process death a global action
+XUSAFE         disable validity checks of xr/xs assertions
+
+               Speedups:
+
+NOBOUNDCHECK   don't check array bound violations
+NOCOMP         don't compress states with fullstate storage (uses more memory)
+NOSTUTTER      disable stuttering rules (warning: changes semantics)
+
+               Memory saving (slower):
+
+MA=N           use a minimized DFA encoding for state vectors up to N bytes
+
+               Experimental:
+
+BCOMP          when in BITSTATE mode, computes hash over compressed state-vector
+NIBIS          apply a small optimization of partial order reduction
+NOVSZ          risky - removes 4 bytes from state vector - its length field.
+PRINTF         enables printfs during verification runs
+RANDSTORE=N    in BITSTATE mode, -DRANDSTORE=33 lowers prob of storing a state to 33%
+W_XPT=N                with MA, write checkpoint files every multiple of N states stored
+R_XPT          with MA, restart run from last checkpoint file written
+
+               Debugging:
+
+SDUMP          with CHECK: adds ascii dumps of state vectors
+SVDUMP         add run option -pN to write N-byte state vectors into file sv_dump
+
+               Already set by the other xspin options:
+
+BITSTATE       use supertrace/bitstate instead of exhaustive exploration
+HC             use hash-compact instead of exhaustive exploration
+COLLAPSE       collapses state vector size by up to 80% to 90%
+MEMCNT=N       set upperbound of 2^N bytes to memory that can be allocated
+MEMLIM=N       set upperbound of N Mbytes to memory that can be allocated
+NOCLAIM                exclude never claim from the verification, if present
+NOFAIR         disable the code for weak-fairness (is faster)
+NOREDUCE       disables the partial order reduction algorithm
+NP             enable non-progress cycle detection (option -l, replacing -a),
+PEG            add complexity profiling (transition counts)
+REACH          guarantee absence of errors within the -m depth-limit
+SAFETY         optimize for the case where no cycle detection is needed
+VAR_RANGES     compute the effective value range of byte variables
+CHECK          generate debugging information (see also below)
+VERBOSE                elaborate debugging printouts
+"
+       button .road6.b -text "Ok" -command {destroy .road6}
+       pack append .road6 .road6.z {top expand fill}
+       pack append .road6 .road6.b {top}
+       .road6.z.t configure -state disabled 
+       .road6.z.t yview -pickplace 1.0      
+       focus .road6.z.t
+}
+
+
+# simulation options panel
+
+set s_options  ""
+set v_options  ""
+set a_options  ""
+set c_options  ""
+
+set Blue       "blue";         #"yellow"
+set Yellow     "yellow";       #"red"
+set White      "white";        #"yellow"
+set Red                "red";          #"yellow"
+set Green      "green";        #"green"
+
+set fd         0
+set Depth      0
+set Seq(0)     0
+set Sdbox      0
+set Spbox(0)   0
+set sbox       0
+
+set simruns    0
+set stepper    0
+set stepped    0
+set VERBOSE    0
+set SYMBOLIC   0
+set howmany    0
+set Choice(1)  0
+set Sticky(0)  0
+set SparseMsc  1
+set showvars   1
+set vv         1
+set qv         1
+set gvars      1
+set lvars      0
+set hide_q1    ""
+set hide_q2    ""
+set hide_q3    ""
+set PlaceSim   "+200+100"
+
+proc simulation_old {} {
+       global s_typ l_typ showvars qv PlaceSim
+       global fvars gvars lvars SparseMsc HelvBig
+       global msc ebc tsc vv svars rvars seed jumpsteps
+       global hide_q1 hide_q2 hide_q3
+
+       catch { .menu.run.m entryconfigure 5 -state normal }
+
+       catch {destroy .s}
+       toplevel .s
+       set k [string first "\+" $PlaceSim]
+       if {$k > 0} {
+               set PlaceSim [string range $PlaceSim $k end]
+       }
+
+       wm title .s "Simulation Options"
+       wm iconname .s "SIM"
+       wm geometry .s $PlaceSim
+
+       frame .s.opt -relief flat
+
+       mkpan_in
+
+       frame .s.opt.mode -relief raised -borderwidth 1m
+       label .s.opt.mode.fld0 \
+               -font $HelvBig \
+               -text "Display Mode" \
+               -relief sunken -borderwidth 1m
+
+       checkbutton .s.opt.mode.fld4b -text "Time Sequence Panel - with:" \
+               -variable tsc \
+               -relief flat
+       frame .s.opt.mode.flds
+       radiobutton .s.opt.mode.flds.fld3 \
+               -text "    Interleaved Steps" \
+               -variable m_typ -value 2 \
+               -relief flat
+       radiobutton .s.opt.mode.flds.fld1 \
+               -text "    One Window per Process" \
+               -variable m_typ -value 0 \
+               -relief flat
+       radiobutton .s.opt.mode.flds.fld2 \
+               -text "    One Trace per Process" \
+               -variable m_typ -value 1 \
+               -relief flat
+       frame .s.opt.mode.flds.fld0 -width 15
+       pack append .s.opt.mode.flds \
+               .s.opt.mode.flds.fld0 {left frame w}\
+               .s.opt.mode.flds.fld3 {top frame w}\
+               .s.opt.mode.flds.fld1 {top frame w}\
+               .s.opt.mode.flds.fld2 {top frame w}
+
+       checkbutton .s.opt.mode.fld4a -text "MSC Panel - with:" \
+               -variable msc \
+               -relief flat
+       frame .s.opt.mode.steps
+       radiobutton .s.opt.mode.steps.fld5 -text "    Step Number Labels" \
+               -variable SYMBOLIC -value 0 \
+               -relief flat
+       radiobutton .s.opt.mode.steps.fld6 -text "    Source Text Labels" \
+               -variable SYMBOLIC -value 1 \
+               -relief flat
+       radiobutton .s.opt.mode.steps.fld7 -text "    Normal Spacing" \
+               -variable SparseMsc -value 1 \
+               -relief flat
+       radiobutton .s.opt.mode.steps.fld8 -text "    Condensed Spacing" \
+               -variable SparseMsc -value 0 \
+               -relief flat
+       frame .s.opt.mode.steps.fld0 -width 15
+       pack append .s.opt.mode.steps \
+               .s.opt.mode.steps.fld0 {left frame w}\
+               .s.opt.mode.steps.fld5 {top frame w}\
+               .s.opt.mode.steps.fld6 {top frame w}\
+               .s.opt.mode.steps.fld7 {top frame w}\
+               .s.opt.mode.steps.fld8 {top frame w}
+
+       checkbutton .s.opt.mode.fld4c -text "Execution Bar Panel" \
+               -variable ebc \
+               -relief flat
+       checkbutton .s.opt.mode.fld4d -text "Data Values Panel" \
+               -variable vv \
+               -relief flat
+
+       frame .s.opt.mode.vars
+
+       checkbutton .s.opt.mode.vars.fld4c -text "    Track Buffered Channels" \
+               -variable qv \
+               -relief flat
+       checkbutton .s.opt.mode.vars.fld4d -text "    Track Global Variables" \
+               -variable gvars \
+               -relief flat
+       checkbutton .s.opt.mode.vars.fld4e -text "    Track Local Variables" \
+               -variable lvars \
+               -relief flat
+
+       checkbutton .s.opt.mode.vars.fld4f \
+               -text "    Display vars marked 'show' in MSC" \
+               -variable showvars \
+               -relief flat
+       frame .s.opt.mode.vars.fld0 -width 15
+       pack append .s.opt.mode.vars \
+               .s.opt.mode.vars.fld0 {left frame w}\
+               .s.opt.mode.vars.fld4c {top frame w}\
+               .s.opt.mode.vars.fld4d {top frame w}\
+               .s.opt.mode.vars.fld4e {top frame w}\
+               .s.opt.mode.vars.fld4f {top frame w}
+
+       pack append .s.opt.mode .s.opt.mode.fld0 {top pady 4 frame w fillx}
+
+       pack append .s.opt.mode .s.opt.mode.fld4a {top pady 4 frame w}
+       pack append .s.opt.mode .s.opt.mode.steps {top frame w}
+
+       pack append .s.opt.mode .s.opt.mode.fld4b {top pady 4 frame w}
+       pack append .s.opt.mode .s.opt.mode.flds  {top frame w}
+
+       pack append .s.opt.mode .s.opt.mode.fld4d {top pady 4 frame w}
+       pack append .s.opt.mode .s.opt.mode.vars {top frame w}
+
+       pack append .s.opt.mode .s.opt.mode.fld4c {top pady 4 frame w}
+
+       pack append .s.opt .s.opt.mode {left frame n}
+
+       frame .s.opt.mesg -relief raised -borderwidth 1m
+       label .s.opt.mesg.loss0 \
+               -font $HelvBig \
+               -text "A Full Queue" \
+               -relief sunken -borderwidth 1m
+       radiobutton .s.opt.mesg.loss1 -text "Blocks New Msgs" \
+               -variable l_typ -value 0 \
+               -relief flat
+       radiobutton .s.opt.mesg.loss2 -text "Loses New Msgs" \
+               -variable l_typ -value 1 \
+               -relief flat
+       pack append .s.opt.mesg .s.opt.mesg.loss0 {top pady 4 frame w fillx}
+       pack append .s.opt.mesg .s.opt.mesg.loss1 {top pady 4 frame w}
+       pack append .s.opt.mesg .s.opt.mesg.loss2 {top pady 4 frame w}
+
+       frame .s.opt.hide -relief raised -borderwidth 1m
+       label .s.opt.hide.txt  \
+               -font $HelvBig \
+               -text "Hide Queues in MSC" \
+               -relief sunken -borderwidth 1m
+       pack append .s.opt.hide .s.opt.hide.txt {top pady 4 frame w fillx }
+
+       for {set i 1} {$i < 4} {incr i} {
+               frame .s.opt.hide.q$i
+               label .s.opt.hide.q$i.qno \
+                       -font $HelvBig \
+                       -text "Queue nr:"
+               entry .s.opt.hide.q$i.entry \
+                       -relief sunken -width 8
+               pack append .s.opt.hide.q$i .s.opt.hide.q$i.qno {left pady 4 frame n }
+               pack append .s.opt.hide.q$i .s.opt.hide.q$i.entry {left pady 4 frame n}
+               pack append .s.opt.hide .s.opt.hide.q$i {top pady 4 frame w fillx}
+       }
+       frame .s.opt.lframe -relief raised -borderwidth 1m
+       label .s.opt.lframe.tl \
+               -font $HelvBig \
+               -text "Simulation Style" \
+               -relief sunken -borderwidth 1m
+       radiobutton .s.opt.lframe.is -text "Interactive" \
+               -variable s_typ -value 2 \
+               -relief flat
+       radiobutton .s.opt.lframe.gs -text "Guided (using pan.trail)" \
+               -variable s_typ -value 1 \
+               -relief flat
+       frame .s.opt.lframe.b
+       entry .s.opt.lframe.b.entry -relief sunken -width 8 
+       label .s.opt.lframe.b.label \
+               -font $HelvBig \
+               -text "Steps Skipped"
+       pack append .s.opt.lframe.b \
+               .s.opt.lframe.b.label {left} \
+               .s.opt.lframe.b.entry {left}
+
+       radiobutton .s.opt.lframe.rs -text "Random (using seed)" \
+               -variable s_typ -value 0 \
+               -relief flat
+       frame .s.opt.lframe.s
+       entry .s.opt.lframe.s.entry -relief sunken -width 8 
+       label .s.opt.lframe.s.label \
+               -font $HelvBig \
+               -text "Seed Value"
+       pack append .s.opt.lframe.s \
+               .s.opt.lframe.s.label {left} \
+               .s.opt.lframe.s.entry {left}
+
+       pack append .s.opt.lframe .s.opt.lframe.tl {top pady 4 frame w fillx} \
+               .s.opt.lframe.rs {top pady 4 frame w} \
+               .s.opt.lframe.s  {top pady 4 frame e} \
+               .s.opt.lframe.gs {top pady 4 frame w} \
+               .s.opt.lframe.b  {top pady 4 frame e} \
+               .s.opt.lframe.is {top pady 4 frame w}
+
+       pack append .s.opt .s.opt.lframe {top frame n}
+       pack append .s.opt .s.opt.mesg {top frame n fillx}
+       pack append .s.opt .s.opt.hide {top frame n expand fillx filly}
+
+       pack append .s .s.opt { top frame n }
+
+       pack append .s [button .s.rewind -text "Start" \
+               -command "Rewind"  ] {right frame e}
+       pack append .s [button .s.exit -text "Cancel" \
+               -command "Stopsim" ] {right frame e}
+       pack append .s [button .s.help -text "Help" -fg red \
+               -command "roadmap1" ] {right frame e}
+
+       .s.opt.lframe.s.entry  insert end $seed
+       .s.opt.lframe.b.entry insert end $jumpsteps
+
+       .s.opt.hide.q1.entry insert end $hide_q1
+       .s.opt.hide.q2.entry insert end $hide_q2
+       .s.opt.hide.q3.entry insert end $hide_q3
+
+       raise .s
+}
+
+
+proc simulation {} {
+       global s_typ l_typ showvars qv PlaceSim
+       global fvars gvars lvars SparseMsc HelvBig
+       global msc ebc tsc vv svars rvars seed jumpsteps
+       global hide_q1 hide_q2 hide_q3
+       global whichsim
+
+       catch { .menu.run.m entryconfigure 5 -state normal }
+
+       catch {destroy .s}
+       toplevel .s
+               catch {rmfile pan_in9999999.trail}
+               debug {about to remove pan_in9999999.trail}
+               rmfile pan_in9999999.trail
+       set k [string first "\+" $PlaceSim]
+       if {$k > 0} {
+               set PlaceSim [string range $PlaceSim $k end]
+       }
+
+       wm title .s "Simulation Options"
+       wm iconname .s "SIM"
+       wm geometry .s $PlaceSim
+
+       mkpan_in
+
+       # lower frame with 'start', 'cancel' and 'help' buttons
+       frame .s.l -relief flat
+       pack .s.l -side bottom -fill both
+
+         pack [button .s.l.rewind -text " Start " \
+               -command "Rewind"  ] -side right -fill y -padx 4
+         pack [button .s.l.exit -text "Cancel" \
+               -command "
+                       Stopsim;
+                       catch {rmfile pan_in9999999.trail}
+                       "
+               ] -side right -fill y -padx 4
+         pack [button .s.l.help -text " Help " -fg red \
+               -command "roadmap1" ]  -side right -fill y -padx 4
+
+       # upper frame with modes and options
+       frame .s.u -relief flat
+       pack .s.u -side top -fill both
+
+         frame .s.u.mode -relief raised -borderwidth 1m
+         pack .s.u.mode -side left -fill both -expand 1
+
+           frame .s.u.mode.fdis -relief flat
+           pack .s.u.mode.fdis -side top -fill x -expand 1
+
+             label .s.u.mode.fdis.fld0 \
+               -font $HelvBig \
+               -text "Display Mode" \
+               -relief sunken -borderwidth 1m
+             pack .s.u.mode.fdis.fld0 -side top -fill x
+
+#MSC Panel
+
+           frame .s.u.mode.fmsc -relief flat
+           pack  .s.u.mode.fmsc -side top -fill x
+
+             checkbutton .s.u.mode.fmsc.fld4a -text "MSC Panel - with:" \
+                 -variable msc \
+                 -relief flat
+             pack .s.u.mode.fmsc.fld4a -side left
+
+           frame .s.u.mode.msc -relief flat
+           pack  .s.u.mode.msc -side top -fill x
+
+             frame .s.u.mode.msc.lab -relief flat
+             pack  .s.u.mode.msc.lab -side top -fill x
+
+               frame .s.u.mode.msc.lab.dummy -width 18 -relief flat
+               pack .s.u.mode.msc.lab.dummy -side left -fill y
+
+               frame .s.u.mode.msc.lab.radios -relief flat
+               pack .s.u.mode.msc.lab.radios -side left -fill x
+       
+                 frame .s.u.mode.msc.lab.radios.fnum -relief flat
+                 pack .s.u.mode.msc.lab.radios.fnum -side top -fill x
+
+                   radiobutton .s.u.mode.msc.lab.radios.fnum.fld5 \
+                         -text "    Step Number Labels" \
+                         -variable SYMBOLIC -value 0 \
+                         -relief flat
+                   pack .s.u.mode.msc.lab.radios.fnum.fld5 -side left
+
+                 frame .s.u.mode.msc.lab.radios.ftext -relief flat
+                 pack .s.u.mode.msc.lab.radios.ftext -side top -fill x
+
+                   radiobutton .s.u.mode.msc.lab.radios.ftext.fld6 \
+                       -text "    Source Text Labels" \
+                       -variable SYMBOLIC -value 1 \
+                       -relief flat
+                   pack .s.u.mode.msc.lab.radios.ftext.fld6 -side left
+
+               frame .s.u.mode.msc.lab.bracket
+               pack .s.u.mode.msc.lab.bracket -side left -fill y
+               
+                 canvas .s.u.mode.msc.lab.bracket.c -width 10 -height 40
+                 pack .s.u.mode.msc.lab.bracket.c -side top
+                   .s.u.mode.msc.lab.bracket.c create line 5 15 10 15 10 38 5 38
+
+             frame .s.u.mode.msc.space -relief flat
+             pack  .s.u.mode.msc.space -side top -fill x
+
+               frame .s.u.mode.msc.space.dummy -width 18 -relief flat
+               pack .s.u.mode.msc.space.dummy -side left -fill y
+
+               frame .s.u.mode.msc.space.radios -relief flat
+               pack  .s.u.mode.msc.space.radios -side left -fill x
+       
+                 frame .s.u.mode.msc.space.radios.fnorm -relief flat
+                 pack  .s.u.mode.msc.space.radios.fnorm -side top -fill x
+
+                   radiobutton .s.u.mode.msc.space.radios.fnorm.fld7 \
+                       -text "    Normal Spacing" \
+                       -variable SparseMsc -value 1 \
+                       -relief flat
+                   pack .s.u.mode.msc.space.radios.fnorm.fld7 -side left
+
+                 frame .s.u.mode.msc.space.radios.fcond -relief flat
+                 pack  .s.u.mode.msc.space.radios.fcond -side top -fill x
+
+                   radiobutton .s.u.mode.msc.space.radios.fcond.fld8 \
+                       -text "    Condensed Spacing" \
+                       -variable SparseMsc -value 0 \
+                       -relief flat
+                   pack .s.u.mode.msc.space.radios.fcond.fld8 -side left
+
+               frame .s.u.mode.msc.space.bracket
+               pack .s.u.mode.msc.space.bracket -side left -fill y
+               
+                 canvas .s.u.mode.msc.space.bracket.c -width 10 -height 40
+                 pack .s.u.mode.msc.space.bracket.c -side top
+                   .s.u.mode.msc.space.bracket.c create line 5 15 10 15 10 38 5 38
+
+# Time Sequence Panel
+
+           frame .s.u.mode.ftsp -relief flat 
+           pack  .s.u.mode.ftsp -side top -fill x
+
+             checkbutton .s.u.mode.ftsp.fld4b \
+               -text "Time Sequence Panel - with:" \
+               -variable tsc \
+               -relief flat
+             pack .s.u.mode.ftsp.fld4b -side left
+
+           frame .s.u.mode.tsp
+           pack  .s.u.mode.tsp -side top -fill x
+
+             frame .s.u.mode.tsp.proc
+             pack  .s.u.mode.tsp.proc -side top -fill x
+
+               frame .s.u.mode.tsp.proc.dummy -width 18
+               pack  .s.u.mode.tsp.proc.dummy -side left -fill y
+
+               frame .s.u.mode.tsp.proc.radios -relief flat
+               pack  .s.u.mode.tsp.proc.radios -side left -fill y
+
+                 frame .s.u.mode.tsp.proc.radios.is
+                 pack  .s.u.mode.tsp.proc.radios.is -side top -fill x
+
+                   radiobutton .s.u.mode.tsp.proc.radios.is.fld3 \
+                           -text "    Interleaved Steps" \
+                           -variable m_typ -value 2 \
+                           -relief flat
+                   pack .s.u.mode.tsp.proc.radios.is.fld3 -side left
+
+                 frame .s.u.mode.tsp.proc.radios.1win -relief flat
+                 pack .s.u.mode.tsp.proc.radios.1win -side top -fill x
+
+                   radiobutton .s.u.mode.tsp.proc.radios.1win.fld1 \
+                       -text "    One Window per Process" \
+                       -variable m_typ -value 0 \
+                       -relief flat
+                   pack .s.u.mode.tsp.proc.radios.1win.fld1 -side left
+
+                 frame .s.u.mode.tsp.proc.radios.1trace -relief flat
+                 pack  .s.u.mode.tsp.proc.radios.1trace -side top -fill x
+
+                   radiobutton .s.u.mode.tsp.proc.radios.1trace.fld2 \
+                       -text "    One Trace per Process" \
+                       -variable m_typ -value 1 \
+                       -relief flat
+                   pack .s.u.mode.tsp.proc.radios.1trace.fld2 -side left
+
+               frame .s.u.mode.tsp.proc.bracket
+               pack .s.u.mode.tsp.proc.bracket -side left -fill y
+
+               set y 13
+                 canvas .s.u.mode.tsp.proc.bracket.c -width 10 -height 66
+                 pack .s.u.mode.tsp.proc.bracket.c -side top
+                   .s.u.mode.tsp.proc.bracket.c create line    5  [expr 0 + $y] \
+                                                               10 [expr 0 + $y] \
+                                                               10 [expr 25 + $y] \
+                                                               5  [expr 25 + $y] \
+                                                               10 [expr 25 + $y] \
+                                                               10 [expr 50 + $y] \
+                                                               5  [expr 50 + $y]
+
+       frame .s.u.mode.fdvp -relief flat
+       pack .s.u.mode.fdvp -side top -fill x
+
+         checkbutton .s.u.mode.fdvp.fld4d -text "Data Values Panel" \
+               -variable vv \
+               -relief flat
+         pack .s.u.mode.fdvp.fld4d -side left
+
+       frame .s.u.mode.vars
+       pack .s.u.mode.vars -side top -fill x
+
+         frame .s.u.mode.vars.dummy -width 18
+         pack .s.u.mode.vars.dummy -side left -fill y
+
+         frame .s.u.mode.vars.chks -relief flat
+         pack  .s.u.mode.vars.chks -side left -fill y
+           
+           frame .s.u.mode.vars.chks.ftbc
+           pack  .s.u.mode.vars.chks.ftbc -side top -fill x
+
+             checkbutton .s.u.mode.vars.chks.ftbc.fld4c -text "    Track Buffered Channels" \
+               -variable qv \
+               -relief flat
+             pack .s.u.mode.vars.chks.ftbc.fld4c -side left
+
+           frame .s.u.mode.vars.chks.ftgv
+           pack  .s.u.mode.vars.chks.ftgv -side top -fill x
+
+             checkbutton .s.u.mode.vars.chks.ftgv.fld4d -text "    Track Global Variables" \
+               -variable gvars \
+               -relief flat
+             pack .s.u.mode.vars.chks.ftgv.fld4d -side left
+
+           frame .s.u.mode.vars.chks.ftlv
+           pack  .s.u.mode.vars.chks.ftlv -side top -fill x
+
+             checkbutton .s.u.mode.vars.chks.ftlv.fld4e -text "    Track Local Variables" \
+               -variable lvars \
+               -relief flat
+             pack .s.u.mode.vars.chks.ftlv.fld4e -side left
+
+           frame .s.u.mode.vars.chks.fshow
+           pack  .s.u.mode.vars.chks.fshow -side top -fill x
+
+             checkbutton .s.u.mode.vars.chks.fshow.fld4f \
+               -text "    Display vars marked 'show' in MSC" \
+               -variable showvars \
+               -relief flat
+
+             pack .s.u.mode.vars.chks.fshow.fld4f -side left
+
+       frame .s.u.mode.fexecbar -relief flat
+       pack .s.u.mode.fexecbar -side top -fill x
+
+         checkbutton .s.u.mode.fexecbar.fld4c -text "Execution Bar Panel" \
+               -variable ebc \
+               -relief flat
+          pack .s.u.mode.fexecbar.fld4c -side left
+
+#Right upper frame
+       frame .s.u.r -relief flat
+       pack .s.u.r -side right -fill y -expand 1
+
+#Simulation Style
+         frame .s.u.r.sim -relief raised -borderwidth 1m
+         pack .s.u.r.sim -side top -fill both -expand 1
+
+           frame .s.u.r.sim.flab -relief sunken
+           pack .s.u.r.sim.flab -side top -fill x
+
+             label .s.u.r.sim.flab.tl \
+               -font $HelvBig \
+               -text "Simulation Style" \
+               -relief sunken -borderwidth 1m
+             pack .s.u.r.sim.flab.tl -side top -fill x
+
+           frame .s.u.r.sim.random
+           pack .s.u.r.sim.random -side top -fill x
+
+               radiobutton .s.u.r.sim.random.rs -text "Random (using seed)" \
+               -variable s_typ -value 0 \
+               -relief flat \
+               -command "enable_disable_sub_buttons"
+               pack .s.u.r.sim.random.rs -side left
+
+           frame .s.u.r.sim.seedvalue
+           pack .s.u.r.sim.seedvalue -side top -fill x
+
+             frame .s.u.r.sim.seedvalue.dummy -width 18
+             pack .s.u.r.sim.seedvalue.dummy -side left -fill y
+
+             label .s.u.r.sim.seedvalue.label \
+               -font $HelvBig \
+               -text "Seed Value"
+             pack .s.u.r.sim.seedvalue.label -side left
+
+             entry .s.u.r.sim.seedvalue.entry -relief sunken -width 8
+             pack .s.u.r.sim.seedvalue.entry -side left
+
+           frame .s.u.r.sim.guided
+           pack .s.u.r.sim.guided -side top -fill x
+
+               radiobutton .s.u.r.sim.guided.gs -text "Guided" \
+                  -variable s_typ -value 1 \
+                  -relief flat \
+                  -command "enable_disable_sub_buttons"
+               pack .s.u.r.sim.guided.gs -side left
+               
+               frame .s.u.r.sim.guided_type
+               pack .s.u.r.sim.guided_type -side top -fill x
+
+                 frame .s.u.r.sim.guided_type.dummy -width 18
+                 pack .s.u.r.sim.guided_type.dummy -side left -fill y
+
+                   frame .s.u.r.sim.guided_type.radios
+                   pack .s.u.r.sim.guided_type.radios -side left
+
+                     frame .s.u.r.sim.guided_type.radios.pan_trail
+                     pack  .s.u.r.sim.guided_type.radios.pan_trail -side top -fill x
+
+                       radiobutton .s.u.r.sim.guided_type.radios.pan_trail.rb \
+                               -text "Using pan_in.trail" \
+                               -variable whichsim -value 0 \
+                               -relief flat
+                       pack .s.u.r.sim.guided_type.radios.pan_trail.rb -side left
+
+                     frame .s.u.r.sim.guided_type.radios.trail_other
+                     pack  .s.u.r.sim.guided_type.radios.trail_other -side top -fill x
+
+                       radiobutton .s.u.r.sim.guided_type.radios.trail_other.rb \
+                               -text "Use" \
+                               -variable whichsim -value 1 \
+                               -relief flat
+                       pack .s.u.r.sim.guided_type.radios.trail_other.rb -side left
+
+                       entry .s.u.r.sim.guided_type.radios.trail_other.entry \
+                               -width 20
+                       pack .s.u.r.sim.guided_type.radios.trail_other.entry -side left
+
+                       button .s.u.r.sim.guided_type.radios.trail_other.button -text "Browse" \
+                               -command select_trail_file
+                       pack .s.u.r.sim.guided_type.radios.trail_other.button -side left          
+
+           frame .s.u.r.sim.skipstep
+           pack  .s.u.r.sim.skipstep -side top -fill x
+
+             label .s.u.r.sim.skipstep.label \
+               -font $HelvBig \
+               -text "Steps Skipped"
+             pack .s.u.r.sim.skipstep.label -side left
+
+             entry .s.u.r.sim.skipstep.entry -relief sunken -width 8
+             pack .s.u.r.sim.skipstep.entry -side left
+
+           frame .s.u.r.sim.interactive
+           pack .s.u.r.sim.interactive -side top -fill x
+
+               radiobutton .s.u.r.sim.interactive.is -text "Interactive" \
+                       -variable s_typ -value 2 \
+                       -relief flat \
+               -command "enable_disable_sub_buttons"
+               pack .s.u.r.sim.interactive.is -side left
+
+#A Full Queue
+         frame .s.u.r.fq -relief raised -borderwidth 1m
+         pack .s.u.r.fq -side top -fill both -expand 1
+
+           frame .s.u.r.fq.label -relief sunken
+           pack .s.u.r.fq.label -side top -fill x
+
+             label .s.u.r.fq.label.loss0 \
+               -font $HelvBig \
+               -text "A Full Queue" \
+               -relief sunken -borderwidth 1m
+             pack .s.u.r.fq.label.loss0 -side top -fill x
+
+           frame .s.u.r.fq.block
+           pack .s.u.r.fq.block -side top -fill x
+
+             radiobutton .s.u.r.fq.block.loss1 -text "Blocks New Msgs" \
+               -variable l_typ -value 0 \
+               -relief flat
+             pack .s.u.r.fq.block.loss1 -side left
+
+           frame .s.u.r.fq.lose
+           pack .s.u.r.fq.lose -side top -fill x
+
+             radiobutton .s.u.r.fq.lose.loss2 -text "Loses New Msgs" \
+               -variable l_typ -value 1 \
+               -relief flat
+             pack .s.u.r.fq.lose.loss2 -side left
+
+#Hide Queues in MSC
+         frame .s.u.r.hq -relief raised -borderwidth 1m
+         pack .s.u.r.hq -side top -fill both -expand 1
+
+           frame .s.u.r.hq.flabel -relief sunken
+           pack .s.u.r.hq.flabel -side top -fill x
+
+               label .s.u.r.hq.flabel.txt  \
+                 -font $HelvBig \
+                 -text "Hide Queues in MSC" \
+                 -relief sunken -borderwidth 1m
+           pack .s.u.r.hq.flabel.txt -side top -fill x
+
+       for {set i 1} {$i < 4} {incr i} {
+               frame .s.u.r.hq.q$i
+               pack .s.u.r.hq.q$i -side top -fill x
+               label .s.u.r.hq.q$i.qno \
+                       -font $HelvBig \
+                       -text "Queue nr:"
+               pack .s.u.r.hq.q$i.qno -side left
+               entry .s.u.r.hq.q$i.entry \
+                       -relief sunken -width 8
+               pack .s.u.r.hq.q$i.entry -side left
+       }
+
+       .s.u.r.sim.seedvalue.entry insert end $seed
+       .s.u.r.sim.skipstep.entry insert end $jumpsteps
+
+       .s.u.r.hq.q1.entry insert end $hide_q1
+       .s.u.r.hq.q2.entry insert end $hide_q2
+       .s.u.r.hq.q3.entry insert end $hide_q3
+       enable_disable_sub_buttons
+
+       tkwait visibility .s
+       raise .s
+}
+
+proc enable_disable_sub_buttons {} {
+       global s_typ
+       switch -regexp $s_typ {
+               0|2 { .s.u.r.sim.guided_type.radios.pan_trail.rb configure -state disabled
+                     .s.u.r.sim.guided_type.radios.trail_other.rb configure -state disabled
+                     .s.u.r.sim.guided_type.radios.trail_other.button configure -state disabled
+                   }
+               1   { .s.u.r.sim.guided_type.radios.pan_trail.rb configure -state normal
+                     .s.u.r.sim.guided_type.radios.trail_other.rb configure -state normal
+                     .s.u.r.sim.guided_type.radios.trail_other.button configure -state normal
+                     .s.u.r.sim.guided_type.radios.pan_trail.rb select
+                   }
+
+       }
+}
+
+proc select_trail_file {} {
+       global Trail_filename
+       .s.u.r.sim.guided_type.radios.trail_other.rb select
+       # try to use the predefined file selection dialog
+       switch [info commands tk_getOpenFile] "" {
+               # some old version of Tk so use our own file selection dialog
+               set fileselect "FileSelect open"
+       } default {
+               set fileselect "tk_getOpenFile"
+       }
+       set init_dir [pwd]
+       # get the file (return if the file selection dialog canceled)
+       switch -- [set file [eval $fileselect -initialdir { { $init_dir } } ]] "" return
+       .s.u.r.sim.guided_type.radios.trail_other.entry insert end $file
+       raise .s
+       
+}
+
+proc bld_s_options {} {
+       global fvars gvars lvars svars qv
+       global rvars l_typ showvars vv
+       global s_typ seed jumpsteps s_options
+       global hide_q1 hide_q2 hide_q3 ival whichsim trail_file trail_num
+
+       set s_options "-X -p -v $ival(5)"
+
+       if {$showvars && $gvars == 0 && $lvars == 0} {
+               catch { tk_messageBox -icon info \
+               -message "Display variables marked 'show' selected, \
+               but no local or global vars are being tracked"
+       }       }
+       if {$showvars==1} { set s_options [format "%s -Y" $s_options] }
+       if {$s_typ==2} { set s_options [format "%s -i" $s_options] }
+       if {$vv && $gvars} { set s_options [format "%s -g" $s_options] }
+       if {$vv && $lvars} { set s_options [format "%s -l" $s_options] }
+       if {$svars} { set s_options [format "%s -s" $s_options] }
+       if {$rvars} { set s_options [format "%s -r" $s_options] }
+       if {$l_typ} { set s_options [format "%s -m" $s_options] }
+       if {$hide_q1 != ""} { set s_options [format "%s -q%s" $s_options $hide_q1] }
+       if {$hide_q2 != ""} { set s_options [format "%s -q%s" $s_options $hide_q2] }
+       if {$hide_q3 != ""} { set s_options [format "%s -q%s" $s_options $hide_q3] }
+       if {$s_typ==1} then {
+               set trail_num ""
+               #Guided
+               if {$whichsim == 1} {
+                       #using user specified file
+                       if ![file exists $trail_file] {
+                               catch { tk_messageBox -icon info \
+                                       -message "Trail file $trail_file does not exist."
+                               }
+                               return 0
+                       }
+                       # see if file is in current directory. if not, copy to 
+                       # pan_in9999999.trail in current directory
+                       set ind [string last "\/" $trail_file]
+                       if {$ind > -1} {
+                               if {[pwd] != [string range $trail_file 0 [expr $ind - 1]]} { 
+                                       cpfile $trail_file pan_in9999999.trail
+                                       set trail_file "pan_in9999999.trail"
+                               } else {
+                                       #strip off path
+                                       set trail_file [string range $trail_file \
+                                               [expr $ind + 1] \
+                                               [expr [string length $trail_file] - 1]]
+                               }
+                       }       
+                       #see if it's a 'pan_in<#>.trail' file
+                       set is_pan_in_trail_file 0
+                       if {[string range $trail_file 0 5] == "pan_in"} {
+                               set l [string length $trail_file]
+
+                               if {[string range $trail_file \
+                                       [expr $l-6] [expr $l-1]] == ".trail"} {
+                                       set num [string range $trail_file 6 [expr $l-7]]
+                                       if [string is integer $num] {
+                                               set trail_num $num
+                                               set is_pan_in_trail_file 1
+                       }       }       }
+                       if !($is_pan_in_trail_file) {
+                               # not a 'pan_in<#>.trail' file - copy file to pan_in9999999.trail
+                               # in current directory
+                               cpfile $trail_file pan_in9999999.trail
+                               if [file exists pan_in9999999.trail] {
+                                       set trail_num 9999999
+                               } else {
+                                       catch {tk_messageBox -icon info \
+                                               -message "Unable to create input file in $pwd \
+                                                       check write permissions."
+                                       }
+                                       return 0
+                               }
+                       }
+               } else {
+                       if {![file exists pan_in.trail] && ![file exists pan_in.tra]} {
+                               catch { tk_messageBox -icon info \
+                                       -message "Trail file \'pan_in.tra(il)\' does not exist."
+                               }
+                               return 0
+                       }
+               }
+                       
+               set s_options [format "%s -t%s" $s_options $trail_num]
+       } else {
+               if {[string length $seed] > 0} {
+                       set s_options [format "%s -n%s" $s_options $seed]
+       }       }
+       if {$s_typ!=2} then {
+               if {[string length $jumpsteps] > 0} {
+                       set s_options [format "%s -j%s" $s_options $jumpsteps]
+       }       }
+       return 1
+}
+
+proc Stopsim {} {
+       global stop dbox2 Sticky PlaceSim PlaceCanvas
+       global stepper stepped howmany fd
+
+       set stop 1
+       set stepped 0
+       set stepper 0
+       add_log "<stop simulation>"
+       if {[winfo exists .s]} {
+               set PlaceSim [wm geometry .s]
+               destroy .s
+       }
+       catch {set howmany 0}
+       catch {stopbar}
+       catch { if {$Sticky($dbox2) == 0} {
+                       set PlaceCanvas(msc) [wm geometry .f$dbox2]
+                       destroy .f$dbox2
+       }       }
+       catch {
+               puts $fd "q"
+               flush $fd
+       }
+       update
+}
+
+proc Step_forw {} {
+       global stepper stepped sbox simruns PlaceSim
+
+       set stepped 1
+       set stepper 1
+       if {$simruns == 0} {
+               if {[winfo exists .s]} {
+                       set PlaceSim [wm geometry .s]
+                       destroy .s
+               }
+               runsim
+       } else {
+               catch { .c$sbox.run configure \
+               -text "Run" -command "Runsim" }
+       }
+}
+
+proc Rewind {} {
+       global Depth s_typ whichsim trail_file
+       global Sdbox Spbox
+       global seed jumpsteps simruns
+       global hide_q1 hide_q2 hide_q3 trail_file
+
+       catch { set jumpsteps [.s.u.r.sim.skipstep.entry get] }
+       catch { set hide_q1 [.s.u.r.hq.q1.entry get] }
+       catch { set hide_q2 [.s.u.r.hq.q2.entry get] }
+       catch { set hide_q3 [.s.u.r.hq.q3.entry get] }
+
+       if {$s_typ == 0} {
+               catch { set seed [.s.u.r.sim.seedvalue.entry get] }
+       }
+       if {$s_typ == 1} {
+               #Guided
+               set Depth 0
+               catch {
+                       foreach el [array names Spbox] {
+                               set Sdbox $Spbox($el)
+                               .c$Sdbox.z.t tag remove Rev 1.0 end
+               }       }
+               if {$whichsim == 1} {
+                       set trail_file ""
+                       catch {set trail_file [.s.u.r.sim.guided_type.radios.trail_other.entry get]}
+               }
+       }
+
+       set simruns 0
+
+       Step_forw
+}
+
+proc Runsim {} {
+       global stepper stepped sbox
+
+       catch { .c$sbox.run configure \
+               -text "Suspend" -command "Step_forw" }
+       set stepper 1
+       set stepped 0
+}
+
+proc BreakPoint {} {
+       global stepped sbox
+
+       set stepped 1
+       catch { .c$sbox.run configure \
+               -text "BreakPoint" -command "Runsim" }
+}
+
+proc runsim {} {
+       global Unix SPIN tk_major
+       global s_options s_typ dbox2
+       global stepper stepped
+       global simruns m_typ
+       global gvars lvars
+       global fd stop Depth Seq
+       global Sdbox Spbox pbox howmany Choice
+       global sbox VERBOSE SYMBOLIC msc ebc vv tsc
+       global Blue Yellow White Red Green
+       global SmallFont BigFont Sticky SparseMsc
+       global FG BG qv gvars lvars PlaceBox
+       global dbox Vvbox 
+       global whichsim trail_num
+
+       set simruns 1
+       set Vvbox 0
+       set pno 0
+       set Varnm("") ""
+       set Queues("")  ""
+       set Depth 0
+       set Seq(0) 0
+       set Pstp 1
+       set Seenpno 1
+       set Banner "Select"
+
+#      catch { unset Spbox(0) }
+       catch {
+               foreach el [array names pbox] {
+                       catch { destroy .c$pbox($el) }
+                       catch { unset pbox($el) }
+               }
+               foreach el [array names Spbox] {
+                       catch { destroy .c$Spbox($el) }
+                       catch { unset Spbox($el) }
+               }
+       }
+       if ![bld_s_options] {
+               return
+       }
+
+       add_log "<starting simulation>"
+       add_log "$SPIN $s_options pan_in"
+       update
+       set s_options [format "%s pan_in" $s_options]
+
+       mkpan_in
+
+       set sbox [mkbox "Simulation Output" "SimOut" "sim.out" 71 11 100 100]
+
+       pack append .c$sbox [button .c$sbox.stepf -text "Single Step" \
+               -command "Step_forw" ] {left frame w}
+       pack append .c$sbox [button .c$sbox.run -text "Run" \
+               -command "Runsim" ] {left frame w}
+
+       .c$sbox.b configure -text "Cancel" -command "Stopsim"
+
+       raise .c$sbox
+
+       set YSZ 12
+       set XSZ 84
+       set YNR 60
+       set NPR 10
+       set SMX 250
+       set Easy 1
+       set HAS 0
+       set HAS_CYCLE 0
+       set dontwait 0
+       set notexecutable 0
+       set lastexecutable 0
+
+       if {$m_typ == 2} {
+               if {$tsc} {
+               set pbox(0) \
+               [mkbox "Time Sequence" "Sequence" "seq.out" 80 10 100 325]
+               set dbox $pbox(0)
+       }       }
+       if {$msc} {
+               if {[hasWord "!!"] || [hasWord "\\?\\?"]} {
+                       set Easy 0
+               }
+
+               set maxx [expr [winfo screenwidth .]  - 400]    ;# button widths
+               set maxh [expr [winfo screenheight .] - (5+120)]        ;# borders+buttons
+               set dbox2 \
+               [mkcanvas "Sequence Chart" "msc" $maxx 5 1]
+               .f$dbox2.c configure -height $maxh \
+                       -scrollregion "[expr -$XSZ/2] 0 \
+                               [expr $NPR*$XSZ] [expr 100+$SMX*$YSZ]"
+
+               raise .f$dbox2
+       }
+
+       raise .c$sbox
+
+       set stop 0
+       set good_trail 0
+       if {$s_typ == 1} {
+               if $whichsim {
+                       set filen "pan_in${trail_num}.trail"
+                       if [file exists $filen] {
+                               set good_trail 1
+                       }
+               } else {
+                       if {[file exists pan_in.trail] || [file exists pan_in.tra]} {
+                               set good_trail 1
+                       }
+               } 
+               if $good_trail {
+                       catch { .c$sbox.z.t insert end "preparing trail, please wait..." }
+                       update
+                       rmfile trail.out
+                       catch {eval exec $SPIN $s_options >&trail.out} errmsg
+               } else {
+                       set errmsg "error: no trail file for guided simulation"
+                       return
+               }
+               if {[string length $errmsg]>0} {
+                       add_log "$errmsg"
+                       catch {
+                       tk_messageBox -icon info -message $errmsg
+                       }
+                       catch {
+                               set fd [open trail.out r]
+                               while {[gets $fd line] > -1} {
+                                       add_log "$line"
+                               }
+                               close $fd
+                       }
+                       Stopsim
+                       catch { destroy .c$sbox }
+                       catch { destroy .c$dbox }
+                       set simruns 0
+                       update
+                       return
+               }
+               set fd [open trail.out r]
+               catch { .c$sbox.z.t insert end "done\n" }
+       } else {
+               update
+               set fd [open "|$SPIN $s_options" r+]
+               catch "flush $fd"
+               update
+       }
+
+       if {$s_typ == 2} {
+               Runsim
+       }
+
+       if {$ebc} { startbar "Xspin Bar Chart" }
+
+       set pstp -1
+       set bailout 0
+       set realstring ""
+
+       update
+       raise .c$sbox
+       lower .
+
+       while {$stop == 0 && [eof $fd] == 0} {
+       if {$bailout == 0 && [gets $fd line] > -1} {
+               set pln 0
+               set syntax 0
+               set isvar 0
+               set pname ""
+               set i 0
+               set VERBOSE 0
+               set Fnm "pan_in"
+
+               raise .c$sbox
+
+               if {$Unix == 0} {
+                       if {[string first "processes created" $line] > 0} {
+                               set bailout 1
+               }       }
+               if {[string first "type return to proceed" $line] > 0} {
+                       puts $fd ""
+                       flush $fd
+                       update
+                       continue
+               }
+
+               set i [string first "<merge" $line]
+               if {$i > 0} {
+                       set line [string range $line 0 $i]
+               }
+
+               set lastpstp $pstp
+               set pmtch [scan $line \
+                       "%d: proc %d (%s line %d \"%s\" " \
+                       pstp pno pname pln Fnm]
+               incr pmtch -1
+               set i [string first "\[" $line]
+               if {$i > 0} {
+                       set i [expr $i + 1]
+                       set j [string length $line]
+                       set j [expr $j - 2]
+                       set stmnt [string range $line $i $j]
+               } else {
+                       set stmnt "-"
+               }
+               if {$pmtch != 4} {
+                       set pmtch [scan $line \
+                               "       proc %d (%s line %d \"%s\" " \
+                               pno pname pln Fnm]
+               }
+               if {$pmtch != 4} {
+                       if {[string first "spin: line" $line] == 0 } {
+                               scan $line "spin: line %d \"%s\" " pln Fnm
+                               if {[string first "pan_in" $Fnm] >= 0} {
+                               .inp.t tag add Rev $pln.0 $pln.end
+                               .inp.t tag configure Rev \
+                                       -background $FG -foreground $BG
+                               .inp.t yview -pickplace $pln.0
+                               }
+                               if {[string first "assertion viol" $line] < 0} {
+                                       set syntax 1
+                               }
+                       }
+                       if {[string first "Error: "   $line] >= 0 \
+                       ||  [string first "warning: " $line] >= 0 } {
+                               set syntax 1
+                       }
+               }
+               if {$pmtch != 4 && $syntax == 0} {
+                       set pmtch [scan $line \
+                               "%d: proc - (%s line %d \"%s\" " \
+                               pstp pname pln Fnm]
+                       if { $pmtch == 4 } {
+                               set pno -1
+                       }
+               }
+               #       set Fnm [string trim $Fnm "\""]
+               set pname [string trim $pname "()"]
+
+               if {[string first "TRACK" $pname] >= 0} {
+                       set nwcol([expr $pno+1]) 1
+               } elseif {[string length $pname] > 0} {
+                       if {[info exists nwcol([expr $pno+1])] \
+                       &&  $nwcol([expr $pno+1])} {
+                               unset Plabel($pno)
+##
+                               set TMP1 [expr ($pno + 1)*$XSZ]
+                               set TMP2 [expr $Pstp*$YSZ]
+                               .f$dbox2.c create line \
+                                       [expr $TMP1 - 20] $TMP2 \
+                                       [expr $TMP1 + 20] $TMP2 \
+                                       -width 2 \
+                                       -fill $Red
+                               incr TMP2 4
+                               .f$dbox2.c create line \
+                                       [expr $TMP1 - 20] $TMP2 \
+                                       [expr $TMP1 + 20] $TMP2 \
+                                       -width 2 \
+                                       -fill $Red
+##
+                       }
+                       set nwcol([expr $pno+1]) 0
+               }
+               if {$pmtch == 4 && $syntax == 0} {
+                       if {$ebc} {
+                               if {[string first "values:" $line] < 0} {
+                                       stepbar $pno $pname
+                       }       }
+                       if {$m_typ == 1 && $tsc} {
+                               if { [info exists pbox($pno)] == 0 } {
+                                       set pbox($pno) [mkbox \
+                                               "Proc $pno ($pname)" \
+                                               "Proc$pno" "proc.$pno.out" \
+                                               60 10 \
+                                               [expr 100+$pno*25] \
+                                               [expr 325+$pno*35] ]
+                               }
+                               set dbox $pbox($pno)
+                       } elseif {$m_typ == 0 && $tsc} {
+                               if { [info exists Spbox($pno)] == 0 } {
+                                       set Spbox($pno) \
+                                               [mkbox "$pname (proc $pno)" \
+                                               "$pname" "" \
+                                               60 10 \
+                                               [expr 100+$pno*25] \
+                                               [expr 325+$pno*35] ]
+                                       readinfile .c$Spbox($pno).z.t "pan_in"
+                               }
+                               set Sdbox $Spbox($pno)
+                       }
+               } elseif { [string first "..." $line] > 0 && \
+                          [regexp "^\\\t*MSC: (.*)" $line] == 0 } {
+                       set $line ""
+                       set syntax 1
+                       set pln 0
+               } elseif {$s_typ == 2 \
+                     && [string first "Select " $line] == 0 } {
+                       set Banner $line
+                       set pln 0
+                       set notexecutable 0
+                       set lastexecutable 0
+                       set has_timeout 0
+               } elseif {$s_typ == 2 \
+                     && [string first "choice" $line] >= 0 } {
+                       scan $line "    choice %d" howmany
+                       set NN [string first ":" $line]; incr NN 2
+                       set Choice($howmany) [string range $line $NN end]
+                       if {[string first "timeout" $Choice($howmany)] > 0} {
+                               set has_timeout 1
+                       }
+                       if {[string first "unexecutable," $line] >= 0} {
+                               incr notexecutable
+                       } else {
+                               set lastexecutable $howmany
+                       }
+                       set pln 0
+               } elseif {$s_typ == 2 \
+                     && [string first "Make Selection" $line] >= 0 } {
+                       scan $line "Make Selection %d" howmany
+                       if {$notexecutable == $howmany-1 && $has_timeout == 0} {
+                               set howmany $lastexecutable
+                               add_log "selected: $howmany (forced)"
+                               catch {
+                                       foreach el [array names Choice] {
+                                       unset Choice($el)
+                               } }
+                       } else {
+                               pickoption $Banner
+                               add_log "selected: $howmany"
+                       }
+                       puts $fd $howmany
+                       catch "flush $fd"
+                       set dontwait 1
+                       set pln 0
+               } elseif { [regexp "^\\\t*MSC: (.*)" $line mch rstr] != 0 } {
+                       if {$realstring != ""} {
+                       set realstring "$realstring $rstr"
+                       } else {
+                       set realstring $rstr
+                       }
+                       # picked up in next cycle
+               } elseif { [string first "processes" $line] > 0 \
+                     ||   [string first "timeout" $line]  == 0 \
+                     ||   [string first "=s==" $line]  > 0 \
+                     ||   [string first "=r==" $line]  > 0 } {
+
+                       if { $m_typ == 1 && $tsc} {
+                               set dbox $pbox(0)
+                       } elseif { $m_typ == 0 && $tsc} {
+                               if { [info exists Spbox($pno)] == 0 } {
+                                       set Spbox($pno) \
+                                               [mkbox "$pname (proc $pno)" \
+                                               "$pname" "" \
+                                               60 10 \
+                                               [expr 100+$pno*25] \
+                                               [expr 325+$pno*35] ]
+                                       readinfile .c$Spbox($pno).z.t "pan_in"
+                               }
+                               set Sdbox $Spbox($pno)
+                       }
+                       set pln 0;      # prevent tag update
+               } elseif {$syntax == 0 && [string first " = " $line] > 0 } {
+                               set isvar [string first "=" $line]
+                               set isvar [expr $isvar + 1]
+                               set varvl [string range $line $isvar end]
+                               set isvar [expr $isvar - 2]
+                               set varnm [string range $line 0 $isvar]
+                               set varnm [string trim $varnm " "]
+                               set Varnm($varnm) $varvl
+                               set isvar 1
+               } elseif { [scan $line " %s %d " varnm qnr] == 2} {
+                       if {$syntax == 0 &&  [string compare $varnm "queue"] == 0} {
+                               set isvar [string last ":" $line]
+                               set isvar [expr $isvar + 1]
+                               set varvl [string range $line $isvar end]
+                               set XX [string first "(" $line]
+                               set YY [string last  ")" $line]
+                               set ZZ [string range $line $XX $YY]
+                               set Queues($qnr) $varvl
+                               if {[info exists Alias($qnr)]} {
+                               if {[string first $ZZ $Alias($qnr)] < 0} {
+                                       set Alias($qnr) "$Alias($qnr), $ZZ"
+                               }
+                               } else {
+                                       set Alias($qnr) $ZZ
+                               }
+                               set isvar 1
+                       }
+               } elseif {[string length $line] == 0} {
+                       if {$dontwait == 0} { set stepper 0 }
+                       set pln 0
+                       set Depth [expr $Depth + 1]
+                       set Seq($Depth) [tell $fd]
+                       set dontwait 0
+               }
+
+
+       if {$syntax == 0} {
+               if {[string first "terminates" $line] > 0} {
+                       set pln -1
+                       set stmnt "<stop>"
+               }
+##NEW
+               if {$pln > 0 && [string first "pan_in" $Fnm] >= 0} {
+                       .inp.t tag remove hilite 0.0 end
+                       src_line $pln
+               }
+##END
+               if {$m_typ == 0} {
+                       if {$pln > 0 && [string first "pan_in" $Fnm] >= 0} {
+                               catch {
+                               .c$Sdbox.z.t yview -pickplace $pln.0
+                               .c$Sdbox.z.t tag remove Rev 1.0 end
+                               .c$Sdbox.z.t tag add Rev $pln.0 $pln.end
+                               .c$Sdbox.z.t tag configure Rev \
+                                       -background $FG -foreground $BG
+                       }       }
+               } elseif {$m_typ == 1} {
+                       if { [info exists pbox($pno)] == 0 } {
+                               set pbox($pno) [mkbox \
+                                       "Proc $pno ($pname)" \
+                                       "Proc$pno" "proc.$pno.out" \
+                                       60 10 \
+                                       [expr 100+$pno*25] \
+                                       [expr 325+$pno*35] ]
+                       }
+                       set dbox $pbox($pno)
+                       catch {
+                               .c$dbox.z.t yview -pickplace end
+                               .c$dbox.z.t insert end "$line\n"
+                       }
+               } elseif {$m_typ == 2 && $pln != 0 \
+               &&  [string first "unexecutable, " $line] < 0} {
+                       catch { .c$dbox.z.t yview -pickplace end }
+                       catch { .c$dbox.z.t insert end "$pno:$pln" }
+                       for {set i $pno} {$i > 0} {incr i -1} {
+                               catch { .c$dbox.z.t insert end "\t|" }
+                       }
+                       catch { .c$dbox.z.t insert end "\t|>$stmnt\n" }
+               }
+               if {$msc && $pln != 0} {
+                       set Mcont "--"
+                       set HAS 0
+                       if { [scan $stmnt "values: %d!%d" inq inp1] == 2 \
+                       ||   [scan $stmnt "values: %d!%s" inq inp2] == 2 } {
+                               set HAS   [string first "!" $stmnt]
+                               incr HAS
+                               set Mcont [string range $stmnt $HAS end]
+                               set HAS 1
+                       } elseif { [scan $stmnt "values: %d?%d" inq inp1] == 2 \
+                       || [scan $stmnt "values: %d?%s" inq inp2] == 2 } {
+                               set HAS   [string first "?" $stmnt]
+                               incr HAS
+                               set Mcont [string range $stmnt $HAS end]
+                               set HAS 2
+                       } elseif { [string first "-" $stmnt] == 0} {
+                               set HAS 3
+                               if {$HAS_CYCLE} {
+                                       set stmnt [format "Cycle>>"]
+                               } else {
+                                       set stmnt [format "<waiting>"]
+                               }
+                       } elseif { [string first "<stop>" $stmnt] == 0} {
+                               set HAS 3
+                               set stmnt [format "<stopped>"]
+                       }
+                       if {$pno+1 > $Seenpno} { set Seenpno [expr $pno+1] }
+                       set XLOC [expr (1+$pno)*$XSZ]
+                       set YLOC [expr $Pstp*$YSZ]
+                       if {[string first "printf('MSC: " $stmnt] == 0} {
+                               set VERBOSE 1
+                               set stmnt $realstring
+                               if {[string first "BREAK" $realstring] >= 0} {
+                                       BreakPoint
+                               }
+                               set realstring ""
+                       } else {
+                               set VERBOSE 0
+                       }
+                       catch {
+                       if {$VERBOSE \
+                       ||  $HAS != 0 \
+                       ||  [info exists R($pstp,$pno)]} {
+
+                               if { $SparseMsc == 1 \
+                               ||   [info exists Plabel($pno)] == 0 \
+                               ||   ([info exists R($pstp,$pno)] == 0 \
+                               &&   ($HAS != 1 \
+                               ||   [info exists HasBox($YLOC,[expr 1+$pno])])) } {
+                                       incr Pstp
+                                       for     {set i 1} \
+                                               {$Pstp > 1 && $i <= $Seenpno} \
+                                               {incr i} {
+                                               if {[info exists HasBox($YLOC,$i)]} {
+                                                       continue
+                                               }
+                                               set TMP1 [expr $i*$XSZ]
+                                               set lncol $Blue
+                                               set lnwdt 1
+                                               catch {
+                                                       if {$nwcol($i)} {
+                                                               set lncol "gray"
+                                                               set lnwdt 15
+                                               }       }
+                                               .f$dbox2.c create line \
+                                               $TMP1 $YLOC $TMP1 \
+                                               [expr $YLOC+$YSZ] \
+                                               -width $lnwdt \
+                                               -fill $lncol
+                                       }
+                                       if {[info exists HasBox($YLOC,[expr 1+$pno])]} {
+                                               set YLOC [expr $Pstp*$YSZ]
+                               }       }
+                               if {$HAS == 1 || $HAS == 2} {
+                                       set stmnt [string range $stmnt 8 end]
+                               }
+                               if { [info exists Plabel($pno)] == 0} {
+                                       set Plabel($pno) 0
+                                       if {$SparseMsc == 0} {
+                                               set HasBox($YLOC,[expr 1+$pno]) 1
+                                       }
+                                       .f$dbox2.c create rectangle \
+                                               [expr $XLOC-20] $YLOC \
+                                               [expr $XLOC+20] \
+                                               [expr $YLOC+$YSZ] \
+                                               -outline $Red -fill $Yellow
+
+                                               if {$pname != "TRACK"} {
+                                                       .f$dbox2.c create text $XLOC \
+                                                               [expr $YLOC+$YSZ/2] \
+                                                               -font $SmallFont \
+                                                               -text "$pname:$pno"
+                                               } else {
+                                                       .f$dbox2.c create text $XLOC \
+                                                               [expr $YLOC+$YSZ/2] \
+                                                               -font $SmallFont \
+                                                               -text "<show>"
+                                               }
+
+                                       set YLOC [expr $Pstp*$YSZ]
+                                       incr Pstp
+                                       for     {set i 1} \
+                                               {$Pstp > 1 && $i <= $Seenpno} \
+                                               {incr i} {
+                                               set TMP1 [expr $i*$XSZ]
+                                               set lncol $Blue
+                                               set lnwdt 1
+                                               catch {
+                                                       if {$nwcol($i)} {
+                                                               set lncol "gray"
+                                                               set lnwdt 15
+                                               }       }
+                                               .f$dbox2.c create line \
+                                               $TMP1 $YLOC $TMP1 \
+                                               [expr $YLOC+$YSZ] \
+                                               -width $lnwdt \
+                                               -fill $lncol
+                                       }
+                               }
+                               if {(1+$pno) > $NPR} {
+                                       set NPR [expr $pno+2]
+                                       .f$dbox2.c configure \
+                                        -scrollregion \
+                                        "[expr -$XSZ/2] 0 \
+                                         [expr $NPR*$XSZ] [expr $SMX*$YSZ]"
+                               }
+                               if {$Pstp > $SMX-2} {
+                                       set SMX [expr 2*$SMX]
+                                       .f$dbox2.c configure \
+                                        -scrollregion \
+                                        "[expr -$XSZ/2] 0 \
+                                         [expr $NPR*$XSZ] [expr $SMX*$YSZ]"
+                               }
+
+                               if { [info exists R($pstp,$pno)] == 0 } {
+                                       if {$VERBOSE == 1} {
+                                               if {[string first "~W " $stmnt] == 0} {
+                                                       set BoxFil $White
+                                                       set stmnt [string range $stmnt 3 end] 
+                                               } else { if {[string first "~G " $stmnt] == 0} {
+                                                       set BoxFil $Green
+                                                       set stmnt [string range $stmnt 3 end]
+                                               } else { if {[string first "~R " $stmnt] == 0} {
+                                                       set BoxFil $Red
+                                                       set stmnt [string range $stmnt 3 end]
+                                               } else { if {[string first "~B " $stmnt] == 0} {
+                                                       set BoxFil $Blue
+                                                       set stmnt [string range $stmnt 3 end]
+                                               } else { set BoxFil $Yellow } } } }
+                                               set BoxLab $stmnt
+                                               if {[string first "line " $stmnt] == 0} {
+                                                       scan $stmnt "line %d" pln
+                                                       set Fnm "pan_in"        ;# not necessarily right...
+                                               }
+                                       } else {
+                                               set BoxLab $pstp
+                                               set BoxFil $White
+                                       }
+                                       if {$SparseMsc == 0} {
+                                               set HasBox($YLOC,[expr 1+$pno]) 1
+                                       }
+                                       set R($pstp,$pno) \
+                                               [.f$dbox2.c create rectangle \
+                                                [expr $XLOC-20] $YLOC \
+                                                [expr $XLOC+20] \
+                                                [expr $YLOC+$YSZ] \
+                                                -outline $Blue -fill $BoxFil]
+                                       set T($pstp,$pno) \
+                                               [.f$dbox2.c create text \
+                                                $XLOC \
+                                                [expr $YLOC+$YSZ/2] \
+                                               -font $SmallFont \
+                                               -text $BoxLab]
+                                       #if {$Pstp > $YNR-2} {
+                                       #       .f$dbox2.c yview \
+                                       #        [expr ($Pstp-$YNR)]
+                                       #}
+                               }
+                               if { $HAS == 3 } {
+                                       .f$dbox2.c itemconfigure \
+                                        $R($pstp,$pno) \
+                                        -outline $Red -fill $Yellow
+                               }
+
+                               if {$SYMBOLIC} {
+                                       .f$dbox2.c itemconfigure $T($pstp,$pno) \
+                                               -font $SmallFont -text "$stmnt"
+                               } else {
+                                       if {$VERBOSE == 0 } {
+                                               .f$dbox2.c bind $T($pstp,$pno) <Any-Enter> "
+                                               .f$dbox2.c itemconfigure $T($pstp,$pno) \
+                                                       -font $BigFont -text {$stmnt}
+                                               .inp.t tag remove hilite 0.0 end
+                                               if {[string first "pan_in" $Fnm] >= 0} {
+                                                       src_line $pln
+                                               }
+                                               "
+                                               .f$dbox2.c bind $T($pstp,$pno) <Any-Leave> "
+                                               .f$dbox2.c itemconfigure $T($pstp,$pno) \
+                                                       -font $SmallFont -text {$pstp}
+                                               "
+                                       } else {
+                                               .f$dbox2.c bind $T($pstp,$pno) <Any-Enter> "
+                                               .inp.t tag remove hilite 0.0 end
+                                               if {[string first "pan_in" $Fnm] >= 0} {
+                                                       src_line $pln
+                                               }
+                                               "
+                                       }
+                               }
+                       }
+
+                       set YLOC [expr $YLOC+$YSZ/2]
+                       if {$HAS == 1} {
+                               if { [info exists Q_add($inq)] == 0 } {
+                                       set Q_add($inq) 0
+                                       set Q_del($inq) 0
+                               }
+                               set Slot $Q_add($inq)
+                               incr Q_add($inq) 1
+
+                               set Mesg_y($inq,$Slot) $YLOC
+                               set Mesg_x($inq,$Slot) $XLOC
+                               set Q_val($inq,$Slot) $Mcont
+                       
+                               set Rem($inq,$Slot) \
+                                       [.f$dbox2.c create text \
+                                       [expr $XLOC-40] $YLOC \
+                                       -font $SmallFont -text $stmnt]
+                       } elseif { $HAS == 2 } {
+                               if {$Easy} {
+                                       set Slot $Q_del($inq)
+                                       incr Q_del($inq) 1
+                               } else {
+                                       for {set Slot $Q_del($inq)} \
+                                               {$Slot < $Q_add($inq)} \
+                                               {incr Slot} {
+                                       if {$Q_val($inq,$Slot) == "_X_"} {
+                                                       incr Q_del($inq) 1
+                                               } else {
+                                                       break
+                                       }       }
+
+                                       for {set Slot $Q_del($inq)} \
+                                               {$Slot < $Q_add($inq)} \
+                                               {incr Slot} {
+                                       if {$Mcont == $Q_val($inq,$Slot)} {
+                                               set Q_val($inq,$Slot) "_X_"
+                                               break
+                                       }       }
+                               }
+                               if {$Slot >= $Q_add($inq)} {
+                                       add_log "<<error: cannot match $stmnt>>"
+                               } else {
+                                       set TMP1 $Mesg_x($inq,$Slot)
+                                       set TMP2 $Mesg_y($inq,$Slot)
+                                       if {$XLOC < $TMP1} {
+                                               set Delta -20
+                                       } else {
+                                               set Delta 20
+                                       }
+                                       .f$dbox2.c create line \
+                                               [expr $TMP1+$Delta] $TMP2 \
+                                               [expr $XLOC-$Delta] $YLOC \
+                                               -fill $Red -width 2 \
+                                               -arrow last -arrowshape {5 5 5}
+
+                                       if {$SparseMsc == 0} {
+                                               set TMP3 5
+                                       } else {
+                                               set TMP3 0
+                                       }
+
+                                       .f$dbox2.c coords $Rem($inq,$Slot) \
+                                               [expr ($TMP1 + $XLOC)/2] \
+                                               [expr ($TMP2 + $YLOC)/2 - $TMP3]
+                                       .f$dbox2.c raise $Rem($inq,$Slot)
+                               }
+                       } }
+               }
+               if {$pln == 0 && ($gvars || $lvars || $qv)} {
+                       if {$Vvbox == 0} {
+                               if {$vv} { set Vvbox [mkbox "Data Values" \
+                                       "Vars" "var.out" 71 19 100 350] }
+                       } else {
+                               catch { .c$Vvbox.z.t delete 0.0 end }
+                       }
+                       if {$vv} {
+                               if {$gvars || $lvars} {
+                                       raise .c$Vvbox
+                                       foreach el [lsort [array names Varnm]] {
+                                       if {[string length $Varnm($el)] > 0} {
+                                       catch { .c$Vvbox.z.t insert \
+                                               end "$el = $Varnm($el)\n" }
+                                       }       }
+                               }
+                               if {$qv} {
+                                       foreach el [lsort [array names Queues]] {
+                                       catch {
+                                       .c$Vvbox.z.t insert end "queue $el ($Alias($el))\n"
+                                       .c$Vvbox.z.t insert end "       $Queues($el)\n"
+                                       }       }
+                       }       }
+               }
+       } else {
+                       set stepper 0
+       }
+               if {$isvar == 0} {
+                       if {$syntax == 1} {
+                               if {[string first "..." $line] < 0} {
+                                       add_log "$line"
+                               catch { .c$sbox.z.t insert end "$line\n" }
+                               catch { .c$sbox.z.t yview -pickplace end }
+                               }
+                       } else {
+                               if {[string length $line] > 0} {
+                               catch { .c$sbox.z.t insert end "$line\n" }
+                               catch { .c$sbox.z.t yview -pickplace end }
+                               }
+                               if {$m_typ == 2 && \
+                                       [string first "START OF CYCLE" $line] > 0} {
+                                       catch { .c$dbox.z.t yview -pickplace end }
+                                       catch { .c$dbox.z.t insert end "$line\n" }
+                                       catch {
+                                       set XLOC [expr $Seenpno*$XSZ+$XSZ/2]
+                                       set YLOC [expr $Pstp*$YSZ+$YSZ/2]
+
+                                       .f$dbox2.c create text \
+                                               [expr $XLOC+$XSZ] $YLOC \
+                                               -font $SmallFont \
+                                               -text "Cycle/Waiting" \
+                                               -fill $Red
+
+                                       .f$dbox2.c create line \
+                                               $XLOC $YLOC \
+                                               [expr $XLOC+$XSZ/2] $YLOC \
+                                               -fill $Red \
+                                               -arrow first -arrowshape {5 5 5}
+                                       }
+                                       set HAS_CYCLE [expr $YLOC+1]
+                               }
+                               if {$m_typ == 2 && $HAS == 3 && $HAS_CYCLE != 0} {
+                                       catch {
+                                       set YLOC [expr $Pstp*$YSZ+$YSZ/2]
+                                       set XLOC0 [expr $pno*$XSZ+$XSZ]
+                                       set XLOC [expr $Seenpno*$XSZ+$XSZ]
+                                       .f$dbox2.c create line \
+                                               $XLOC0 [expr $YLOC-$YSZ/2] \
+                                               $XLOC0 $YLOC \
+                                               -fill $Red
+                                       .f$dbox2.c create line \
+                                               $XLOC0 $YLOC $XLOC $YLOC \
+                                               -fill $Red
+
+                                       set XLOC [expr $Seenpno*$XSZ+$XSZ]
+
+                                       .f$dbox2.c create line \
+                                               $XLOC $YLOC $XLOC \
+                                               [expr $HAS_CYCLE-1] \
+                                               -fill $Red
+               }       }       }       }
+               # mystery update:
+               if {$tk_major >= 4 || $m_typ != 1} {
+                       update  ;# tk 3.x can crash on this
+               }
+
+               if {$syntax == 0 \
+               &&  $stop == 0 \
+               &&  $stepped == 1 \
+               &&  $stepper == 0 \
+               &&  $dontwait == 0} {
+                       update  ;# here it is harmless also with tk 3.x
+                       tkwait variable stepper
+               }
+       } else {
+               if {$s_typ == 0 || $s_typ == 2} {
+                       add_log "<at end of run>"
+               } else {
+                       add_log "<at end of trail>"
+               }
+               catch { addscales $dbox2 }
+               if {$ebc} { barscales }
+               update
+               tkwait variable stepper
+       }
+       }
+       # end of guided trail
+
+       while {$stepper == 1} {
+               tkwait variable stepper
+       }
+       teardown
+       
+       catch "close $fd"
+       add_log "<done>"
+
+       update
+}
+
+proc teardown {} {
+       global m_typ pbox sbox dbox Spbox Vvbox
+       global simruns stop stepped stepper howmany
+
+       set simruns 0
+       set stop 1
+       set stepped 0
+       set stepper 0
+       catch { set howmany 0 }
+       catch {
+               if { $m_typ == 1 } {
+                       foreach el [array names pbox] {
+                               catch { destroy .c$pbox($el) }
+                               catch { unset pbox($el) }
+                       }
+               } elseif { $m_typ == 0 } {
+                       foreach el [array names Spbox] {
+                               catch { destroy .c$Spbox($el) }
+                               catch { unset Spbox($el) }
+               }       }
+       }
+       if {[winfo exists .c$sbox]} {
+               set x "Simulation Output"
+               set PlaceBox($x) [wm geometry .c$sbox]
+               set k [string first "\+" $PlaceBox($x)]
+               if {$k > 0} {
+                       set PlaceBox($x) [string range $PlaceBox($x) $k end]
+               }
+               destroy .c$sbox
+       }
+       catch { destroy .c$dbox }
+       if {[winfo exists .c$Vvbox]} {
+               set x "Data Values"
+               set PlaceBox($x) [wm geometry .c$Vvbox]
+               set k [string first "\+" $PlaceBox($x)]
+               if {$k > 0} {
+                       set PlaceBox($x) [string range $PlaceBox($x) $k end]
+               }
+               destroy .c$Vvbox
+       }
+}
+
+set PlaceMenu  "+150+150"
+
+proc pickoption {nm} {
+       global howmany Choice PlaceMenu
+
+       catch {destroy .prompt}
+       toplevel .prompt
+       wm title .prompt "Select"
+       wm iconname .prompt "Select"
+       wm geometry .prompt $PlaceMenu
+
+       text .prompt.t -relief raised -bd 2 \
+               -width [string length $nm] -height 1 \
+               -setgrid 1
+       pack append .prompt .prompt.t { top expand fillx }
+       .prompt.t insert end "$nm"
+       for {set i 0} {$i <= $howmany} {incr i} {
+               if {[info exists Choice($i)] \
+               &&  $Choice($i) != 0 \
+               &&  [string first "outside range" $Choice($i)] < 0 \
+               &&  [string first "unexecutable," $Choice($i)] <= 0} {
+                       pack append .prompt \
+                         [button .prompt.b$i -text "$i: $Choice($i)" \
+                         -anchor w \
+                         -command "set howmany $i" ] \
+                         {top expand fillx}
+
+                       set j [string first "line " $Choice($i)]
+                       if {$j > 0} {
+                         set k [string range $Choice($i) $j end]
+                         scan $k "line %d" k
+                         bind .prompt.b$i <Enter> "report $k"
+                         bind .prompt.b$i <Leave> "report 0"
+                         bind .prompt.b$i <ButtonRelease-1> "set howmany $i"
+       }       }       }
+       tkwait variable howmany
+       set PlaceMenu [wm geometry .prompt]
+       set k [string first "\+" $PlaceMenu]
+       if {$k > 0} {
+               set PlaceMenu [string range $PlaceMenu $k end]
+       }
+       catch { foreach el [array names Choice]  { unset Choice($el) } }
+       destroy .prompt
+}
+
+proc report {n} {
+       .inp.t tag remove hilite 0.0 end
+       if {$n > 0} { src_line $n }
+}
+
+# validation options panel
+
+set an_typ -1; set cp_typ 0; set cyc_typ 0
+set as_typ -1;  set ie_typ 1; set ebc 0
+set ct_typ 0;  set et_typ 1
+set st_typ 0;  set se_typ 0; set bf_typ 0
+set oct_typ -1;        # remembers last setting used for compilation
+set nv_typ 1
+set po_typ -1; set cm_typ 0; set vb_typ 0
+set pr_typ 0;  set where 0
+set vr_typ 0;  set xu_typ -1
+set ur_typ 1;  set vbox 0
+set killed 0;  set Job_Done 0; set tcnt 0
+set waitwhat "none"
+set not_warned_yet 1
+
+set LastGenerate       ""
+set LastCompile        ""
+set NextCompile        ""
+
+proc syntax_check {a T} {
+       global SPIN BG FG
+
+       mkpan_in
+       add_log "$SPIN $a pan_in"
+       catch {exec $SPIN $a pan_in >&pan.tmp} err ;# added -v
+       set cnt 0
+       set maxln 50
+       set ef [open pan.tmp r]
+       .inp.t tag remove hilite 0.0 end
+       .inp.t tag remove sel 0.0 end
+       set pln 0
+       set allmsg ""
+       while {[gets $ef line] > -1} {
+               add_log "$line"
+               set allmsg "$allmsg\n$line"
+               if {[string first "spin: line" $line] >= 0} {
+                       scan $line "spin: line %d" pln
+                       src_line $pln
+               }
+               if {[string first "spin: warning, line" $line] >= 0} {
+                       scan $line "spin: warning, line %d" pln
+                       src_line $pln
+               }
+               incr cnt
+       }
+       close $ef
+       if {$cnt == 0} { add_log "no syntax errors" } else {
+               warner $T "$allmsg" 800
+       }
+       update
+}
+
+proc prescan {} {
+       global an_typ cp_typ nv_typ po_typ
+       global xu_typ as_typ ie_typ
+
+       mkpan_in
+
+       if {$an_typ == -1} {
+               set an_typ 0
+               set nv_typ [hasWord "never"]
+               if {[hasWord "accept.*:"]} {
+                       set an_typ 1
+                       set cp_typ 2
+               } elseif {[hasWord "progress.*:"]} {
+                       set an_typ 1
+                       set cp_typ 1
+               }
+       }
+       if {$po_typ == -1} {
+               if {[hasWord "_last"] \
+               ||  [hasWord "provided.*\\("] \
+               ||  [hasWord "enabled\\("]} {
+                       set po_typ 0
+               } else {
+                       set po_typ 1
+               }
+       }
+       if {$xu_typ == -1} {
+               if {[hasWord "xr"] || [hasWord "xs"]} {
+                       set xu_typ 1
+               } else {
+                       set xu_typ 0
+               }
+       }
+       if {$as_typ == -1} {
+               if {$an_typ == 0} {
+                       set as_typ [hasWord "assert"]
+                       set ie_typ 1
+               } else {
+                       set as_typ 0
+                       set ie_typ 0
+               }
+       }
+}
+
+proc basicval2 {} {
+       global e ival expl HelvBig PlaceSim
+       global an_typ cp_typ nv_typ firstime
+       global cyc_typ ct_typ lt_typ
+       global et_typ st_typ se_typ bf_typ stop
+       global vb_typ pr_typ vr_typ ur_typ xu_typ
+
+       set nv_typ 1
+       set an_typ 1
+       set cp_typ 2
+
+       dump_tl "pan.ltl"
+
+       catch { .menu.run.m entryconfigure 8 -state normal }
+       catch { .tl.results.top.rv configure -state normal }
+       set stop 0
+       set firstime 0
+       set lt_typ 1
+
+       catch {destroy .v}
+       toplevel .v
+
+       set k [string first "\+" $PlaceSim]
+       if {$k > 0} {
+               set PlaceSim [string range $PlaceSim $k end]
+       }
+
+       wm title .v "LTL Verification Options"
+       wm iconname .v "VAL"
+       wm geometry .v $PlaceSim
+
+       prescan
+
+       frame .v.correct -relief flat -borderwidth 1m
+       frame .v.cframe  -relief raised -borderwidth 1m
+
+       set z .v.correct
+
+       frame $z.rframe  -relief raised -borderwidth 1m
+
+       label $z.rframe.lb \
+               -font $HelvBig \
+               -text "Options" \
+               -relief sunken -borderwidth 1m
+
+       checkbutton $z.rframe.fc -text "With Weak Fairness" \
+               -variable cyc_typ \
+               -relief flat 
+       checkbutton $z.rframe.xu -text "Check xr/xs Assertions" \
+               -variable xu_typ \
+               -relief flat
+
+       pack append $z.rframe \
+               $z.rframe.lb {top pady 4 frame w fillx} \
+               $z.rframe.fc {top pady 4 frame w} \
+               $z.rframe.xu {top pady 4 frame w filly}
+
+       pack append $z $z.rframe {top frame nw filly}
+
+       label .v.cframe.lb \
+               -font $HelvBig \
+               -text "Verification" \
+               -relief sunken -borderwidth 1m
+
+       radiobutton .v.cframe.ea -text "Exhaustive" \
+               -variable ct_typ -value 0 \
+               -relief flat 
+       radiobutton .v.cframe.sa -text "Supertrace/Bitstate" \
+               -variable ct_typ -value 1 \
+               -relief flat 
+       radiobutton .v.cframe.hc -text "Hash-Compact" \
+               -variable ct_typ -value 2 \
+               -relief flat 
+
+       pack append .v.cframe .v.cframe.lb {top pady 4 frame nw fillx} \
+               .v.cframe.ea {top pady 4 frame nw} \
+               .v.cframe.sa {top pady 4 frame nw} \
+               .v.cframe.hc {top pady 4 frame nw}
+
+       frame .v.pf -relief raised -borderwidth 1m
+       frame .v.pf.mesg -borderwidth 1m
+       
+       label .v.pf.mesg.loss0 \
+               -font $HelvBig \
+               -text "A Full Queue" \
+               -relief sunken -borderwidth 1m
+       radiobutton .v.pf.mesg.loss1 -text "Blocks New Msgs" \
+               -variable l_typ -value 0 \
+               -relief flat
+       radiobutton .v.pf.mesg.loss2 -text "Loses New Msgs" \
+               -variable l_typ -value 1 \
+               -relief flat
+       pack append .v.pf.mesg \
+               .v.pf.mesg.loss0 {top pady 4 frame w expand fillx} \
+               .v.pf.mesg.loss1 {top pady 4 frame w} \
+               .v.pf.mesg.loss2 {top pady 4 frame w}
+       pack append .v.pf \
+               .v.pf.mesg   {left frame w expand fillx}
+
+       pack append .v \
+               .v.cframe  {top frame w fill}\
+               .v.correct {top frame w fill}\
+               .v.pf {top frame w expand fill}
+
+       pack append .v [button .v.adv -text "\[Set Advanced Options]" \
+               -command "advanced_val" ] {top fillx}
+       pack append .v [button .v.run -text "Run" \
+               -command {runval ".tl.results.t"} ] {right frame se}
+       pack append .v [button .v.exit -text "Cancel" \
+               -command "set PlaceSim [wm geometry .v]; \
+               set stop 1; destroy .v"] {right frame se}
+       pack append .v [button .v.help -text "Help" -fg red \
+               -command "roadmap2f" ] {right frame se}
+
+       tkwait visibility .v
+       raise .v
+}
+
+set PlaceBasic "+200+10"
+set PlaceAdv   "+150+10"
+
+proc basicval {} {
+       global e ival expl HelvBig PlaceBasic
+       global an_typ nv_typ firstime as_typ ie_typ
+       global cyc_typ ct_typ lt_typ as_typ ie_typ
+       global et_typ st_typ se_typ bf_typ stop
+       global vb_typ pr_typ vr_typ ur_typ xu_typ
+
+       catch { .menu.run.m entryconfigure 8 -state normal }
+       catch { .tl.results.top.rv configure -state normal }
+       set stop 0
+       set firstime 0
+       set lt_typ 0
+
+       catch {destroy .v}
+       toplevel .v
+
+       wm title .v "Basic Verification Options"
+       wm iconname .v "VAL"
+       wm geometry .v $PlaceBasic
+
+       prescan
+
+       frame .v.correct -relief flat -borderwidth 1m
+       frame .v.cframe  -relief raised -borderwidth 1m
+
+       set z .v.correct
+
+       frame $z.rframe  -relief raised -borderwidth 1m
+
+       label $z.rframe.lb \
+               -font $HelvBig \
+               -text "Correctness Properties" \
+               -relief sunken -borderwidth 1m
+       radiobutton $z.rframe.sp -text "Safety (state properties)" \
+               -variable an_typ -value 0 \
+               -relief flat \
+               -command { set cyc_typ 0; set cp_typ 0
+                       if {$an_typ == 0} {
+                               set as_typ [hasWord "assert"]
+                               set ie_typ 1
+                       }
+                }
+       frame $z.rframe.sf
+       checkbutton $z.rframe.sf.as -text "Assertions" \
+               -variable as_typ \
+               -relief flat \
+               -command {
+                       set an_typ 0
+                       if {![hasWord "assert"] && $as_typ==1} then {
+                               complain6
+                       }
+                }
+       checkbutton $z.rframe.sf.ie -text "Invalid Endstates" \
+               -variable ie_typ \
+               -relief flat \
+               -command { set an_typ 0 }
+
+       frame $z.rframe.sf.fill -width 15
+       pack append $z.rframe.sf \
+               $z.rframe.sf.fill {left frame w} \
+               $z.rframe.sf.as {top pady 4 frame w} \
+               $z.rframe.sf.ie {top pady 4 frame w}
+
+       radiobutton $z.rframe.cp -text "Liveness (cycles/sequences)" \
+               -variable an_typ -value 1 \
+               -relief flat \
+               -command {
+                       set as_typ 0; set ie_typ 0
+                       if {[hasWord "accept"]} then { set cp_typ 2 }\
+                       elseif {[hasWord "progress"]} then { set cp_typ 1 } \
+                       else complain5
+               }
+
+       frame $z.rframe.sub
+       radiobutton $z.rframe.sub.np -text "Non-Progress Cycles" \
+               -variable cp_typ -value 1 \
+               -relief flat \
+               -command {
+                       set an_typ 1
+                       if {![hasWord "progress"] && $cp_typ==1} then {
+                               complain4
+                       }
+                }
+       radiobutton $z.rframe.sub.ac -text "Acceptance Cycles" \
+               -variable cp_typ -value 2 \
+               -relief flat \
+               -command {
+                       set an_typ 1
+                       if {![hasWord "accept"] && $cp_typ==2} then {
+                               complain1
+                       }
+               }
+       checkbutton $z.rframe.sub.fc -text "With Weak Fairness" \
+               -variable cyc_typ \
+               -relief flat  \
+               -command { if {$an_typ==0} then "set cyc_typ 0; complain3" }
+
+       checkbutton $z.rframe.nv -text "Apply Never Claim (If Present)" \
+               -variable nv_typ \
+               -relief flat \
+               -command { if {![hasWord "never"] && $nv_typ==1} then "complain2" }
+       checkbutton $z.rframe.ur -text "Report Unreachable Code" \
+               -variable ur_typ \
+               -relief flat
+       checkbutton $z.rframe.xu -text "Check xr/xs Assertions" \
+               -variable xu_typ \
+               -relief flat
+
+       frame $z.rframe.sub.fill -width 15
+       pack append $z.rframe.sub \
+               $z.rframe.sub.fill {left frame w} \
+               $z.rframe.sub.np {top pady 4 frame w} \
+               $z.rframe.sub.ac {top pady 4 frame w} \
+               $z.rframe.sub.fc {top pady 4 frame w}
+
+       pack append $z.rframe \
+               $z.rframe.lb {top pady 4 frame w fillx} \
+               $z.rframe.sp {top pady 4 frame w} \
+                       $z.rframe.sf {top pady 4 frame w} \
+               $z.rframe.cp {top pady 4 frame w} \
+                       $z.rframe.sub {top pady 4 frame w} \
+               $z.rframe.nv {top pady 4 frame w} \
+               $z.rframe.ur {top pady 4 frame w} \
+               $z.rframe.xu {top pady 4 frame w filly}
+
+       pack append $z $z.rframe {top frame nw filly}
+
+       label .v.cframe.lb \
+               -font $HelvBig \
+               -text "Search Mode" \
+               -relief sunken -borderwidth 1m
+
+       radiobutton .v.cframe.ea -text "Exhaustive" \
+               -variable ct_typ -value 0 \
+               -relief flat 
+       radiobutton .v.cframe.sa -text "Supertrace/Bitstate" \
+               -variable ct_typ -value 1 \
+               -relief flat 
+       radiobutton .v.cframe.hc -text "Hash-Compact" \
+               -variable ct_typ -value 2 \
+               -relief flat 
+
+       pack append .v.cframe .v.cframe.lb {top pady 4 frame nw fillx} \
+               .v.cframe.ea {top pady 4 frame nw} \
+               .v.cframe.sa {top pady 4 frame nw} \
+               .v.cframe.hc {top pady 4 frame nw}
+
+       frame .v.pf -relief raised -borderwidth 1m
+       frame .v.pf.mesg -borderwidth 1m
+       
+       label .v.pf.mesg.loss0 \
+               -font $HelvBig \
+               -text "A Full Queue" \
+               -relief sunken -borderwidth 1m
+       radiobutton .v.pf.mesg.loss1 -text "Blocks New Msgs" \
+               -variable l_typ -value 0 \
+               -relief flat
+       radiobutton .v.pf.mesg.loss2 -text "Loses New Msgs" \
+               -variable l_typ -value 1 \
+               -relief flat
+       pack append .v.pf.mesg \
+               .v.pf.mesg.loss0 {top pady 4 frame w fillx} \
+               .v.pf.mesg.loss1 {top pady 4 frame w} \
+               .v.pf.mesg.loss2 {top pady 4 frame w}
+       pack append .v.pf \
+               .v.pf.mesg {left frame nw expand fill}
+
+       pack append .v \
+               .v.correct {left} \
+               .v.cframe  {top frame n expand fill}\
+               .v.pf {top frame n expand fill}
+
+       pack append .v [button .v.nvr -text "\[Add Never Claim from File]" \
+               -command "call_nvr" ] {top fillx}
+       pack append .v [button .v.ltl -text "\[Verify an LTL Property]" \
+               -command "destroy .v; call_tl" ] {top fillx}
+       pack append .v [button .v.adv -text "\[Set Advanced Options]" \
+               -command "advanced_val" ] {top fillx}
+       pack append .v [button .v.run -text "Run" \
+               -command {set PlaceBasic [wm geometry .v]; runval "0"} ] {right frame se}
+       pack append .v [button .v.exit -text "Cancel" \
+               -command {set PlaceBasic [wm geometry .v]; \
+               set stop 1; destroy .v}] {right frame se}
+       pack append .v [button .v.help -text "Help" -fg red \
+               -command "roadmap2e" ] {right frame se}
+
+       tkwait visibility .v
+       raise .v
+}
+
+set HasNever ""
+
+proc call_nvr {} {
+       global HasNever
+       global xversion Fname nv_typ
+
+       switch [info commands tk_getOpenFile] "" {
+               set fileselect "FileSelect open"
+       } default {
+               set fileselect "tk_getOpenFile \
+                       -filetypes { \
+                               { { Aut files }  .aut } \
+                               { { Nvr files }  .nvr } \
+                               { { All Files }   *   } \
+                               }"
+       }
+
+       set HasNever [eval $fileselect]
+
+       if {$HasNever == ""} {
+               wm title . "SPIN CONTROL $xversion -- File: $Fname"
+               set nv_typ 0
+       } else {
+               set nv_typ 1
+               set z [string last "\/" $HasNever]
+               if {$z > 0} {
+                       incr z
+                       set HsN [string range $HasNever $z end]
+               } else {
+                       set HsN $HasNever
+               }
+               wm title . "SPIN CONTROL $xversion -- File: $Fname  Claim: $HsN"
+       }
+}
+
+proc advanced_val {} {
+       global e ival expl HelvBig
+       global nv_typ firstime PlaceAdv
+       global cyc_typ ct_typ
+       global et_typ st_typ se_typ bf_typ stop po_typ cm_typ
+       global vb_typ pr_typ vr_typ ur_typ xu_typ
+
+       catch { .menu.run.m entryconfigure 8 -state normal }
+       catch { .tl.results.top.rv configure -state normal }
+       set stop 0
+       set firstime 0
+
+       catch {destroy .av}
+       toplevel .av
+
+       wm title .av "Advanced Verification Options"
+       wm iconname .av "VAL"
+       wm geometry .av $PlaceAdv
+
+       frame .av.pans
+       frame .av.pans.correct -relief flat
+       frame .av.memopts -relief flat;         # memory options panel
+       frame .av.oframe  -relief raised -borderwidth 1m ;# error trail options
+       frame .av.recomp  -relief raised -borderwidth 1m ;# recompilation
+
+       prescan
+
+       for {set x 0} {$x<=2} {incr x} {
+               frame .av.memopts.choice$x -relief flat
+               entry .av.memopts.choice$x.e1 -relief sunken -width 20
+               label .av.memopts.choice$x.e2 -text $e($x) -relief flat
+               .av.memopts.choice$x.e1 insert end $ival($x)
+
+               pack append .av.memopts.choice$x \
+                       .av.memopts.choice$x.e2 {left  frame w fillx} \
+                       [button .av.memopts.choice$x.e3 -text $expl($x) \
+                       -command "d_list $x" ] {right frame e} \
+                       .av.memopts.choice$x.e1 {right frame e fillx}
+
+               pack append .av.memopts \
+                       .av.memopts.choice$x { top frame w pady 5 fillx}
+       }
+       for {set x 7} {$x<=7} {incr x} {
+               frame .av.memopts.choice$x -relief flat
+               entry .av.memopts.choice$x.e1 -relief sunken -width 20
+               label .av.memopts.choice$x.e2 -text $e($x) -relief flat
+               .av.memopts.choice$x.e1 insert end $ival($x)
+
+               pack append .av.memopts.choice$x \
+                       .av.memopts.choice$x.e2 {left  frame w fillx} \
+                       [button .av.memopts.choice$x.e3 -text $expl($x) \
+                       -command "d_list $x" ] {right frame e} \
+                       .av.memopts.choice$x.e1 {right frame e fillx}
+
+               pack append .av.memopts \
+                       .av.memopts.choice$x { top frame w pady 5 fillx}
+       }
+       for {set x 3} {$x<=5} {incr x} {
+               frame .av.memopts.choice$x -relief flat
+               entry .av.memopts.choice$x.e1 -relief sunken -width 20
+               label .av.memopts.choice$x.e2 -text $e($x) -relief flat
+               .av.memopts.choice$x.e1 insert end $ival($x)
+
+               pack append .av.memopts.choice$x \
+                       .av.memopts.choice$x.e2 {left  frame w fillx} \
+                       [button .av.memopts.choice$x.e3 -text $expl($x) \
+                       -command "d_list $x" ] {right frame e} \
+                       .av.memopts.choice$x.e1 {right frame e fillx}
+
+               pack append .av.memopts \
+                       .av.memopts.choice$x { top frame w pady 5 fillx}
+       }
+       set z .av.pans.correct
+       frame $z.rframe  -relief raised -borderwidth 1m
+       label $z.rframe.lb3 \
+               -font $HelvBig \
+               -text "   Error Trapping   " \
+               -relief sunken -borderwidth 1m
+       radiobutton $z.rframe.c0 -text "Don't Stop at Errors" \
+               -variable et_typ -value 0 \
+               -relief flat 
+       checkbutton $z.rframe.c0a -text "Save All Error-trails" \
+               -variable st_typ \
+               -relief flat 
+       checkbutton $z.rframe.c0b -text "Find Shortest Trail (iterative)" \
+               -variable se_typ \
+               -relief flat
+       checkbutton $z.rframe.c0c -text "Use Breadth-First Search" \
+               -variable bf_typ \
+               -relief flat
+       frame  $z.rframe.basic1 
+
+       frame $z.rframe.cc
+       radiobutton $z.rframe.cc.c1 -text "Stop at Error Nr:" \
+               -variable et_typ -value 1 \
+               -relief flat 
+       entry $z.rframe.cc.c2 -relief sunken -width 8
+       $z.rframe.cc.c2 insert end "$ival(6)"
+       pack append $z.rframe.cc \
+               $z.rframe.cc.c1 {left}\
+               $z.rframe.cc.c2 {right expand fillx}
+
+       pack append $z.rframe \
+               $z.rframe.lb3 { top expand fillx frame nw} \
+               $z.rframe.cc  {top pady 4 frame w} \
+               $z.rframe.c0  {top pady 4 frame w} \
+               $z.rframe.c0a {top pady 4 frame w} \
+               $z.rframe.c0b {top pady 4 frame w} \
+               $z.rframe.c0c {top pady 4 frame w} \
+               $z.rframe.basic1 {top frame w}
+       pack append $z $z.rframe {top frame nw expand fill}
+
+       frame .av.pans.pf -relief flat
+       set z .av.pans.pf
+       frame $z.mesg -relief raised -borderwidth 1m;           # queue loss options
+       frame $z.pframe -relief raised -borderwidth 1m
+       label $z.pframe.lb2 \
+               -font $HelvBig \
+               -text "   Type of Run   " \
+               -relief sunken -borderwidth 1m
+       checkbutton $z.pframe.po -text "Use Partial Order Reduction" \
+               -variable po_typ \
+               -relief flat 
+       checkbutton $z.pframe.cm -text "Use Compression" \
+               -variable cm_typ \
+               -relief flat 
+#      checkbutton $z.pframe.vb -text "Verbose (For Debugging Only)" \
+#              -variable vb_typ \
+#              -relief flat
+       checkbutton $z.pframe.pr -text "Add Complexity Profiling" \
+               -variable pr_typ \
+               -relief flat
+       checkbutton $z.pframe.vr -text "Compute Variable Ranges" \
+               -variable vr_typ \
+               -relief flat
+
+       pack append $z.pframe \
+               $z.pframe.lb2 {top fillx pady 4 frame w} \
+               $z.pframe.po {top pady 4 frame w} \
+               $z.pframe.cm {top pady 4 frame w} \
+               $z.pframe.pr  {top pady 4 frame w} \
+               $z.pframe.vr  {top pady 4 frame w}
+
+       pack append .av.pans.pf \
+               .av.pans.pf.pframe  {top frame nw expand fill}
+       pack append .av.pans \
+               .av.pans.correct {left frame nw expand fillx}\
+               .av.pans.pf {left frame nw expand fillx}
+
+       button .av.help -text "Help" -fg red -command "roadmap2d"
+       button  .av.basic1 -text "Set" -fg red -command "stopval 1" 
+       button  .av.basic0 -text "Cancel" -command "stopval 0" 
+
+       pack append .av \
+               .av.memopts {top frame w} \
+               .av.pans {top fillx} \
+               .av.help  {left frame w} \
+               .av.basic1 {right frame e} \
+               .av.basic0 {right frame e}
+
+       raise .av
+}
+
+proc g_list {} {
+       global FG BG
+
+       catch {destroy .r}
+       toplevel .r
+
+       wm title .r "Options"
+       wm iconname .r "Options"
+
+       frame .r.top
+               listbox .r.top.list -width  6 -height 3 -relief raised
+               listbox .r.top.expl -width 40 -height 3  -relief flat
+       pack append .r.top \
+               .r.top.list {left}\
+               .r.top.expl {left}
+       frame .r.bot
+               text .r.bot.text -width 40 -height 1 -relief flat
+               .r.bot.text insert end "(Double-Click option or Cancel)"
+               button .r.bot.quit -text "Cancel" -command "destroy .r"
+       pack append .r.bot \
+               .r.bot.text {top}\
+               .r.bot.quit {frame s}
+
+       frame .r.caps
+               text .r.caps.cap1 -width 6 -height -1 -fg blue
+               text .r.caps.cap2 -width 30 -height -1 -fg blue
+               .r.caps.cap1 insert end "Option:"
+               .r.caps.cap2 insert end "Meaning:"
+       pack append .r.caps \
+               .r.caps.cap1 {left} \
+               .r.caps.cap2 {left}
+
+       pack append .r \
+               .r.caps  {frame w}\
+               .r.top {top expand} \
+               .r.bot {bottom expand}
+
+       foreach i { "-o1" "-o2" "-o3" } {
+               .r.top.list insert end $i
+       }
+       foreach i { \
+               "disable dataflow-optimizations" \
+               "disable dead variables elimination" \
+               "disable statement merging" } {
+               .r.top.expl insert end $i
+       }
+       bind .r.top.list <Double-Button-1> {
+               set extra [selection get]
+               .av.memopts.choice5.e1 insert end " $extra"
+               destroy .r
+       }
+}
+
+proc r_list {} {
+       global FG BG
+
+       catch {destroy .r}
+       toplevel .r
+
+       wm title .r "Options"
+       wm iconname .r "Options"
+
+       frame .r.top
+               listbox .r.top.list -width  6 -height 8 -relief raised
+               listbox .r.top.expl -width 40 -height 8  -relief flat
+       pack append .r.top \
+               .r.top.list {left}\
+               .r.top.expl {left}
+       frame .r.bot
+               text .r.bot.text -width 40 -height 1 -relief flat
+               .r.bot.text insert end "(Double-Click option or Cancel)"
+               button .r.bot.quit -text "Cancel" -command "destroy .r"
+       pack append .r.bot \
+               .r.bot.text {top}\
+               .r.bot.quit {frame s}
+
+       frame .r.caps
+               text .r.caps.cap1 -width 6 -height -1 -fg blue
+               text .r.caps.cap2 -width 30 -height -1 -fg blue
+               .r.caps.cap1 insert end "Option:"
+               .r.caps.cap2 insert end "Meaning:"
+       pack append .r.caps \
+               .r.caps.cap1 {left} \
+               .r.caps.cap2 {left}
+
+       pack append .r \
+               .r.caps  {frame w}\
+               .r.top {top expand} \
+               .r.bot {bottom expand}
+
+       foreach i { "-d" "-q" "-I" "-h?" "-s" "-A" "-E" "-w?" } {
+               .r.top.list insert end $i
+       }
+       foreach i { \
+               "print state tables and stop" \
+               "require all chans to be empty in valid endstates" \
+               "try to find shortest trail" \
+               "choose another seed for hash 1..32 (default 1)" \
+               "use 1-bit hashing (default is 2-bit)" \
+               "ignore assertion violation errors" \
+               "ignore invalid endstate errors" \
+               "set explicit -w parameter" \
+               "" } {
+               .r.top.expl insert end $i
+       }
+       bind .r.top.list <Double-Button-1> {
+               set extra [selection get]
+               .av.memopts.choice4.e1 insert end " $extra"
+               destroy .r
+       }
+}
+
+proc d_list {nr} {
+
+       if {$nr == 0} { roadmap2a; return }
+       if {$nr == 1} { roadmap2b; return }
+       if {$nr == 2} { roadmap2c; return }
+       if {$nr == 4} { r_list; return }
+       if {$nr == 5} { g_list; return }
+       if {$nr == 7} { roadmap2k; return }
+#      if {$nr != 3} { roadmap2; return }
+
+       catch {destroy .b}
+       toplevel .b
+
+       wm title .b "Options"
+       wm iconname .b "Options"
+
+       frame .b.top
+               scrollbar .b.top.scroll -command ".b.top.list yview"
+               listbox   .b.top.list -yscroll ".b.top.scroll set" -relief raised
+       pack append .b.top \
+               .b.top.scroll {right filly}\
+               .b.top.list {left expand}
+
+       frame .b.bot
+               text .b.bot.text -width 21 -height 1 -relief flat
+               .b.bot.text insert end "(Double-Click option)"
+               button .b.bot.quit -text "Cancel" -command "destroy .b"
+               button .b.bot.expl -text "Explanations" -command "roadmap6"
+       pack append .b.bot \
+               .b.bot.text {top frame nw}\
+               .b.bot.expl {left}\
+               .b.bot.quit {left}
+
+
+       pack append .b \
+               .b.top {top frame nw expand} \
+               .b.bot {bottom}
+
+       foreach i { \
+               "-DBCOMP" \
+               "-DCTL" \
+               "-DGLOB_ALPHA" \
+               "-DMA=?" \
+               "-DNFAIR=?" \
+               "-DNIBIS" \
+               "-DNOBOUNDCHECK" \
+               "-DNOREDUCE" \
+               "-DNOCOMP" \
+               "-DNOSTUTTER" \
+               "-DNOVSZ" \
+               "-DPRINTF" \
+               "-DRANDSTORE=?" \
+               "-DR_XPT" \
+               "-DSDUMP" \
+               "-DSVDUMP" \
+               "-DVECTORSZ=?" \
+               "-DW_XPT=?" \
+               "-DXUSAFE" \
+               } {
+               .b.top.list insert end $i
+       }
+       bind .b.top.list <Double-Button-1> {
+               set directive [selection get]
+               .av.memopts.choice3.e1 insert end " $directive"
+               destroy .b
+       }
+}
+
+proc complain1 {} {
+       set m "warning: there are no accept labels"
+       add_log $m
+       catch { tk_messageBox -icon info -message $m }
+}
+
+proc complain2 {} {
+       set m "warning: there is no never claim"
+       add_log $m
+       catch { tk_messageBox -icon info -message $m }
+}
+
+proc complain3 {} {
+       set m "weak fairness is irrelevant to state properties"
+       add_log $m
+       catch { tk_messageBox -icon info -message $m }
+}
+
+proc complain4 {} {
+       set m "warning: there are no progress labels"
+       add_log $m
+       catch { tk_messageBox -icon info -message $m }
+}
+
+proc complain5 {} {
+       global an_typ
+       set m "warning: there are neither accept nor progress labels"
+       add_log $m
+       set an_typ 0
+       catch { tk_messageBox -icon info -message $m }
+}
+
+proc complain6 {} {
+       set m "warning: there are no assert statements in the spec"
+       add_log $m
+       catch { tk_messageBox -icon info -message $m }
+}
+
+proc complain7 {} {
+       set m "warning: Breadth-First Search implies a restriction to Safety properties"
+       add_log $m
+       catch { tk_messageBox -icon info -message $m }
+}
+
+proc complain8 {} {
+       set m "error: cannot combine -DMA and -DBITSTATE"
+       add_log $m
+       catch { tk_messageBox -icon info -message $m }
+}
+
+proc stopval {how} {
+       global stop ival PlaceAdv
+
+       if {$how} {
+       set ival(0) "[.av.memopts.choice0.e1 get]"
+       set ival(1) "[.av.memopts.choice1.e1 get]"
+       set ival(2) "[.av.memopts.choice2.e1 get]"
+       set ival(3) "[.av.memopts.choice3.e1 get]"
+       set ival(4) "[.av.memopts.choice4.e1 get]"
+       set ival(5) "[.av.memopts.choice5.e1 get]"
+       set ival(7) "[.av.memopts.choice7.e1 get]"
+       set ival(6) "[.av.pans.correct.rframe.cc.c2 get]"
+       }
+       set stop 1
+       if {[winfo exists .av]} {
+               set PlaceAdv [wm geometry .av]
+               set k [string first "\+" $PlaceAdv]
+               if {$k > 0} {
+                       set PlaceAdv [string range $PlaceAdv $k end]
+               }
+               destroy .av
+       }
+}
+
+proc log {n} {
+       set m 1
+       set cnt 0
+       while {$m<$n} {
+               set m [expr $m*2]
+               incr cnt
+       }
+       return $cnt
+}
+
+proc bld_v_options {} {
+       global an_typ cp_typ cyc_typ as_typ ie_typ
+       global et_typ st_typ se_typ l_typ bf_typ
+       global ct_typ ival v_options a_options
+       global c_options po_typ cm_typ vb_typ
+       global pr_typ vr_typ ur_typ xu_typ
+       global ol_typ oct_typ nv_typ lt_typ
+
+       set ol_typ $l_typ
+       set oct_typ $ct_typ
+
+       set a_options "-a -X"
+       if {$l_typ==1}  { set a_options [format "%s -m" $a_options] }
+       if {$lt_typ==1} { set a_options [format "%s -N pan.ltl" $a_options] }
+
+       set Mbytes $ival(0)
+       catch { set Mbytes [.av.memopts.choice0.e1 get] }
+
+       # the Mstate scale resolution is in thousands: 2^10
+       set Mstate [expr 10+[log $ival(1)]]
+       catch { set Mstate [expr 10+[log [.av.memopts.choice1.e1 get]]] }
+       set Mdepth $ival(2)
+       catch { set Mdepth [.av.memopts.choice2.e1 get] }
+       catch { set ival(0) "[.av.memopts.choice0.e1 get]" }
+       catch { set ival(1) "[.av.memopts.choice1.e1 get]" }
+       catch { set ival(2) "[.av.memopts.choice2.e1 get]" }
+       catch { set ival(3) "[.av.memopts.choice3.e1 get]" }
+       catch { set ival(4) "[.av.memopts.choice4.e1 get]" }
+       catch { set ival(5) "[.av.memopts.choice5.e1 get]" }
+       catch { set ival(7) "[.av.memopts.choice7.e1 get]" }
+
+       if {$ct_typ == 2} {     ;# hash-compact
+               set c_options [format "-DHC -DMEMLIM=%d" $Mbytes]
+
+               # in exhaustive mode: #hashtable ~~ #states
+
+               set v_options "-X -m$Mdepth -w$Mstate"
+
+               if {$Mstate >= $Mbytes} {
+               catch {
+               tk_messageBox -icon info \
+                       -message "The Estimated Statespace size exceeds \
+the maximum that the Memory limit you set would allow."
+               }
+                       return 0
+               }
+       } elseif {$ct_typ==1}   {
+               set c_options [format "-DBITSTATE -DMEMLIM=%d" $Mbytes]
+
+               # in supertrace mode: #bits ~~ 128x #states
+               # (effectively the #bytes will be ~~ 16x #states)
+
+               set Mstate [expr 7+$Mstate]
+               set v_options "-X -m$Mdepth -w$Mstate"
+
+               if {$Mstate-3 >= $Mbytes} {
+               catch {
+               tk_messageBox -icon info \
+                       -message "The Estimated Statespace size exceeds \
+maximum allowed by the Memory limit that you set would allow."
+               }
+                       return 0
+               }
+       } else {
+               set c_options [format "-DMEMLIM=%d" $Mbytes]
+
+               # in exhaustive mode: #hashtable ~~ #states
+
+               set v_options "-X -m$Mdepth -w$Mstate"
+
+               if {$Mstate >= $Mbytes} {
+               catch {
+               tk_messageBox -icon info \
+                       -message "The Estimated Statespace size exceeds \
+the maximum that the Physical Memory limit allows."
+               }
+                       return 0
+               }
+       }
+       set c_options [format "-D_POSIX_SOURCE %s" $c_options]
+       if {$an_typ==0} { set c_options [format "%s -DSAFETY" $c_options] }
+       if {$an_typ==1 && $cp_typ==1}   { set c_options [format "%s -DNP" $c_options] }
+       if {$po_typ==0} { set c_options [format "%s -DNOREDUCE" $c_options] }
+       if {$cm_typ==1 && $ct_typ!=1}   { set c_options [format "%s -DCOLLAPSE" $c_options] }
+       if {$vb_typ==1} { set c_options [format "%s -DCHECK" $c_options] }
+       if {$nv_typ==0} { set c_options [format "%s -DNOCLAIM" $c_options] }
+       if {$se_typ!=0} { set c_options [format "%s -DREACH" $c_options] }
+       if {$bf_typ!=0} {
+               if {$an_typ != 0} {
+                       complain7
+                       set c_options [format "%s -DBFS -DSAFETY" $c_options]
+               } else {
+                       set c_options [format "%s -DBFS" $c_options]
+       }       }
+       if {$xu_typ==0 && $po_typ!=0}   { set c_options [format "%s -DXUSAFE" $c_options] }
+       if {$pr_typ==1} { set c_options [format "%s -DPEG" $c_options] }
+       if {$vr_typ==1} { set c_options [format "%s -DVAR_RANGES" $c_options] }
+       if {$cyc_typ==1}        {
+               set c_options [format "%s -DNFAIR=3" $c_options]
+       } else {
+               set c_options [format "%s -DNOFAIR" $c_options]
+       }
+       set foo $ival(3)
+       catch { set foo [.av.memopts.choice3.e1 get] }
+
+       if {[string first "-DBITSTATE" $c_options] > 0 && [string first "-DMA" $foo] > 0} {
+               complain8
+       }
+       set c_options [format "%s %s" $c_options $foo ]
+
+       set foo $ival(4)
+       catch { set foo [.av.memopts.choice4.e1 get] }
+       set v_options [format "%s %s" $v_options $foo ] 
+
+       set foo $ival(5)
+       catch { set foo [.av.memopts.choice.5.e1 get] }
+       set a_options [format "%s %s" $a_options $foo ]
+
+       if {$an_typ==0 && $as_typ==0} { set v_options [format "%s -A" $v_options] }
+       if {$an_typ==0 && $ie_typ==0} { set v_options [format "%s -E" $v_options] }
+       if {$an_typ==1 && $cp_typ==1} { set v_options [format "%s -l" $v_options] }
+       if {$an_typ==1 && $cp_typ==2} { set v_options [format "%s -a" $v_options] }
+       if {$cyc_typ==1} { set v_options [format "%s -f" $v_options] }
+       if {$ur_typ==0} { set v_options [format "%s -n" $v_options] }
+       if {$st_typ==1} { set v_options [format "%s -e" $v_options] }
+       if {$se_typ!=0} { set v_options [format "%s -i" $v_options] }
+       if {$et_typ==0} { set v_options [format "%s -c0" $v_options] }
+       if {$et_typ==1} { set v_options [format "%s -c%s" $v_options $ival(6)] }
+       if {$ct_typ==1 && $ival(7) != 2} { set v_options [format "%s -k%s" $v_options $ival(7)] }
+       return 1
+}
+
+set mt 0
+set skipmax 10
+
+proc runval {havedest} {
+       global Unix CC SPIN Fname PlaceSim
+       global v_options a_options notignored
+       global c_options Job_Done mt skipmax
+       global stop s_typ vbox waitwhat not_warned_yet
+       global LastGenerate LastCompile NextCompile
+
+       set stop 0
+       if {[bld_v_options] == 0} {
+               advanced_val
+               return
+       }
+       if {[winfo exists .v]} {
+               set PlaceSim [wm geometry .v]
+               destroy .v
+       }
+       catch {destroy .av}
+       if {[string first "\?" $c_options] > 0} {
+               add_log "error: undefined '?' in optional compiler directives"
+               return
+       }
+       if {[string first "\?" $v_options] > 0} {
+               add_log "error: undefined '?' in extra runtime options"
+               return
+       }
+       add_log "<starting verification>"
+       if {$havedest != "0"} {
+               $havedest insert end "<starting verification>\n"
+       }
+
+       set nochange [no_change]
+       if {$nochange == 0} { set LastGenerate "" }
+
+       if {$LastGenerate == $a_options} {
+               add_log "<no code regeneration necessary>"
+               if {$havedest != "0"} {
+                       $havedest insert end "<no code regeneration necessary>\n"
+               }
+               set errmsg 0
+       } else {
+               set LastCompile ""
+               add_log "$SPIN $a_options pan_in"; update
+               if {$havedest != "0"} {
+                       $havedest insert end "$SPIN $a_options pan_in\n"
+               }
+               if {$Unix} {
+                       catch {eval exec $SPIN $a_options pan_in} errmsg
+               } else {
+                       catch {eval exec $SPIN $a_options pan_in >&pan.tmp}
+                       set errmsg [msg_file pan.tmp 0]
+               }
+               if {[string length $errmsg]>0} {
+                       set foo [string first "Exit-Status 0" $errmsg]
+                       if {$foo<0} {
+                               add_log "$errmsg"
+                               if {$havedest != "0"} {
+                                       $havedest insert end "$errmsg\n"
+                               }
+                               update
+                               return
+                       }
+                       incr foo -2
+                       set errmsg [string range $errmsg 0 $foo]
+                       add_log "$errmsg"
+                       if {$havedest != "0"} {
+                               $havedest insert end "$errmsg\n"
+                       }
+       }       }
+       set LastGenerate $a_options
+
+       set NextCompile "$CC -o pan $c_options pan.c"
+
+       if {$havedest != "0"} {
+               catch { $havedest yview -pickplace end }
+       }
+       if {$LastCompile == $NextCompile && [file exists pan]} {
+               add_log "<no recompilation necessary>"
+               if {$havedest != "0"} {
+                       $havedest insert end "<no recompilation necessary>\n"
+               }
+               set errmsg 0
+       } else {
+               add_log $NextCompile
+               if {$havedest != "0"} {
+                       $havedest insert end "$NextCompile\n"
+               }
+               catch {
+                       warner "Compiling" "Please wait until compilation of the \
+executable produced by spin completes." 300
+               }
+               update
+               if {$Unix} {
+                       rmfile "./pan"
+                       catch {eval exec $NextCompile >pan.tmp 2>pan.err}
+               } else {
+                       rmfile "pan.exe"
+                       catch {eval exec $NextCompile >pan.tmp 2>pan.err}
+               }
+
+               set errmsg [msg_file pan.tmp 0]
+               if {[string length $errmsg] == 0} {
+                       set errmsg [msg_file pan.err 0]
+               } else {
+                       set errmsg "$errmsg\n[msg_file pan.err 0]"
+               }
+
+               catch {destroy .warn}
+
+               auto_reset
+               if {$Unix} {
+                       if {[auto_execok "./pan"] == "" \
+                       ||  [auto_execok "./pan"] == 0} {
+                               add_log "$errmsg"
+                               add_log "compilation failed"
+                               if {$havedest != "0"} {
+                                       $havedest insert end "<compilation failed>\n"
+                               }
+                               update
+                               return
+                       }
+               } else {
+                       if {[auto_execok "pan"] == "" \
+                       ||  [auto_execok "pan"] == 0} {
+                               add_log "$errmsg"
+                               add_log "compilation failed"
+                               if {$havedest != "0"} {
+                                       $havedest insert end "<compilation failed>\n"
+                               }
+                               update
+                               return
+       }       }       }
+
+       set LastCompile $NextCompile
+       set NextCompile ""
+
+       if {$Unix} {
+               set PREFIX "time ./pan -v"
+       } else {
+               set PREFIX "pan -v"
+       }
+       add_log "$PREFIX $v_options"; update
+       if {$havedest != "0"} {
+               $havedest insert end "$PREFIX $v_options\n"
+               catch { $havedest yview -pickplace end }
+       }
+       set errmsg ""
+       update
+       rmfile pan.out
+       set errmsg [catch {eval exec $PREFIX $v_options >&pan.out &}]
+       if {$errmsg} {
+               add_log "$errmsg"
+               add_log "could not run verification"
+               if {$havedest != "0"} {
+                       $havedest insert end "<could not run verification>\n"
+               }
+               update
+               return
+       }
+
+       set not_warned_yet 1
+       if {$havedest != "0"} {
+               set vbox $havedest
+       } else {
+               set vv [mkbox "Verification Output" "VerOut" "$Fname.out" 80 20]
+               set vbox .c$vv.z.t
+       }
+       update
+       set mt 0
+       after 5000 outcheck $vbox
+       update
+}
+
+proc outcheck {vbox} {
+       global stop where not_warned_yet runtime mt Unix Fname FG skipmax
+
+       set firstline 1
+       set have_trail 0
+       set po_red_viol 0
+
+       if {[winfo exists $vbox] == 0} {
+               add_log "<verification output panel $vbox was closed>"
+               return
+       }
+
+       set erline 0; set lnr 0
+       set nomem 0; set nerr 0
+
+       if {$stop == 0} {
+         catch { set nt [file mtime pan.out] }
+         if {$mt == $nt && $skipmax > 0} {
+               incr skipmax -1
+         } else {
+         set mt $nt
+         set skipmax 10
+         set fd [open pan.out r]
+         while {[gets $fd line] > -1} {
+               if {$firstline} {
+                       set firstline 0
+                       set nerr 0
+                       set trunc 0
+                       set nomem 0
+                       .inp.t tag remove hilite 0.0 end
+                       catch { $vbox delete 0.0 end }
+                       set lnr 0
+               }
+               catch { $vbox insert end "$line\n" }
+               incr lnr
+               catch { $vbox yview -pickplace end }
+               update
+
+               if {[string first "line" $line]>=0} {
+                       scan $line "\tline %d" where
+                       catch { src_line $where }
+               }
+               if {[string first "State-vector" $line] == 0 \
+               ||  ([string first "error:" $line] == 0 \
+               &&   [string first "error: max search depth too small" $line] != 0)} {
+                       set stop 1      ;# run must have completed
+                       set nerr [string first "errors:" $line]
+                       if {$nerr > 0} {
+                       set part [string range $line $nerr end]
+                       scan $part "errors: %d" nerr
+                       if {$nerr == 0} {
+                               catch { .tl.results.top.title configure\
+                                       -text "Verification Result: valid" -fg $FG
+                               }
+                       } else {
+                               catch { .tl.results.top.title configure\
+                                       -text "Verification Result: not valid" -fg red
+                               }
+                       }
+                       set erline $lnr
+                       incr erline -1
+                       }
+               }
+               if {[string first "search depth too small" $line]>0} {
+                       set trunc 1
+               }
+               if {[string first "wrote pan_in.trail" $line]>0} {
+                       set have_trail 1
+               }
+               if {[string first "violated: access to chan" $line]>0} {
+                       set po_red_viol 1
+               }
+               if {[string first "out of memory" $line]>0} {
+                       set nomem 1
+               }
+               if {[string first "A=atomic;" $line]>0} {
+                       set stop 1
+               }
+               update
+         }
+         catch "close $fd"
+       } }
+       if {$nomem || $po_red_viol} { set erline 0 }
+
+       if {$stop || ($have_trail && $po_red_viol==0 && ($nerr>0 || $trunc>0))} {
+               catch { $vbox yview 0.0 }
+               add_log "<verification done>"
+               if {$nerr > 0 || $trunc == 1 || $nomem == 1} {
+                       if {[file exists pan_in.trail]} {
+                               cpfile pan_in.trail $Fname.trail
+                       } elseif {[file exists pan_in.tra]} {
+                               cpfile pan_in.tra $Fname.trail
+                       }
+                       catch { repeatbox $nerr $trunc $nomem }
+               }
+       } else {
+               if {$not_warned_yet} {
+                       set runtime 0
+                       set stop 0
+                       set line "Running verification -- waiting for output"
+                       catch { $vbox insert end "$line\n" }
+                       set line "\t(kill background process 'pan' to abort run)"
+                       catch { $vbox insert end "$line\n" }
+                       if {$Unix == 0} {
+                       set line "\t(use ctl-alt-del to kill pan)"
+                       catch { $vbox insert end "$line\n" }
+                       } else {
+                       set line "\t(use /bin/ps to find pid; then: kill -2 pid)"
+                       catch { $vbox insert end "$line\n" }
+                       catch { $vbox yview -pickplace end }
+                       }
+                       set not_warned_yet 0
+               } else {
+                       incr runtime 5
+                       if {$stop} {
+                               add_log "<done>"
+                               return
+                       } else {
+                       if {$runtime%60 == 0} {
+                               set rt [expr $runtime / 60]
+                               add_log "verification now running for approx $rt min.."
+                       }}
+                       update
+               }
+               after 5000 outcheck $vbox
+       }
+}
+
+proc src_line {s} {
+       global FG BG
+       scan $s %d tgt_lnr
+
+       if {$tgt_lnr > 0} {
+       .inp.t tag add hilite $tgt_lnr.0 $tgt_lnr.end
+       .inp.t tag configure hilite -background $FG -foreground $BG
+               if {$tgt_lnr > 10} {
+       .inp.t yview -pickplace [expr $tgt_lnr-10]
+               } else {
+       .inp.t yview -pickplace [expr $tgt_lnr-1]
+               }
+       }
+}
+
+proc repeatbox { {nerr} {trunc} {nomem}} {
+       global s_typ PlaceWarn whichsim
+
+       if {$nerr <= 0 && $trunc <= 0 && $nomem <= 0} { return }
+
+       catch {destroy .rep}
+       toplevel .rep
+
+       wm title .rep "Suggested Action"
+       wm iconname .rep "Suggest"
+       wm geometry .rep $PlaceWarn
+       button .rep.b0 -text "Close" -command {destroy .rep}
+       button .rep.b1 -text "Run Guided Simulation.." \
+               -command {destroy .rep; Rewind }
+       button .rep.b2 -text "Setup Guided Simulation.." \
+               -command {destroy .rep; simulation }
+
+       if {$nerr>0} {
+               message .rep.t -width 500 -text "\
+Optionally, repeat the run with a different search\
+depth to find a shorter path to the error.
+
+Or, perform a GUIDED simulation to retrace\
+the error found in this run, and skip\
+the first series of steps if the error was\
+found at a depth greater than about 100 steps)."
+               set s_typ 1
+               set whichsim 0
+
+               pack append .rep .rep.t {top expand fill}
+               pack append .rep .rep.b0 {right}
+               pack append .rep .rep.b1 {right}
+               pack append .rep .rep.b2 {right}
+       } else {
+
+               if {$nomem>0} {
+                       message .rep.t -width 500 -text "\
+Make sure the Physical Memory parameter (under Advanced\
+Options) is set to the maximum physical memory available.\
+If not, repeat the verification with the true maximum.\
+(Don't set it higher than the physical limit though.)\
+Otherwise, use compression, or switch to a\
+Supertrace Verification."
+               } else {
+
+                       if {$trunc} {
+
+                       message .rep.t -width 500 -text "\
+If the search was incomplete (truncated)\
+because the max search depth was too small,\
+try to increase the depth limit (it is set\
+in Advanced Options of the Verification Parameters\
+Panel), and repeat the verification."
+                       }
+               }
+               pack append .rep .rep.t {top expand fill}
+               pack append .rep .rep.b0 {right}
+       }
+}
+
+# Main startup and arg processing
+# this is at the end - to make sure all
+# proc declarations were seen
+
+if {$argc == 1} {
+       set Fname "$argv"
+       wm title . "SPIN CONTROL $xversion -- File: $Fname"
+       cleanup 0
+       cpfile $argv.trail pan_in.trail
+       reopen
+
+       check_xsp $argv
+}
+
+focus .inp.t
+update
This page took 0.100464 seconds and 4 git commands to generate.