1
0
mirror of https://github.com/wfjm/w11.git synced 2026-01-31 14:12:46 +00:00
Files
wfjm.w11/tools/tcl/rbtest/util.tcl

174 lines
5.2 KiB
Tcl

# $Id: util.tcl 985 2018-01-03 08:59:40Z mueller $
#
# Copyright 2011-2017 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
# 2017-04-22 883 2.0.2 setup: now idempotent
# 2014-12-21 617 2.0.1 use rbtout stat bit for timeout
# 2014-11-09 603 2.0 use rlink v4 address layout and iface with 8 regs
# 2011-03-27 374 1.0 Initial version
# 2011-03-13 369 0.1 Frist draft
#
package provide rbtest 1.0
package require rutiltpp
package require rutil
package require rlink
namespace eval rbtest {
#
# setup register descriptions for rbd_tester
#
regdsc CNTL {wchk 15} {nbusy 9 10}
regdsc INIT {fifo 2} {data 1} {cntl 0}
#
# setup: amap definitions for rbd_tester
#
proc setup {{base 0xffe0}} {
if {[rlc amap -testname te.cntl $base]} {return}
rlc amap -insert te.cntl [expr {$base + 0x00}]
rlc amap -insert te.stat [expr {$base + 0x01}]
rlc amap -insert te.attn [expr {$base + 0x02}]
rlc amap -insert te.ncyc [expr {$base + 0x03}]
rlc amap -insert te.data [expr {$base + 0x04}]
rlc amap -insert te.dinc [expr {$base + 0x05}]
rlc amap -insert te.fifo [expr {$base + 0x06}]
rlc amap -insert te.lnak [expr {$base + 0x07}]
}
#
# init: reset rbd_tester (clear via init)
#
proc init {} {
rlc exec -init te.cntl [regbld rbtest::INIT fifo data cntl]
}
#
# nbusymax: returns maximal nbusy value not causing timeout
# set te.cntl nbusy to max
# do read to te.data (will fail, check stat)
# get cycle count from te.ncyc --> this minus one is nbusymax
# restore te.cntl
proc nbusymax {} {
set esdmsk [regbld rlink::STAT rbtout rbnak rberr]
rlc exec \
-rreg te.cntl sav_cntl \
-wreg te.cntl [regbld rbtest::CNTL {nbusy -1}] \
-rreg te.data -estat [regbld rlink::STAT rbtout] $esdmsk \
-rreg te.ncyc ncyc
rlc exec \
-wreg te.cntl $sav_cntl
return [expr {$ncyc - 1}]
}
#
# probe: determine rbd_tester environment (max nbusy, stat and attn wiring)
#
proc probe {} {
set esdmsktout [regbld rlink::STAT rbnak rberr]
set rbusy {}
set rstat {}
set rattn {}
#
# probe max nbusy for write and read
#
set wrerr {}
set rderr {}
for {set i 3} { $i < 8 } {incr i} {
set nbusy0 [expr {( 1 << $i )}]
for {set j -1} { $j <= 1 } {incr j} {
set nbusy [expr {$nbusy0 + $j}]
set valc [regbld rbtest::CNTL [list nbusy $nbusy]]
rlc exec \
-wreg te.cntl $valc \
-wreg te.data 0x0000 statwr -estat 0x0 $esdmsktout \
-rreg te.data dummy statrd -estat 0x0 $esdmsktout
if {[llength $wrerr] == 0 && [regget rlink::STAT(rbnak) $statwr] != 0} {
lappend wrerr $i $j $nbusy
}
if {[llength $rderr] == 0 && [regget rlink::STAT(rbnak) $statrd] != 0} {
lappend rderr $i $j $nbusy
}
}
}
rlc exec -init te.cntl [regbld rbtest::INIT fifo data cntl]
lappend rbusy $wrerr $rderr
#
# probe stat wiring
#
for {set i 0} { $i < 4 } {incr i} {
rlc exec \
-wreg te.stat [expr {1 << $i}] \
-rreg te.data dummy statrd
lappend rstat [list $i [regget rlink::STAT(stat) $statrd]]
}
rlc exec -init te.cntl [regbld rbtest::INIT fifo data cntl]
#
# probe attn wiring
#
rlc exec -attn
for {set i 0} { $i < 16 } {incr i} {
rlc exec \
-wreg te.attn [expr {1 << $i}] \
-attn attnpat
lappend rattn [list $i $attnpat]
}
rlc exec -attn
#
return [list $rbusy $rstat $rattn]
}
#
# probe_print: print probe results
#
proc probe_print {{plist {}}} {
set rval {}
if {[llength $plist] == 0} {
set plist [probe]
}
set rbusy [lindex $plist 0]
set rstat [lindex $plist 1]
set rattn [lindex $plist 2]
#
append rval \
"nbusy: write max [lindex $rbusy 0 2] --> WIDTH=[lindex $rbusy 0 0]"
append rval \
"\nnbusy: read max [lindex $rbusy 1 2] --> WIDTH=[lindex $rbusy 1 0]"
#
for {set i 0} { $i < 4 } {incr i} {
set rcvpat [lindex $rstat $i 1]
set rcvind [print_bitind $rcvpat]
append rval [format "\nstat: te.stat line %2d --> design %2d %s" \
$i $rcvind [pbvi b4 $rcvpat]]
}
#
for {set i 0} { $i < 16 } {incr i} {
set rcvpat [lindex $rattn $i 1]
set rcvind [print_bitind $rcvpat]
append rval [format "\nattn: te.attn line %2d --> design %2d %s" \
$i $rcvind [pbvi b16 $rcvpat]]
}
return $rval
}
#
# print_bitind: helper for probe_print:
#
proc print_bitind {pat} {
for {set i 0} { $i < 16 } {incr i} {
if {[expr {$pat & [expr {1 << $i}] }] } { return $i}
}
return -1
}
}