1
0
mirror of https://github.com/wfjm/w11.git synced 2026-05-03 06:39:50 +00:00
Files
wfjm.w11/tools/tcl/rw11/dmpcnt.tcl
2018-11-11 09:50:46 +01:00

217 lines
5.8 KiB
Tcl

# $Id: dmpcnt.tcl 1066 2018-11-10 11:21:53Z mueller $
#
# Copyright 2018- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
# This program is free software; you may redistribute and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for complete details.
#
# Revision History:
# Date Rev Version Comment
# 2018-11-09 1066 1.1.1 pc_sta: fix default file name
# 2018-10-21 1058 1.1 add logger, pc_l* commands
# 2018-10-13 1055 1.0 Initial version
# 2018-09-23 1050 0.1 First draft
#
package provide rw11 1.0
package require rlink
package require rwxxtpp
namespace eval rw11 {
#
# setup dmpcnt unit register descriptions for w11a -------------------------
#
regdsc PC_CNTL {ainc 15} {caddr 13 5} \
{func 2 3 "s:NOOP:NOOP1:NOOP2:NOOP3:STO:STA:CLR:LOA"}
regdsc PC_STAT {ainc 15} {caddr 13 5} {waddr 8} {run 0}
# preliminary handling of counter names, hack in first version
variable pcnt_cnames [list cpu_cpbusy cpu_km_prix cpu_km_pri0 cpu_km_wait \
cpu_sm cpu_um cpu_idec cpu_pcload \
cpu_vfetch cpu_irupt ca_rd ca_wr \
ca_rdhit ca_wrhit ca_rdmem ca_wrmem \
ca_rdwait ca_wrwait ib_rd ib_wr \
ib_busy rb_rd rb_wr rb_busy \
ext_rdrhit ext_wrrhit ext_wrflush ext_rlrxact \
ext_rlrxback ext_rltxact ext_rltxback ext_udec]
variable pcnt_cindex
set tmp_ind 0
foreach {nam} $pcnt_cnames {
set pcnt_cindex($nam) $tmp_ind
incr tmp_ind
}
unset tmp_ind
variable pcnt_timesta 0
variable pcnt_timenext 0
variable pcnt_logaftid 0
variable pcnt_logchan 0
#
# pc_setup: rmap definitions for dmpcnt
#
proc pc_setup {{cpu "cpu0"}} {
set base [$cpu get base]
if {[$cpu rmap -testname pc.cntl [expr {$base + 0x60}]]} {return}
$cpu rmap -insert pc.cntl [expr {$base + 0x60}]
$cpu rmap -insert pc.stat [expr {$base + 0x61}]
$cpu rmap -insert pc.data [expr {$base + 0x62}]
}
#
# pc_start: start the dmpcnt
#
proc pc_start {{cpu "cpu0"} args} {
$cpu cp -wreg pc.cntl [regbldkv rw11::PC_CNTL func "STA" ]
}
#
# pc_stop: stop the dmpcnt
#
proc pc_stop {{cpu "cpu0"}} {
$cpu cp -wreg pc.cntl [regbld rw11::PC_CNTL {func "STO"}]
}
#
# pc_clear: clear the dmpcnt
#
proc pc_clear {{cpu "cpu0"}} {
$cpu cp -wreg pc.cntl [regbld rw11::PC_CNTL {func "CLR"}]
}
#
# pc_read: read dmpcnt data
# returns a list of 32 float values in range 0...2^32-1
#
proc pc_read {{cpu "cpu0"}} {
$cpu cp -wreg pc.cntl [regbldkv rw11::PC_CNTL func "LOA" caddr 0 ainc 1 ] \
-rblk pc.data [expr {2*32}] blk
set rval {}
foreach {d0 d1} $blk {
lappend rval [expr {$d0 + 65536.*$d1}]
}
return $rval
}
#
# pc_print: print dmpcnt data
#
proc pc_print {pclist} {
set sn 0
set rval ""
append rval "#cn count"
foreach {pc} $pclist {
set cname [lindex $rw11::pcnt_cnames $sn]
append rval [format "\n%3d %10.0f %s" $sn $pc $cname]
incr sn
}
return $rval
}
#
# pc_printraw: read and print dmpcnt raw data
#
proc pc_printraw {{cpu "cpu0"}} {
$cpu cp -wreg pc.cntl [regbldkv rw11::PC_CNTL func "LOA" caddr 0 ainc 1 ] \
-rblk pc.data [expr {2*32}] blk
set sn 0
set rval {}
append rval "#cn msb lsb count"
foreach {d0 d1} $blk {
set cnt [expr {$d0 + 65536.*$d1}]
set cname [lindex $rw11::pcnt_cnames $sn]
append rval [format "\n%3d %4.4x %4.4x %10.0f %s" \
$sn $d1 $d0 $cnt $cname]
incr sn
}
return $rval
}
#
# pc_lsta: start logging
#
proc pc_lsta {{file ""}} {
variable pcnt_timesta
variable pcnt_timenext
variable pcnt_logaftid
variable pcnt_logchan
if {$pcnt_logchan != 0} { error "pc logger already running" }
if {$file eq ""} {
set timestamp [clock format [clock seconds] -format "%Y-%m-%d-%H%M%S"]
set file "pc_dmpcnt_$timestamp.dat"
}
pc_clear
pc_start
set pcnt_logchan [open $file w]
fconfigure $pcnt_logchan -buffering line
set pcnt_timesta [clock milliseconds]
set pcnt_timenext $pcnt_timesta
after 0 rw11::pc_lhdl
return ""
}
#
# pc_lsto: stop logging
#
proc pc_lsto {} {
variable pcnt_logaftid
variable pcnt_logchan
variable pcnt_timesta
variable pcnt_timenext
if {$pcnt_logchan == 0} { return "" }
after cancel $pcnt_logaftid
close $pcnt_logchan
set pcnt_logchan 0
set pcnt_timesta 0
set pcnt_timenext 0
set pcnt_logaftid 0
return ""
}
#
# pc_lcom: add comment to logger
#
proc pc_lcom {{comment ""}} {
variable pcnt_logchan
if {$pcnt_logchan == 0} { error "pc logger not running" }
puts $pcnt_logchan "# $comment"
return ""
}
#
# pc_lhdl: logger handler
#
proc pc_lhdl {} {
variable pcnt_timesta
variable pcnt_timenext
variable pcnt_logaftid
variable pcnt_logchan
if {$pcnt_logchan == 0} { return "" }
set tela [expr {([clock milliseconds]-$pcnt_timesta)/1000.}]
set pclist [pc_read]
set line [format "%10.3f " $tela]
foreach {pc} $pclist {
append line [format " %1.0f" $pc]
}
puts $pcnt_logchan $line
set pcnt_timenext [expr {$pcnt_timenext + 1000}]
set dt [expr { $pcnt_timenext - [clock milliseconds]}]
after $dt rw11::pc_lhdl
return ""
}
}