# halcheck.tcl: a halfile to report: # 1) functions with no addf (usually an error) # 2) signals with no inputs (not an error) # 3) signals with no output (not an error) # # Usage in ini file (must be the last HALFILE): # [HAL] # ... # HALFILE = LIB:halcheck.tcl # # Note: connections in a POSTGUI_HALFILE are not checked # # config items: set ::popup 1 ;# default: enable popup (in addition to prints) set ::bigfont {Helvetica 12 bold} ;# {Family size weight} #---------------------------------------------------------------------- set ::prog halcheck # test for ::argv items on halfile line (requires 2.7) if [info exists ::argv] { if {[lsearch $::argv nopopup] >= 0} { set ::popup 0 ;# disable popup } } #---------------------------------------------------------------------- proc gui_message { type items } { if { "$items" == "" } return # twopass processing uses built-ins only (no Tk) if {$::popup && [catch {package require Tk} msg]} { set ::popup 0 } if { !$::popup } return if { ![winfo exists .b] } { wm title . "HAL checks" pack [button .b \ -text Dismiss \ -command {destroy .} \ ] -side bottom } set items [string map {" " \n} $items] switch $type { no_addfs { pack [label .noa1 \ -text "Functions with no addf: " \ -font $::bigfont \ -relief ridge -bd 3 \ ] -side top -fill x -expand 1 pack [label .noa2 \ -text "$items" \ -justify left \ -anchor w \ -relief sunken -bd 3 \ ] -side top -fill x -expand 1 } no_inputs { pack [label .noi1 \ -text "Signals with no inputs: " \ -font $::bigfont \ -relief ridge -bd 3 \ ] -side top -fill x -expand 1 pack [label .noi2 \ -text "$items" \ -justify left \ -anchor w \ -relief sunken -bd 3 \ ] -side top -fill x -expand 1 } no_output { pack [label .noo1 \ -text "Signals with no output: " \ -font $::bigfont \ -relief ridge -bd 3 \ ] -side top -fill x -expand 1 pack [label .noo2 \ -text "$items" \ -justify left \ -anchor w \ -relief sunken -bd 3 \ ] -side top -fill x -expand 1 } } } ;# gui_message proc check_function_usage {} { set ans [hal show function] set lines [split $ans \n] set header_len 2 set lines [lreplace $lines 0 [expr $header_len -1]] set lines [lreplace $lines end end] set ct 0 set no_addfs "" foreach line $lines { catch {unset f1 f2 f3 f4} scan [lindex $lines $ct] \ "%s %s %s %s %s %s" \ owner codeaddr arg fp users name if {"$users" == 0} { puts "$::prog: Functions with no addf: $name" lappend no_addfs $name } incr ct } gui_message no_addfs $no_addfs } ;# check_function_usage proc check_signal_usage {} { set ans [hal show signal] set lines [split $ans \n] set header_len 2 set lines [lreplace $lines 0 [expr $header_len -1]] set lines [lreplace $lines end end] set ct 0 foreach line $lines { set howmany [scan $line "%s%s%s" fld1 fld2 fld3] if {$howmany == 3} { set signame $fld3 set ::SIG($signame,type) $fld1 set ::SIG($signame,value) $fld2 set ::SIG($signame,inputs) "" set ::SIG($signame,output) "" set ::SIG($signame,ios) "" continue } switch $fld1 { "==>" {lappend ::SIG($signame,inputs) $fld2} "<==" {lappend ::SIG($signame,output) $fld2} "<=>" {lappend ::SIG($signame,ios) $fld2} default {return -code error "check-signal_usage: unrecognized <$line>"} } incr ct } set no_inputs "" foreach iname [array names ::SIG *,inputs] { set signame [lindex [split $iname ,] 0] if {$::SIG($iname) == ""} { set msg "$::prog: Signal: $signame <$::SIG($signame,value)> NO inputs" if {$::SIG($signame,ios) != ""} { set msg "$msg (i/o:$::SIG($signame,ios))" } else { lappend no_inputs $signame } puts "$msg" } } set no_output "" foreach oname [array names ::SIG *,output] { set signame [lindex [split $oname ,] 0] if {$::SIG($oname) == ""} { set msg "$::prog: Signal: $signame <$::SIG($signame,value)> NO output" if {$::SIG($signame,ios) != ""} { set msg "$msg (i/o:$::SIG($signame,ios))" } else { lappend no_output $signame } puts "$msg" } } foreach iname [array names ::SIG *,ios] { if { $::SIG($iname) == ""} {unset ::SIG($iname)} } gui_message no_inputs $no_inputs gui_message no_output $no_output } ;# check_signal_usage #---------------------------------------------------------------------- # begin check_function_usage check_signal_usage