# $Id: util.tcl 516 2013-05-05 21:24:52Z mueller $
|
# $Id: util.tcl 516 2013-05-05 21:24:52Z mueller $
|
#
|
#
|
# Copyright 2011-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
# Copyright 2011-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
|
#
|
#
|
# This program is free software; you may redistribute and/or modify it under
|
# 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
|
# the terms of the GNU General Public License as published by the Free
|
# Software Foundation, either version 2, or at your option any later version.
|
# Software Foundation, either version 2, or at your option any later version.
|
#
|
#
|
# This program is distributed in the hope that it will be useful, but
|
# This program is distributed in the hope that it will be useful, but
|
# WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
# WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
|
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
# for complete details.
|
# for complete details.
|
#
|
#
|
# Revision History:
|
# Revision History:
|
# Date Rev Version Comment
|
# Date Rev Version Comment
|
# 2011-03-27 374 1.0 Initial version
|
# 2011-03-27 374 1.0 Initial version
|
# 2011-03-13 369 0.1 First draft
|
# 2011-03-13 369 0.1 First draft
|
#
|
#
|
|
|
package provide rbmoni 1.0
|
package provide rbmoni 1.0
|
|
|
package require rutil
|
package require rutil
|
package require rlink
|
package require rlink
|
|
|
namespace eval rbmoni {
|
namespace eval rbmoni {
|
#
|
#
|
# setup register descriptions for rbd_rbmon
|
# setup register descriptions for rbd_rbmon
|
#
|
#
|
regdsc CNTL {go 0}
|
regdsc CNTL {go 0}
|
regdsc ALIM {hilim 15 8} {lolim 7 8}
|
regdsc ALIM {hilim 15 8} {lolim 7 8}
|
regdsc ADDR {wrap 15} {addr 10 11 "-"} {laddr 10 9} {waddr 1 2}
|
regdsc ADDR {wrap 15} {addr 10 11 "-"} {laddr 10 9} {waddr 1 2}
|
#
|
#
|
regdsc DAT3 {flags 15 8 "-"} {ack 15} {busy 14} {err 13} {nak 12} {tout 11} \
|
regdsc DAT3 {flags 15 8 "-"} {ack 15} {busy 14} {err 13} {nak 12} {tout 11} \
|
{init 9} {we 8} {addr 7 8}
|
{init 9} {we 8} {addr 7 8}
|
regdsc DAT0 {ndlymsb 15 4} {nbusy 11 12}
|
regdsc DAT0 {ndlymsb 15 4} {nbusy 11 12}
|
#
|
#
|
# 'pseudo register', describes 1st word in return list element of rbmoni::read
|
# 'pseudo register', describes 1st word in return list element of rbmoni::read
|
# must have same bit sequence as DAT3(flags)
|
# must have same bit sequence as DAT3(flags)
|
regdsc FLAGS {ack 7} {busy 6} {err 5} {nak 4} {tout 3} {init 1} {we 0}
|
regdsc FLAGS {ack 7} {busy 6} {err 5} {nak 4} {tout 3} {init 1} {we 0}
|
#
|
#
|
# setup: amap definitions for rbd_rbmon
|
# setup: amap definitions for rbd_rbmon
|
#
|
#
|
proc setup {{base 0x00fc}} {
|
proc setup {{base 0x00fc}} {
|
rlc amap -insert rm.cntl [expr {$base + 0x00}]
|
rlc amap -insert rm.cntl [expr {$base + 0x00}]
|
rlc amap -insert rm.alim [expr {$base + 0x01}]
|
rlc amap -insert rm.alim [expr {$base + 0x01}]
|
rlc amap -insert rm.addr [expr {$base + 0x02}]
|
rlc amap -insert rm.addr [expr {$base + 0x02}]
|
rlc amap -insert rm.data [expr {$base + 0x03}]
|
rlc amap -insert rm.data [expr {$base + 0x03}]
|
}
|
}
|
#
|
#
|
# init: reset rbd_rbmon (stop, reset alim)
|
# init: reset rbd_rbmon (stop, reset alim)
|
#
|
#
|
proc init {} {
|
proc init {} {
|
rlc exec \
|
rlc exec \
|
-wreg rm.cntl 0x0000 \
|
-wreg rm.cntl 0x0000 \
|
-wreg rm.alim [regbld rbmoni::ALIM {hilim 0xff} {lolim 0x00}] \
|
-wreg rm.alim [regbld rbmoni::ALIM {hilim 0xff} {lolim 0x00}] \
|
-wreg rm.addr 0x0000
|
-wreg rm.addr 0x0000
|
}
|
}
|
#
|
#
|
# start: start the rbmon
|
# start: start the rbmon
|
#
|
#
|
proc start {} {
|
proc start {} {
|
rlc exec -wreg rm.cntl [regbld rbmoni::CNTL go]
|
rlc exec -wreg rm.cntl [regbld rbmoni::CNTL go]
|
}
|
}
|
#
|
#
|
# stop: stop the rbmon
|
# stop: stop the rbmon
|
#
|
#
|
proc stop {} {
|
proc stop {} {
|
rlc exec -wreg rm.cntl 0x0000
|
rlc exec -wreg rm.cntl 0x0000
|
}
|
}
|
#
|
#
|
# read: read nent last entries (by default all)
|
# read: read nent last entries (by default all)
|
#
|
#
|
proc read {{nent -1}} {
|
proc read {{nent -1}} {
|
set amax [regget rbmoni::ADDR(laddr) -1]
|
set amax [regget rbmoni::ADDR(laddr) -1]
|
if {$nent == -1} { set nent $amax }
|
if {$nent == -1} { set nent $amax }
|
|
|
rlc exec -rreg rm.addr raddr
|
rlc exec -rreg rm.addr raddr
|
|
|
set laddr [regget rbmoni::ADDR(laddr) $raddr]
|
set laddr [regget rbmoni::ADDR(laddr) $raddr]
|
set nval $laddr
|
set nval $laddr
|
if {[regget rbmoni::ADDR(wrap) $raddr]} { set nval $amax }
|
if {[regget rbmoni::ADDR(wrap) $raddr]} { set nval $amax }
|
|
|
if {$nent > $nval} {set nent $nval}
|
if {$nent > $nval} {set nent $nval}
|
if {$nent == 0} { return {} }
|
if {$nent == 0} { return {} }
|
|
|
set caddr [expr {( $laddr - $nent ) & $amax}]
|
set caddr [expr {( $laddr - $nent ) & $amax}]
|
rlc exec -wreg rm.addr [regbld rbmoni::ADDR [list laddr $caddr]]
|
rlc exec -wreg rm.addr [regbld rbmoni::ADDR [list laddr $caddr]]
|
|
|
set rval {}
|
set rval {}
|
|
|
while {$nent > 0} {
|
while {$nent > 0} {
|
set nblk [expr {$nent << 2}]
|
set nblk [expr {$nent << 2}]
|
if {$nblk > 256} {set nblk 256}
|
if {$nblk > 256} {set nblk 256}
|
rlc exec -rblk rm.data $nblk rawdat
|
rlc exec -rblk rm.data $nblk rawdat
|
|
|
foreach {d0 d1 d2 d3} $rawdat {
|
foreach {d0 d1 d2 d3} $rawdat {
|
set eflag [regget rbmoni::DAT3(flags) $d3]
|
set eflag [regget rbmoni::DAT3(flags) $d3]
|
set eaddr [regget rbmoni::DAT3(addr) $d3]
|
set eaddr [regget rbmoni::DAT3(addr) $d3]
|
set edly [expr {( [regget rbmoni::DAT0(ndlymsb) $d0] << 16 ) | $d1 }]
|
set edly [expr {( [regget rbmoni::DAT0(ndlymsb) $d0] << 16 ) | $d1 }]
|
set enbusy [regget rbmoni::DAT0(nbusy) $d0]
|
set enbusy [regget rbmoni::DAT0(nbusy) $d0]
|
lappend rval [list $eflag $eaddr $d2 $edly $enbusy]
|
lappend rval [list $eflag $eaddr $d2 $edly $enbusy]
|
}
|
}
|
|
|
set nent [expr {$nent - ( $nblk >> 2 ) }]
|
set nent [expr {$nent - ( $nblk >> 2 ) }]
|
}
|
}
|
|
|
rlc exec -wreg rm.addr $raddr
|
rlc exec -wreg rm.addr $raddr
|
|
|
return $rval
|
return $rval
|
}
|
}
|
#
|
#
|
# print: print rbmon data (optionally also read them)
|
# print: print rbmon data (optionally also read them)
|
#
|
#
|
proc print {{mondat -1}} {
|
proc print {{mondat -1}} {
|
|
|
if {[llength $mondat] == 1} {
|
if {[llength $mondat] == 1} {
|
set ele [lindex $mondat 0]
|
set ele [lindex $mondat 0]
|
if {[llength $ele] == 1} {
|
if {[llength $ele] == 1} {
|
set nent [lindex $ele 0]
|
set nent [lindex $ele 0]
|
set mondat [read $nent]
|
set mondat [read $nent]
|
}
|
}
|
}
|
}
|
|
|
set rval {}
|
set rval {}
|
|
|
set eind [expr {1 - [llength $mondat] }]
|
set eind [expr {1 - [llength $mondat] }]
|
append rval " ind addr data delay nbusy ac bs er na to in we"
|
append rval " ind addr data delay nbusy ac bs er na to in we"
|
|
|
foreach {ele} $mondat {
|
foreach {ele} $mondat {
|
foreach {eflag eaddr edata edly enbusy} $ele { break }
|
foreach {eflag eaddr edata edly enbusy} $ele { break }
|
set fack [regget rbmoni::FLAGS(ack) $eflag]
|
set fack [regget rbmoni::FLAGS(ack) $eflag]
|
set fbsy [regget rbmoni::FLAGS(busy) $eflag]
|
set fbsy [regget rbmoni::FLAGS(busy) $eflag]
|
set ferr [regget rbmoni::FLAGS(err) $eflag]
|
set ferr [regget rbmoni::FLAGS(err) $eflag]
|
set fnak [regget rbmoni::FLAGS(nak) $eflag]
|
set fnak [regget rbmoni::FLAGS(nak) $eflag]
|
set fto [regget rbmoni::FLAGS(tout) $eflag]
|
set fto [regget rbmoni::FLAGS(tout) $eflag]
|
set fini [regget rbmoni::FLAGS(init) $eflag]
|
set fini [regget rbmoni::FLAGS(init) $eflag]
|
set fwe [regget rbmoni::FLAGS(we) $eflag]
|
set fwe [regget rbmoni::FLAGS(we) $eflag]
|
set ename ""
|
set ename ""
|
set comment ""
|
set comment ""
|
if {$ferr} {append comment " err=1!"}
|
if {$ferr} {append comment " err=1!"}
|
if {$fini} {
|
if {$fini} {
|
append comment " init"
|
append comment " init"
|
} else {
|
} else {
|
if {$fnak} {append comment " nak=1!"}
|
if {$fnak} {append comment " nak=1!"}
|
}
|
}
|
if {$fto} {append comment " tout=1!"}
|
if {$fto} {append comment " tout=1!"}
|
if {[rlc amap -testaddr $eaddr]} {set ename [rlc amap -name $eaddr]}
|
if {[rlc amap -testaddr $eaddr]} {set ename [rlc amap -name $eaddr]}
|
append rval [format \
|
append rval [format \
|
"\n%4d %-10s %4.4x %6d %4d %2.2x %d %d %d %d %d %d %d %s" \
|
"\n%4d %-10s %4.4x %6d %4d %2.2x %d %d %d %d %d %d %d %s" \
|
$eind $ename $edata $edly $enbusy $eflag \
|
$eind $ename $edata $edly $enbusy $eflag \
|
$fack $fbsy $ferr $fnak $fto $fini $fwe $comment]
|
$fack $fbsy $ferr $fnak $fto $fini $fwe $comment]
|
incr eind
|
incr eind
|
}
|
}
|
|
|
return $rval
|
return $rval
|
}
|
}
|
|
|
#
|
#
|
# raw_edata: prepare edata lists for raw data reads in tests
|
# raw_edata: prepare edata lists for raw data reads in tests
|
# args is list of {eflag eaddr edata enbusy} sublists
|
# args is list of {eflag eaddr edata enbusy} sublists
|
|
|
proc raw_edata {edat emsk args} {
|
proc raw_edata {edat emsk args} {
|
upvar $edat uedat
|
upvar $edat uedat
|
upvar $emsk uemsk
|
upvar $emsk uemsk
|
set uedat {}
|
set uedat {}
|
set uemsk {}
|
set uemsk {}
|
|
|
set m0 [expr {0xffff & ~[regget rbmoni::DAT0(nbusy) -1] }]
|
set m0 [expr {0xffff & ~[regget rbmoni::DAT0(nbusy) -1] }]
|
set d1 0x0000
|
set d1 0x0000
|
set m1 0xffff
|
set m1 0xffff
|
set m3 0x0000
|
set m3 0x0000
|
|
|
foreach line $args {
|
foreach line $args {
|
foreach {eflags eaddr edata enbusy} $line { break }
|
foreach {eflags eaddr edata enbusy} $line { break }
|
set d0 [regbld rbmoni::DAT0 [list nbusy $enbusy]]
|
set d0 [regbld rbmoni::DAT0 [list nbusy $enbusy]]
|
if {$edata ne ""} {
|
if {$edata ne ""} {
|
set m2 0x0000
|
set m2 0x0000
|
set d2 $edata
|
set d2 $edata
|
} else {
|
} else {
|
set m2 0xffff
|
set m2 0xffff
|
set d2 0x0000
|
set d2 0x0000
|
}
|
}
|
set d3 [regbld rbmoni::DAT3 [list flags $eflags] [list addr $eaddr]]
|
set d3 [regbld rbmoni::DAT3 [list flags $eflags] [list addr $eaddr]]
|
|
|
lappend uedat $d0 $d1 $d2 $d3
|
lappend uedat $d0 $d1 $d2 $d3
|
lappend uemsk $m0 $m1 $m2 $m3
|
lappend uemsk $m0 $m1 $m2 $m3
|
}
|
}
|
|
|
return ""
|
return ""
|
}
|
}
|
|
|
#
|
#
|
# raw_check: check raw data against expect values prepared by raw_edata
|
# raw_check: check raw data against expect values prepared by raw_edata
|
#
|
#
|
proc raw_check {edat emsk} {
|
proc raw_check {edat emsk} {
|
|
|
rlc exec -estatdef 0x0 [regbld rlink::STAT {stat -1}] \
|
rlc exec -estatdef 0x0 [regbld rlink::STAT {stat -1}] \
|
-rreg rm.addr -edata [llength $edat] \
|
-rreg rm.addr -edata [llength $edat] \
|
-wreg rm.addr 0 \
|
-wreg rm.addr 0 \
|
-rblk rm.data [llength $edat] -edata $edat $emsk \
|
-rblk rm.data [llength $edat] -edata $edat $emsk \
|
-rreg rm.addr -edata [llength $edat]
|
-rreg rm.addr -edata [llength $edat]
|
return ""
|
return ""
|
}
|
}
|
|
|
}
|
}
|
|
|