OpenCores
URL https://opencores.org/ocsvn/w11/w11/trunk

Subversion Repositories w11

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /w11
    from Rev 27 to Rev 28
    Reverse comparison

Rev 27 → Rev 28

/trunk/tools/tcl/rlink/util.tcl
1,4 → 1,4
# $Id: util.tcl 609 2014-12-07 19:35:25Z mueller $
# $Id: util.tcl 617 2014-12-21 14:18:53Z mueller $
#
# Copyright 2011-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
13,6 → 13,7
#
# Revision History:
# Date Rev Version Comment
# 2014-12-21 617 2.0.1 add rbtout definition in STAT
# 2014-12-07 609 2.0 use new rlink v4 iface; remove SINIT again
# 2014-08-09 580 1.0.2 add run_rri
# 2011-08-06 403 1.0.1 add SINT and SINIT defs for serport init
25,7 → 26,7
package require rutil 1.0
 
namespace eval rlink {
regdsc STAT {stat 7 4} {attn 3} {rbnak 1} {rberr 0}
regdsc STAT {stat 7 4} {attn 3} {rbtout 2} {rbnak 1} {rberr 0}
regdsc RLCNTL {anena 15} {atoena 14} {atoval 7 8}
regdsc RLSTAT {lcmd 15 8} {babo 7} {rbsize 2 3}
#
/trunk/tools/tcl/rutil/util.tcl
1,4 → 1,4
# $Id: util.tcl 569 2014-07-13 14:36:32Z mueller $
# $Id: util.tcl 619 2014-12-23 13:17:41Z mueller $
#
# Copyright 2011-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
13,6 → 13,7
#
# Revision History:
# Date Rev Version Comment
# 2014-12-23 619 1.0.3 regget: add check for unknown field descriptor
# 2014-07-12 569 1.0.2 add sxt16 and sxt32
# 2013-05-09 517 1.0.1 add optlist2arr
# 2011-03-27 374 1.0 Initial version
169,6 → 170,9
#
proc regget {name val} {
upvar $name fdsc
if {! [info exists fdsc] } {
error "register field descriptor \"$name\" unknown"
}
set fbeg [lindex $fdsc 0]
set flen [lindex $fdsc 1]
set mskb [lindex $fdsc 2]
/trunk/tools/tcl/rbemon/util.tcl
1,4 → 1,4
# $Id: util.tcl 516 2013-05-05 21:24:52Z mueller $
# $Id: util.tcl 620 2014-12-25 10:48:35Z mueller $
#
# Copyright 2011-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
32,7 → 32,7
#
# setup: amap definitions for rbd_eyemon
#
proc setup {base} {
proc setup {{base 0xffd0}} {
rlc amap -insert em.cntl [expr {$base + 0x00}]
rlc amap -insert em.rdiv [expr {$base + 0x01}]
rlc amap -insert em.addr [expr {$base + 0x02}]
/trunk/tools/tcl/rbtest/test_data.tcl
1,4 → 1,4
# $Id: test_data.tcl 603 2014-11-09 22:50:26Z mueller $
# $Id: test_data.tcl 617 2014-12-21 14:18:53Z mueller $
#
# Copyright 2011-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
13,6 → 13,7
#
# Revision History:
# Date Rev Version Comment
# 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
# 2011-03-27 374 1.0 Initial version
# 2011-03-13 369 0.1 First Draft
71,8 → 72,8
-wreg te.data 0xdead \
-rreg te.data -edata 0xdead \
-wreg te.cntl [regbld rbtest::CNTL {nbusy 0x3ff}] \
-wreg te.data 0xbeaf -estat [regbld rlink::STAT rbnak] $esdmsk \
-rreg te.data -estat [regbld rlink::STAT rbnak] $esdmsk \
-wreg te.data 0xbeaf -estat [regbld rlink::STAT rbtout] $esdmsk \
-rreg te.data -estat [regbld rlink::STAT rbtout] $esdmsk \
-wreg te.cntl 0x0000 \
-rreg te.data -edata 0xdead -edata 0xdead
#
/trunk/tools/tcl/rbtest/util.tcl
1,4 → 1,4
# $Id: util.tcl 603 2014-11-09 22:50:26Z mueller $
# $Id: util.tcl 617 2014-12-21 14:18:53Z mueller $
#
# Copyright 2011-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
13,6 → 13,7
#
# Revision History:
# Date Rev Version Comment
# 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
61,7 → 62,7
rlc exec -estatdef 0 $esdmsk \
-rreg te.cntl sav_cntl \
-wreg te.cntl [regbld rbtest::CNTL {nbusy -1}] \
-rreg te.data -estat [regbld rlink::STAT rbnak] $esdmsk \
-rreg te.data -estat [regbld rlink::STAT rbtout] $esdmsk \
-rreg te.ncyc ncyc
rlc exec -estatdef 0 $esdmsk \
-wreg te.cntl $sav_cntl
71,10 → 72,10
# probe: determine rbd_tester environment (max nbusy, stat and attn wiring)
#
proc probe {} {
set esdval 0x00
set esdmsk [regbld rlink::STAT {stat -1}]
set esdmsknak [regbld rlink::STAT {stat -1} rbnak]
set esdmskatt [regbld rlink::STAT {stat -1} attn]
set esdval 0x00
set esdmsk [regbld rlink::STAT {stat -1}]
set esdmsktout [regbld rlink::STAT {stat -1} rbtout]
set esdmskattn [regbld rlink::STAT {stat -1} attn]
set rbusy {}
set rstat {}
set rattn {}
90,8 → 91,8
set valc [regbld rbtest::CNTL [list nbusy $nbusy]]
rlc exec \
-wreg te.cntl $valc -estat $esdval $esdmsk\
-wreg te.data 0x0000 statwr -estat $esdval $esdmsknak \
-rreg te.data dummy statrd -estat $esdval $esdmsknak
-wreg te.data 0x0000 statwr -estat $esdval $esdmsktout \
-rreg te.data dummy statrd -estat $esdval $esdmsktout
if {[llength $wrerr] == 0 && [regget rlink::STAT(rbnak) $statwr] != 0} {
lappend wrerr $i $j $nbusy
}
117,7 → 118,7
#
rlc exec -attn
for {set i 0} { $i < 16 } {incr i} {
rlc exec -estatdef $esdval $esdmskatt \
rlc exec -estatdef $esdval $esdmskattn \
-wreg te.attn [expr {1 << $i}] \
-attn attnpat
lappend rattn [list $i $attnpat]
/trunk/tools/tcl/rbbram/perf.tcl
1,6 → 1,6
# $Id: perf.tcl 609 2014-12-07 19:35:25Z mueller $
# $Id: perf.tcl 622 2014-12-28 20:45:26Z mueller $
#
# Copyright 2011-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
# Copyright 2011-2014 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
13,6 → 13,7
#
# Revision History:
# Date Rev Version Comment
# 2014-12-27 622 1.1.1 don't use read buffers in rblk speed test
# 2014-12-06 609 1.1 test 512,1024,2000 word wblk/rbld; retra buffer cut
# 2013-01-04 469 1.0.2 perf_blk: add optional 2nd arg: trace
# 2012-12-27 465 1.0.1 adopt format, cover small ms and large kb
37,7 → 38,7
"\n ms/r kB/s ms/r kB/s ms/r kB/s ms/r kB/s ms/r kB/s ms/r kB/s"
 
# 256 512 1024
foreach nblk {1 2 4 8 16 32 64 128 256 512 1024 2000} {
foreach nblk {1 2 4 8 16 32 64 128 256 512 768 1024 1536 2000} {
set wbuf0 {}
set wbuf1 {}
set wbuf2 {}
53,13 → 54,13
 
# single wblk
if {$trace} { puts "1 wblk for $nblk" }
set tbeg [clock clicks -milliseconds]
set tbeg [clock milliseconds]
set addr 0x0000
for {set i 1} {1} {incr i} {
rlc exec \
-wreg br.cntl $addr \
-wblk br.data $wbuf0
set trun [expr {[clock clicks -milliseconds] - $tbeg}]
set trun [expr {[clock milliseconds] - $tbeg}]
if {$trun > $tmax} { break }
set addr [expr {( $addr + $nblk ) & $amax}]
}
67,7 → 68,7
 
# double wblk
if {$trace} { puts "2 wblk for $nblk" }
set tbeg [clock clicks -milliseconds]
set tbeg [clock milliseconds]
set addr 0x0000
for {set i 1} {1} {incr i} {
rlc exec \
74,7 → 75,7
-wreg br.cntl $addr \
-wblk br.data $wbuf0 \
-wblk br.data $wbuf1
set trun [expr {[clock clicks -milliseconds] - $tbeg}]
set trun [expr {[clock milliseconds] - $tbeg}]
if {$trun > $tmax} { break }
set addr [expr {( $addr + 2 * $nblk ) & $amax}]
}
82,7 → 83,7
 
# quad wblk
if {$trace} { puts "4 wblk for $nblk" }
set tbeg [clock clicks -milliseconds]
set tbeg [clock milliseconds]
set addr 0x0000
for {set i 1} {1} {incr i} {
rlc exec \
91,7 → 92,7
-wblk br.data $wbuf1 \
-wblk br.data $wbuf2 \
-wblk br.data $wbuf3
set trun [expr {[clock clicks -milliseconds] - $tbeg}]
set trun [expr {[clock milliseconds] - $tbeg}]
if {$trun > $tmax} { break }
set addr [expr {( $addr + 4 * $nblk ) & $amax}]
}
99,13 → 100,13
 
# single rblk
if {$trace} { puts "1 rblk for $nblk" }
set tbeg [clock clicks -milliseconds]
set tbeg [clock milliseconds]
set addr 0x0000
for {set i 1} {1} {incr i} {
rlc exec \
-wreg br.cntl $addr \
-rblk br.data $nblk rbuf0
set trun [expr {[clock clicks -milliseconds] - $tbeg}]
-rblk br.data $nblk
set trun [expr {[clock milliseconds] - $tbeg}]
if {$trun > $tmax} { break }
set addr [expr {( $addr + $nblk ) & $amax}]
}
114,14 → 115,14
# double rblk
if {2*$nblk <= $rbmax} {
if {$trace} { puts "2 rblk for $nblk" }
set tbeg [clock clicks -milliseconds]
set tbeg [clock milliseconds]
set addr 0x0000
for {set i 1} {1} {incr i} {
rlc exec \
-wreg br.cntl $addr \
-rblk br.data $nblk rbuf0 \
-rblk br.data $nblk rbuf1
set trun [expr {[clock clicks -milliseconds] - $tbeg}]
-rblk br.data $nblk \
-rblk br.data $nblk
set trun [expr {[clock milliseconds] - $tbeg}]
if {$trun > $tmax} { break }
set addr [expr {( $addr + 2 * $nblk ) & $amax}]
}
133,16 → 134,16
# quad rblk
if {4*$nblk <= $rbmax} {
if {$trace} { puts "4 rblk for $nblk" }
set tbeg [clock clicks -milliseconds]
set tbeg [clock milliseconds]
set addr 0x0000
for {set i 1} {1} {incr i} {
rlc exec \
-wreg br.cntl $addr \
-rblk br.data $nblk rbuf0 \
-rblk br.data $nblk rbuf1 \
-rblk br.data $nblk rbuf2 \
-rblk br.data $nblk rbuf3
set trun [expr {[clock clicks -milliseconds] - $tbeg}]
-rblk br.data $nblk \
-rblk br.data $nblk \
-rblk br.data $nblk \
-rblk br.data $nblk
set trun [expr {[clock milliseconds] - $tbeg}]
if {$trun > $tmax} { break }
set addr [expr {( $addr + 4 * $nblk ) & $amax}]
}
/trunk/tools/tcl/rbmoni/test_regs.tcl
1,4 → 1,4
# $Id: test_regs.tcl 375 2011-04-02 07:56:47Z mueller $
# $Id: test_regs.tcl 622 2014-12-28 20:45:26Z mueller $
#
# Copyright 2011- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
13,6 → 13,7
#
# Revision History:
# Date Rev Version Comment
# 2014-12-27 622 2.0 rbd_rbmon reorganized, supports now 16 bit addresses
# 2011-03-27 374 1.0 Initial version
# 2011-03-13 369 0.1 First Draft
#
38,27 → 39,34
#
#-------------------------------------------------------------------------
rlc log " test 1: write/read cntl"
foreach val [list [regbld rbmoni::CNTL go] 0x0] {
rlc exec -estatdef $esdval $esdmsk \
-wreg rm.cntl $val \
-rreg rm.cntl -edata $val
}
rlc exec -estatdef $esdval $esdmsk \
-wreg rm.cntl [regbld rbmoni::CNTL start] \
-rreg rm.cntl -edata [regbld rbmoni::CNTL start] \
-wreg rm.cntl [regbld rbmoni::CNTL stop] \
-rreg rm.cntl -edata 0 \
-wreg rm.cntl [regbld rbmoni::CNTL start wena] \
-rreg rm.cntl -edata [regbld rbmoni::CNTL start wena] \
-wreg rm.cntl [regbld rbmoni::CNTL stop] \
-rreg rm.cntl -edata 0
#
#-------------------------------------------------------------------------
rlc log " test 2: write/read alim"
foreach val [list [regbld rbmoni::ALIM {hilim 0x00} {lolim 0x00}] \
[regbld rbmoni::ALIM {hilim 0xff} {lolim 0xff}] \
[regbld rbmoni::ALIM {hilim 0x00} {lolim 0xff}] \
[regbld rbmoni::ALIM {hilim 0xff} {lolim 0x00}]
] {
rlc log " test 2: read stat"
rlc exec -estatdef $esdval $esdmsk \
-rreg rm.stat rstat
set bsize [regget rbmoni::STAT(bsize) $rstat]
set amax [expr {( 512 << $bsize ) - 1}]
#
#-------------------------------------------------------------------------
rlc log " test 3: write/read hilim/lolim"
foreach {lolim hilim} {0xffff 0x0000 \
0x0000 0xfffb} {
rlc exec -estatdef $esdval $esdmsk \
-wreg rm.alim $val \
-rreg rm.alim -edata $val
-wreg rm.lolim $lolim -wreg rm.hilim $hilim \
-rreg rm.lolim -edata $lolim -rreg rm.hilim -edata $hilim
}
#
#-------------------------------------------------------------------------
rlc log " test 3: write/read addr"
set amax [regget rbmoni::ADDR(laddr) -1]
rlc log " test 4: write/read addr"
foreach {laddr waddr} [list 0x0000 0 0x0000 3 $amax 0 $amax 3] {
set addr [regbld rbmoni::ADDR [list laddr $laddr] [list waddr $waddr]]
rlc exec -estatdef $esdval $esdmsk \
67,16 → 75,16
}
#
#-------------------------------------------------------------------------
rlc log " test 4: verify that cntl.go 0->1 clear addr"
rlc log " test 5: verify that cntl.go 0->1 clear addr"
rlc exec -estatdef $esdval $esdmsk \
-wreg rm.cntl 0x0 \
-wreg rm.cntl [regbld rbmoni::CNTL stop] \
-rreg rm.cntl -edata 0x0 \
-wreg rm.addr [regbld rbmoni::ADDR [list laddr $amax]] \
-rreg rm.addr -edata [regbld rbmoni::ADDR [list laddr $amax]] \
-wreg rm.cntl [regbld rbmoni::CNTL go] \
-rreg rm.cntl -edata [regbld rbmoni::CNTL go] \
-wreg rm.cntl [regbld rbmoni::CNTL start] \
-rreg rm.cntl -edata [regbld rbmoni::CNTL start] \
-rreg rm.addr -edata 0x00 \
-wreg rm.cntl 0x0 \
-wreg rm.cntl [regbld rbmoni::CNTL stop] \
-rreg rm.cntl -edata 0x0
#
#-------------------------------------------------------------------------
/trunk/tools/tcl/rbmoni/test_rbtest.tcl
1,6 → 1,6
# $Id: test_rbtest.tcl 516 2013-05-05 21:24:52Z mueller $
# $Id: test_rbtest.tcl 619 2014-12-23 13:17:41Z mueller $
#
# Copyright 2011-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
# Copyright 2011-2014 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
13,6 → 13,7
#
# Revision History:
# Date Rev Version Comment
# 2014-12-22 619 2.0 adopt to new rbd_rbmon and rlink v4
# 2011-03-27 374 1.0 Initial version
# 2011-03-13 369 0.1 First Draft
#
40,32 → 41,40
rbtest::init
#
set atecntl [rlc amap te.cntl]
set atestat [rlc amap te.stat]
set ateattn [rlc amap te.attn]
set atencyc [rlc amap te.ncyc]
set atedata [rlc amap te.data]
set atedinc [rlc amap te.dinc]
set atefifo [rlc amap te.fifo]
set atelnak [rlc amap te.lnak]
 
#
#-------------------------------------------------------------------------
rlc log " test 1: exercise monitor data access via data/addr regs"
 
set vtecntl [regbld rbtest::CNTL {stat -1}]
set vtestat 0xf
set vtedata 0x1234
 
# setup te.cntl and te.data
# write/read te.stat and te.data with rbmoni on; check that 4 lines aquired
rlc exec -estatdef $esdval $esdmsk \
-wreg te.cntl $vtecntl \
-wreg te.data $vtedata
 
# read te.cntl and te.data with rbmoni on; check that 2 lines aquired
rlc exec -estatdef $esdval $esdmsk \
-wreg rm.cntl [regbld rbmoni::CNTL go] \
-rreg te.cntl -edata $vtecntl \
-wreg rm.cntl [regbld rbmoni::CNTL start] \
-wreg te.stat $vtestat \
-wreg te.data $vtedata \
-rreg te.stat -edata $vtestat \
-rreg te.data -edata $vtedata \
-wreg rm.cntl 0x0 \
-rreg rm.addr -edata [regbld rbmoni::ADDR {laddr 2}]
-wreg rm.cntl [regbld rbmoni::CNTL stop] \
-rreg rm.addr -edata [regbld rbmoni::ADDR {laddr 4}]
 
if {$print} {puts [print]}
rlc exec -wreg te.stat 0x0; # clear stat to simplify later stat tests
 
# build expect list: list of {eflag eaddr edata enbusy} sublists
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS ack] $atecntl $vtecntl 0] \
[list [regbld rbmoni::FLAGS ack] $atedata $vtedata 0]
[list [regbld rbmoni::FLAGS ack we] $atestat $vtestat 0] \
[list [regbld rbmoni::FLAGS ack we] $atedata $vtedata 0] \
[list [regbld rbmoni::FLAGS ack] $atestat $vtestat 0] \
[list [regbld rbmoni::FLAGS ack] $atedata $vtedata 0]
 
#
#-------------------------------------------------------------------------
72,21 → 81,25
rlc log " test 1a: read all in one rblk"
rlc exec -estatdef $esdval $esdmsk \
-wreg rm.addr 0x0000 \
-rblk rm.data 8 -edata $edat $emsk \
-rreg rm.addr -edata 0x8
-rblk rm.data 16 -edata $edat $emsk \
-rreg rm.addr -edata 16
 
#
#-------------------------------------------------------------------------
rlc log " test 1b: random address with rreg"
foreach addr {0x1 0x3 0x5 0x7 0x6 0x4 0x2 0x0} {
foreach addr {0x1 0x3 0x5 0x7 0x6 0x4 0x2 0x0 \
0x9 0xb 0xd 0xf 0xe 0xc 0xa 0x8} {
rlc exec -estatdef $esdval $esdmsk \
-wreg rm.addr $addr \
-rreg rm.data -edata [lindex $edat $addr] [lindex $emsk $addr] \
-rreg rm.addr -edata [expr {$addr + 1}]
}
 
#
#-------------------------------------------------------------------------
rlc log " test 1c: random address with rblk length 2"
foreach addr {0x1 0x3 0x5 0x6 0x4 0x2 0x0} {
foreach addr {0x1 0x3 0x5 0x7 0x6 0x4 0x2 0x0 \
0x9 0xb 0xd 0xe 0xc 0xa 0x8} {
rlc exec -estatdef $esdval $esdmsk \
-wreg rm.addr $addr \
-rblk rm.data 2 -edata [lrange $edat $addr [expr {$addr + 1}] ] \
93,6 → 106,7
[lrange $emsk $addr [expr {$addr + 1}] ] \
-rreg rm.addr -edata [expr {$addr + 2}]
}
 
#
#-------------------------------------------------------------------------
rlc log " test 2a: test rreg,wreg capture (ncyc=0); ack, we flags"
151,8 → 165,8
rbmoni::start
rlc exec -estatdef $esdval $esdmsk \
-wreg te.cntl $vtecntl \
-wreg te.data $vtedata -estat [regbld rlink::STAT rbnak] \
-rreg te.data -edata 0x5555 -estat [regbld rlink::STAT rbnak] \
-wreg te.data $vtedata -estat [regbld rlink::STAT rbtout] \
-rreg te.data -edata 0x5555 -estat [regbld rlink::STAT rbtout] \
-wreg te.cntl 0
rbmoni::stop
if {$print} {puts [print]}
161,21 → 175,16
#
#-------------------------------------------------------------------------
rlc log " test 2d: test rreg,wreg capture (prompt nak); nak flag"
set vtecntl [regbld rbtest::CNTL nofifo]
set vtefifo 0xdead
set vtelnak 0xdead
# build expect list: list of {eflag eaddr edata enbusy} sublists
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS ack we] $atecntl $vtecntl 0] \
[list [regbld rbmoni::FLAGS nak we] $atefifo $vtefifo 0] \
[list [regbld rbmoni::FLAGS nak ] $atefifo {} 0] \
[list [regbld rbmoni::FLAGS ack we] $atecntl 0 0]
[list [regbld rbmoni::FLAGS nak we] $atelnak $vtelnak 0] \
[list [regbld rbmoni::FLAGS nak ] $atelnak {} 0]
#
rbmoni::start
rlc exec -estatdef $esdval $esdmsk \
-wreg te.cntl $vtecntl \
-wreg te.fifo $vtefifo -estat [regbld rlink::STAT rbnak] \
-rreg te.fifo -estat [regbld rlink::STAT rbnak] \
-wreg te.cntl 0
-wreg te.lnak $vtelnak -estat [regbld rlink::STAT rbnak] \
-rreg te.lnak -estat [regbld rlink::STAT rbnak]
rbmoni::stop
if {$print} {puts [print]}
raw_check $edat $emsk
183,20 → 192,20
#
#-------------------------------------------------------------------------
rlc log " test 2e: test rreg,wreg capture (delayed nak); nak flag"
set vtecntl [regbld rbtest::CNTL nofifo {nbusy 7}]
set vtefifo 0xdead
# build expect list: list of {eflag eaddr edata enbusy} sublists
set vtecntl [regbld rbtest::CNTL {nbusy 7}]
set vtelnak 0xdead
# build expect list: list of {eflag eaddr edata enbusy} sublists
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS ack we] $atecntl $vtecntl 0] \
[list [regbld rbmoni::FLAGS ack busy nak we] $atefifo $vtefifo 7] \
[list [regbld rbmoni::FLAGS ack busy nak ] $atefifo {} 7] \
[list [regbld rbmoni::FLAGS ack busy nak we] $atelnak $vtelnak 7] \
[list [regbld rbmoni::FLAGS ack busy nak ] $atelnak {} 7] \
[list [regbld rbmoni::FLAGS ack we] $atecntl 0 0]
#
rbmoni::start
rlc exec -estatdef $esdval $esdmsk \
-wreg te.cntl $vtecntl \
-wreg te.fifo $vtefifo -estat [regbld rlink::STAT rbnak] \
-rreg te.fifo -estat [regbld rlink::STAT rbnak] \
-wreg te.lnak $vtelnak -estat [regbld rlink::STAT rbnak] \
-rreg te.lnak -estat [regbld rlink::STAT rbnak] \
-wreg te.cntl 0
rbmoni::stop
if {$print} {puts [print]}
244,16 → 253,16
rbmoni::stop
if {$print} {puts [print]}
raw_check $edat $emsk
 
#
#-------------------------------------------------------------------------
rlc log " test 3: test init capture; init flag"
set vtecntl [regbld rbtest::CNTL {nofifo}]
set vteinit [regbld rbtest::INIT {cntl}]
set vtecntl [regbld rbtest::CNTL {nbusy 2}]
set vteinit [regbld rbtest::INIT cntl]
# build expect list: list of {eflag eaddr edata enbusy} sublists
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS ack we ] $atecntl $vtecntl 0] \
[list [regbld rbmoni::FLAGS nak init we] $atecntl $vteinit 0] \
[list [regbld rbmoni::FLAGS nak init ] $atecntl $vteinit 0] \
[list [regbld rbmoni::FLAGS ack ] $atecntl 0 0]
#
rbmoni::start
268,20 → 277,20
#
#-------------------------------------------------------------------------
rlc log " test 4: test rblk,wblk capture (ncyc=2 on read)"
set vteinit [regbld rbtest::INIT cntl fifo]
set vteinit [regbld rbtest::INIT cntl]
set nbusy_2 [regbld rbtest::CNTL {nbusy 2}]
set vtefifo {0xdead 0xbeaf 0x4711}
# build expect list: list of {eflag eaddr edata enbusy} sublists
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS nak init we] $atecntl $vteinit 0] \
[list [regbld rbmoni::FLAGS ack we] $atefifo 0xdead 0] \
[list [regbld rbmoni::FLAGS ack we] $atefifo 0xbeaf 0] \
[list [regbld rbmoni::FLAGS ack we] $atefifo 0x4711 0] \
[list [regbld rbmoni::FLAGS ack we] $atecntl $nbusy_2 0] \
[list [regbld rbmoni::FLAGS ack busy ] $atefifo 0xdead 2] \
[list [regbld rbmoni::FLAGS ack busy ] $atefifo 0xbeaf 2] \
[list [regbld rbmoni::FLAGS ack busy ] $atefifo 0x4711 2] \
[list [regbld rbmoni::FLAGS nak init we] $atecntl $vteinit 0]
[list [regbld rbmoni::FLAGS nak init] $atecntl $vteinit 0] \
[list [regbld rbmoni::FLAGS ack we] $atefifo 0xdead 0] \
[list [regbld rbmoni::FLAGS burst ack we] $atefifo 0xbeaf 0] \
[list [regbld rbmoni::FLAGS burst ack we] $atefifo 0x4711 0] \
[list [regbld rbmoni::FLAGS ack we] $atecntl $nbusy_2 0] \
[list [regbld rbmoni::FLAGS ack busy ] $atefifo 0xdead 2] \
[list [regbld rbmoni::FLAGS burst ack busy ] $atefifo 0xbeaf 2] \
[list [regbld rbmoni::FLAGS burst ack busy ] $atefifo 0x4711 2] \
[list [regbld rbmoni::FLAGS nak init] $atecntl $vteinit 0]
#
rbmoni::start
rlc exec -estatdef $esdval $esdmsk \
296,6 → 305,36
 
#
#-------------------------------------------------------------------------
rlc log " test 5: test lolim,hilim"
# set window to te.ncyc to te.dinc, thus exclude cntl,stat,attn,fifo,lnak
rlc exec -wreg rm.lolim $atencyc \
-wreg rm.hilim $atedinc
 
# now access all regs, but only ncyc,data,dinc should be recorded
raw_edata edat emsk \
[list [regbld rbmoni::FLAGS ack ] $atencyc 0x0001 0] \
[list [regbld rbmoni::FLAGS ack we] $atedata 0x2345 0] \
[list [regbld rbmoni::FLAGS ack ] $atedinc 0x2345 0] \
[list [regbld rbmoni::FLAGS ack ] $atedata 0x2346 0]
#
rbmoni::start
rlc exec -rreg te.cntl \
-rreg te.stat \
-rreg te.attn \
-rreg te.ncyc \
-wreg te.data 0x2345 \
-wreg te.fifo 0xbeaf \
-rreg te.dinc -edata 0x2345 \
-rreg te.fifo -edata 0xbeaf \
-rreg te.data -edata 0x2346 \
-rreg te.lnak
rbmoni::stop
if {$print} {puts [print]}
raw_check $edat $emsk
rbmoni::init
 
#
#-------------------------------------------------------------------------
rlc log "rbmoni::test_rbtest - cleanup:"
rbtest::init
rbmoni::init
/trunk/tools/tcl/rbmoni/util.tcl
1,4 → 1,4
# $Id: util.tcl 603 2014-11-09 22:50:26Z mueller $
# $Id: util.tcl 619 2014-12-23 13:17:41Z mueller $
#
# Copyright 2011-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
13,6 → 13,7
#
# Revision History:
# Date Rev Version Comment
# 2014-12-23 619 3.0 rbd_rbmon reorganized, supports now 16 bit addresses
# 2014-11-09 603 2.0 use rlink v4 address layout
# 2011-03-27 374 1.0 Initial version
# 2011-03-13 369 0.1 First draft
27,25 → 28,28
#
# setup register descriptions for rbd_rbmon
#
regdsc CNTL {go 0}
regdsc ALIM {hilim 15 8} {lolim 7 8}
regdsc ADDR {wrap 15} {addr 10 11 "-"} {laddr 10 9} {waddr 1 2}
regdsc CNTL {wena 2} {stop 1} {start 0}
regdsc STAT {bsize 15 3} {wrap 0}
regdsc ADDR {laddr 15 14} {waddr 1 2}
#
regdsc DAT3 {flags 15 8 "-"} {ack 15} {busy 14} {err 13} {nak 12} {tout 11} \
{init 9} {we 8} {addr 7 8}
regdsc DAT0 {ndlymsb 15 4} {nbusy 11 12}
regdsc DAT3 {flags 15 8 "-"} {burst 15} {tout 14} {nak 13} {ack 12} \
{busy 11} {err 10} {we 9} {init 8} {ndlymsb 7 8}
regdsc DAT2 {ndlylsb 15 6} {nbusy 9 10}
#
# 'pseudo register', describes 1st word in return list element of rbmoni::read
# must have same bit sequence as DAT3(flags)
regdsc FLAGS {ack 7} {busy 6} {err 5} {nak 4} {tout 3} {init 1} {we 0}
# same bits as DAT3(flags) (but shifted positions) plus bnext
regdsc FLAGS {bnext 8} {burst 7} {tout 6} {nak 5} {ack 4} \
{busy 3} {err 2} {we 1} {init 0}
#
# setup: amap definitions for rbd_rbmon
#
proc setup {{base 0xffe8}} {
rlc amap -insert rm.cntl [expr {$base + 0x00}]
rlc amap -insert rm.alim [expr {$base + 0x01}]
rlc amap -insert rm.addr [expr {$base + 0x02}]
rlc amap -insert rm.data [expr {$base + 0x03}]
rlc amap -insert rm.cntl [expr {$base + 0x00}]
rlc amap -insert rm.stat [expr {$base + 0x01}]
rlc amap -insert rm.hilim [expr {$base + 0x02}]
rlc amap -insert rm.lolim [expr {$base + 0x03}]
rlc amap -insert rm.addr [expr {$base + 0x04}]
rlc amap -insert rm.data [expr {$base + 0x05}]
}
#
# init: reset rbd_rbmon (stop, reset alim)
52,34 → 56,37
#
proc init {} {
rlc exec \
-wreg rm.cntl 0x0000 \
-wreg rm.alim [regbld rbmoni::ALIM {hilim 0xff} {lolim 0x00}] \
-wreg rm.cntl [regbld rbmoni::CNTL stop] \
-wreg rm.hilim 0xfffb \
-wreg rm.lolim 0x0000 \
-wreg rm.addr 0x0000
}
#
# start: start the rbmon
#
proc start {} {
rlc exec -wreg rm.cntl [regbld rbmoni::CNTL go]
proc start {{wena 0}} {
rlc exec -wreg rm.cntl [regbld rbmoni::CNTL start [list wena $wena]]
}
#
# stop: stop the rbmon
#
proc stop {} {
rlc exec -wreg rm.cntl 0x0000
rlc exec -wreg rm.cntl [regbld rbmoni::CNTL stop]
}
#
# read: read nent last entries (by default all)
#
proc read {{nent -1}} {
set amax [regget rbmoni::ADDR(laddr) -1]
rlc exec -rreg rm.addr raddr \
-rreg rm.stat rstat
 
set bsize [regget rbmoni::STAT(bsize) $rstat]
set amax [expr {( 512 << $bsize ) - 1}]
if {$nent == -1} { set nent $amax }
 
rlc exec -rreg rm.addr raddr
 
set laddr [regget rbmoni::ADDR(laddr) $raddr]
set nval $laddr
if {[regget rbmoni::ADDR(wrap) $raddr]} { set nval $amax }
if {[regget rbmoni::STAT(wrap) $rstat]} { set nval $amax }
 
if {$nent > $nval} {set nent $nval}
if {$nent == 0} { return {} }
89,24 → 96,38
 
set rval {}
 
while {$nent > 0} {
set nblk [expr {$nent << 2}]
set nrest $nent
while {$nrest > 0} {
set nblk [expr {$nrest << 2}]
if {$nblk > 256} {set nblk 256}
rlc exec -rblk rm.data $nblk rawdat
 
foreach {d0 d1 d2 d3} $rawdat {
set eflag [regget rbmoni::DAT3(flags) $d3]
set eaddr [regget rbmoni::DAT3(addr) $d3]
set edly [expr {( [regget rbmoni::DAT0(ndlymsb) $d0] << 16 ) | $d1 }]
set enbusy [regget rbmoni::DAT0(nbusy) $d0]
lappend rval [list $eflag $eaddr $d2 $edly $enbusy]
set edelay [expr {( [regget rbmoni::DAT3(ndlymsb) $d3] << 6 ) |
[regget rbmoni::DAT2(ndlylsb) $d2] }]
set enbusy [regget rbmoni::DAT2(nbusy) $d2]
set edata $d1
set eaddr $d0
lappend rval [list $eflag $eaddr $edata $edelay $enbusy]
}
 
set nent [expr {$nent - ( $nblk >> 2 ) }]
set nrest [expr {$nrest - ( $nblk >> 2 ) }]
}
 
rlc exec -wreg rm.addr $raddr
 
set mbnext [regbld rbmoni::FLAGS bnext]
set mburst [regbld rbmoni::FLAGS burst]
 
# now set bnext flag when burst is set in following entry
for {set i 1} {$i < $nent} {incr i} {
if {[lindex $rval $i 0] & int($mburst)} {
set i1 [expr {$i - 1} ]
lset rval $i1 0 [expr {[lindex $rval $i1 0] | $mbnext}]
}
}
 
return $rval
}
#
123,33 → 144,63
}
 
set rval {}
set edlymax 16383
 
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 nbsy flags bu to na ac bs er mode"
 
set mbnext [regbld rbmoni::FLAGS bnext]
set mburst [regbld rbmoni::FLAGS burst]
set mtout [regbld rbmoni::FLAGS tout ]
set mnak [regbld rbmoni::FLAGS nak ]
set mack [regbld rbmoni::FLAGS ack ]
set mbusy [regbld rbmoni::FLAGS busy ]
set merr [regbld rbmoni::FLAGS err ]
set mwe [regbld rbmoni::FLAGS we ]
set minit [regbld rbmoni::FLAGS init ]
set mblk [expr {$mbnext | $mburst}]
 
foreach {ele} $mondat {
foreach {eflag eaddr edata edly enbusy} $ele { break }
set fack [regget rbmoni::FLAGS(ack) $eflag]
set fbsy [regget rbmoni::FLAGS(busy) $eflag]
set ferr [regget rbmoni::FLAGS(err) $eflag]
set fnak [regget rbmoni::FLAGS(nak) $eflag]
set fto [regget rbmoni::FLAGS(tout) $eflag]
set fini [regget rbmoni::FLAGS(init) $eflag]
set fwe [regget rbmoni::FLAGS(we) $eflag]
set ename ""
set comment ""
if {$ferr} {append comment " err=1!"}
if {$fini} {
append comment " init"
 
set fburst [expr {$eflag & $mburst}]
set ftout [expr {$eflag & $mtout} ]
set fnak [expr {$eflag & $mnak} ]
set fack [expr {$eflag & $mack} ]
set fbusy [expr {$eflag & $mbusy} ]
set ferr [expr {$eflag & $merr} ]
set fwe [expr {$eflag & $mwe} ]
set finit [expr {$eflag & $minit} ]
 
set pburst [expr {$fburst ? "bu" : " "}]
set ptout [expr {$ftout ? "to" : " "}]
set pnak [expr {$fnak ? "na" : " "}]
set pack [expr {$fack ? "ac" : " "}]
set pbusy [expr {$fbusy ? "bs" : " "}]
set perr [expr {$ferr ? "er" : " "}]
set pmode "????"
if {$finit} {
set pmode "init"
} else {
if {$fnak} {append comment " nak=1!"}
if {$fwe} {
set pmode [expr {$eflag & $mblk ? "wblk" : "wreg"}]
} else {
set pmode [expr {$eflag & $mblk ? "rblk" : "rreg"}]
}
}
if {$fto} {append comment " tout=1!"}
 
set pedly [expr {$edly!=$edlymax ? [format "%5d" $edly] : " --"}]
set ename [format "%4.4x" $eaddr]
set comment ""
if {$ferr} {append comment " ERR=1!"}
if {!$finit && $fnak} {append comment " NAK=1!"}
if {$ftout} {append comment " TOUT=1!"}
if {[rlc amap -testaddr $eaddr]} {set ename [rlc amap -name $eaddr]}
append rval [format \
"\n%4d %-10s %4.4x %6d %4d %2.2x %d %d %d %d %d %d %d %s" \
$eind $ename $edata $edly $enbusy $eflag \
$fack $fbsy $ferr $fnak $fto $fini $fwe $comment]
"\n%5d %-10s %4.4x %5s %4d %s %s %s %s %s %s %s %s %s" \
$eind $ename $edata $pedly $enbusy [pbvi b8 $eflag] \
$pburst $ptout $pnak $pack $pbusy $perr $pmode $comment]
incr eind
}
 
166,22 → 217,23
set uedat {}
set uemsk {}
 
set m0 [expr {0xffff & ~[regget rbmoni::DAT0(nbusy) -1] }]
set d1 0x0000
set m1 0xffff
set m3 0x0000
set m3 [regbld rbmoni::DAT3 {ndlymsb -1}]
set m2 [regbld rbmoni::DAT2 {ndlylsb -1}]
set m1 0
set m0 0
 
foreach line $args {
foreach {eflags eaddr edata enbusy} $line { break }
set d0 [regbld rbmoni::DAT0 [list nbusy $enbusy]]
set d3 [regbld rbmoni::DAT3 [list flags $eflags]]
set d2 [regbld rbmoni::DAT2 [list nbusy $enbusy]]
if {$edata ne ""} {
set m2 0x0000
set d2 $edata
set m1 0x0000
set d1 $edata
} else {
set m2 0xffff
set d2 0x0000
set m1 0xffff
set d1 0x0000
}
set d3 [regbld rbmoni::DAT3 [list flags $eflags] [list addr $eaddr]]
set d0 $eaddr
 
lappend uedat $d0 $d1 $d2 $d3
lappend uemsk $m0 $m1 $m2 $m3
/trunk/tools/tcl/rbs3hio/util.tcl
1,4 → 1,4
# $Id: util.tcl 516 2013-05-05 21:24:52Z mueller $
# $Id: util.tcl 620 2014-12-25 10:48:35Z mueller $
#
# Copyright 2011-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
34,7 → 34,7
#
# setup: amap definitions for s3_humanio_rbus
#
proc setup {base} {
proc setup {{base 0xfef0}} {
rlc amap -insert hi.cntl [expr {$base + 0x00}]
rlc amap -insert hi.swi [expr {$base + 0x01}]
rlc amap -insert hi.led [expr {$base + 0x02}]
/trunk/tools/tcl/tst_rlink/test_all.tcl
1,4 → 1,4
# $Id: test_all.tcl 603 2014-11-09 22:50:26Z mueller $
# $Id: test_all.tcl 618 2014-12-21 23:05:48Z mueller $
#
# Copyright 2011-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
33,8 → 33,8
#
set errcnt 0
incr errcnt [rbtest::test_all 0xf 0xfffc]
##incr errcnt [rbmoni::test_regs]
##incr errcnt [rbmoni::test_rbtest]
incr errcnt [rbmoni::test_regs]
incr errcnt [rbmoni::test_rbtest]
 
puts "tst_rlink::test_all errcnt = $errcnt --> [rutil::errcnt2txt $errcnt]"
 
/trunk/tools/tcl/tst_rlink/perf.tcl
1,4 → 1,4
# $Id: perf.tcl 606 2014-11-24 07:08:51Z mueller $
# $Id: perf.tcl 622 2014-12-28 20:45:26Z mueller $
#
# Copyright 2011-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
36,7 → 36,7
-wreg timer.1 0
rlc exec -attn
 
set tbeg [clock clicks -milliseconds]
set tbeg [clock milliseconds]
rlc exec -wreg timer.0 $dly
for {set i 1} {1} {incr i} {
rlc wtlam 1.
43,7 → 43,7
rlc exec \
-attn \
-wreg timer.0 $dly
set trun [expr {[clock clicks -milliseconds] - $tbeg}]
set trun [expr {[clock milliseconds] - $tbeg}]
if {$trun > $tmax} { break }
}
set ms [expr {double($trun) / double($i)}]
/trunk/tools/tcl/rw11/defs.tcl
1,4 → 1,4
# $Id: defs.tcl 553 2014-03-17 06:40:08Z mueller $
# $Id: defs.tcl 621 2014-12-26 21:20:05Z mueller $
#
# Copyright 2014- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
#
27,7 → 27,6
#
regdsc CP_CNTL {func 3 0}
regdsc CP_STAT {rust 7 4} {halt 3} {go 2} {merr 1} {err 0}
regdsc CP_IBRB {base 12 7} {bw 1 2}
regdsc CP_AH {ubm 7} {p22 6} {addr 5 6}
#
# setup w11a register descriptions -----------------------------------------
/trunk/tools/tcl/rw11/cpucons.tcl
1,6 → 1,6
# $Id: cpucons.tcl 512 2013-04-28 07:44:02Z mueller $
# $Id: cpucons.tcl 626 2015-01-03 14:41:37Z mueller $
#
# Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
# Copyright 2013-2015 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
13,6 → 13,7
#
# Revision History:
# Date Rev Version Comment
# 2015-01-02 626 1.0.1 BUGFIX: proc "<": use \r to signal <ENTER>
# 2013-04-26 510 1.0 Initial version
#
 
70,7 → 71,7
#
proc "<" {args} {
set str [join $args " "]
append str "\n"
append str "\r"
cpu0tta0 type $str
return ""
}
/trunk/tools/tbench/test_cp_ibrbasics.tcl
1,4 → 1,4
# $Id: test_cp_ibrbasics.tcl 552 2014-03-02 23:02:00Z mueller $
# $Id: test_cp_ibrbasics.tcl 621 2014-12-26 21:20:05Z mueller $
#
# Copyright 2014- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
5,6 → 5,7
#
# Revision History:
# Date Rev Version Comment
# 2014-12-26 621 1.1 test membe
# 2014-03-02 552 1.0 Initial version
#
# Test very basic memory interface gymnastics
12,7 → 13,7
#
 
# ----------------------------------------------------------------------------
rlc log "test_cp_membasics: Test very basic ibus interface gymnastics"
rlc log "test_cp_ibrbasics: Test very basic ibus interface gymnastics"
 
rlc log " write/read ibus space (MMU SAR SM I regs) via bwm/brm"
$cpu cp -wal 0172240 \
21,4 → 22,77
$cpu cp -wal 0172240 \
-brm 3 -edata {012340 012342 012344}
 
rlc log " write/read ibus space (MMU SAR SM I regs) via wibr/ribr"
$cpu cp -ribr 0172240 -edata 012340 \
-ribr 0172242 -edata 012342 \
-ribr 0172244 -edata 012344
$cpu cp -wibr 0172240 022340 \
-wibr 0172242 022342 \
-wibr 0172244 022344
$cpu cp -ribr 0172240 -edata 022340 \
-ribr 0172242 -edata 022342 \
-ribr 0172244 -edata 022344
 
rlc log " membe with wibr (non sticky)"
$cpu cp -wibr 0172240 0x0100 \
-wibr 0172242 0x0302 \
-wibr 0172244 0x0504
rlc log " membe = 0 (no byte selected)"
$cpu cp -wmembe 0 \
-wibr 0172242 0xffff \
-rmembe -edata 0x03 \
-ribr 0172242 -edata 0x0302
rlc log " membe = 1 (lsb selected)"
$cpu cp -wmembe 0x01 \
-wibr 0172242 0xffaa \
-rmembe -edata 0x03 \
-ribr 0172242 -edata 0x03aa
rlc log " membe = 2 (msb selected)"
$cpu cp -wmembe 0x02 \
-wibr 0172242 0xbbff \
-rmembe -edata 0x03 \
-ribr 0172242 -edata 0xbbaa
 
$cpu cp -ribr 0172240 -edata 0x0100 \
-ribr 0172242 -edata 0xbbaa \
-ribr 0172244 -edata 0x0504
 
rlc log " membe with wibr (sticky)"
$cpu cp -wibr 0172240 0x1110 \
-wibr 0172242 0x1312 \
-wibr 0172244 0x1514
 
rlc log " membe = 0 + stick (no byte selected)"
$cpu cp -wmembe 0 -stick \
-wibr 0172242 0xffff \
-rmembe -edata 0x04 \
-ribr 0172242 -edata 0x1312
 
rlc log " membe = 1 + stick (lsb selected)"
$cpu cp -wmembe 1 -stick \
-wibr 0172240 0xffaa \
-rmembe -edata 0x05 \
-wibr 0172242 0xffbb \
-rmembe -edata 0x05 \
-wibr 0172244 0xffcc \
-rmembe -edata 0x05
$cpu cp -ribr 0172240 -edata 0x11aa \
-ribr 0172242 -edata 0x13bb \
-ribr 0172244 -edata 0x15cc
 
rlc log " membe = 2 + stick (msb selected)"
$cpu cp -wmembe 2 -stick \
-wibr 0172240 0xccff \
-rmembe -edata 0x06 \
-wibr 0172242 0xbbff \
-rmembe -edata 0x06 \
-wibr 0172244 0xaaff \
-rmembe -edata 0x06
$cpu cp -ribr 0172240 -edata 0xccaa \
-ribr 0172242 -edata 0xbbbb \
-ribr 0172244 -edata 0xaacc
rlc log " membe = 3 again"
$cpu cp -wmembe 3 \
-rmembe -edata 0x03
 
# --------------------------------------------------------------------
/trunk/tools/tbench/test_cp_membasics.tcl
1,4 → 1,4
# $Id: test_cp_membasics.tcl 552 2014-03-02 23:02:00Z mueller $
# $Id: test_cp_membasics.tcl 621 2014-12-26 21:20:05Z mueller $
#
# Copyright 2014- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
70,5 → 70,3
 
$cpu cp -wal 02200 \
-brm 4 -edata {007700 007710 007720 007730}
 
 
/trunk/tools/tbench/test_cp_psw.tcl
1,10 → 1,11
# $Id: test_cp_psw.tcl 552 2014-03-02 23:02:00Z mueller $
# $Id: test_cp_psw.tcl 621 2014-12-26 21:20:05Z mueller $
#
# Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
# Copyright 2013-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
#
# Revision History:
# Date Rev Version Comment
# 2014-12-26 621 1.0.1 adopt to 4k word ibus window
# 2013-03-31 502 1.0 Initial version
#
# Test that psw is writable and readable via various ways
11,7 → 12,7
# 1. direct cp access
# 2. via 16bit memory addressing
# 3. via 22bit memory addressing
# 4. via ibr mapping
# 4. via ibr window
#
# This test not only verifies psw, but also all basic access methods
#
41,10 → 42,8
}
 
rlc log " write/read via ibr window"
$cpu cp -wibrb 0177700 \
-ribrb -edata 0017700
foreach w { 000000 000017 } {
$cpu cp -wibr 076 $w \
-ribr 076 -edata $w \
-rps -edata $w
$cpu cp -wibr 0177776 $w \
-ribr 0177776 -edata $w \
-rps -edata $w
}
/trunk/tools/src/librw11/Rw11.hpp
1,6 → 1,6
// $Id: Rw11.hpp 502 2013-04-02 19:29:30Z mueller $
// $Id: Rw11.hpp 625 2014-12-30 16:17:45Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2014 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-29 624 1.1 adopt to Rlink V4 attn logic
// 2013-03-06 495 1.0 Initial version
// 2013-01-27 478 0.1 First draft
// ---------------------------------------------------------------------------
20,7 → 21,7
 
/*!
\file
\version $Id: Rw11.hpp 502 2013-04-02 19:29:30Z mueller $
\version $Id: Rw11.hpp 625 2014-12-30 16:17:45Z mueller $
\brief Declaration of class Rw11.
*/
 
61,7 → 62,7
static const int kLam = 0; //!< W11 CPU cluster lam
 
protected:
int AttnHandler(const RlinkServer::AttnArgs& args);
int AttnHandler(RlinkServer::AttnArgs& args);
 
protected:
boost::shared_ptr<RlinkServer> fspServ;
/trunk/tools/src/librw11/Rw11CntlPC11.hpp
1,6 → 1,6
// $Id: Rw11CntlPC11.hpp 515 2013-05-04 17:28:59Z mueller $
// $Id: Rw11CntlPC11.hpp 623 2014-12-29 19:11:40Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2014 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-29 623 1.1 adopt to Rlink V4 attn logic
// 2013-05-03 515 1.0 Initial version
// ---------------------------------------------------------------------------
 
19,7 → 20,7
 
/*!
\file
\version $Id: Rw11CntlPC11.hpp 515 2013-05-04 17:28:59Z mueller $
\version $Id: Rw11CntlPC11.hpp 623 2014-12-29 19:11:40Z mueller $
\brief Declaration of class Rw11CntlPC11.
*/
 
71,7 → 72,7
static const uint16_t kPBUF_M_BUF = 0377;
 
protected:
int AttnHandler(const RlinkServer::AttnArgs& args);
int AttnHandler(RlinkServer::AttnArgs& args);
void SetOnline(size_t ind, bool online);
protected:
/trunk/tools/src/librw11/Rw11Cpu.hpp
1,6 → 1,6
// $Id: Rw11Cpu.hpp 506 2013-04-14 21:54:03Z mueller $
// $Id: Rw11Cpu.hpp 626 2015-01-03 14:41:37Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2015 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2015-01-01 626 1.1 Adopt for rlink v4 and 4k ibus window; add IAddrMap
// 2013-04-14 506 1.0.1 add AddLalh(),AddRMem(),AddWMem()
// 2013-04-12 504 1.0 Initial version
// 2013-01-27 478 0.1 First draft
21,7 → 22,7
 
/*!
\file
\version $Id: Rw11Cpu.hpp 506 2013-04-14 21:54:03Z mueller $
\version $Id: Rw11Cpu.hpp 626 2015-01-03 14:41:37Z mueller $
\brief Declaration of class Rw11Cpu.
*/
 
39,6 → 40,7
#include "librtools/Rstats.hpp"
#include "librtools/RerrMsg.hpp"
#include "librlink/RlinkConnect.hpp"
#include "librlink/RlinkAddrMap.hpp"
 
#include "Rw11Probe.hpp"
 
69,6 → 71,7
const std::string& Type() const;
size_t Index() const;
uint16_t Base() const;
uint16_t IBase() const;
 
void AddCntl(const boost::shared_ptr<Rw11Cntl>& spcntl);
bool TestCntl(const std::string& name) const;
79,7 → 82,8
 
std::string NextCntlName(const std::string& base) const;
 
int AddIbrb(RlinkCommandList& clist, uint16_t ibaddr);
int AddMembe(RlinkCommandList& clist, uint16_t be,
bool stick=false);
int AddRibr(RlinkCommandList& clist, uint16_t ibaddr);
int AddWibr(RlinkCommandList& clist, uint16_t ibaddr,
uint16_t data);
88,10 → 92,12
uint16_t mode=kCp_ah_m_22bit);
int AddRMem(RlinkCommandList& clist, uint32_t addr,
uint16_t* buf, size_t size,
uint16_t mode=kCp_ah_m_22bit);
uint16_t mode=kCp_ah_m_22bit,
bool singleblk=false);
int AddWMem(RlinkCommandList& clist, uint32_t addr,
const uint16_t* buf, size_t size,
uint16_t mode=kCp_ah_m_22bit);
uint16_t mode=kCp_ah_m_22bit,
bool singleblk=false);
 
bool MemRead(uint16_t addr, std::vector<uint16_t>& data,
size_t nword, RerrMsg& emsg);
110,6 → 116,15
bool CpuGo() const;
uint16_t CpuStat() const;
 
uint16_t IbusRemoteAddr(uint16_t ibaddr) const;
void AllAddrMapInsert(const std::string& name, uint16_t ibaddr);
 
bool IAddrMapInsert(const std::string& name, uint16_t ibaddr);
bool IAddrMapErase(const std::string& name);
bool IAddrMapErase(uint16_t ibaddr);
void IAddrMapClear();
const RlinkAddrMap& IAddrMap() const;
 
void W11AttnHandler();
 
const Rstats& Stats() const;
126,8 → 141,7
static const uint16_t kCp_addr_memi = 0x0007; //!<
static const uint16_t kCp_addr_r0 = 0x0008; //!<
static const uint16_t kCp_addr_pc = 0x000f; //!<
static const uint16_t kCp_addr_ibrb = 0x0010; //!<
static const uint16_t kCp_addr_ibr = 0x0080; //!<
static const uint16_t kCp_addr_membe = 0x0010; //!<
 
static const uint16_t kCp_func_noop = 0x0000; //!<
static const uint16_t kCp_func_start = 0x0001; //!<
160,6 → 174,9
static const uint16_t kCp_ah_m_22bit = kWBit06; //!<
static const uint16_t kCp_ah_m_ubmap = kWBit07; //!<
 
static const uint16_t kCp_membe_m_stick = kWBit02; //!<
static const uint16_t kCp_membe_m_be = 0x0003; //!<
 
private:
Rw11Cpu() {} //!< default ctor blocker
 
168,11 → 185,13
std::string fType;
size_t fIndex;
uint16_t fBase;
uint16_t fIBase;
bool fCpuGo;
uint16_t fCpuStat;
boost::mutex fCpuGoMutex;
boost::condition_variable fCpuGoCond;
cmap_t fCntlMap; //!< name->cntl map
RlinkAddrMap fIAddrMap; //!< ibus name<->address mapping
Rstats fStats; //!< statistics
};
/trunk/tools/src/librw11/Rw11CntlLP11.cpp
1,6 → 1,6
// $Id: Rw11CntlLP11.cpp 515 2013-05-04 17:28:59Z mueller $
// $Id: Rw11CntlLP11.cpp 625 2014-12-30 16:17:45Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2014 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
13,6 → 13,8
//
// Revision History:
// Date Rev Version Comment
// 2014-12-30 625 1.2 adopt to Rlink V4 attn logic
// 2014-12-25 621 1.1 adopt to 4k word ibus window
// 2013-05-04 515 1.0 Initial version
// 2013-05-01 513 0.1 First draft
// ---------------------------------------------------------------------------
19,7 → 21,7
 
/*!
\file
\version $Id: Rw11CntlLP11.cpp 515 2013-05-04 17:28:59Z mueller $
\version $Id: Rw11CntlLP11.cpp 625 2014-12-30 16:17:45Z mueller $
\brief Implemenation of Rw11CntlLP11.
*/
 
67,7 → 69,7
: Rw11CntlBase<Rw11UnitLP11,1>("lp11"),
fPC_buf(0)
{
// must here because Unit have a back-pointer (not available at Rw11CntlBase)
// must be here because Units have a back-ptr (not available at Rw11CntlBase)
for (size_t i=0; i<NUnit(); i++) {
fspUnit[i].reset(new Rw11UnitLP11(this, i));
}
97,9 → 99,14
throw Rexception("Rw11CntlLP11::Start",
"Bad state: started, no lam, not enable, not found");
// add device register address ibus and rbus mappings
// done here because now Cntl bound to Cpu and Cntl probed
Cpu().AllAddrMapInsert(Name()+".csr", Base() + kCSR);
Cpu().AllAddrMapInsert(Name()+".buf", Base() + kBUF);
 
// setup primary info clist
fPrimClist.Clear();
Cpu().AddIbrb(fPrimClist, fBase);
fPrimClist.AddAttn();
fPC_buf = Cpu().AddRibr(fPrimClist, fBase+kBUF);
 
// add attn handler
136,14 → 143,12
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
int Rw11CntlLP11::AttnHandler(const RlinkServer::AttnArgs& args)
int Rw11CntlLP11::AttnHandler(RlinkServer::AttnArgs& args)
{
RlinkCommandList* pclist;
size_t off;
GetPrimInfo(args, pclist, off);
fStats.Inc(kStatNAttnHdl);
Server().GetAttnInfo(args, fPrimClist);
 
uint16_t buf = (*pclist)[off+fPC_buf].Data();
uint16_t buf = fPrimClist[fPC_buf].Data();
bool val = buf & kBUF_M_VAL;
uint8_t ochr = buf & kBUF_M_BUF;
 
186,7 → 191,6
Rw11Cpu& cpu = Cpu();
uint16_t csr = online ? 0 : kCSR_M_ERROR;
RlinkCommandList clist;
cpu.AddIbrb(clist, fBase);
cpu.AddWibr(clist, fBase+kCSR, csr);
Server().Exec(clist);
return;
/trunk/tools/src/librw11/Rw11CntlRK11.cpp
1,6 → 1,6
// $Id: Rw11CntlRK11.cpp 562 2014-06-15 17:23:18Z mueller $
// $Id: Rw11CntlRK11.cpp 628 2015-01-04 16:22:09Z mueller $
//
// Copyright 2013-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2015 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Other credits:
// the boot code is from the simh project and Copyright Robert M Supnik
//
15,6 → 15,9
//
// Revision History:
// Date Rev Version Comment
// 2015-01-04 628 2.0 use Rw11RdmaDisk
// 2014-12-30 625 1.2 adopt to Rlink V4 attn logic
// 2014-12-25 621 1.1 adopt to 4k word ibus window
// 2014-06-14 562 1.0.1 Add stats
// 2013-04-20 508 1.0 Initial version
// 2013-02-10 485 0.1 First draft
22,7 → 25,7
 
/*!
\file
\version $Id: Rw11CntlRK11.cpp 562 2014-06-15 17:23:18Z mueller $
\version $Id: Rw11CntlRK11.cpp 628 2015-01-04 16:22:09Z mueller $
\brief Implemenation of Rw11CntlRK11.
*/
 
137,15 → 140,18
fPC_rkda(0),
fPC_rkmr(0),
fPC_rkcs(0),
fRd_busy(false),
fRd_rkcs(0),
fRd_rkda(0),
fRd_addr(0),
fRd_lba(0),
fRd_nwrd(0),
fRd_ovr(false)
fRd_fu(0),
fRd_ovr(false),
fRdma(this,
boost::bind(&Rw11CntlRK11::RdmaPreExecCB, this, _1, _2, _3),
boost::bind(&Rw11CntlRK11::RdmaPostExecCB, this, _1, _2, _3, _4))
{
// must here because Unit have a back-pointer (not available at Rw11CntlBase)
// must be here because Units have a back-ptr (not available at Rw11CntlBase)
for (size_t i=0; i<NUnit(); i++) {
fspUnit[i].reset(new Rw11UnitRK11(this, i));
}
158,10 → 164,6
fStats.Define(kStatNFuncRchk , "NFuncRchk" , "func RCHK");
fStats.Define(kStatNFuncDreset , "NFuncDreset" , "func DRESET");
fStats.Define(kStatNFuncWlock , "NFuncWlock " , "func WLOCK");
fStats.Define(kStatNRdmaWrite , "NRdmaWrite" , "rdma WRITE");
fStats.Define(kStatNRdmaRead , "NRdmaRead" , "rdma READ");
fStats.Define(kStatNRdmaWchk , "NRdmaWchk" , "rdma WCHK");
fStats.Define(kStatNRdmaRchk , "NRdmaRchk" , "rdma RCHK");
}
 
//------------------------------------------+-----------------------------------
188,9 → 190,19
throw Rexception("Rw11CntlRK11::Start",
"Bad state: started, no lam, not enable, not found");
 
// add device register address ibus and rbus mappings
// done here because now Cntl bound to Cpu and Cntl probed
Cpu().AllAddrMapInsert(Name()+".ds", Base() + kRKDS);
Cpu().AllAddrMapInsert(Name()+".er", Base() + kRKER);
Cpu().AllAddrMapInsert(Name()+".cs", Base() + kRKCS);
Cpu().AllAddrMapInsert(Name()+".wc", Base() + kRKWC);
Cpu().AllAddrMapInsert(Name()+".ba", Base() + kRKBA);
Cpu().AllAddrMapInsert(Name()+".da", Base() + kRKDA);
Cpu().AllAddrMapInsert(Name()+".mr", Base() + kRKMR);
 
// setup primary info clist
fPrimClist.Clear();
Cpu().AddIbrb(fPrimClist, fBase);
fPrimClist.AddAttn();
fPC_rkwc = Cpu().AddRibr(fPrimClist, fBase+kRKWC);
fPC_rkba = Cpu().AddRibr(fPrimClist, fBase+kRKBA);
fPC_rkda = Cpu().AddRibr(fPrimClist, fBase+kRKDA);
224,7 → 236,6
rkds |= kRKDS_M_WPS;
}
unit.SetRkds(rkds);
cpu.AddIbrb(clist, fBase);
cpu.AddWibr(clist, fBase+kRKDS, rkds);
Server().Exec(clist);
 
283,14 → 294,14
os << bl << " fPC_rkda: " << fPC_rkda << endl;
os << bl << " fPC_rkmr: " << fPC_rkmr << endl;
os << bl << " fPC_rkcs: " << fPC_rkcs << endl;
os << bl << " fRd_busy: " << fRd_busy << endl;
os << bl << " fRd_rkcs: " << fRd_rkcs << endl;
os << bl << " fRd_rkda: " << fRd_rkda << endl;
os << bl << " fRd_addr: " << fRd_addr << endl;
os << bl << " fRd_lba: " << fRd_lba << endl;
os << bl << " fRd_nwrd: " << fRd_nwrd << endl;
os << bl << " fRd_fu: " << fRd_fu << endl;
os << bl << " fRd_ovr: " << fRd_ovr << endl;
 
fRdma.Dump(os, ind+2, "fRdma: ");
Rw11CntlBase<Rw11UnitRK11,8>::Dump(os, ind, " ^");
return;
}
298,18 → 309,16
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
int Rw11CntlRK11::AttnHandler(const RlinkServer::AttnArgs& args)
int Rw11CntlRK11::AttnHandler(RlinkServer::AttnArgs& args)
{
RlinkCommandList* pclist;
size_t off;
GetPrimInfo(args, pclist, off);
fStats.Inc(kStatNAttnHdl);
Server().GetAttnInfo(args, fPrimClist);
 
uint16_t rkwc = (*pclist)[off+fPC_rkwc].Data();
uint16_t rkba = (*pclist)[off+fPC_rkba].Data();
uint16_t rkda = (*pclist)[off+fPC_rkda].Data();
//uint16_t rkmr = (*pclist)[off+fPC_rkmr].Data();
uint16_t rkcs = (*pclist)[off+fPC_rkcs].Data();
uint16_t rkwc = fPrimClist[fPC_rkwc].Data();
uint16_t rkba = fPrimClist[fPC_rkba].Data();
uint16_t rkda = fPrimClist[fPC_rkda].Data();
//uint16_t rkmr = fPrimClist[fPC_rkmr].Data();
uint16_t rkcs = fPrimClist[fPC_rkcs].Data();
 
uint16_t se = rkda & kRKDA_B_SC;
uint16_t hd = (rkda>>kRKDA_V_SUR) & kRKDA_B_SUR;
347,10 → 356,12
 
if (fTraceLevel>0) {
RlogMsg lmsg(LogFile());
static const char* fumnemo[8] = {"cr","w ","r ","wc","sk","rc","dr","wl"};
lmsg << "-I RK11 cs=" << RosPrintBvi(rkcs,8)
<< " da=" << RosPrintBvi(rkda,8)
<< " ad=" << RosPrintBvi(addr,8,18)
<< " fu=" << fu
<< " fu=" << fumnemo[fu&0x7]
<< " dchs=" << dr
<< "," << RosPrintf(cy,"d",3)
<< "," << hd
386,13 → 397,20
// if found, truncate request length
bool ovr = lba + nblk > unit.NBlock();
if (ovr) nwrd = (unit.NBlock()-lba) * (unit.BlockSize()/2);
bool queue = false;
 
// remember request parameters for call back
fRd_rkcs = rkcs;
fRd_rkda = rkda;
fRd_addr = addr;
fRd_lba = lba;
fRd_nwrd = nwrd;
fRd_ovr = ovr;
fRd_fu = fu;
 
// now handle the functions
if (fu == kRKCS_CRESET) { // Control reset -----------------
fStats.Inc(kStatNFuncCreset);
cpu.AddWibr(clist, fBase+kRKMR, kRKMR_M_CRESET);
fRd_busy = false;
 
} else if (fu == kRKCS_WRITE) { // Write -------------------------
// Note: WRITE+FMT is just WRITE
400,22 → 418,40
if (se >= unit.NSector()) rker |= kRKER_M_NXS;
if (cy >= unit.NCylinder()) rker |= kRKER_M_NXC;
if (unit.WProt()) rker |= kRKER_M_WLO;
if (rkcs & kRKCS_M_IBA) rker |= kRKER_M_DRE; // not yet supported FIXME
queue = true;
if (rkcs & kRKCS_M_IBA) rker |= kRKER_M_DRE; // IBA not supported
if (rker) {
AddErrorExit(clist, rker);
} else {
fRdma.QueueDiskWrite(addr, nwrd,
Rw11Cpu::kCp_ah_m_22bit|Rw11Cpu::kCp_ah_m_ubmap,
lba, &unit);
}
 
} else if (fu == kRKCS_READ) { // Read --------------------------
fStats.Inc(kStatNFuncRead);
if (se >= unit.NSector()) rker |= kRKER_M_NXS;
if (cy >= unit.NCylinder()) rker |= kRKER_M_NXC;
if (rkcs & kRKCS_M_IBA) rker |= kRKER_M_DRE; // not yet supported FIXME
queue = true;
if (rkcs & kRKCS_M_IBA) rker |= kRKER_M_DRE; // IBA not supported
if (rker) {
AddErrorExit(clist, rker);
} else {
fRdma.QueueDiskRead(addr, nwrd,
Rw11Cpu::kCp_ah_m_22bit|Rw11Cpu::kCp_ah_m_ubmap,
lba, &unit);
}
 
} else if (fu == kRKCS_WCHK) { // Write Check -------------------
fStats.Inc(kStatNFuncWchk);
if (se >= unit.NSector()) rker |= kRKER_M_NXS;
if (cy >= unit.NCylinder()) rker |= kRKER_M_NXC;
if (rkcs & kRKCS_M_IBA) rker |= kRKER_M_DRE; // not yet supported FIXME
queue = true;
if (rkcs & kRKCS_M_IBA) rker |= kRKER_M_DRE; // IBA not supported
if (rker) {
AddErrorExit(clist, rker);
} else {
fRdma.QueueDiskWriteCheck(addr, nwrd,
Rw11Cpu::kCp_ah_m_22bit|Rw11Cpu::kCp_ah_m_ubmap,
lba, &unit);
}
 
} else if (fu == kRKCS_SEEK) { // Seek --------------------------
fStats.Inc(kStatNFuncSeek);
439,9 → 475,13
fStats.Inc(kStatNFuncRchk);
if (se >= unit.NSector()) rker |= kRKER_M_NXS;
if (cy >= unit.NCylinder()) rker |= kRKER_M_NXC;
if (rkcs & kRKCS_M_IBA) rker |= kRKER_M_DRE; // not yet supported FIXME
queue = true;
 
if (rkcs & kRKCS_M_IBA) rker |= kRKER_M_DRE; // IBA not supported
if (rker) {
AddErrorExit(clist, rker);
} else {
AddNormalExit(clist, nwrd, 0); // no action, virt disks don't err
}
} else if (fu == kRKCS_DRESET) { // Drive Reset -------------------
fStats.Inc(kStatNFuncDreset);
cpu.AddWibr(clist, fBase+kRKMR, kRKMR_M_FDONE);
456,26 → 496,9
cpu.AddWibr(clist, fBase+kRKMR, kRKMR_M_FDONE);
}
 
if (queue) { // to be handled in RdmaHandlder
if (rker) { // abort on case of errors
cpu.AddWibr(clist, fBase+kRKER, rker);
cpu.AddWibr(clist, fBase+kRKMR, kRKMR_M_FDONE);
LogRker(rker);
} else { // or queue action
fRd_busy = true;
fRd_rkcs = rkcs;
fRd_rkda = rkda;
fRd_addr = addr;
fRd_lba = lba;
fRd_nwrd = nwrd;
fRd_ovr = ovr;
Server().QueueAction(boost::bind(&Rw11CntlRK11::RdmaHandler, this));
}
 
} else { // handled here
Server().Exec(clist);
if (clist.Size()) { // if handled directly
Server().Exec(clist); // doit
}
 
return 0;
}
 
482,168 → 505,122
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
int Rw11CntlRK11::RdmaHandler()
void Rw11CntlRK11::RdmaPreExecCB(int stat, size_t nword,
RlinkCommandList& clist)
{
uint16_t rker = 0;
uint16_t fu = (fRd_rkcs>>kRKCS_V_FUNC) & kRKCS_B_FUNC;
uint16_t dr = (fRd_rkda>>kRKDA_V_DRSEL) & kRKDA_B_DRSEL;
Rw11UnitRK11& unit = *fspUnit[dr];
Rw11Cpu& cpu = Cpu();
// if last chunk and not doing WCHK add a labo and normal exit csr update
if (stat == Rw11Rdma::kStatusBusyLast && fRd_fu != kRKCS_WCHK) {
clist.AddLabo();
AddNormalExit(clist, nword, 0);
}
return;
}
 
uint8_t buf[512];
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
if (fu == kRKCS_WRITE) { // Write -------------------------
// Note: WRITE+FMT is like WRITE
fStats.Inc(kStatNRdmaWrite);
RlinkCommandList clist;
size_t bsize = (fRd_nwrd>256) ? 256 : fRd_nwrd;
cpu.AddRMem(clist, fRd_addr, (uint16_t*) buf, bsize,
Rw11Cpu::kCp_ah_m_22bit|Rw11Cpu::kCp_ah_m_ubmap);
Server().Exec(clist);
// FIXME_code: handle rdma I/O error
RerrMsg emsg;
bool rc = unit.VirtWrite(fRd_lba, 1, buf, emsg);
if (!rc) {
RlogMsg lmsg(LogFile());
lmsg << emsg;
rker |= kRKER_M_CSE; // forward disk I/O error
}
if (rker == 0) {
fRd_nwrd -= bsize;
fRd_addr += 2*bsize;
fRd_lba += 1;
}
if (rker==0 && fRd_nwrd>0) // not error and not yet done
return 1; // requeue
} else if (fu == kRKCS_READ) {
fStats.Inc(kStatNRdmaRead);
if ((fRd_rkcs&kRKCS_M_FMT) == 0) { // Read --------------------------
RerrMsg emsg;
bool rc = unit.VirtRead(fRd_lba, 1, buf, emsg);
if (!rc) {
RlogMsg lmsg(LogFile());
lmsg << emsg;
rker |= kRKER_M_CSE; // forward disk I/O error
}
void Rw11CntlRK11::RdmaPostExecCB(int stat, size_t ndone,
RlinkCommandList& clist, size_t ncmd)
{
if (stat == Rw11Rdma::kStatusBusy) return;
 
if (rker == 0) {
RlinkCommandList clist;
size_t bsize = (fRd_nwrd>256) ? 256 : fRd_nwrd;
cpu.AddWMem(clist, fRd_addr, (uint16_t*) buf, bsize,
Rw11Cpu::kCp_ah_m_22bit|Rw11Cpu::kCp_ah_m_ubmap);
Server().Exec(clist);
// FIXME_code: handle rdma I/O error
fRd_nwrd -= bsize;
fRd_addr += 2*bsize;
fRd_lba += 1;
uint16_t rker = 0;
 
// handle write check
if (fRd_fu == kRKCS_WCHK) {
size_t nwcok = fRdma.WriteCheck(ndone);
if (nwcok != ndone) { // if mismatch found
rker |= kRKER_M_WCE; // set error flag
if (fRd_rkcs & kRKCS_M_SSE) { // if 'stop-on-soft' requested
ndone = nwcok; // truncate word count
}
if (rker==0 && fRd_nwrd>0) // not error and not yet done
return 1; // requeue
} else { // Read Format -------------------
uint16_t cy = fRd_lba / (unit.NHead()*unit.NSector());
uint16_t da = cy<<kRKDA_V_CYL;
RlinkCommandList clist;
cpu.AddWMem(clist, fRd_addr, &da, 1,
Rw11Cpu::kCp_ah_m_22bit|Rw11Cpu::kCp_ah_m_ubmap);
Server().Exec(clist);
// FIXME_code: handle rdma I/O error
fRd_nwrd -= 1;
fRd_addr += 2;
fRd_lba += 1;
if (rker==0 && fRd_nwrd>0) // not error and not yet done
return 1; // requeue
}
} else if (fu == kRKCS_WCHK) { // Write Check -------------------
fStats.Inc(kStatNRdmaWchk);
uint16_t bufmem[256];
RlinkCommandList clist;
size_t bsize = (fRd_nwrd>256) ? 256 : fRd_nwrd;
cpu.AddRMem(clist, fRd_addr, bufmem, bsize,
Rw11Cpu::kCp_ah_m_22bit|Rw11Cpu::kCp_ah_m_ubmap);
Server().Exec(clist);
// FIXME_code: handle rdma I/O error
RerrMsg emsg;
bool rc = unit.VirtRead(fRd_lba, 1, buf, emsg);
if (!rc) {
RlogMsg lmsg(LogFile());
lmsg << emsg;
rker |= kRKER_M_CSE; // forward disk I/O error
}
if (rker == 0) {
uint16_t* pmem = bufmem;
uint16_t* pdsk = (uint16_t*) &buf;
for (size_t i=0; i<bsize; i++) {
if (*pmem++ != *pdsk++) rker |= kRKER_M_WCE;
}
fRd_nwrd -= bsize;
fRd_addr += 2*bsize;
fRd_lba += 1;
}
// determine abort criterion
bool stop = (rker & ~kRKER_M_WCE) != 0 ||
((rker & kRKER_M_WCE) && (fRd_rkcs & kRKCS_M_SSE));
if (!stop && fRd_nwrd>0) // not error and not yet done
return 1; // requeue
}
// handle Rdma aborts
if (stat == Rw11Rdma::kStatusFailRdma) rker |= kRKER_M_NXM;
 
} else if (fu == kRKCS_RCHK) { // Read Check --------------------
// Note: no DMA transfer done; done here to keep logic similar to read
fStats.Inc(kStatNRdmaRchk);
size_t bsize = (fRd_nwrd>256) ? 256 : fRd_nwrd;
fRd_nwrd -= bsize;
fRd_addr += 2*bsize;
fRd_lba += 1;
if (rker==0 && fRd_nwrd>0) // not error and not yet done
return 1; // requeue
 
} else {
throw Rexception("Rw11CntlRK11::RdmaHandler",
"Bad state: bad function code");
// check for fused csr updates
if (clist.Size() > ncmd) {
uint8_t ccode = clist[ncmd].Command();
uint16_t cdata = clist[ncmd].Data();
if (ccode != RlinkCommand::kCmdLabo || (rker != 0 && cdata == 0))
throw Rexception("Rw11CntlRK11::RdmaPostExecCB",
"Bad state: Labo not found or missed abort");
if (cdata == 0) return;
}
 
// common handling for dma transfer completion
if (fRd_ovr) rker |= kRKER_M_OVR;
// finally to RK11 register update
RlinkCommandList clist1;
AddNormalExit(clist1, ndone, rker);
Server().Exec(clist1);
 
RlinkCommandList clist;
uint16_t ba = fRd_addr & 0177776; // get lower 16 bits
uint16_t mex = (fRd_addr>>16) & 03; // get upper 2 bits
return;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11CntlRK11::LogRker(uint16_t rker)
{
RlogMsg lmsg(LogFile());
lmsg << "-E RK11 er=" << RosPrintBvi(rker,8) << " ERROR ABORT";
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11CntlRK11::AddErrorExit(RlinkCommandList& clist, uint16_t rker)
{
Rw11Cpu& cpu = Cpu();
cpu.AddWibr(clist, fBase+kRKER, rker);
cpu.AddWibr(clist, fBase+kRKMR, kRKMR_M_FDONE);
LogRker(rker);
return;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11CntlRK11::AddNormalExit(RlinkCommandList& clist, size_t ndone,
uint16_t rker)
{
Rw11Cpu& cpu = Cpu();
uint16_t dr = (fRd_rkda>>kRKDA_V_DRSEL) & kRKDA_B_DRSEL;
Rw11UnitRK11& unit = *fspUnit[dr];
size_t bszwrd = unit.BlockSize()/2; // block size in words
 
size_t nblk = (ndone+bszwrd-1)/bszwrd;
 
uint32_t addr = fRd_addr + 2*ndone;
size_t lba = fRd_lba + nblk;
uint32_t nrest = fRd_nwrd - ndone;
 
uint16_t ba = addr & 0177776; // get lower 16 bits
uint16_t mex = (addr>>16) & 03; // get upper 2 bits
uint16_t cs = (fRd_rkcs & ~kRKCS_M_MEX) | (mex << kRKCS_V_MEX);
uint16_t se;
uint16_t hd;
uint16_t cy;
unit.Lba2Chs(fRd_lba, cy,hd,se);
unit.Lba2Chs(lba, cy,hd,se);
uint16_t da = (fRd_rkda & kRKDA_M_DRSEL) | (cy<<kRKDA_V_CYL) |
(hd<<kRKDA_V_SUR) | se;
 
cpu.AddIbrb(clist, fBase);
if (fRd_ovr) rker |= kRKER_M_OVR;
 
if (rker) {
cpu.AddWibr(clist, fBase+kRKER, rker);
LogRker(rker);
}
cpu.AddWibr(clist, fBase+kRKWC, uint16_t((-fRd_nwrd)&0177777));
cpu.AddWibr(clist, fBase+kRKWC, uint16_t((-nrest)&0177777));
cpu.AddWibr(clist, fBase+kRKBA, ba);
cpu.AddWibr(clist, fBase+kRKDA, da);
if (cs != fRd_rkcs)
cpu.AddWibr(clist, fBase+kRKCS, cs);
cpu.AddWibr(clist, fBase+kRKMR, kRKMR_M_FDONE);
Server().Exec(clist);
 
fRd_busy = false;
 
return 0;
return;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11CntlRK11::LogRker(uint16_t rker)
{
RlogMsg lmsg(LogFile());
lmsg << "-E RK11 er=" << RosPrintBvi(rker,8) << " ERROR ABORT";
}
 
} // end namespace Retro
/trunk/tools/src/librw11/Rw11RdmaDisk.hpp
0,0 → 1,87
// $Id: Rw11RdmaDisk.hpp 628 2015-01-04 16:22:09Z mueller $
//
// Copyright 2015- 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 2, 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
// 2015-01-04 627 1.0 Initial version
// ---------------------------------------------------------------------------
 
 
/*!
\file
\version $Id: Rw11RdmaDisk.hpp 628 2015-01-04 16:22:09Z mueller $
\brief Declaration of class Rw11RdmaDisk.
*/
 
#ifndef included_Retro_Rw11RdmaDisk
#define included_Retro_Rw11RdmaDisk 1
 
#include <vector>
 
#include "Rw11Rdma.hpp"
#include "Rw11UnitDisk.hpp"
 
namespace Retro {
 
class Rw11RdmaDisk : public Rw11Rdma {
public:
Rw11RdmaDisk(Rw11Cntl* pcntl, const precb_t& precb,
const postcb_t& postcb);
~Rw11RdmaDisk();
 
void QueueDiskRead(uint32_t addr, size_t size, uint16_t mode,
uint32_t lba, Rw11UnitDisk* punit);
void QueueDiskWrite(uint32_t addr, size_t size, uint16_t mode,
uint32_t lba, Rw11UnitDisk* punit);
void QueueDiskWriteCheck(uint32_t addr, size_t size,
uint16_t mode, uint32_t lba,
Rw11UnitDisk* punit);
 
size_t WriteCheck(size_t ndone);
 
virtual void Dump(std::ostream& os, int ind=0, const char* text=0) const;
 
// statistics counter indices
enum stats {
kStatNWritePadded = Rw11Rdma::kDimStat,//!< padded disk write
kStatNWChkFail, //!< write check failed
kDimStat
};
protected:
// function code values
enum func {
kFuncRead, //!< read function
kFuncWrite, //!< write function
kFuncWriteCheck //!< write check function
};
 
void SetupDisk(size_t size, uint32_t lba, Rw11UnitDisk* punit,
Rw11RdmaDisk::func func);
virtual void PreRdmaHook();
virtual void PostRdmaHook(size_t ndone);
 
protected:
std::vector<uint16_t> fBuf; //!< data buffer
Rw11UnitDisk* fpUnit; //!< UnitDisk to read VirtDisk
size_t fNWord; //!< words to transfer
size_t fNBlock; //!< disk blocks to transfer
size_t fLba; //!< disk lba
enum func fFunc; //!< current function
};
} // end namespace Retro
 
#include "Rw11RdmaDisk.ipp"
 
#endif
/trunk/tools/src/librw11/Rw11CntlRK11.ipp
0,0 → 1,55
// $Id: Rw11CntlRK11.ipp 627 2015-01-04 11:36:37Z mueller $
//
// Copyright 2015- 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 2, 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
// 2015-01-03 627 1.0 Initial version
// ---------------------------------------------------------------------------
 
/*!
\file
\version $Id: Rw11CntlRK11.ipp 627 2015-01-04 11:36:37Z mueller $
\brief Implemenation (inline) of Rw11CntlRK11.
*/
 
 
// all method definitions in namespace Retro
namespace Retro {
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline void Rw11CntlRK11::SetChunkSize(size_t chunk)
{
fRdma.SetChunkSize(chunk);
return;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline size_t Rw11CntlRK11::ChunkSize() const
{
return fRdma.ChunkSize();
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline const Rstats& Rw11CntlRK11::RdmaStats() const
{
return fRdma.Stats();
}
 
 
} // end namespace Retro
/trunk/tools/src/librw11/Makefile
1,4 → 1,4
# $Id: Makefile 561 2014-06-09 17:22:50Z mueller $
# $Id: Makefile 626 2015-01-03 14:41:37Z mueller $
#
# Revision History:
# Date Rev Version Comment
35,6 → 35,7
OBJ_all += Rw11VirtTerm.o Rw11VirtTermPty.o Rw11VirtTermTcp.o
OBJ_all += Rw11VirtDisk.o Rw11VirtDiskFile.o
OBJ_all += Rw11VirtStream.o
OBJ_all += Rw11Rdma.o Rw11RdmaDisk.o
#
DEP_all = $(OBJ_all:.o=.dep)
#
/trunk/tools/src/librw11/Rw11Rdma.cpp
0,0 → 1,236
// $Id: Rw11Rdma.cpp 627 2015-01-04 11:36:37Z mueller $
//
// Copyright 2015- 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 2, 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
// 2015-01-04 627 1.0 Initial version
// ---------------------------------------------------------------------------
 
/*!
\file
\version $Id: Rw11Rdma.cpp 627 2015-01-04 11:36:37Z mueller $
\brief Implemenation of Rw11Rdma.
*/
 
#include <algorithm>
 
#include "boost/bind.hpp"
 
#include "librtools/Rexception.hpp"
#include "librtools/RosFill.hpp"
#include "librtools/RosPrintf.hpp"
#include "librtools/RosPrintBvi.hpp"
 
#include "Rw11Rdma.hpp"
 
using namespace std;
 
/*!
\class Retro::Rw11Rdma
\brief FIXME_docs
*/
 
// all method definitions in namespace Retro
namespace Retro {
 
//------------------------------------------+-----------------------------------
//! Constructor
 
Rw11Rdma::Rw11Rdma(Rw11Cntl* pcntl, const precb_t& precb,
const postcb_t& postcb)
: fpCntlBase(pcntl),
fPreExecCB(precb),
fPostExecCB(postcb),
fChunksize(0),
fStatus(kStatusDone),
fIsWMem(false),
fAddr(0),
fMode(0),
fNWordMax(0),
fNWordRest(0),
fNWordDone(0),
fpBlock(nullptr),
fStats()
{
fStats.Define(kStatNQueRMem, "NQueRMem" , "RMem chains queued");
fStats.Define(kStatNQueWMem, "NQueWMem" , "WMem chains queued");
fStats.Define(kStatNRdmaRMem, "NRdmaRMem" , "RMem chunks done");
fStats.Define(kStatNRdmaWMem, "NRdmaWMem" , "WMem chunks done");
fStats.Define(kStatNExtClist, "NExtClist" , "clist extended");
fStats.Define(kStatNFailRdma, "NFailRdma" , "Rdma failures");
}
 
//------------------------------------------+-----------------------------------
//! Destructor
 
Rw11Rdma::~Rw11Rdma()
{}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11Rdma::SetChunkSize(size_t chunk)
{
size_t cmax = CntlBase().IsStarted() ? Connect().BlockSizePrudent() : 0;
if (chunk==0 || chunk>cmax) chunk = cmax;
fChunksize = chunk;
return;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11Rdma::QueueRMem(uint32_t addr, uint16_t* block, size_t size,
uint16_t mode)
{
fStats.Inc(kStatNQueRMem);
SetupRdma(false, addr, block, size, mode);
Server().QueueAction(boost::bind(&Rw11Rdma::RdmaHandler, this));
return;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11Rdma::QueueWMem(uint32_t addr, const uint16_t* block, size_t size,
uint16_t mode)
{
fStats.Inc(kStatNQueWMem);
SetupRdma(true, addr, const_cast<uint16_t*>(block), size, mode);
Server().QueueAction(boost::bind(&Rw11Rdma::RdmaHandler, this));
return;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11Rdma::Dump(std::ostream& os, int ind, const char* text) const
{
RosFill bl(ind);
os << bl << (text?text:"--") << "Rw11Rdma @ " << this << endl;
 
os << bl << " fChunkSize: " << RosPrintf(fChunksize,"d",4) << endl;
os << bl << " fStatus: " << fStatus << endl;
os << bl << " fIsWMem: " << fIsWMem << endl;
os << bl << " fAddr: " << RosPrintBvi(fAddr,8,22) << endl;
os << bl << " fMode: " << RosPrintBvi(fAddr,16,16) << endl;
os << bl << " fNWordMax: " << RosPrintf(fNWordMax,"d",4) << endl;
os << bl << " fNWordRest: " << RosPrintf(fNWordRest,"d",4) << endl;
os << bl << " fNWordDone: " << RosPrintf(fNWordDone,"d",4) << endl;
os << bl << " fpBlock: " << fpBlock << endl;
fStats.Dump(os, ind+2, "fStats: ");
return;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11Rdma::SetupRdma(bool iswmem, uint32_t addr, uint16_t* block,
size_t size, uint16_t mode)
{
if (IsActive())
throw Rexception("Rw11Rdma::SetupRdma", "Bad state: Rdma already active");
// if chunk size not yet defined use 'maximal prudent size from Connect
// Note: can't be done in ctor because linkage to Connect is set much
// later in Cntl::Start
if (fChunksize == 0) fChunksize = Connect().BlockSizePrudent();
 
fStatus = kStatusBusy;
fIsWMem = iswmem;
fAddr = addr;
fMode = mode;
fNWordMax = fChunksize;
fNWordRest = size;
fNWordDone = 0;
fpBlock = block;
return;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
int Rw11Rdma::RdmaHandler()
{
RlinkCommandList clist;
 
if (fNWordDone == 0) { // first chunk ?
PreRdmaHook();
}
 
size_t nword = min(fNWordRest, fNWordMax);
if (fIsWMem) {
fStats.Inc(kStatNRdmaWMem);
Cpu().AddWMem(clist, fAddr, fpBlock, nword, fMode, true);
} else {
fStats.Inc(kStatNRdmaRMem);
Cpu().AddRMem(clist, fAddr, fpBlock, nword, fMode, true);
}
size_t ncmd = clist.Size();
if (nword == fNWordRest) fStatus = kStatusBusyLast;
fPreExecCB(fStatus, nword, clist);
if (clist.Size() != ncmd) fStats.Inc(kStatNExtClist);
 
// FIXME_code: check return code
Server().Exec(clist);
 
size_t nworddone = clist[ncmd-1].BlockDone();
fAddr += 2*nworddone;
fNWordRest -= nworddone;
fNWordDone += nworddone;
fpBlock += nworddone;
 
bool islast = false;
if (nword != nworddone) {
fStats.Inc(kStatNFailRdma);
fStatus = kStatusFailRdma;
islast = true;
} else if (fNWordRest == 0) {
fStatus = kStatusDone;
islast = true;
}
 
if (islast) {
PostRdmaHook(fNWordDone);
}
 
fPostExecCB(fStatus, fNWordDone, clist, ncmd);
 
if (fStatus == kStatusBusy) {
return 1;
}
fStatus = kStatusDone;
return 0;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11Rdma::PreRdmaHook()
{
return;
}
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11Rdma::PostRdmaHook(size_t ndone)
{
return;
}
 
} // end namespace Retro
/trunk/tools/src/librw11/Rw11CpuW11a.hpp
1,6 → 1,6
// $Id: Rw11CpuW11a.hpp 504 2013-04-13 15:37:24Z mueller $
// $Id: Rw11CpuW11a.hpp 621 2014-12-26 21:20:05Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2014 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-25 621 1.1 adopt to 4k word ibus window
// 2013-03-03 494 1.0 Initial version
// 2013-01-27 478 0.1 First draft
// ---------------------------------------------------------------------------
20,7 → 21,7
 
/*!
\file
\version $Id: Rw11CpuW11a.hpp 504 2013-04-13 15:37:24Z mueller $
\version $Id: Rw11CpuW11a.hpp 621 2014-12-26 21:20:05Z mueller $
\brief Declaration of class Rw11CpuW11a.
*/
 
37,7 → 38,7
Rw11CpuW11a();
~Rw11CpuW11a();
 
void Setup(size_t ind, uint16_t base);
void Setup(size_t ind, uint16_t base, uint16_t ibase);
 
virtual void Dump(std::ostream& os, int ind=0, const char* text=0) const;
/trunk/tools/src/librw11/Rw11Rdma.ipp
0,0 → 1,100
// $Id: Rw11Rdma.ipp 627 2015-01-04 11:36:37Z mueller $
//
// Copyright 20154- 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 2, 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
// 2015-01-04 627 1.0 Initial version
// ---------------------------------------------------------------------------
 
/*!
\file
\version $Id: Rw11Rdma.ipp 627 2015-01-04 11:36:37Z mueller $
\brief Implemenation (inline) of Rw11Rdma.
*/
 
// all method definitions in namespace Retro
namespace Retro {
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline Rw11Cntl& Rw11Rdma::CntlBase() const
{
return *fpCntlBase;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline Rw11Cpu& Rw11Rdma::Cpu() const
{
return fpCntlBase->Cpu();
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline Rw11& Rw11Rdma::W11() const
{
return fpCntlBase->W11();
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline RlinkServer& Rw11Rdma::Server() const
{
return fpCntlBase->Server();
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline RlinkConnect& Rw11Rdma::Connect() const
{
return fpCntlBase->Connect();
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline RlogFile& Rw11Rdma::LogFile() const
{
return fpCntlBase->LogFile();
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline size_t Rw11Rdma::ChunkSize() const
{
return fChunksize;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline bool Rw11Rdma::IsActive() const
{
return fStatus != kStatusDone;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline const Rstats& Rw11Rdma::Stats() const
{
return fStats;
}
 
} // end namespace Retro
/trunk/tools/src/librw11/Rw11Cntl.hpp
1,6 → 1,6
// $Id: Rw11Cntl.hpp 508 2013-04-20 18:43:28Z mueller $
// $Id: Rw11Cntl.hpp 625 2014-12-30 16:17:45Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2014 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-30 625 1.1 adopt to Rlink V4 attn logic
// 2013-03-06 495 1.0 Initial version
// 2013-02-05 483 0.1 First draft
// ---------------------------------------------------------------------------
20,7 → 21,7
 
/*!
\file
\version $Id: Rw11Cntl.hpp 508 2013-04-20 18:43:28Z mueller $
\version $Id: Rw11Cntl.hpp 625 2014-12-30 16:17:45Z mueller $
\brief Declaration of class Rw11Cntl.
*/
 
82,7 → 83,6
// statistics counter indices
enum stats {
kStatNAttnHdl = 0,
kStatNPrimFused,
kStatNAttnNoAct,
kDimStat
};
90,8 → 90,6
protected:
void ConfigCntl(const std::string& name, uint16_t base, int lam,
uint16_t probeoff, bool probeint, bool proberem);
void GetPrimInfo(const RlinkServer::AttnArgs& args,
RlinkCommandList*& pclist, size_t& offset);
 
private:
Rw11Cntl() {} //!< default ctor blocker
/trunk/tools/src/librw11/Rw11.cpp
1,6 → 1,6
// $Id: Rw11.cpp 504 2013-04-13 15:37:24Z mueller $
// $Id: Rw11.cpp 625 2014-12-30 16:17:45Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2014 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-30 625 1.1 adopt to Rlink V4 attn logic
// 2013-03-06 495 1.0 Initial version
// 2013-01-27 478 0.1 First draft
// ---------------------------------------------------------------------------
19,7 → 20,7
 
/*!
\file
\version $Id: Rw11.cpp 504 2013-04-13 15:37:24Z mueller $
\version $Id: Rw11.cpp 625 2014-12-30 16:17:45Z mueller $
\brief Implemenation of Rw11.
*/
 
133,8 → 134,10
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
int Rw11::AttnHandler(const RlinkServer::AttnArgs& args)
int Rw11::AttnHandler(RlinkServer::AttnArgs& args)
{
Server().GetAttnInfo(args);
 
for (size_t i=0; i<fNCpu; i++) fspCpu[i]->W11AttnHandler();
return 0;
}
/trunk/tools/src/librw11/Rw11CntlPC11.cpp
1,6 → 1,6
// $Id: Rw11CntlPC11.cpp 515 2013-05-04 17:28:59Z mueller $
// $Id: Rw11CntlPC11.cpp 625 2014-12-30 16:17:45Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2014 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
13,12 → 13,14
//
// Revision History:
// Date Rev Version Comment
// 2014-12-30 625 1.2 adopt to Rlink V4 attn logic
// 2014-12-25 621 1.1 adopt to 4k word ibus window
// 2013-05-03 515 1.0 Initial version
// ---------------------------------------------------------------------------
 
/*!
\file
\version $Id: Rw11CntlPC11.cpp 515 2013-05-04 17:28:59Z mueller $
\version $Id: Rw11CntlPC11.cpp 625 2014-12-30 16:17:45Z mueller $
\brief Implemenation of Rw11CntlPC11.
*/
 
75,7 → 77,7
: Rw11CntlBase<Rw11UnitPC11,2>("pc11"),
fPC_pbuf(0)
{
// must here because Unit have a back-pointer (not available at Rw11CntlBase)
// must be here because Units have a back-ptr (not available at Rw11CntlBase)
for (size_t i=0; i<NUnit(); i++) {
fspUnit[i].reset(new Rw11UnitPC11(this, i));
}
105,9 → 107,16
throw Rexception("Rw11CntlPC11::Start",
"Bad state: started, no lam, not enable, not found");
// add device register address ibus and rbus mappings
// done here because now Cntl bound to Cpu and Cntl probed
Cpu().AllAddrMapInsert(Name()+".rcsr", Base() + kRCSR);
Cpu().AllAddrMapInsert(Name()+".rbuf", Base() + kRBUF);
Cpu().AllAddrMapInsert(Name()+".pcsr", Base() + kPCSR);
Cpu().AllAddrMapInsert(Name()+".pbuf", Base() + kPBUF);
 
// setup primary info clist
fPrimClist.Clear();
Cpu().AddIbrb(fPrimClist, fBase);
fPrimClist.AddAttn();
fPC_pbuf = Cpu().AddRibr(fPrimClist, fBase+kPBUF);
 
// add attn handler
236,14 → 245,12
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
int Rw11CntlPC11::AttnHandler(const RlinkServer::AttnArgs& args)
int Rw11CntlPC11::AttnHandler(RlinkServer::AttnArgs& args)
{
RlinkCommandList* pclist;
size_t off;
GetPrimInfo(args, pclist, off);
fStats.Inc(kStatNAttnHdl);
Server().GetAttnInfo(args, fPrimClist);
 
uint16_t pbuf = (*pclist)[off+fPC_pbuf].Data();
uint16_t pbuf = fPrimClist[fPC_pbuf].Data();
bool pval = pbuf & kPBUF_M_PVAL;
bool rbusy = pbuf & kPBUF_M_RBUSY;
uint8_t ochr = pbuf & kPBUF_M_BUF;
301,7 → 308,6
{
Rw11Cpu& cpu = Cpu();
RlinkCommandList clist;
cpu.AddIbrb(clist, fBase);
if (ind == kUnit_PR) { // reader on/offline
uint16_t rcsr = online ? 0 : kRCSR_M_ERROR;
cpu.AddWibr(clist, fBase+kRCSR, rcsr);
/trunk/tools/src/librw11/Rw11Cpu.cpp
1,4 → 1,4
// $Id: Rw11Cpu.cpp 602 2014-11-08 21:42:47Z mueller $
// $Id: Rw11Cpu.cpp 626 2015-01-03 14:41:37Z mueller $
//
// Copyright 2013-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
13,6 → 13,8
//
// Revision History:
// Date Rev Version Comment
// 2015-01-01 626 1.1 Adopt for rlink v4 and 4k ibus window
// 2014-12-21 617 1.0.3 use kStat_M_RbTout for rbus timeout
// 2014-08-02 576 1.0.2 adopt rename of LastExpect->SetLastExpect
// 2013-04-14 506 1.0.1 add AddLalh(),AddRMem(),AddWMem()
// 2013-04-12 504 1.0 Initial version
21,7 → 23,7
 
/*!
\file
\version $Id: Rw11Cpu.cpp 602 2014-11-08 21:42:47Z mueller $
\version $Id: Rw11Cpu.cpp 626 2015-01-03 14:41:37Z mueller $
\brief Implemenation of Rw11Cpu.
*/
#include <stdlib.h>
66,8 → 68,7
const uint16_t Rw11Cpu::kCp_addr_memi;
const uint16_t Rw11Cpu::kCp_addr_r0;
const uint16_t Rw11Cpu::kCp_addr_pc;
const uint16_t Rw11Cpu::kCp_addr_ibrb;
const uint16_t Rw11Cpu::kCp_addr_ibr;
const uint16_t Rw11Cpu::kCp_addr_membe;
 
const uint16_t Rw11Cpu::kCp_func_noop;
const uint16_t Rw11Cpu::kCp_func_start;
100,6 → 101,10
const uint16_t Rw11Cpu::kCp_ah_m_22bit;
const uint16_t Rw11Cpu::kCp_ah_m_ubmap;
 
const uint16_t Rw11Cpu::kCp_membe_m_stick;
const uint16_t Rw11Cpu::kCp_membe_m_be;
 
//------------------------------------------+-----------------------------------
//! Constructor
 
108,11 → 113,13
fType(type),
fIndex(0),
fBase(0),
fIBase(0x4000),
fCpuGo(0),
fCpuStat(0),
fCpuGoMutex(),
fCpuGoCond(),
fCntlMap(),
fIAddrMap(),
fStats()
{}
 
128,7 → 135,8
void Rw11Cpu::Setup(Rw11* pw11)
{
fpW11 = pw11;
// command base: 'cn.', where n is cpu index
// add control port address rbus mappings
// name base: 'cn.', where n is cpu index
string cbase = "c";
cbase += '0'+Index();
cbase += '.';
148,14 → 156,52
Connect().AddrMapInsert(cbase+"r5" , Base()+kCp_addr_r0+5);
Connect().AddrMapInsert(cbase+"sp" , Base()+kCp_addr_r0+6);
Connect().AddrMapInsert(cbase+"pc" , Base()+kCp_addr_r0+7);
Connect().AddrMapInsert(cbase+"ibrb", Base()+kCp_addr_ibrb);
// create names for ib window, line c0.ib00, c0.ib02,.., c0.ib76
for (int i=0; i<32; i++) {
string rname = cbase + "ib";
rname += '0' + ((i>>2)&07);
rname += '0' + ((i<<1)&07);
Connect().AddrMapInsert(rname , Base()+kCp_addr_ibr+i);
Connect().AddrMapInsert(cbase+"membe",Base()+kCp_addr_membe);
 
// add cpu register address ibus and rbus mappings
AllAddrMapInsert("psw" , 0177776);
AllAddrMapInsert("stklim" , 0177774);
AllAddrMapInsert("pirq" , 0177772);
AllAddrMapInsert("mbrk" , 0177770);
AllAddrMapInsert("cpuerr" , 0177766);
AllAddrMapInsert("sysid" , 0177764);
AllAddrMapInsert("hisize" , 0177762);
AllAddrMapInsert("losize" , 0177760);
 
AllAddrMapInsert("hm" , 0177752);
AllAddrMapInsert("maint" , 0177750);
AllAddrMapInsert("cntrl" , 0177746);
AllAddrMapInsert("syserr" , 0177744);
AllAddrMapInsert("hiaddr" , 0177742);
AllAddrMapInsert("loaddr" , 0177740);
 
AllAddrMapInsert("ssr2" , 0177576);
AllAddrMapInsert("ssr1" , 0177574);
AllAddrMapInsert("ssr0" , 0177572);
 
AllAddrMapInsert("sdreg" , 0177570);
 
AllAddrMapInsert("ssr3" , 0172516);
 
// add mmu segment register files
string sdr = "sdr";
string sar = "sar";
for (char i=0; i<8; i++) {
char ichar = '0'+i;
AllAddrMapInsert(sdr+"ki."+ichar, 0172300+2*i);
AllAddrMapInsert(sdr+"kd."+ichar, 0172320+2*i);
AllAddrMapInsert(sar+"ki."+ichar, 0172340+2*i);
AllAddrMapInsert(sar+"kd."+ichar, 0172360+2*i);
AllAddrMapInsert(sdr+"si."+ichar, 0172200+2*i);
AllAddrMapInsert(sdr+"sd."+ichar, 0172220+2*i);
AllAddrMapInsert(sar+"si."+ichar, 0172240+2*i);
AllAddrMapInsert(sar+"sd."+ichar, 0172260+2*i);
AllAddrMapInsert(sdr+"ui."+ichar, 0177600+2*i);
AllAddrMapInsert(sdr+"ud."+ichar, 0177620+2*i);
AllAddrMapInsert(sar+"ui."+ichar, 0177640+2*i);
AllAddrMapInsert(sar+"ud."+ichar, 0177660+2*i);
}
 
return;
}
 
224,7 → 270,6
return;
}
 
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
242,9 → 287,11
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
int Rw11Cpu::AddIbrb(RlinkCommandList& clist, uint16_t ibaddr)
int Rw11Cpu::AddMembe(RlinkCommandList& clist, uint16_t be, bool stick)
{
return clist.AddWreg(fBase+kCp_addr_ibrb, ibaddr & ~(077));
uint16_t data = be & kCp_membe_m_be;
if (stick) data |= kCp_membe_m_stick;
return clist.AddWreg(fBase+kCp_addr_membe, data);
}
 
//------------------------------------------+-----------------------------------
252,8 → 299,10
 
int Rw11Cpu::AddRibr(RlinkCommandList& clist, uint16_t ibaddr)
{
uint16_t ibroff = (ibaddr & 077)/2;
return clist.AddRreg(fBase+kCp_addr_ibr + ibroff);
if ((ibaddr & 0160001) != 0160000)
throw Rexception("Rw11Cpu::AddRibr", "ibaddr out of IO page or odd");
return clist.AddRreg(IbusRemoteAddr(ibaddr));
}
 
//------------------------------------------+-----------------------------------
261,8 → 310,10
 
int Rw11Cpu::AddWibr(RlinkCommandList& clist, uint16_t ibaddr, uint16_t data)
{
uint16_t ibroff = (ibaddr & 077)/2;
return clist.AddWreg(fBase+kCp_addr_ibr + ibroff, data);
if ((ibaddr & 0160001) != 0160000)
throw Rexception("Rw11Cpu::AddWibr", "ibaddr out of IO page or odd");
 
return clist.AddWreg(IbusRemoteAddr(ibaddr), data);
}
 
//------------------------------------------+-----------------------------------
281,12 → 332,17
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
int Rw11Cpu::AddRMem(RlinkCommandList& clist, uint32_t addr,
uint16_t* buf, size_t size, uint16_t mode)
int Rw11Cpu::AddRMem(RlinkCommandList& clist, uint32_t addr, uint16_t* buf,
size_t size, uint16_t mode, bool singleblk)
{
size_t blkmax = Connect().BlockSizeMax();
if (singleblk && size > blkmax)
throw Rexception("Rw11Cpu::AddRMem",
"Bad args: singleblk==true && size > BlockSizeMax()");
 
int ind = AddLalh(clist, addr, mode);
while (size > 0) {
size_t bsize = (size>256) ? 256 : size;
size_t bsize = (size>blkmax) ? blkmax : size;
clist.AddRblk(fBase+kCp_addr_memi, buf, bsize);
buf += bsize;
size -= bsize;
298,11 → 354,17
//! FIXME_docs
 
int Rw11Cpu::AddWMem(RlinkCommandList& clist, uint32_t addr,
const uint16_t* buf, size_t size, uint16_t mode)
const uint16_t* buf, size_t size,
uint16_t mode, bool singleblk)
{
size_t blkmax = Connect().BlockSizeMax();
if (singleblk && size > blkmax)
throw Rexception("Rw11Cpu::AddWMem",
"Bad args: singleblk==true && size > BlockSizeMax()");
 
int ind = AddLalh(clist, addr, mode);
while (size > 0) {
size_t bsize = (size>256) ? 256 : size;
size_t bsize = (size>blkmax) ? blkmax : size;
clist.AddWblk(fBase+kCp_addr_memi, buf, bsize);
buf += bsize;
size -= bsize;
316,10 → 378,11
bool Rw11Cpu::MemRead(uint16_t addr, std::vector<uint16_t>& data,
size_t nword, RerrMsg& emsg)
{
size_t blkmax = Connect().BlockSizePrudent();
data.resize(nword);
size_t ndone = 0;
while (nword>ndone) {
size_t nblk = min(size_t(256), nword-ndone);
size_t nblk = min(blkmax, nword-ndone);
RlinkCommandList clist;
clist.AddWreg(fBase+kCp_addr_al, addr+2*ndone);
clist.AddRblk(fBase+kCp_addr_memi, data.data()+ndone, nblk);
335,10 → 398,11
bool Rw11Cpu::MemWrite(uint16_t addr, const std::vector<uint16_t>& data,
RerrMsg& emsg)
{
size_t blkmax = Connect().BlockSizePrudent();
size_t nword = data.size();
size_t ndone = 0;
while (nword>ndone) {
size_t nblk = min(size_t(256), nword-ndone);
size_t nblk = min(blkmax, nword-ndone);
RlinkCommandList clist;
clist.AddWreg(fBase+kCp_addr_al, addr+2*ndone);
clist.AddWblk(fBase+kCp_addr_memi, data.data()+ndone, nblk);
367,7 → 431,6
clist.SetLastExpect(new RlinkCommandExpect(0,0xff)); // disable stat check
}
if (dsc.fProbeRem) {
AddIbrb(clist, dsc.fAddr);
irb = AddRibr(clist, dsc.fAddr);
clist.SetLastExpect(new RlinkCommandExpect(0,0xff)); // disable stat check
}
376,12 → 439,16
// FIXME_code: handle errors
 
if (dsc.fProbeInt) {
dsc.fFoundInt = (clist[iib].Status() & (RlinkCommand::kStat_M_RbNak |
RlinkCommand::kStat_M_RbErr)) ==0;
dsc.fFoundInt = (clist[iib].Status() &
(RlinkCommand::kStat_M_RbTout |
RlinkCommand::kStat_M_RbNak |
RlinkCommand::kStat_M_RbErr)) ==0;
}
if (dsc.fProbeRem) {
dsc.fFoundRem = (clist[irb].Status() & (RlinkCommand::kStat_M_RbNak |
RlinkCommand::kStat_M_RbErr)) ==0;
dsc.fFoundRem = (clist[irb].Status() &
(RlinkCommand::kStat_M_RbTout |
RlinkCommand::kStat_M_RbNak |
RlinkCommand::kStat_M_RbErr)) ==0;
}
dsc.fProbeDone = true;
}
666,6 → 733,20
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11Cpu::AllAddrMapInsert(const std::string& name, uint16_t ibaddr)
{
string rbname = "i";
rbname += '0'+Index();
rbname += '.';
rbname += name;
Connect().AddrMapInsert(rbname, IbusRemoteAddr(ibaddr));
IAddrMapInsert(name, ibaddr);
return;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11Cpu::W11AttnHandler()
{
RlinkCommandList clist;
687,6 → 768,7
os << bl << " fType: " << fType << endl;
os << bl << " fIndex: " << fIndex << endl;
os << bl << " fBase: " << RosPrintf(fBase,"$x0",4) << endl;
os << bl << " fIBase: " << RosPrintf(fIBase,"$x0",4) << endl;
os << bl << " fCpuGo: " << fCpuGo << endl;
os << bl << " fCpuStat: " << RosPrintf(fCpuStat,"$x0",4) << endl;
os << bl << " fCntlMap: " << endl;
694,6 → 776,7
os << bl << " " << RosPrintf((it->first).c_str(), "-s",8)
<< " : " << it->second << endl;
}
fIAddrMap.Dump(os, ind+2, "fIAddrMap: ");
fStats.Dump(os, ind+2, "fStats: ");
return;
}
/trunk/tools/src/librw11/Rw11CntlDL11.hpp
1,6 → 1,6
// $Id: Rw11CntlDL11.hpp 516 2013-05-05 21:24:52Z mueller $
// $Id: Rw11CntlDL11.hpp 623 2014-12-29 19:11:40Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2014 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-29 623 1.1 adopt to Rlink V4 attn logic
// 2013-05-04 516 1.0.1 add RxRlim support (receive interrupt rate limit)
// 2013-03-06 495 1.0 Initial version
// 2013-02-05 483 0.1 First draft
21,7 → 22,7
 
/*!
\file
\version $Id: Rw11CntlDL11.hpp 516 2013-05-05 21:24:52Z mueller $
\version $Id: Rw11CntlDL11.hpp 623 2014-12-29 19:11:40Z mueller $
\brief Declaration of class Rw11CntlDL11.
*/
 
74,7 → 75,7
static const uint16_t kXBUF_M_XBUF = 0xff;
 
protected:
int AttnHandler(const RlinkServer::AttnArgs& args);
int AttnHandler(RlinkServer::AttnArgs& args);
protected:
size_t fPC_xbuf; //!< PrimClist: xbuf index
/trunk/tools/src/librw11/Rw11Cpu.ipp
1,6 → 1,6
// $Id: Rw11Cpu.ipp 504 2013-04-13 15:37:24Z mueller $
// $Id: Rw11Cpu.ipp 621 2014-12-26 21:20:05Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2014 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-25 621 1.1 Adopt for 4k word ibus window; add IAddrMap
// 2013-04-12 504 1.0 Initial version
// 2013-01-27 478 0.1 First draft
// ---------------------------------------------------------------------------
19,8 → 20,7
 
/*!
\file
\version $Id: Rw11Cpu.ipp 502 2013-04-02 19:29:30Z mu./librwxxtpp/Rwxxtpp_Init.cpp
eller $
\version $Id: Rw11Cpu.ipp 621 2014-12-26 21:20:05Z mueller $
\brief Implemenation (inline) of Rw11Cpu.
*/
 
86,6 → 86,14
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline uint16_t Rw11Cpu::IBase() const
{
return fIBase;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline uint16_t Rw11Cpu::CpuStat() const
{
return fCpuStat;
102,6 → 110,54
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline uint16_t Rw11Cpu::IbusRemoteAddr(uint16_t ibaddr) const
{
return fIBase + (ibaddr & 017777)/2;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline bool Rw11Cpu::IAddrMapInsert(const std::string& name, uint16_t ibaddr)
{
return fIAddrMap.Insert(name, ibaddr);
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline bool Rw11Cpu::IAddrMapErase(const std::string& name)
{
return fIAddrMap.Erase(name);
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline bool Rw11Cpu::IAddrMapErase(uint16_t ibaddr)
{
return fIAddrMap.Erase(ibaddr);
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline void Rw11Cpu::IAddrMapClear()
{
return fIAddrMap.Clear();
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline const RlinkAddrMap& Rw11Cpu::IAddrMap() const
{
return fIAddrMap;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline const Rstats& Rw11Cpu::Stats() const
{
return fStats;
/trunk/tools/src/librw11/Rw11RdmaDisk.cpp
0,0 → 1,208
// $Id: Rw11RdmaDisk.cpp 628 2015-01-04 16:22:09Z mueller $
//
// Copyright 2015- 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 2, 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
// 2015-01-04 628 1.0 Initial version
// ---------------------------------------------------------------------------
 
/*!
\file
\version $Id: Rw11RdmaDisk.cpp 628 2015-01-04 16:22:09Z mueller $
\brief Implemenation of Rw11RdmaDisk.
*/
 
#include "librtools/RosFill.hpp"
#include "librtools/RosPrintf.hpp"
#include "librtools/Rexception.hpp"
 
#include "Rw11RdmaDisk.hpp"
 
using namespace std;
 
/*!
\class Retro::Rw11RdmaDisk
\brief FIXME_docs
*/
 
// all method definitions in namespace Retro
namespace Retro {
 
//------------------------------------------+-----------------------------------
//! Constructor
 
Rw11RdmaDisk::Rw11RdmaDisk(Rw11Cntl* pcntl, const precb_t& precb,
const postcb_t& postcb)
: Rw11Rdma(pcntl, precb, postcb),
fBuf(),
fpUnit(nullptr),
fNWord(0),
fNBlock(0),
fLba()
{
fStats.Define(kStatNWritePadded, "NWritePadded" , "padded disk write");
fStats.Define(kStatNWChkFail, "NWChkFail" , "write check failed");
}
 
//------------------------------------------+-----------------------------------
//! Destructor
 
Rw11RdmaDisk::~Rw11RdmaDisk()
{}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11RdmaDisk::QueueDiskRead(uint32_t addr, size_t size, uint16_t mode,
uint32_t lba, Rw11UnitDisk* punit)
{
SetupDisk(size, lba, punit, kFuncRead);
QueueWMem(addr, fBuf.data(), size, mode);
return;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11RdmaDisk::QueueDiskWrite(uint32_t addr,size_t size, uint16_t mode,
uint32_t lba, Rw11UnitDisk* punit)
{
SetupDisk(size, lba, punit, kFuncWrite);
QueueRMem(addr, fBuf.data(), size, mode);
return;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11RdmaDisk::QueueDiskWriteCheck(uint32_t addr, size_t size,
uint16_t mode, uint32_t lba,
Rw11UnitDisk* punit)
{
SetupDisk(size, lba, punit, kFuncWriteCheck);
QueueRMem(addr, fBuf.data(), size, mode);
return;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
size_t Rw11RdmaDisk::WriteCheck(size_t ndone)
{
if (ndone == 0) return 0;
 
size_t bszwrd = fpUnit->BlockSize()/2; // block size in words
size_t nblk = (ndone+bszwrd-1)/bszwrd;
size_t dsize = nblk*bszwrd;
std::vector<uint16_t> dbuf(dsize);
RerrMsg emsg;
bool rc = fpUnit->VirtRead(fLba, nblk,
reinterpret_cast<uint8_t*>(dbuf.data()), emsg);
if (!rc) throw Rexception("Rw11RdmaDisk::WriteCheck()",
"VirtRead() failed: ", emsg);
uint16_t* pdsk = dbuf.data();
uint16_t* pmem = fBuf.data();
for (size_t i=0; i<ndone; i++) {
if (*pdsk++ != *pmem++) {
fStats.Inc(kStatNWChkFail);
return i;
}
}
 
return ndone;
}
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11RdmaDisk::Dump(std::ostream& os, int ind, const char* text) const
{
RosFill bl(ind);
os << bl << (text?text:"--") << "Rw11RdmaDisk @ " << this << endl;
os << bl << " fBuf.size() " << RosPrintf(fBuf.size(),"d",5) << endl;
os << bl << " fpUnit: " << fpUnit << endl;
os << bl << " fNWord: " << RosPrintf(fNWord,"d",5) << endl;
os << bl << " fNBlock: " << RosPrintf(fNBlock,"d",5) << endl;
os << bl << " fLba: " << RosPrintf(fLba,"d",8) << endl;
os << bl << " fFunc: " << fFunc << endl;
 
Rw11Rdma::Dump(os, ind, " ^");
return;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11RdmaDisk::SetupDisk(size_t size, uint32_t lba, Rw11UnitDisk* punit,
Rw11RdmaDisk::func func)
{
fpUnit = punit;
size_t bszwrd = fpUnit->BlockSize()/2; // block size in words
 
fNWord = size;
fNBlock = (fNWord+bszwrd-1)/bszwrd;
fLba = lba;
fFunc = func;
 
size_t tsize = fNBlock*bszwrd;
if (fBuf.size() < tsize) fBuf.resize(tsize);
 
return;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11RdmaDisk::PreRdmaHook()
{
if (fFunc != kFuncRead) return; // quit unless read request
 
RerrMsg emsg;
bool rc = fpUnit->VirtRead(fLba, fNBlock,
reinterpret_cast<uint8_t*>(fBuf.data()), emsg);
if (!rc) throw Rexception("Rw11RdmaDisk::PreRdmaHook()",
"VirtRead() failed: ", emsg);
return;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11RdmaDisk::PostRdmaHook(size_t ndone)
{
if (ndone == 0) return; // quit if rdma failed early
if (fFunc != kFuncWrite) return; // quit unless write request
 
size_t bszwrd = fpUnit->BlockSize()/2; // block size in words
size_t nblock = (ndone+bszwrd-1)/bszwrd;
size_t npad = nblock*bszwrd - ndone;
 
// if an incomplete block was read, pad it with hex dead
if (npad) {
fStats.Inc(kStatNWritePadded);
uint16_t* p = fBuf.data()+ndone;
for (size_t i=0; i<npad; i++) *p++ = 0xdead;
}
 
RerrMsg emsg;
bool rc = fpUnit->VirtWrite(fLba, nblock,
reinterpret_cast<uint8_t*>(fBuf.data()), emsg);
if (!rc) throw Rexception("Rw11RdmaDisk::PostRdmaHook()",
"VirtWrite() failed: ", emsg);
return;
}
 
 
} // end namespace Retro
/trunk/tools/src/librw11/Rw11CntlLP11.hpp
1,6 → 1,6
// $Id: Rw11CntlLP11.hpp 515 2013-05-04 17:28:59Z mueller $
// $Id: Rw11CntlLP11.hpp 623 2014-12-29 19:11:40Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2014 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-29 623 1.1 adopt to Rlink V4 attn logic
// 2013-05-01 513 1.0 Initial version
// ---------------------------------------------------------------------------
 
19,7 → 20,7
 
/*!
\file
\version $Id: Rw11CntlLP11.hpp 515 2013-05-04 17:28:59Z mueller $
\version $Id: Rw11CntlLP11.hpp 623 2014-12-29 19:11:40Z mueller $
\brief Declaration of class Rw11CntlLP11.
*/
 
61,7 → 62,7
static const uint16_t kBUF_M_BUF = 0177;
 
protected:
int AttnHandler(const RlinkServer::AttnArgs& args);
int AttnHandler(RlinkServer::AttnArgs& args);
void SetOnline(bool online);
protected:
/trunk/tools/src/librw11/Rw11RdmaDisk.ipp
0,0 → 1,29
// $Id: Rw11RdmaDisk.ipp 627 2015-01-04 11:36:37Z mueller $
//
// Copyright 2015- 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 2, 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
// 2015-01-04 627 1.0 Initial version
// ---------------------------------------------------------------------------
 
/*!
\file
\version $Id: Rw11RdmaDisk.ipp 627 2015-01-04 11:36:37Z mueller $
\brief Implemenation (inline) of Rw11RdmaDisk.
*/
 
 
// all method definitions in namespace Retro
namespace Retro {
 
} // end namespace Retro
/trunk/tools/src/librw11/Rw11CntlRK11.hpp
1,6 → 1,6
// $Id: Rw11CntlRK11.hpp 562 2014-06-15 17:23:18Z mueller $
// $Id: Rw11CntlRK11.hpp 627 2015-01-04 11:36:37Z mueller $
//
// Copyright 2013-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2015 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
13,6 → 13,8
//
// Revision History:
// Date Rev Version Comment
// 2015-01-03 627 2.0 use Rw11RdmaDisk
// 2014-12-29 623 1.1 adopt to Rlink V4 attn logic
// 2014-06-14 562 1.0.1 Add stats definitions
// 2013-04-20 508 1.0 Initial version
// 2013-02-10 485 0.1 First draft
21,7 → 23,7
 
/*!
\file
\version $Id: Rw11CntlRK11.hpp 562 2014-06-15 17:23:18Z mueller $
\version $Id: Rw11CntlRK11.hpp 627 2015-01-04 11:36:37Z mueller $
\brief Declaration of class Rw11CntlRK11.
*/
 
30,6 → 32,7
 
#include "Rw11CntlBase.hpp"
#include "Rw11UnitRK11.hpp"
#include "Rw11RdmaDisk.hpp"
 
namespace Retro {
 
48,6 → 51,11
 
virtual void UnitSetup(size_t ind);
 
void SetChunkSize(size_t chunk);
size_t ChunkSize() const;
 
const Rstats& RdmaStats() const;
 
virtual void Dump(std::ostream& os, int ind=0, const char* text=0) const;
 
// some constants (also defined in cpp)
129,26 → 137,28
 
// statistics counter indices
enum stats {
kStatNFuncCreset = Rw11Cntl::kDimStat,
kStatNFuncWrite,
kStatNFuncRead,
kStatNFuncWchk,
kStatNFuncSeek,
kStatNFuncRchk,
kStatNFuncDreset,
kStatNFuncWlock,
kStatNRdmaWrite,
kStatNRdmaRead,
kStatNRdmaWchk,
kStatNRdmaRchk,
kStatNFuncCreset = Rw11Cntl::kDimStat, //!< func CRESET
kStatNFuncWrite, //!< func WRITE
kStatNFuncRead, //!< func READ
kStatNFuncWchk, //!< func WCHK
kStatNFuncSeek, //!< func SEEK
kStatNFuncRchk, //!< func RCHK
kStatNFuncDreset, //!< func DRESET
kStatNFuncWlock, //!< func WLOCK
kDimStat
};
 
protected:
int AttnHandler(const RlinkServer::AttnArgs& args);
int RdmaHandler();
int AttnHandler(RlinkServer::AttnArgs& args);
void RdmaPreExecCB(int stat, size_t nword,
RlinkCommandList& clist);
void RdmaPostExecCB(int stat, size_t ndone,
RlinkCommandList& clist, size_t ncmd);
void LogRker(uint16_t rker);
void AddErrorExit(RlinkCommandList& clist, uint16_t rker);
void AddNormalExit(RlinkCommandList& clist, size_t ndone,
uint16_t rker=0);
 
protected:
size_t fPC_rkwc; //!< PrimClist: rkwc index
size_t fPC_rkba; //!< PrimClist: rkba index
156,17 → 166,18
size_t fPC_rkmr; //!< PrimClist: rkmr index
size_t fPC_rkcs; //!< PrimClist: rkcs index
 
bool fRd_busy; //!< Rdma: busy flag
uint16_t fRd_rkcs; //!< Rdma: request rkcs
uint16_t fRd_rkda; //!< Rdma: request rkda
uint32_t fRd_addr; //!< Rdma: current addr
uint32_t fRd_lba; //!< Rdma: current lba
uint32_t fRd_nwrd; //!< Rdma: current nwrd
uint16_t fRd_fu; //!< Rdma: request fu code
bool fRd_ovr; //!< Rdma: overrun condition found
Rw11RdmaDisk fRdma; //!< Rdma controller
};
} // end namespace Retro
 
//#include "Rw11CntlRK11.ipp"
#include "Rw11CntlRK11.ipp"
 
#endif
/trunk/tools/src/librw11/Rw11CpuW11a.cpp
1,6 → 1,6
// $Id: Rw11CpuW11a.cpp 504 2013-04-13 15:37:24Z mueller $
// $Id: Rw11CpuW11a.cpp 621 2014-12-26 21:20:05Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2014 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-25 621 1.1 adopt to 4k word ibus window
// 2013-03-03 494 1.0 Initial version
// 2013-01-27 478 0.1 First draft
// ---------------------------------------------------------------------------
19,7 → 20,7
 
/*!
\file
\version $Id: Rw11CpuW11a.cpp 504 2013-04-13 15:37:24Z mueller $
\version $Id: Rw11CpuW11a.cpp 621 2014-12-26 21:20:05Z mueller $
\brief Implemenation of Rw11CpuW11a.
*/
 
53,10 → 54,11
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11CpuW11a::Setup(size_t ind, uint16_t base)
void Rw11CpuW11a::Setup(size_t ind, uint16_t base, uint16_t ibase)
{
fIndex = ind;
fBase = base;
fIBase = ibase;
return;
}
 
/trunk/tools/src/librw11/Rw11Rdma.hpp
0,0 → 1,117
// $Id: Rw11Rdma.hpp 627 2015-01-04 11:36:37Z mueller $
//
// Copyright 2015- 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 2, 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
// 2015-01-04 627 1.0 Initial version
// ---------------------------------------------------------------------------
 
 
/*!
\file
\version $Id: Rw11Rdma.hpp 627 2015-01-04 11:36:37Z mueller $
\brief Declaration of class Rw11Rdma.
*/
 
#ifndef included_Retro_Rw11Rdma
#define included_Retro_Rw11Rdma 1
 
#include "boost/utility.hpp"
#include "boost/function.hpp"
 
#include "librtools/Rstats.hpp"
#include "librtools/RerrMsg.hpp"
 
#include "librtools/Rbits.hpp"
#include "Rw11Cntl.hpp"
 
namespace Retro {
 
class Rw11Rdma : public Rbits, private boost::noncopyable {
public:
 
typedef boost::function<void(int,size_t,RlinkCommandList&)> precb_t;
typedef boost::function<void(int,size_t,RlinkCommandList&,
size_t)> postcb_t;
 
Rw11Rdma(Rw11Cntl* pcntl, const precb_t& precb,
const postcb_t& postcb);
virtual ~Rw11Rdma();
 
Rw11Cntl& CntlBase() const;
Rw11Cpu& Cpu() const;
Rw11& W11() const;
RlinkServer& Server() const;
RlinkConnect& Connect() const;
RlogFile& LogFile() const;
 
void SetChunkSize(size_t chunk);
size_t ChunkSize() const;
 
bool IsActive() const;
 
void QueueRMem(uint32_t addr, uint16_t* block, size_t size,
uint16_t mode);
void QueueWMem(uint32_t addr, const uint16_t* block, size_t size,
uint16_t mode);
 
const Rstats& Stats() const;
virtual void Dump(std::ostream& os, int ind=0, const char* text=0) const;
 
// statistics counter indices
enum stats {
kStatNQueRMem, //!< RMem chains queued
kStatNQueWMem, //!< WMem chains queued
kStatNRdmaRMem, //!< RMem chunks done
kStatNRdmaWMem, //!< WMem chunks done
kStatNExtClist, //!< clist extended
kStatNFailRdma, //!< Rdma failures
kDimStat
};
 
// status values
enum status {
kStatusDone, //!< all chunks done and ok
kStatusBusy, //!< more chunks to come
kStatusBusyLast, //!< last chunk to come
kStatusFailRdma //!< last rdma transfer failed
};
 
protected:
void SetupRdma(bool iswmem, uint32_t addr, uint16_t* block,
size_t size, uint16_t mode);
int RdmaHandler();
virtual void PreRdmaHook();
virtual void PostRdmaHook(size_t ndone);
 
protected:
Rw11Cntl* fpCntlBase; //!< plain Rw11Cntl ptr
precb_t fPreExecCB; //!< pre Exec callback
postcb_t fPostExecCB; //!< post Exec callback
size_t fChunksize; //!< channel chunk size
enum status fStatus; //!< dma status
bool fIsWMem; //!< is memory write
uint32_t fAddr; //!< current mem address
uint16_t fMode; //!< current mode
size_t fNWordMax; //!< transfer chunk size
size_t fNWordRest; //!< words to be done
size_t fNWordDone; //!< words transfered
uint16_t* fpBlock; //!< current buffer pointer
Rstats fStats; //!< statistics
};
} // end namespace Retro
 
#include "Rw11Rdma.ipp"
 
#endif
/trunk/tools/src/librw11/Rw11Cntl.cpp
1,6 → 1,6
// $Id: Rw11Cntl.cpp 495 2013-03-06 17:13:48Z mueller $
// $Id: Rw11Cntl.cpp 625 2014-12-30 16:17:45Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2014 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-30 625 1.1 adopt to Rlink V4 attn logic
// 2013-03-06 495 1.0 Initial version
// 2013-02-05 483 0.1 First draft
// ---------------------------------------------------------------------------
19,7 → 20,7
 
/*!
\file
\version $Id: Rw11Cntl.cpp 495 2013-03-06 17:13:48Z mueller $
\version $Id: Rw11Cntl.cpp 625 2014-12-30 16:17:45Z mueller $
\brief Implemenation of Rw11Cntl.
*/
 
56,7 → 57,6
fStats()
{
fStats.Define(kStatNAttnHdl, "NAttnHdl", "AttnHandler() calls");
fStats.Define(kStatNPrimFused,"NPrimFused","PrimInfo fused with attn cmd");
fStats.Define(kStatNAttnNoAct,"NAttnNoAct","AttnHandler() no action return");
}
 
152,30 → 152,6
fProbe.fProbeInt = probeint;
fProbe.fProbeRem = proberem;
return;
}
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void Rw11Cntl::GetPrimInfo(const RlinkServer::AttnArgs& args,
RlinkCommandList*& pclist, size_t& offset)
{
fStats.Inc(kStatNAttnHdl);
 
if (args.fpClist) {
fStats.Inc(kStatNPrimFused);
pclist = args.fpClist;
offset = args.fOffset;
 
} else {
Server().Exec(fPrimClist);
// FIXME_code: handle errors
pclist = &fPrimClist;
offset = 0;
}
return;
}
 
} // end namespace Retro
/trunk/tools/src/librw11/Rw11CntlDL11.cpp
1,6 → 1,6
// $Id: Rw11CntlDL11.cpp 516 2013-05-05 21:24:52Z mueller $
// $Id: Rw11CntlDL11.cpp 625 2014-12-30 16:17:45Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2014 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
13,6 → 13,8
//
// Revision History:
// Date Rev Version Comment
// 2014-12-30 625 1.2 adopt to Rlink V4 attn logic
// 2014-12-25 621 1.1 adopt to 4k word ibus window and
// 2013-05-04 516 1.0.2 add RxRlim support (receive interrupt rate limit)
// 2013-04-20 508 1.0.1 add trace support
// 2013-03-06 495 1.0 Initial version
21,7 → 23,7
 
/*!
\file
\version $Id: Rw11CntlDL11.cpp 516 2013-05-05 21:24:52Z mueller $
\version $Id: Rw11CntlDL11.cpp 625 2014-12-30 16:17:45Z mueller $
\brief Implemenation of Rw11CntlDL11.
*/
 
77,7 → 79,7
fPC_xbuf(0),
fRxRlim(0)
{
// must here because Unit have a back-pointer (not available at Rw11CntlBase)
// must be here because Units have a back-ptr (not available at Rw11CntlBase)
for (size_t i=0; i<NUnit(); i++) {
fspUnit[i].reset(new Rw11UnitDL11(this, i));
}
107,9 → 109,16
throw Rexception("Rw11CntlDL11::Start",
"Bad state: started, no lam, not enable, not found");
// add device register address ibus and rbus mappings
// done here because now Cntl bound to Cpu and Cntl probed
Cpu().AllAddrMapInsert(Name()+".rcsr", Base() + kRCSR);
Cpu().AllAddrMapInsert(Name()+".rbuf", Base() + kRBUF);
Cpu().AllAddrMapInsert(Name()+".xcsr", Base() + kXCSR);
Cpu().AllAddrMapInsert(Name()+".xbuf", Base() + kXBUF);
 
// setup primary info clist
fPrimClist.Clear();
Cpu().AddIbrb(fPrimClist, fBase);
fPrimClist.AddAttn();
fPC_xbuf = Cpu().AddRibr(fPrimClist, fBase+kXBUF);
 
// add attn handler
127,7 → 136,6
Rw11Cpu& cpu = Cpu();
uint16_t rcsr = (fRxRlim<<kRCSR_V_RXRLIM) & kRCSR_M_RXRLIM;
RlinkCommandList clist;
cpu.AddIbrb(clist, fBase);
cpu.AddWibr(clist, fBase+kRCSR, rcsr);
Server().Exec(clist);
return;
140,7 → 148,6
{
if (!fspUnit[0]->RcvQueueEmpty()) {
RlinkCommandList clist;
Cpu().AddIbrb(clist, fBase);
size_t ircsr = Cpu().AddRibr(clist, fBase+kRCSR);
Server().Exec(clist);
// FIXME_code: handle errors
195,14 → 202,12
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
int Rw11CntlDL11::AttnHandler(const RlinkServer::AttnArgs& args)
int Rw11CntlDL11::AttnHandler(RlinkServer::AttnArgs& args)
{
RlinkCommandList* pclist;
size_t off;
GetPrimInfo(args, pclist, off);
fStats.Inc(kStatNAttnHdl);
Server().GetAttnInfo(args, fPrimClist);
 
uint16_t xbuf = (*pclist)[off+fPC_xbuf].Data();
uint16_t xbuf = fPrimClist[fPC_xbuf].Data();
 
uint8_t ochr = xbuf & kXBUF_M_XBUF;
bool xval = xbuf & kXBUF_M_XVAL;
/trunk/tools/src/librwxxtpp/RtclRw11CntlRK11.cpp
1,4 → 1,4
// $Id: RtclRw11CntlRK11.cpp 509 2013-04-21 20:46:20Z mueller $
// $Id: RtclRw11CntlRK11.cpp 627 2015-01-04 11:36:37Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
19,7 → 19,7
 
/*!
\file
\version $Id: RtclRw11CntlRK11.cpp 509 2013-04-21 20:46:20Z mueller $
\version $Id: RtclRw11CntlRK11.cpp 627 2015-01-04 11:36:37Z mueller $
\brief Implemenation of RtclRw11CntlRK11.
*/
 
43,7 → 43,13
 
RtclRw11CntlRK11::RtclRw11CntlRK11()
: RtclRw11CntlBase<Rw11CntlRK11>("Rw11CntlRK11")
{}
{
Rw11CntlRK11* pobj = &Obj();
fGets.Add<size_t> ("chunksize",
boost::bind(&Rw11CntlRK11::ChunkSize, pobj));
fSets.Add<size_t> ("chunksize",
boost::bind(&Rw11CntlRK11::SetChunkSize, pobj, _1));
}
 
//------------------------------------------+-----------------------------------
//! Destructor
91,4 → 97,17
return kOK;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
int RtclRw11CntlRK11::M_stats(RtclArgs& args)
{
RtclStats::Context cntx;
if (!RtclStats::GetArgs(args, cntx)) return kERR;
if (!RtclStats::Collect(args, cntx, Obj().Stats())) return kERR;
if (!RtclStats::Collect(args, cntx, Obj().RdmaStats())) return kERR;
return kOK;
}
 
 
} // end namespace Retro
/trunk/tools/src/librwxxtpp/RtclRw11CntlRK11.hpp
1,6 → 1,6
// $Id: RtclRw11CntlRK11.hpp 509 2013-04-21 20:46:20Z mueller $
// $Id: RtclRw11CntlRK11.hpp 627 2015-01-04 11:36:37Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2015 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2015-01-03 627 1.1 add local M_stat
// 2013-03-06 495 1.0 Initial version
// 2013-02-08 484 0.1 First draft
// ---------------------------------------------------------------------------
20,7 → 21,7
 
/*!
\file
\version $Id: RtclRw11CntlRK11.hpp 509 2013-04-21 20:46:20Z mueller $
\version $Id: RtclRw11CntlRK11.hpp 627 2015-01-04 11:36:37Z mueller $
\brief Declaration of class RtclRw11CntlRK11.
*/
 
38,6 → 39,9
~RtclRw11CntlRK11();
 
virtual int FactoryCmdConfig(RtclArgs& args, RtclRw11Cpu& cpu);
 
protected:
virtual int M_stats(RtclArgs& args);
};
} // end namespace Retro
/trunk/tools/src/librwxxtpp/RtclRw11Cpu.cpp
1,4 → 1,4
// $Id: RtclRw11Cpu.cpp 607 2014-11-30 20:02:48Z mueller $
// $Id: RtclRw11Cpu.cpp 628 2015-01-04 16:22:09Z mueller $
//
// Copyright 2013-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
13,6 → 13,8
//
// Revision History:
// Date Rev Version Comment
// 2014-12-29 623 1.1.2 add M_amap; M_cp: add -print and -dump
// 2014-12-20 616 1.1.1 M_cp: add -edone for BlockDone checking
// 2014-11-30 607 1.1 new rlink v4 iface
// 2014-08-22 584 1.0.5 use nullptr
// 2014-08-02 576 1.0.4 BUGFIX: redo estatdef logic; avoid LastExpect()
25,7 → 27,7
 
/*!
\file
\version $Id: RtclRw11Cpu.cpp 607 2014-11-30 20:02:48Z mueller $
\version $Id: RtclRw11Cpu.cpp 628 2015-01-04 16:22:09Z mueller $
\brief Implemenation of RtclRw11Cpu.
*/
 
74,9 → 76,11
 
RtclRw11Cpu::RtclRw11Cpu(const std::string& type)
: RtclProxyBase(type),
fGets()
fGets(),
fSets()
{
AddMeth("add", boost::bind(&RtclRw11Cpu::M_add, this, _1));
AddMeth("amap", boost::bind(&RtclRw11Cpu::M_amap, this, _1));
AddMeth("cp", boost::bind(&RtclRw11Cpu::M_cp, this, _1));
AddMeth("wtcpu", boost::bind(&RtclRw11Cpu::M_wtcpu, this, _1));
AddMeth("deposit", boost::bind(&RtclRw11Cpu::M_deposit, this, _1));
110,6 → 114,101
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
int RtclRw11Cpu::M_amap(RtclArgs& args)
{
static RtclNameSet optset("-name|-testname|-testaddr|-insert|-erase|-print");
 
const RlinkAddrMap& addrmap = Obj().IAddrMap();
 
string opt;
string name;
uint16_t addr=0;
 
if (args.NextOpt(opt, optset)) {
if (opt == "-name") { // amap -name addr
if (!args.GetArg("addr", addr)) return kERR;
if (!args.AllDone()) return kERR;
string tstname;
if(addrmap.Find(addr, tstname)) {
args.SetResult(tstname);
} else {
return args.Quit(string("-E: address '") + args.PeekArgString(-1) +
"' not mapped");
}
 
} else if (opt == "-testname") { // amap -testname name
if (!args.GetArg("name", name)) return kERR;
if (!args.AllDone()) return kERR;
uint16_t tstaddr;
args.SetResult(int(addrmap.Find(name, tstaddr)));
 
} else if (opt == "-testaddr") { // amap -testaddr addr
if (!args.GetArg("addr", addr)) return kERR;
if (!args.AllDone()) return kERR;
string tstname;
args.SetResult(int(addrmap.Find(addr, tstname)));
 
} else if (opt == "-insert") { // amap -insert name addr
uint16_t tstaddr;
string tstname;
int tstint;
if (!args.GetArg("name", name)) return kERR;
// enforce that the name is not a valid representation of an int
if (Tcl_GetIntFromObj(nullptr, args[args.NDone()-1], &tstint) == kOK)
return args.Quit(string("-E: name should not look like an int but '")+
name + "' does");
if (!args.GetArg("addr", addr)) return kERR;
if (!args.AllDone()) return kERR;
if (addrmap.Find(name, tstaddr))
return args.Quit(string("-E: mapping already defined for '")+name+"'");
if (addrmap.Find(addr, tstname))
return args.Quit(string("-E: mapping already defined for address '") +
args.PeekArgString(-1) + "'");
Obj().IAddrMapInsert(name, addr);
 
} else if (opt == "-erase") { // amap -erase name
if (!args.GetArg("name", name)) return kERR;
if (!args.AllDone()) return kERR;
if (!Obj().IAddrMapErase(name))
return args.Quit(string("-E: no mapping defined for '") + name + "'");
 
} else if (opt == "-print") { // amap -print
if (!args.AllDone()) return kERR;
ostringstream sos;
addrmap.Print(sos);
args.AppendResultLines(sos);
}
} else {
if (!args.OptValid()) return kERR;
if (!args.GetArg("?name", name)) return kERR;
if (args.NOptMiss()==0) { // amap name
uint16_t tstaddr;
if(addrmap.Find(name, tstaddr)) {
args.SetResult(int(tstaddr));
} else {
return args.Quit(string("-E: no mapping defined for '") + name + "'");
}
 
} else { // amap
RtclOPtr plist(Tcl_NewListObj(0, nullptr));
const RlinkAddrMap::amap_t amap = addrmap.Amap();
for (RlinkAddrMap::amap_cit_t it=amap.begin(); it!=amap.end(); it++) {
Tcl_Obj* tpair[2];
tpair[0] = Tcl_NewIntObj(it->first);
tpair[1] = Tcl_NewStringObj((it->second).c_str(),(it->second).length());
Tcl_ListObjAppendElement(nullptr, plist, Tcl_NewListObj(2, tpair));
}
args.SetResult(plist);
}
}
return kOK;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
int RtclRw11Cpu::M_cp(RtclArgs& args)
{
static RtclNameSet optset("-rr|-rr0|-rr1|-rr2|-rr3|-rr4|-rr5|-rr6|-rr7|"
119,19 → 218,21
"-ral|-rah|-wal|-wah|-wa|"
"-rm|-rmi|-wm|-wmi|-brm|-bwm|"
"-stapc|-start|-stop|-continue|-step|-reset|"
"-ribrb|-wibrb|-ribr|-wibr|"
"-rmembe|-wmembe|-ribr|-wibr|"
"-rconf|-rstat|"
"-edata|-estat|-estatdef"
);
"-edata|-edone|-estat|-estatdef|"
"-print|-dump|");
 
Tcl_Interp* interp = args.Interp();
 
RlinkCommandList clist;
string opt;
uint16_t base = Obj().Base();
uint16_t base = Obj().Base();
 
vector<string> vardata;
vector<string> varstat;
string varprint;
string vardump;
 
uint8_t estatdef_val = 0x00;
uint8_t estatdef_msk = 0xff;
223,7 → 324,8
 
} else if (opt == "-rm" || // -rm(i) ?varData ?varStat ------
opt == "-rmi") {
uint16_t addr = opt=="-rm" ? Rw11Cpu::kCp_addr_mem : Rw11Cpu::kCp_addr_memi;
uint16_t addr = opt=="-rm" ? Rw11Cpu::kCp_addr_mem :
Rw11Cpu::kCp_addr_memi;
if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
clist.AddRreg(base + addr);
280,44 → 382,41
if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
clist.AddWreg(base + Rw11Cpu::kCp_addr_cntl, Rw11Cpu::kCp_func_reset);
 
} else if (opt == "-ribrb") { // -ribrb ?varData ?varStat ------
} else if (opt == "-rmembe") { // -rmembe ?varData ?varStat ------
if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
clist.AddRreg(base + Rw11Cpu::kCp_addr_ibrb);
clist.AddRreg(base + Rw11Cpu::kCp_addr_membe);
 
} else if (opt == "-wibrb") { // -wibrb base ?varStat [-be be] -
uint16_t data;
if (!args.GetArg("base", data)) return kERR;
} else if (opt == "-wmembe") { // -wmembe be ?varStat [-stick] -
uint16_t be;
bool stick = false;
if (!args.GetArg("be", be, 3)) return kERR;
if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
 
data &= 0177700; // clear byte enables
static RtclNameSet suboptset("-be");
static RtclNameSet suboptset("-stick");
string subopt;
while (args.NextSubOpt(subopt, suboptset)>=0) { // loop for sub-options
if (!args.OptValid()) return kERR;
if (subopt == "-be") { // -be be
uint16_t be;
if (!args.GetArg("be", be, 0x3)) return kERR;
if (be == 0) be = 0x3; // map be 0 -> be 3
data |= be; // set byte enables
if (subopt == "-stick") { // -stick
stick = true;
}
}
clist.AddWreg(base + Rw11Cpu::kCp_addr_ibrb, data);
Obj().AddMembe(clist, be, stick);
 
} else if (opt == "-ribr") { // -ribr off ?varData ?varStat ----
uint16_t off;
if (!args.GetArg("off", off, 63)) return kERR;
uint16_t ibaddr;
if (!GetIAddr(args, ibaddr)) return kERR;
if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
clist.AddRreg(base + Rw11Cpu::kCp_addr_ibr + off/2);
Obj().AddRibr(clist, ibaddr);
 
} else if (opt == "-wibr") { // -wibr off data ?varStat --------
uint16_t off;
uint16_t ibaddr;
uint16_t data;
if (!args.GetArg("off", off, 63)) return kERR;
if (!args.GetArg("data", data)) return kERR;
if (!GetIAddr(args, ibaddr)) return kERR;
if (!args.GetArg("data", data)) return kERR;
if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
clist.AddWreg(base + Rw11Cpu::kCp_addr_ibr + off/2, data);
Obj().AddWibr(clist, ibaddr, data);
 
} else if (opt == "-rconf") { // -rconf ?varData ?varStat ------
if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
351,6 → 450,23
clist[lsize-1].Expect()->SetData(data, mask);
}
 
} else if (opt == "-edone") { // -edone done --------------------
if (lsize == 0)
return args.Quit("-E: -edone not allowed on empty command list");
uint16_t done=0;
if (!args.GetArg("done", done)) return kERR;
if (clist[lsize-1].Expect()==0) {
clist[lsize-1].SetExpect(new RlinkCommandExpect(estatdef_val,
estatdef_msk));
}
uint8_t cmd = clist[lsize-1].Command();
if (cmd == RlinkCommand::kCmdRblk ||
cmd == RlinkCommand::kCmdWblk) {
clist[lsize-1].Expect()->SetDone(done);
} else {
return args.Quit("-E: -edone allowed only after -rblk,-wblk");
}
 
} else if (opt == "-estat") { // -estat ?stat ?mask -------------
if (lsize == 0)
return args.Quit("-E: -estat not allowed on empty command list");
373,6 → 489,12
estatdef_val = stat;
estatdef_msk = mask;
 
} else if (opt == "-print") { // -print ?varRes -----------------
varprint = "-";
if (!args.GetArg("??varRes", varprint)) return kERR;
} else if (opt == "-dump") { // -dump ?varRes ------------------
vardump = "-";
if (!args.GetArg("??varRes", vardump)) return kERR;
}
 
if (estatdef_msk != 0xff && // estatdef defined
387,6 → 509,13
 
}
 
int nact = 0;
if (varprint == "-") nact += 1;
if (vardump == "-") nact += 1;
if (nact > 1)
return args.Quit(
"-E: more that one of -print,-dump without target variable found");
 
if (!args.AllDone()) return kERR;
if (clist.Size() == 0) return kOK;
 
398,6 → 527,7
// FIXME_code: is this a good idea ??
if (!Connect().Exec(clist, emsg)) return args.Quit(emsg);
 
// FIXME: this code is a 1-to-1 copy from RtclRlinkConnect ! put into a method
for (size_t icmd=0; icmd<clist.Size(); icmd++) {
RlinkCommand& cmd = clist[icmd];
407,6 → 537,8
RtclOPtr pele;
switch (cmd.Command()) {
case RlinkCommand::kCmdRreg:
case RlinkCommand::kCmdAttn:
case RlinkCommand::kCmdLabo:
pres = Tcl_NewIntObj((int)cmd.Data());
break;
 
423,6 → 555,22
}
}
 
if (!varprint.empty()) {
ostringstream sos;
const RlinkConnect::LogOpts& logopts = Connect().GetLogOpts();
clist.Print(sos, Connect().Context(), &Connect().AddrMap(),
logopts.baseaddr, logopts.basedata, logopts.basestat);
RtclOPtr pobj(Rtcl::NewLinesObj(sos));
if (!Rtcl::SetVarOrResult(args.Interp(), varprint, pobj)) return kERR;
}
 
if (!vardump.empty()) {
ostringstream sos;
clist.Dump(sos, 0);
RtclOPtr pobj(Rtcl::NewLinesObj(sos));
if (!Rtcl::SetVarOrResult(args.Interp(), vardump, pobj)) return kERR;
}
 
return kOK;
}
 
1104,6 → 1252,41
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
bool RtclRw11Cpu::GetIAddr(RtclArgs& args, uint16_t& ibaddr)
{
Tcl_Obj* pobj=0;
if (!args.GetArg("ibaddr", pobj)) return kERR;
 
int tstint;
// if a number is given..
if (Tcl_GetIntFromObj(nullptr, pobj, &tstint) == kOK) {
if (tstint >= 0 && tstint <= 0xffff && (tstint & 0x1) == 0) {
ibaddr = (uint16_t)tstint;
} else {
args.AppendResult("-E: value '", Tcl_GetString(pobj),
"' for 'addr' odd number or out of range 0...0xffff",
nullptr);
return false;
}
// if a name is given
} else {
string name(Tcl_GetString(pobj));
uint16_t tstaddr;
if (Obj().IAddrMap().Find(name, tstaddr)) {
ibaddr = tstaddr;
} else {
args.AppendResult("-E: no address mapping known for '",
Tcl_GetString(pobj), "'", nullptr);
return false;
}
}
 
return true;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
bool RtclRw11Cpu::GetVarName(RtclArgs& args, const char* argname,
size_t nind,
std::vector<std::string>& varname)
/trunk/tools/src/librwxxtpp/RtclRw11Cpu.hpp
1,6 → 1,6
// $Id: RtclRw11Cpu.hpp 511 2013-04-27 13:51:46Z mueller $
// $Id: RtclRw11Cpu.hpp 621 2014-12-26 21:20:05Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2014 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-25 621 1.0.2 add M_amap
// 2013-04-26 511 1.0.1 add M_show
// 2013-04-02 502 1.0 Initial version
// 2013-02-02 480 0.1 First draft
21,7 → 22,7
 
/*!
\file
\version $Id: RtclRw11Cpu.hpp 511 2013-04-27 13:51:46Z mueller $
\version $Id: RtclRw11Cpu.hpp 621 2014-12-26 21:20:05Z mueller $
\brief Declaration of class RtclRw11Cpu.
*/
 
51,6 → 52,7
 
protected:
int M_add(RtclArgs& args);
int M_amap(RtclArgs& args);
int M_cp(RtclArgs& args);
int M_wtcpu(RtclArgs& args);
int M_deposit(RtclArgs& args);
71,6 → 73,7
RlinkServer& Server();
RlinkConnect& Connect();
 
bool GetIAddr(RtclArgs& args, uint16_t& ibaddr);
bool GetVarName(RtclArgs& args, const char* argname,
size_t nind, std::vector<std::string>& varname);
 
/trunk/tools/src/librwxxtpp/RtclRw11Cntl.hpp
1,6 → 1,6
// $Id: RtclRw11Cntl.hpp 504 2013-04-13 15:37:24Z mueller $
// $Id: RtclRw11Cntl.hpp 627 2015-01-04 11:36:37Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2015 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2015-01-03 627 1.1 M_stats now virtual
// 2013-03-06 495 1.0 Initial version
// 2013-02-08 484 0.1 First draft
// ---------------------------------------------------------------------------
20,7 → 21,7
 
/*!
\file
\version $Id: RtclRw11Cntl.hpp 504 2013-04-13 15:37:24Z mueller $
\version $Id: RtclRw11Cntl.hpp 627 2015-01-04 11:36:37Z mueller $
\brief Declaration of class RtclRw11Cntl.
*/
 
52,7 → 53,7
int M_get(RtclArgs& args);
int M_set(RtclArgs& args);
int M_probe(RtclArgs& args);
int M_stats(RtclArgs& args);
virtual int M_stats(RtclArgs& args);
int M_dump(RtclArgs& args);
int M_default(RtclArgs& args);
 
/trunk/tools/src/librwxxtpp/RtclRw11.cpp
1,6 → 1,6
// $Id: RtclRw11.cpp 513 2013-05-01 14:02:06Z mueller $
// $Id: RtclRw11.cpp 621 2014-12-26 21:20:05Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2014 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-25 621 1.1 adopt to 4k word ibus window
// 2013-03-06 495 1.0 Initial version
// 2013-01-27 478 0.1 First Draft
// ---------------------------------------------------------------------------
19,7 → 20,7
 
/*!
\file
\version $Id: RtclRw11.cpp 513 2013-05-01 14:02:06Z mueller $
\version $Id: RtclRw11.cpp 621 2014-12-26 21:20:05Z mueller $
\brief Implemenation of class RtclRw11.
*/
 
100,7 → 101,7
if (type == "w11a") { // w11a --------------------------
RtclRw11CpuW11a* pobj = new RtclRw11CpuW11a(args.Interp(), "cpu0");
// configure cpu
pobj->Obj().Setup(0,0); // ind=0,base=0
pobj->Obj().Setup(0,0,0x4000); // ind=0,base=0,ibase=0x4000
// install in w11
Obj().AddCpu(dynamic_pointer_cast<Rw11Cpu>(pobj->ObjSPtr()));
 
/trunk/tools/src/librlink/RlinkConnect.hpp
1,6 → 1,6
// $Id: RlinkConnect.hpp 611 2014-12-10 23:23:58Z mueller $
// $Id: RlinkConnect.hpp 626 2015-01-03 14:41:37Z mueller $
//
// Copyright 2011-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2011-2015 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
13,6 → 13,9
//
// Revision History:
// Date Rev Version Comment
// 2015-01-01 626 2.1 full rlink v4 implementation
// 2014-12-25 621 2.0.2 Reorganize packet send/revd stats
// 2014-12-20 616 2.0.1 add BlockDone expect checks
// 2014-12-10 611 2.0 re-organize for rlink v4
// 2013-04-21 509 1.3.3 add SndAttn() method
// 2013-03-05 495 1.3.2 add Exec() without emsg (will send emsg to LogFile)
32,7 → 35,7
 
/*!
\file
\version $Id: RlinkConnect.hpp 611 2014-12-10 23:23:58Z mueller $
\version $Id: RlinkConnect.hpp 626 2015-01-03 14:41:37Z mueller $
\brief Declaration of class \c RlinkConnect.
*/
 
113,12 → 116,17
bool SndOob(uint16_t addr, uint16_t data, RerrMsg& emsg);
bool SndAttn(RerrMsg& emsg);
 
uint32_t SysId() const;
size_t RbufSize() const;
size_t BlockSizeMax() const;
size_t BlockSizePrudent() const;
 
bool AddrMapInsert(const std::string& name, uint16_t addr);
bool AddrMapErase(const std::string& name);
bool AddrMapErase(uint16_t addr);
void AddrMapClear();
const RlinkAddrMap& AddrMap() const;
 
const RlinkAddrMap& AddrMap() const;
const Rstats& Stats() const;
const Rstats& SndStats() const;
const Rstats& RcvStats() const;
156,6 → 164,12
static const uint16_t kSBCNTL_V_RLBMON= 14; //!< SBCNTL: rlbmon enable bit
static const uint16_t kSBCNTL_V_RBMON = 13; //!< SBCNTL: rbmon enable bit
 
// space beyond data for rblk = 8 :cmd(1) cnt(2) dcnt(2) stat(1) crc(2)
// and wblk = 3 :cmd(1) cnt(2)
static const uint16_t kRbufBlkDelta=16; //!< rbuf needed for rblk or wblk
// 512 byte are enough space for a prudent amount of non-blk commands
static const uint16_t kRbufPrudentDelta=512; //!< Rbuf space reserve
 
// statistics counter indices
enum stats {
kStatNExec = 0, //!< Exec() calls
170,11 → 184,11
kStatNInit, //!< init commands
kStatNRblkWord, //!< words rcvd with rblk
kStatNWblkWord, //!< words send with wblk
kStatNTxPktByt, //!< Tx packet bytes send
kStatNRxPktByt, //!< Rx packet bytes rcvd
kStatNExpData, //!< Expect() for data defined
kStatNExpStat, //!< Expect() for stat defined"
kStatNExpDone, //!< Expect() for done defined
kStatNExpStat, //!< Expect() for stat defined
kStatNChkData, //!< expect data failed
kStatNChkDone, //!< expect done failed
kStatNChkStat, //!< expect stat failed
kStatNSndOob, //!< SndOob() calls
kStatNErrMiss, //!< decode: missing data
212,6 → 226,8
boost::recursive_mutex fConnectMutex; //!< mutex to lock whole connect
uint16_t fAttnNotiPatt; //!< attn notifier pattern
double fTsLastAttnNoti; //!< time stamp last attn notify
uint32_t fSysId; //!< SYSID of connected device
size_t fRbufSize; //!< Rbuf size (in bytes)
};
} // end namespace Retro
/trunk/tools/src/librlink/RlinkConnect.ipp
1,6 → 1,6
// $Id: RlinkConnect.ipp 604 2014-11-16 22:33:09Z mueller $
// $Id: RlinkConnect.ipp 626 2015-01-03 14:41:37Z mueller $
//
// Copyright 2011-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2011-2015 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2015-01-01 626 2.1 full rlink v4 implementation
// 2013-03-05 495 1.2.1 add Exec() without emsg (will send emsg to LogFile)
// 2013-02-23 492 1.2 use scoped_ptr for Port; Close allways allowed
// use RlinkContext, add Context(), Exec(..., cntx)
24,7 → 25,7
 
/*!
\file
\version $Id: RlinkConnect.ipp 604 2014-11-16 22:33:09Z mueller $
\version $Id: RlinkConnect.ipp 626 2015-01-03 14:41:37Z mueller $
\brief Implemenation (inline) of RlinkConnect.
*/
 
88,7 → 89,35
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
inline uint32_t RlinkConnect::SysId() const
{
return fSysId;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
inline size_t RlinkConnect::RbufSize() const
{
return fRbufSize;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
inline size_t RlinkConnect::BlockSizeMax() const
{
return (fRbufSize-kRbufBlkDelta)/2;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
inline size_t RlinkConnect::BlockSizePrudent() const
{
return (fRbufSize-kRbufPrudentDelta)/2;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline bool RlinkConnect::AddrMapInsert(const std::string& name, uint16_t addr)
{
return fAddrMap.Insert(name, addr);
/trunk/tools/src/librlink/RlinkPacketBufSnd.cpp
1,4 → 1,4
// $Id: RlinkPacketBufSnd.cpp 606 2014-11-24 07:08:51Z mueller $
// $Id: RlinkPacketBufSnd.cpp 621 2014-12-26 21:20:05Z mueller $
//
// Copyright 2014- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-25 621 1.0.1 Reorganize packet send/revd stats
// 2014-11-15 604 1.0 Initial version
// 2014-11-02 600 0.1 First draft (re-organize PacketBuf for rlink v4)
// ---------------------------------------------------------------------------
19,7 → 20,7
 
/*!
\file
\version $Id: RlinkPacketBufSnd.cpp 606 2014-11-24 07:08:51Z mueller $
\version $Id: RlinkPacketBufSnd.cpp 621 2014-12-26 21:20:05Z mueller $
\brief Implemenation of class RlinkPacketBuf.
*/
 
49,6 → 50,7
: fRawBuf()
{
// Statistic setup
fStats.Define(kStatNTxPktByt, "NTxPktByt", "Tx packet bytes send");
fStats.Define(kStatNTxEsc, "NTxEsc", "Tx data escapes");
}
 
108,8 → 110,9
PutRawEsc(kEcEop); // <EOP>
fStats.Inc(kStatNTxEsc , double(nesc));
 
return SndRaw(port, emsg);
bool sndok = SndRaw(port, emsg);
if (sndok) fStats.Inc(kStatNTxPktByt, double(PktSize()));
return sndok;
}
 
//------------------------------------------+-----------------------------------
/trunk/tools/src/librlink/RlinkPacketBufSnd.hpp
1,4 → 1,4
// $Id: RlinkPacketBufSnd.hpp 606 2014-11-24 07:08:51Z mueller $
// $Id: RlinkPacketBufSnd.hpp 621 2014-12-26 21:20:05Z mueller $
//
// Copyright 2014- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-25 621 1.0.1 Reorganize packet send/revd stats
// 2014-11-14 604 1.0 Initial version
// 2014-11-02 600 0.1 First draft (re-organize PacketBuf for rlink v4)
// ---------------------------------------------------------------------------
20,7 → 21,7
 
/*!
\file
\version $Id: RlinkPacketBufSnd.hpp 606 2014-11-24 07:08:51Z mueller $
\version $Id: RlinkPacketBufSnd.hpp 621 2014-12-26 21:20:05Z mueller $
\brief Declaration of class RlinkPacketBufSnd.
*/
 
61,7 → 62,8
// statistics counter indices
enum stats {
kStatNTxEsc = 0
kStatNTxPktByt=0, //!< Tx packet bytes send
kStatNTxEsc //!< Tx data escapes
};
 
protected:
/trunk/tools/src/librlink/RlinkCommandExpect.hpp
1,6 → 1,6
// $Id: RlinkCommandExpect.hpp 492 2013-02-24 22:14:47Z mueller $
// $Id: RlinkCommandExpect.hpp 616 2014-12-21 10:09:25Z mueller $
//
// Copyright 2011- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2011-2014 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-20 616 1.1 add Done count methods (for rblk/wblk)
// 2011-03-12 368 1.0 Initial version
// 2011-01-15 355 0.1 First draft
// ---------------------------------------------------------------------------
20,7 → 21,7
 
/*!
\file
\version $Id: RlinkCommandExpect.hpp 492 2013-02-24 22:14:47Z mueller $
\version $Id: RlinkCommandExpect.hpp 616 2014-12-21 10:09:25Z mueller $
\brief Declaration of class RlinkCommandExpect.
*/
 
48,6 → 49,7
 
void SetStatus(uint8_t stat, uint8_t statmsk=0);
void SetData(uint16_t data, uint16_t datamsk=0);
void SetDone(uint16_t done, bool check=true);
void SetBlock(const std::vector<uint16_t>& block);
void SetBlock(const std::vector<uint16_t>& block,
const std::vector<uint16_t>& blockmsk);
56,16 → 58,19
uint8_t StatusMask() const;
uint16_t DataValue() const;
uint16_t DataMask() const;
uint16_t DoneValue() const;
const std::vector<uint16_t>& BlockValue() const;
const std::vector<uint16_t>& BlockMask() const;
 
bool StatusCheck(uint8_t val) const;
bool DataCheck(uint16_t val) const;
bool DoneCheck(uint16_t val) const;
bool BlockCheck(size_t ind, uint16_t val) const;
size_t BlockCheck(const uint16_t* pval, size_t size) const;
 
bool StatusIsChecked() const;
bool DataIsChecked() const;
bool DoneIsChecked() const;
bool BlockIsChecked(size_t ind) const;
 
void Dump(std::ostream& os, int ind=0, const char* text=0) const;
/trunk/tools/src/librlink/RlinkCommandExpect.ipp
1,6 → 1,6
// $Id: RlinkCommandExpect.ipp 488 2013-02-16 18:49:47Z mueller $
// $Id: RlinkCommandExpect.ipp 616 2014-12-21 10:09:25Z mueller $
//
// Copyright 2011- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2011-2014 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-20 616 1.1 add Done count methods (for rblk/wblk)
// 2011-03-12 368 1.0 Initial version
// 2011-01-15 355 0.1 First draft
// ---------------------------------------------------------------------------
19,7 → 20,7
 
/*!
\file
\version $Id: RlinkCommandExpect.ipp 488 2013-02-16 18:49:47Z mueller $
\version $Id: RlinkCommandExpect.ipp 616 2014-12-21 10:09:25Z mueller $
\brief Implemenation (inline) of class RlinkCommandExpect.
*/
 
49,6 → 50,16
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline void RlinkCommandExpect::SetDone(uint16_t done, bool check)
{
fDataVal = done;
fDataMsk = check ? 0 : 0xffff;
return;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline void RlinkCommandExpect::SetBlock(const std::vector<uint16_t>& block)
{
fBlockVal = block;
102,6 → 113,14
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline uint16_t RlinkCommandExpect::DoneValue() const
{
return fDataVal;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline const std::vector<uint16_t>& RlinkCommandExpect::BlockValue() const
{
return fBlockVal;
134,6 → 153,14
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline bool RlinkCommandExpect::DoneCheck(uint16_t val) const
{
return !DoneIsChecked() || val == fDataVal;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline bool RlinkCommandExpect::StatusIsChecked() const
{
return fStatusMsk != 0xff;
147,4 → 174,12
return fDataMsk != 0xffff;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
inline bool RlinkCommandExpect::DoneIsChecked() const
{
return fDataMsk == 0;
}
 
} // end namespace Retro
/trunk/tools/src/librlink/RlinkServer.cpp
1,4 → 1,4
// $Id: RlinkServer.cpp 611 2014-12-10 23:23:58Z mueller $
// $Id: RlinkServer.cpp 628 2015-01-04 16:22:09Z mueller $
//
// Copyright 2013-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
13,6 → 13,8
//
// Revision History:
// Date Rev Version Comment
// 2014-12-30 625 2.1 adopt to Rlink V4 attn logic
// 2014-12-21 617 2.0.1 use kStat_M_RbTout for rbus timeout
// 2014-12-11 611 2.0 re-organize for rlink v4
// 2013-05-01 513 1.0.2 fTraceLevel now uint32_t
// 2013-04-21 509 1.0.1 add Resume(), reorganize server start handling
22,7 → 24,7
 
/*!
\file
\version $Id: RlinkServer.cpp 611 2014-12-10 23:23:58Z mueller $
\version $Id: RlinkServer.cpp 628 2015-01-04 16:22:09Z mueller $
\brief Implemenation of RlinkServer.
*/
 
65,7 → 67,9
fStats()
{
fContext.SetStatus(0,
~(RlinkCommand::kStat_M_RbNak|RlinkCommand::kStat_M_RbErr));
~(RlinkCommand::kStat_M_RbTout |
RlinkCommand::kStat_M_RbNak |
RlinkCommand::kStat_M_RbErr));
 
fELoop.AddPollHandler(boost::bind(&RlinkServer::WakeupHandler, this, _1),
fWakeupEvent, POLLIN);
75,7 → 79,9
fStats.Define(kStatNEloopPoll,"NEloopPoll","event loop turns (poll)");
fStats.Define(kStatNWakeupEvt,"NWakeupEvt","Wakeup events");
fStats.Define(kStatNRlinkEvt, "NRlinkEvt", "Rlink data events");
fStats.Define(kStatNAttnRead, "NAttnRead", "Attn read commands");
fStats.Define(kStatNAttnHdl ,"NAttnHdl" ,"Attn handler calls");
fStats.Define(kStatNAttnNoti ,"NAttnNoti" ,"Attn notifies processed");
fStats.Define(kStatNAttnHarv ,"NAttnHarv" ,"Attn handler restarts");
fStats.Define(kStatNAttn00, "NAttn00", "Attn bit 0 set");
fStats.Define(kStatNAttn01, "NAttn01", "Attn bit 1 set");
fStats.Define(kStatNAttn02, "NAttn02", "Attn bit 2 set");
147,6 → 153,36
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void RlinkServer::GetAttnInfo(AttnArgs& args, RlinkCommandList& clist)
{
RlinkCommand& cmd0 = clist[0];
if (cmd0.Command() != RlinkCommand::kCmdAttn)
throw Rexception("RlinkServer::GetAttnInfo", "clist did't start with attn");
 
RerrMsg emsg;
if (!Exec(clist, emsg))
throw Rexception("RlinkServer::GetAttnInfo", "Exec() failed: ", emsg);
 
args.fAttnHarvest = cmd0.Data();
args.fHarvestDone = true;
 
return;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void RlinkServer::GetAttnInfo(AttnArgs& args)
{
RlinkCommandList clist;
clist.AddAttn();
GetAttnInfo(args, clist);
return;
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
void RlinkServer::RemoveAttnHandler(uint16_t mask, void* cdata)
{
boost::lock_guard<RlinkConnect> lock(*fspConn);
267,9 → 303,9
// only called under lock !!
if (apat & fAttnNotiPatt) {
RlogMsg lmsg(LogFile(), 'W');
lmsg << "SignalAttnNotify: redundant notify: "
<< " have=" << RosPrintBvi(fAttnNotiPatt,16)
<< " apat=" << RosPrintBvi(apat,16);
lmsg << "SignalAttnNotify: redundant notify:"
<< " have=" << RosPrintBvi(fAttnNotiPatt,16)
<< " apat=" << RosPrintBvi(apat,16);
}
fAttnNotiPatt |= apat;
Wakeup();
398,58 → 434,60
 
void RlinkServer::CallAttnHandler()
{
// FIXME_code: this is still V3 logic
// notifier pattern is ignored, only that one was received is used
fStats.Inc(kStatNAttnHdl);
 
// if notifier pending, transfer it to current attn pattern
if (fAttnNotiPatt) {
boost::lock_guard<RlinkConnect> lock(*fspConn);
uint16_t onoti = fAttnNotiPatt;
 
// Clear fAttnNotiPatt before clist is issued ! This avoids a race
// in case the attn read is followed immediately by a notify which
// is signaled during Exec().
fStats.Inc(kStatNAttnNoti);
fAttnPatt |= fAttnNotiPatt;
fAttnNotiPatt = 0;
}
 
RlinkCommandList clist;
clist.AddAttn();
fStats.Inc(kStatNAttnRead);
Exec(clist);
// FIXME_code: handle errors: bool ok =
uint16_t nattn = clist[0].Data();
fAttnPatt |= nattn;
// do stats for pending attentions
for (size_t i=0; i<16; i++) {
if (fAttnPatt & (uint16_t(1)<<i)) fStats.Inc(kStatNAttn00+i);
}
 
if (onoti & (~nattn)) { // bits in notify not in attn ?
RlogMsg lmsg(LogFile(), 'W');
lmsg << "CallAttnHandler: missing lams in attn: "
<< " attn=" << RosPrintBvi(nattn,16)
<< " noti=" << RosPrintBvi(onoti,16);
}
for (size_t i=0; i<16; i++) {
if (nattn & (uint16_t(1)<<i)) fStats.Inc(kStatNAttn00+i);
}
}
// multiple handlers may be called for one attn bit
// now call handlers, multiple handlers may be called for one attn bit
uint16_t hnext = 0;
uint16_t hdone = 0;
for (size_t i=0; i<fAttnDsc.size(); i++) {
uint16_t hmatch = fAttnPatt & fAttnDsc[i].fId.fMask;
if (hmatch) {
AttnArgs args(fAttnPatt, fAttnDsc[i].fId.fMask);
boost::lock_guard<RlinkConnect> lock(*fspConn);
 
// FIXME_code: return code not used, yet
boost::lock_guard<RlinkConnect> lock(*fspConn);
fAttnDsc[i].fHandler(args);
if (!args.fHarvestDone)
Rexception("RlinkServer::CallAttnHandler()",
"Handler didn't set fHarvestDone");
 
uint16_t hnew = args.fAttnHarvest & ~fAttnDsc[i].fId.fMask;
hnext |= hnew;
hdone |= hmatch;
}
}
fAttnPatt &= ~hdone; // clear handled bits
 
if (fAttnPatt && fTraceLevel>0) {
RlogMsg lmsg(LogFile(), 'I');
lmsg << "eloop: unhandled attn, mask="
<< RosPrintBvi(fAttnPatt,16) << endl;
// if there are any unhandled attenions, do default handling which will
// ensure that attention harvest is done
if (fAttnPatt) {
AttnArgs args(fAttnPatt, fAttnPatt);
GetAttnInfo(args);
hnext |= args.fAttnHarvest & ~fAttnPatt;
if (fTraceLevel>0) {
RlogMsg lmsg(LogFile(), 'I');
lmsg << "eloop: unhandled attn, mask="
<< RosPrintBvi(fAttnPatt,16) << endl;
}
}
fAttnPatt = 0;
// finally replace current attn pattern by the attentions found during
// harvest and not yet handled
fAttnPatt = hnext;
if (fAttnPatt) fStats.Inc(kStatNAttnHarv);
 
return;
}
/trunk/tools/src/librlink/RlinkServer.hpp
1,4 → 1,4
// $Id: RlinkServer.hpp 607 2014-11-30 20:02:48Z mueller $
// $Id: RlinkServer.hpp 625 2014-12-30 16:17:45Z mueller $
//
// Copyright 2013-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-30 625 2.1 adopt to Rlink V4 attn logic
// 2014-11-30 607 2.0 re-organize for rlink v4
// 2013-05-01 513 1.0.2 fTraceLevel now uint32_t
// 2013-04-21 509 1.0.1 add Resume(), reorganize server start handling
22,7 → 23,7
 
/*!
\file
\version $Id: RlinkServer.hpp 607 2014-11-30 20:02:48Z mueller $
\version $Id: RlinkServer.hpp 625 2014-12-30 16:17:45Z mueller $
\brief Declaration of class \c RlinkServer.
*/
 
52,19 → 53,17
public:
 
struct AttnArgs {
uint16_t fAttnPatt;
uint16_t fAttnMask;
RlinkCommandList* fpClist;
size_t fOffset;
uint16_t fAttnPatt; //<! in: current attention pattern
uint16_t fAttnMask; //<! in: handler attention mask
uint16_t fAttnHarvest; //<! out: harvested attentions
bool fHarvestDone; //<! out: set true when harvested
AttnArgs();
AttnArgs(uint16_t apatt, uint16_t amask);
AttnArgs(uint16_t apatt, uint16_t amask,
RlinkCommandList* pclist, size_t off);
};
 
typedef ReventLoop::pollhdl_t pollhdl_t;
typedef boost::function<int(const AttnArgs&)> attnhdl_t;
typedef boost::function<int()> actnhdl_t;
typedef ReventLoop::pollhdl_t pollhdl_t;
typedef boost::function<int(AttnArgs&)> attnhdl_t;
typedef boost::function<int()> actnhdl_t;
 
explicit RlinkServer();
virtual ~RlinkServer();
81,10 → 80,11
void AddAttnHandler(const attnhdl_t& attnhdl, uint16_t mask,
void* cdata = 0);
void RemoveAttnHandler(uint16_t mask, void* cdata = 0);
void GetAttnInfo(AttnArgs& args, RlinkCommandList& clist);
void GetAttnInfo(AttnArgs& args);
 
void QueueAction(const actnhdl_t& actnhdl);
 
 
void AddPollHandler(const pollhdl_t& pollhdl,
int fd, short events=POLLIN);
bool TestPollHandler(int fd, short events=POLLIN);
115,7 → 115,9
kStatNEloopPoll, //!< event loop turns (poll)
kStatNWakeupEvt, //!< Wakeup events
kStatNRlinkEvt, //!< Rlink data events
kStatNAttnRead, //!< Attn read commands
kStatNAttnHdl, //<! Attn handler calls
kStatNAttnNoti, //<! Attn notifies processed
kStatNAttnHarv, //<! Attn handler restarts
kStatNAttn00, //!< Attn bit 0 set
kStatNAttn01, //!< Attn bit 1 set
kStatNAttn02, //!< Attn bit 2 set
/trunk/tools/src/librlink/RlinkServer.ipp
1,4 → 1,4
// $Id: RlinkServer.ipp 610 2014-12-09 22:44:43Z mueller $
// $Id: RlinkServer.ipp 625 2014-12-30 16:17:45Z mueller $
//
// Copyright 2013-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-30 625 2.1 adopt to Rlink V4 attn logic
// 2014-11-30 607 2.0 re-organize for rlink v4
// 2013-05-01 513 1.0.1 fTraceLevel now uint32_t
// 2013-03-06 495 1.0 Initial version
21,7 → 22,7
 
/*!
\file
\version $Id: RlinkServer.ipp 610 2014-12-09 22:44:43Z mueller $
\version $Id: RlinkServer.ipp 625 2014-12-30 16:17:45Z mueller $
\brief Implemenation (inline) of RlinkServer.
*/
 
108,7 → 109,6
return !fActnList.empty();
}
 
 
//==========================================+===================================
// AttnArgs sub class
 
123,8 → 123,8
inline RlinkServer::AttnArgs::AttnArgs()
: fAttnPatt(0),
fAttnMask(0),
fpClist(0),
fOffset(0)
fAttnHarvest(0),
fHarvestDone(false)
{}
 
//------------------------------------------+-----------------------------------
133,21 → 133,10
inline RlinkServer::AttnArgs::AttnArgs(uint16_t apatt, uint16_t amask)
: fAttnPatt(apatt),
fAttnMask(amask),
fpClist(0),
fOffset(0)
fAttnHarvest(0),
fHarvestDone(false)
{}
 
//------------------------------------------+-----------------------------------
//! Constructor
 
inline RlinkServer::AttnArgs::AttnArgs(uint16_t apatt, uint16_t amask,
RlinkCommandList* pclist, size_t offset)
: fAttnPatt(apatt),
fAttnMask(amask),
fpClist(pclist),
fOffset(offset)
{}
 
//==========================================+===================================
// AttnId sub class
 
/trunk/tools/src/librlink/RlinkCommand.cpp
1,6 → 1,6
// $Id: RlinkCommand.cpp 609 2014-12-07 19:35:25Z mueller $
// $Id: RlinkCommand.cpp 628 2015-01-04 16:22:09Z mueller $
//
// Copyright 2011-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2011-2015 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
13,6 → 13,9
//
// Revision History:
// Date Rev Version Comment
// 2015-01-04 628 1.2.3 Print(): adopt large nblk;
// 2014-12-21 617 1.2.2 use kStat_M_RbTout for rbus timeout
// 2014-12-20 616 1.2.1 Print(): display BlockDone; add kFlagChkDone
// 2014-12-06 609 1.2 new rlink v4 iface
// 2014-08-15 583 1.1 rb_mreq addr now 16 bit
// 2013-05-06 495 1.0.2 add RlinkContext to Print() args
23,7 → 26,7
 
/*!
\file
\version $Id: RlinkCommand.cpp 609 2014-12-07 19:35:25Z mueller $
\version $Id: RlinkCommand.cpp 628 2015-01-04 16:22:09Z mueller $
\brief Implemenation of class RlinkCommand.
*/
 
70,11 → 73,13
const uint32_t RlinkCommand::kFlagErrDec;
const uint32_t RlinkCommand::kFlagChkStat;
const uint32_t RlinkCommand::kFlagChkData;
const uint32_t RlinkCommand::kFlagChkDone;
 
const uint8_t RlinkCommand::kStat_M_Stat;
const uint8_t RlinkCommand::kStat_V_Stat;
const uint8_t RlinkCommand::kStat_B_Stat;
const uint8_t RlinkCommand::kStat_M_Attn;
const uint8_t RlinkCommand::kStat_M_RbTout;
const uint8_t RlinkCommand::kStat_M_RbNak;
const uint8_t RlinkCommand::kStat_M_RbErr;
 
260,7 → 265,7
// separator + command mnemonic, code and flags
// separator: ++ first in packet
// -- non-first in packet
// ?? FIXME: separator for labo canceled commands
// ?? FIXME_code: separator for labo canceled commands
const char* sep = "??";
if (TestFlagAny(kFlagPktBeg)) {
sep = "++";
309,8 → 314,23
}
}
 
// block length field
if (ccode== kCmdRblk || ccode==kCmdWblk) {
os << " n=" << RosPrintf(BlockSize(), "d", 3);
os << " n=" << RosPrintf(BlockSize(), "d", 4)
<< (BlockSize()==BlockDone() ? "=" : ">")
<< RosPrintf(BlockDone(), "d", 4);
if (fpExpect) {
if (TestFlagAny(kFlagChkDone)) {
os << "#";
os << " N=" << RosPrintf(fpExpect->DoneValue(), "d", 4);
} else if (fpExpect->DoneIsChecked()) {
os << "!";
} else {
os << " ";
}
} else {
os << " ";
}
}
 
// status field
328,9 → 348,9
}
 
if (TestFlagAny(kFlagDone)) {
if (TestFlagAny(kFlagChkStat|kFlagChkData)) {
if (TestFlagAny(kFlagChkStat|kFlagChkData|kFlagChkDone)) {
os << " FAIL: "
<< Rtools::Flags2String(fFlags&(kFlagChkStat|kFlagChkData),
<< Rtools::Flags2String(fFlags&(kFlagChkStat|kFlagChkData|kFlagChkDone),
FlagNames(),',');
} else {
os << " OK";
354,7 → 374,7
const uint16_t* pdat = BlockPointer();
 
for (size_t i=0; i<size; i++) {
if (i%ncol == 0) os << "\n " << RosPrintf(i,"d",3) << ": ";
if (i%ncol == 0) os << "\n " << RosPrintf(i,"d",4) << ": ";
os << RosPrintBvi(pdat[i], dbase);
if (dcheck) {
if (!fpExpect->BlockCheck(i, pdat[i])) {
373,7 → 393,7
const vector<uint16_t>& emskvec = fpExpect->BlockMask();
for (size_t i=0; i<size; i++) {
if (!fpExpect->BlockCheck(i, pdat[i])) {
os << "\n FAIL d[" << RosPrintf(i,"d",3) << "]: "
os << "\n FAIL d[" << RosPrintf(i,"d",4) << "]: "
<< RosPrintBvi(pdat[i], dbase) << "#"
<< " D=" << RosPrintBvi(evalvec[i], dbase);
if (i < emskvec.size() && emskvec[i]!=0x0000) {
389,7 → 409,7
size_t size = BlockSize();
size_t ncol = (80-4-5)/(dwidth+2);
for (size_t i=0; i<size; i++) {
if (i%ncol == 0) os << "\n " << RosPrintf(i,"d",3) << ": ";
if (i%ncol == 0) os << "\n " << RosPrintf(i,"d",4) << ": ";
os << RosPrintBvi(pdat[i], dbase) << " ";
}
}
454,6 → 474,7
// use msb first order, will also be printing order
static Retro::RflagName fnam[] = {
{kFlagChkData, "ChkData"},
{kFlagChkDone, "ChkDone"},
{kFlagChkStat, "ChkStat"},
{kFlagErrDec, "ErrDec"},
{kFlagErrNak, "ErrNak"},
/trunk/tools/src/librlink/RlinkPacketBufRcv.cpp
1,4 → 1,4
// $Id: RlinkPacketBufRcv.cpp 607 2014-11-30 20:02:48Z mueller $
// $Id: RlinkPacketBufRcv.cpp 621 2014-12-26 21:20:05Z mueller $
//
// Copyright 2014- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-25 621 1.0.1 Reorganize packet send/revd stats
// 2014-11-30 607 1.0 Initial version
// 2014-11-02 600 0.1 First draft (re-organize PacketBuf for rlink v4)
// ---------------------------------------------------------------------------
19,7 → 20,7
 
/*!
\file
\version $Id: RlinkPacketBufRcv.cpp 607 2014-11-30 20:02:48Z mueller $
\version $Id: RlinkPacketBufRcv.cpp 621 2014-12-26 21:20:05Z mueller $
\brief Implemenation of class RlinkPacketBuf.
*/
 
55,6 → 56,7
fDropData()
{
// Statistic setup
fStats.Define(kStatNRxPktByt, "NRxPktByt", "Rx packet bytes rcvd");
fStats.Define(kStatNRxDrop, "NRxDrop", "Rx bytes dropped");
fStats.Define(kStatNRxSop, "NRxSop", "Rx SOP commas seen");
fStats.Define(kStatNRxEop, "NRxEop", "Rx EOP commas seen");
272,6 → 274,7
case kEcEop: // EOP seen
SetFlagBit(kFlagEopSeen); // -> set eop and return
fRcvState = kRcvDone;
fStats.Inc(kStatNRxPktByt, double(PktSize()));
return;
case kEcNak: // NAK seen
/trunk/tools/src/librlink/RlinkCommand.hpp
1,4 → 1,4
// $Id: RlinkCommand.hpp 609 2014-12-07 19:35:25Z mueller $
// $Id: RlinkCommand.hpp 617 2014-12-21 14:18:53Z mueller $
//
// Copyright 2011-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
13,6 → 13,8
//
// Revision History:
// Date Rev Version Comment
// 2014-12-21 617 1.2.2 use kStat_M_RbTout for rbus timeout
// 2014-12-20 616 1.2.1 add kFlagChkDone
// 2014-12-06 609 1.2 new rlink v4 iface
// 2013-05-06 495 1.0.1 add RlinkContext to Print() args; drop oper<<()
// 2011-03-27 374 1.0 Initial version
22,7 → 24,7
 
/*!
\file
\version $Id: RlinkCommand.hpp 609 2014-12-07 19:35:25Z mueller $
\version $Id: RlinkCommand.hpp 617 2014-12-21 14:18:53Z mueller $
\brief Declaration of class RlinkCommand.
*/
 
124,13 → 126,15
 
static const uint32_t kFlagChkStat= 1u<<12; //!< stat expect check failed
static const uint32_t kFlagChkData= 1u<<13; //!< data expect check failed
static const uint32_t kFlagChkDone= 1u<<14; //!< done expect check failed
 
static const uint8_t kStat_M_Stat = 0xf0; //!< stat: external stat bits
static const uint8_t kStat_V_Stat = 4;
static const uint8_t kStat_B_Stat = 0x0f;
static const uint8_t kStat_M_Attn = kBBit03;//!< stat: attn flags set
static const uint8_t kStat_M_RbNak = kBBit01;//!< stat: attn flags set
static const uint8_t kStat_M_RbErr = kBBit00;//!< stat: attn flags set
static const uint8_t kStat_M_Stat = 0xf0; //!< stat: external stat bits
static const uint8_t kStat_V_Stat = 4;
static const uint8_t kStat_B_Stat = 0x0f;
static const uint8_t kStat_M_Attn = kBBit03;//!< stat: attn flag set
static const uint8_t kStat_M_RbTout = kBBit02;//!< stat: rbtout flag set
static const uint8_t kStat_M_RbNak = kBBit01;//!< stat: rbnak flag set
static const uint8_t kStat_M_RbErr = kBBit00;//!< stat: rberr flag set
 
protected:
void SetCmdSimple(uint8_t cmd, uint16_t addr, uint16_t data);
/trunk/tools/src/librlink/RlinkPacketBufRcv.hpp
1,4 → 1,4
// $Id: RlinkPacketBufRcv.hpp 607 2014-11-30 20:02:48Z mueller $
// $Id: RlinkPacketBufRcv.hpp 621 2014-12-26 21:20:05Z mueller $
//
// Copyright 2014- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-25 621 1.0.1 Reorganize packet send/revd stats
// 2014-11-30 607 1.0 Initial version
// 2014-11-02 600 0.1 First draft (re-organize PacketBuf for rlink v4)
// ---------------------------------------------------------------------------
20,7 → 21,7
 
/*!
\file
\version $Id: RlinkPacketBufRcv.hpp 607 2014-11-30 20:02:48Z mueller $
\version $Id: RlinkPacketBufRcv.hpp 621 2014-12-26 21:20:05Z mueller $
\brief Declaration of class RlinkPacketBuf.
*/
 
63,7 → 64,8
 
// statistics counter indices
enum stats {
kStatNRxDrop=0, //!< Rx bytes dropped
kStatNRxPktByt=0, //!< Rx packet bytes rcvd
kStatNRxDrop, //!< Rx bytes dropped
kStatNRxSop, //!< Rx SOP commas seen
kStatNRxEop, //!< Rx EOP commas seen
kStatNRxNak, //!< Rx NAK commas seen
/trunk/tools/src/librlink/RlinkConnect.cpp
1,6 → 1,6
// $Id: RlinkConnect.cpp 611 2014-12-10 23:23:58Z mueller $
// $Id: RlinkConnect.cpp 626 2015-01-03 14:41:37Z mueller $
//
// Copyright 2011-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2011-2015 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2015-01-01 626 2.1 full rlink v4 implementation
// 2014-12-10 611 2.0 re-organize for rlink v4
// 2014-08-26 587 1.5 start accept rlink v4 protocol (partially...)
// 2014-08-15 583 1.4 rb_mreq addr now 16 bit
32,7 → 33,7
 
/*!
\file
\version $Id: RlinkConnect.cpp 611 2014-12-10 23:23:58Z mueller $
\version $Id: RlinkConnect.cpp 626 2015-01-03 14:41:37Z mueller $
\brief Implemenation of RlinkConnect.
*/
 
82,6 → 83,9
const uint16_t RlinkConnect::kSBCNTL_V_RLBMON;
const uint16_t RlinkConnect::kSBCNTL_V_RBMON;
 
const uint16_t RlinkConnect::kRbufBlkDelta;
const uint16_t RlinkConnect::kRbufPrudentDelta;
 
//------------------------------------------+-----------------------------------
//! Default constructor
 
97,7 → 101,9
fspLog(new RlogFile(&cout, "<cout>")),
fConnectMutex(),
fAttnNotiPatt(0),
fTsLastAttnNoti(-1)
fTsLastAttnNoti(-1),
fSysId(0xffffffff),
fRbufSize(0)
{
for (size_t i=0; i<8; i++) fSeqNumber[i] = 0;
114,11 → 120,11
fStats.Define(kStatNInit, "NInit", "init commands");
fStats.Define(kStatNRblkWord, "NRblkWord", "words rcvd with rblk");
fStats.Define(kStatNWblkWord, "NWblkWord", "words send with wblk");
fStats.Define(kStatNTxPktByt, "NTxPktByt", "Tx packet bytes send");
fStats.Define(kStatNRxPktByt, "NRxPktByt", "Rx packet bytes rcvd");
fStats.Define(kStatNExpData, "NExpData", "Expect() for data defined");
fStats.Define(kStatNExpDone, "NExpDone", "Expect() for done defined");
fStats.Define(kStatNExpStat, "NExpStat", "Expect() for stat defined");
fStats.Define(kStatNChkData, "NChkData", "expect data failed");
fStats.Define(kStatNChkDone, "NChkData", "expect done failed");
fStats.Define(kStatNChkStat, "NChkStat", "expect stat failed");
fStats.Define(kStatNSndOob, "NSndOob", "SndOob() calls");
fStats.Define(kStatNErrMiss, "NErrMiss", "decode: missing data");
147,6 → 153,24
 
fpPort->SetLogFile(fspLog);
fpPort->SetTraceLevel(fLogOpts.tracelevel);
 
RlinkCommandList clist;
clist.AddRreg(kRbaddr_RLSTAT);
clist.AddRreg(kRbaddr_RLID1);
clist.AddRreg(kRbaddr_RLID0);
 
if (!Exec(clist, emsg)) {
Close();
return false;
}
 
uint16_t rlstat = clist[0].Data();
uint16_t rlid1 = clist[1].Data();
uint16_t rlid0 = clist[2].Data();
 
fRbufSize = size_t(1) << (10 + (rlstat & kRLSTAT_M_RBSize));
fSysId = uint32_t(rlid1)<<16 | uint32_t(rlid0);
 
return true;
}
 
299,7 → 323,8
RlinkCommand& cmd = clist[i];
bool checkfound = cmd.TestFlagAny(RlinkCommand::kFlagChkStat |
RlinkCommand::kFlagChkData);
RlinkCommand::kFlagChkData |
RlinkCommand::kFlagChkDone);
bool errorfound = cmd.TestFlagAny(RlinkCommand::kFlagErrNak |
RlinkCommand::kFlagErrDec);
checkseen |= checkfound;
571,7 → 596,6
 
// FIXME_code: handle send fail properly;
if (!fSndPkt.SndPacket(fpPort.get(), emsg)) return false;
fStats.Inc(kStatNTxPktByt, double(fSndPkt.PktSize()));
 
// FIXME_code: handle recoveries
// FIXME_code: use proper value for timeout
777,8 → 801,13
// expect handling
if (cmd.Expect()) { // expect object attached ?
RlinkCommandExpect& expect = *cmd.Expect();
if (expect.DataIsChecked() ||
expect.BlockValue().size()>0) fStats.Inc(kStatNExpData);
if (ccode==RlinkCommand::kCmdRblk ||
ccode==RlinkCommand::kCmdWblk) {
if (expect.BlockValue().size()>0) fStats.Inc(kStatNExpData);
if (expect.DoneIsChecked()) fStats.Inc(kStatNExpDone);
} else {
if (expect.DataIsChecked()) fStats.Inc(kStatNExpData);
}
if (expect.StatusIsChecked()) fStats.Inc(kStatNExpStat);
 
if (ccode==RlinkCommand::kCmdRreg ||
795,6 → 824,13
cmd.SetFlagBit(RlinkCommand::kFlagChkData);
}
}
if (ccode==RlinkCommand::kCmdRblk ||
ccode==RlinkCommand::kCmdWblk) {
if (!expect.DoneCheck(cmd.BlockDone())) {
fStats.Inc(kStatNChkDone);
cmd.SetFlagBit(RlinkCommand::kFlagChkDone);
}
}
if (!expect.StatusCheck(cmd.Status())) {
fStats.Inc(kStatNChkStat);
cmd.SetFlagBit(RlinkCommand::kFlagChkStat);
/trunk/tools/src/librtools/Rexception.cpp
1,6 → 1,6
// $Id: Rexception.cpp 488 2013-02-16 18:49:47Z mueller $
// $Id: Rexception.cpp 625 2014-12-30 16:17:45Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2014 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
13,12 → 13,13
//
// Revision History:
// Date Rev Version Comment
// 2014-12-30 625 1.1 add ctor(meth,text,emsg)
// 2013-01-12 474 1.0 Initial version
// ---------------------------------------------------------------------------
 
/*!
\file
\version $Id: Rexception.cpp 488 2013-02-16 18:49:47Z mueller $
\version $Id: Rexception.cpp 625 2014-12-30 16:17:45Z mueller $
\brief Implemenation of Rexception.
*/
 
64,6 → 65,14
{}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
Rexception::Rexception(const std::string& meth, const std::string& text,
const RerrMsg& errmsg)
: fErrmsg(meth,text+errmsg.Message())
{}
 
//------------------------------------------+-----------------------------------
//! Destructor
 
Rexception::~Rexception() throw()
/trunk/tools/src/librtools/Rexception.hpp
1,6 → 1,6
// $Id: Rexception.hpp 487 2013-02-12 19:14:38Z mueller $
// $Id: Rexception.hpp 625 2014-12-30 16:17:45Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2014 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
13,7 → 13,8
//
// Revision History:
// Date Rev Version Comment
// 2013-02-12 487 1.0,1 add ErrMsg() getter
// 2014-12-30 625 1.1 add ctor(meth,text,emsg)
// 2013-02-12 487 1.0.1 add ErrMsg() getter
// 2013-01-12 474 1.0 Initial version
// ---------------------------------------------------------------------------
 
20,7 → 21,7
 
/*!
\file
\version $Id: Rexception.hpp 487 2013-02-12 19:14:38Z mueller $
\version $Id: Rexception.hpp 625 2014-12-30 16:17:45Z mueller $
\brief Declaration of class Rexception.
*/
 
42,6 → 43,8
const std::string& text);
Rexception(const std::string& meth,
const std::string& text, int errnum);
Rexception(const std::string& meth,
const std::string& text, const RerrMsg& errmsg);
~Rexception() throw();
 
const char* what() const throw();
/trunk/tools/src/librlinktpp/RtclRlinkConnect.cpp
1,6 → 1,6
// $Id: RtclRlinkConnect.cpp 609 2014-12-07 19:35:25Z mueller $
// $Id: RtclRlinkConnect.cpp 628 2015-01-04 16:22:09Z mueller $
//
// Copyright 2011-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2011-2015 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
13,6 → 13,8
//
// Revision History:
// Date Rev Version Comment
// 2015-01-04 628 1.3.2 add M_get
// 2014-12-20 616 1.3.1 M_exec: add -edone for BlockDone checking
// 2014-12-06 609 1.3 new rlink v4 iface
// 2014-08-22 584 1.2.1 use nullptr
// 2014-08-15 583 1.2 rb_mreq addr now 16 bit
31,7 → 33,7
 
/*!
\file
\version $Id: RtclRlinkConnect.cpp 609 2014-12-07 19:35:25Z mueller $
\version $Id: RtclRlinkConnect.cpp 628 2015-01-04 16:22:09Z mueller $
\brief Implemenation of class RtclRlinkConnect.
*/
 
40,6 → 42,7
#include <iostream>
 
#include "boost/bind.hpp"
#include "boost/thread/locks.hpp"
 
#include "librtcltools/Rtcl.hpp"
#include "librtcltools/RtclOPtr.hpp"
67,7 → 70,8
 
RtclRlinkConnect::RtclRlinkConnect(Tcl_Interp* interp, const char* name)
: RtclProxyOwned<RlinkConnect>("RlinkConnect", interp, name,
new RlinkConnect())
new RlinkConnect()),
fGets()
{
AddMeth("open", boost::bind(&RtclRlinkConnect::M_open, this, _1));
AddMeth("close", boost::bind(&RtclRlinkConnect::M_close, this, _1));
82,11 → 86,22
AddMeth("print", boost::bind(&RtclRlinkConnect::M_print, this, _1));
AddMeth("dump", boost::bind(&RtclRlinkConnect::M_dump, this, _1));
AddMeth("config", boost::bind(&RtclRlinkConnect::M_config, this, _1));
AddMeth("get", boost::bind(&RtclRlinkConnect::M_get, this, _1));
AddMeth("$default", boost::bind(&RtclRlinkConnect::M_default, this, _1));
 
for (size_t i=0; i<8; i++) {
fCmdnameObj[i] = Tcl_NewStringObj(RlinkCommand::CommandName(i), -1);
}
 
RlinkConnect* pobj = &Obj();
fGets.Add<uint32_t> ("sysid",
boost::bind(&RlinkConnect::SysId, pobj));
fGets.Add<size_t> ("rbufsize",
boost::bind(&RlinkConnect::RbufSize, pobj));
fGets.Add<size_t> ("bsizemax",
boost::bind(&RlinkConnect::BlockSizeMax, pobj));
fGets.Add<size_t> ("bsizeprudent",
boost::bind(&RlinkConnect::BlockSizePrudent, pobj));
}
 
//------------------------------------------+-----------------------------------
132,8 → 147,8
int RtclRlinkConnect::M_exec(RtclArgs& args)
{
static RtclNameSet optset("-rreg|-rblk|-wreg|-wblk|-labo|-attn|-init|"
"-edata|-estat|-estatdef|"
"-volatile|-print|-dump|-rlist");
"-edata|-edone|-estat|-estatdef|"
"-print|-dump|-rlist");
 
Tcl_Interp* interp = args.Interp();
 
154,7 → 169,7
size_t lsize = clist.Size();
if (opt == "-rreg") { // -rreg addr ?varData ?varStat ---
if (!GetAddr(args, Obj(), addr)) return kERR;
if (!GetAddr(args, addr)) return kERR;
if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
clist.AddRreg(addr);
161,8 → 176,8
 
} else if (opt == "-rblk") { // -rblk addr size ?varData ?varStat
int32_t bsize;
if (!GetAddr(args, Obj(), addr)) return kERR;
if (!args.GetArg("bsize", bsize, 1, 2048)) return kERR;
if (!GetAddr(args, addr)) return kERR;
if (!args.GetArg("bsize", bsize, 1, Obj().BlockSizeMax())) return kERR;
if (!GetVarName(args, "??varData", lsize, vardata)) return kERR;
if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
clist.AddRblk(addr, (size_t) bsize);
169,7 → 184,7
 
} else if (opt == "-wreg") { // -wreg addr data ?varStat -------
uint16_t data;
if (!GetAddr(args, Obj(), addr)) return kERR;
if (!GetAddr(args, addr)) return kERR;
if (!args.GetArg("data", data)) return kERR;
if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
clist.AddWreg(addr, data);
176,8 → 191,8
 
} else if (opt == "-wblk") { // -wblk addr block ?varStat ------
vector<uint16_t> block;
if (!GetAddr(args, Obj(), addr)) return kERR;
if (!args.GetArg("data", block, 1, 2048)) return kERR;
if (!GetAddr(args, addr)) return kERR;
if (!args.GetArg("data", block, 1, Obj().BlockSizeMax())) return kERR;
if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
clist.AddWblk(addr, block);
 
193,7 → 208,7
 
} else if (opt == "-init") { // -init addr data ?varStat -------
uint16_t data;
if (!GetAddr(args, Obj(), addr)) return kERR;
if (!GetAddr(args, addr)) return kERR;
if (!args.GetArg("data", data)) return kERR;
if (!GetVarName(args, "??varStat", lsize, varstat)) return kERR;
clist.AddInit(addr, data);
219,6 → 234,22
clist[lsize-1].Expect()->SetData(data, mask);
}
 
} else if (opt == "-edone") { // -edone done --------------------
if (!ClistNonEmpty(args, clist)) return kERR;
uint16_t done=0;
if (!args.GetArg("done", done)) return kERR;
if (clist[lsize-1].Expect()==0) {
clist[lsize-1].SetExpect(new RlinkCommandExpect(estatdef_val,
estatdef_msk));
}
uint8_t cmd = clist[lsize-1].Command();
if (cmd == RlinkCommand::kCmdRblk ||
cmd == RlinkCommand::kCmdWblk) {
clist[lsize-1].Expect()->SetDone(done);
} else {
return args.Quit("-E: -edone allowed only after -rblk,-wblk");
}
 
} else if (opt == "-estat") { // -estat ?stat ?mask -------------
if (!ClistNonEmpty(args, clist)) return kERR;
uint8_t stat=0;
269,7 → 300,7
if (varlist == "-") nact += 1;
if (nact > 1)
return args.Quit(
"-E: more that one of -print,-dump,-list without target variable found");
"-E: more that one of -print,-dump,-rlist without target variable found");
 
if (!args.AllDone()) return kERR;
if (clist.Size() == 0) return kOK;
712,6 → 743,16
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
int RtclRlinkConnect::M_get(RtclArgs& args)
{
// synchronize with server thread (really needed ??)
boost::lock_guard<RlinkConnect> lock(Obj());
return fGets.M_get(args);
}
 
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
int RtclRlinkConnect::M_default(RtclArgs& args)
{
if (!args.AllDone()) return kERR;
732,8 → 773,7
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
bool RtclRlinkConnect::GetAddr(RtclArgs& args, RlinkConnect& conn,
uint16_t& addr)
bool RtclRlinkConnect::GetAddr(RtclArgs& args, uint16_t& addr)
{
Tcl_Obj* pobj=0;
if (!args.GetArg("addr", pobj)) return kERR;
811,7 → 851,7
const RlinkCommandList& clist)
{
if (clist.Size() == 0) {
args.AppendResult("-E: -edata, -estat, or -volatile "
args.AppendResult("-E: -edata, -edone, or -estat "
"not allowed on empty command list", nullptr);
return false;
}
/trunk/tools/src/librlinktpp/RtclRlinkConnect.hpp
1,6 → 1,6
// $Id: RtclRlinkConnect.hpp 492 2013-02-24 22:14:47Z mueller $
// $Id: RtclRlinkConnect.hpp 628 2015-01-04 16:22:09Z mueller $
//
// Copyright 2011-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2011-2015 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2015-01-04 628 1.0.4 add M_get
// 2013-02-23 492 1.0.3 use RlogFile.Name(); use Context().ErrorCount()
// 2013-01-06 473 1.0.2 add M_rawio
// 2011-11-28 434 1.0.1 ConfigBase(): use uint32_t for lp64 compatibility
22,7 → 23,7
 
/*!
\file
\version $Id: RtclRlinkConnect.hpp 492 2013-02-24 22:14:47Z mueller $
\version $Id: RtclRlinkConnect.hpp 628 2015-01-04 16:22:09Z mueller $
\brief Declaration of class RtclRlinkConnect.
*/
 
34,6 → 35,7
 
#include "librtcltools/RtclOPtr.hpp"
#include "librtcltools/RtclProxyOwned.hpp"
#include "librtcltools/RtclGetList.hpp"
 
#include "librlink/RlinkConnect.hpp"
 
58,9 → 60,10
int M_print(RtclArgs& args);
int M_dump(RtclArgs& args);
int M_config(RtclArgs& args);
int M_get(RtclArgs& args);
int M_default(RtclArgs& args);
 
bool GetAddr(RtclArgs& args, RlinkConnect& conn, uint16_t& addr);
bool GetAddr(RtclArgs& args, uint16_t& addr);
bool GetVarName(RtclArgs& args, const char* argname,
size_t nind, std::vector<std::string>& varname);
bool ConfigBase(RtclArgs& args, uint32_t& base);
69,6 → 72,7
 
protected:
RtclOPtr fCmdnameObj[8];
RtclGetList fGets;
};
} // end namespace Retro
/trunk/tools/src/librlinktpp/RtclAttnShuttle.cpp
1,4 → 1,4
// $Id: RtclAttnShuttle.cpp 602 2014-11-08 21:42:47Z mueller $
// $Id: RtclAttnShuttle.cpp 625 2014-12-30 16:17:45Z mueller $
//
// Copyright 2013-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
//
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-30 625 1.1 adopt to Rlink V4 attn logic
// 2014-11-08 602 1.0.3 cast int first to ptrdiff_t, than to ClientData
// 2014-08-22 584 1.0.2 use nullptr
// 2013-05-20 521 1.0.1 Setup proper Tcl channel options
22,7 → 23,7
 
/*!
\file
\version $Id: RtclAttnShuttle.cpp 602 2014-11-08 21:42:47Z mueller $
\version $Id: RtclAttnShuttle.cpp 625 2014-12-30 16:17:45Z mueller $
\brief Implemenation of class RtclAttnShuttle.
*/
 
126,13 → 127,16
//------------------------------------------+-----------------------------------
//! FIXME_docs
 
int RtclAttnShuttle::AttnHandler(const RlinkServer::AttnArgs& args)
int RtclAttnShuttle::AttnHandler(RlinkServer::AttnArgs& args)
{
fpServ->GetAttnInfo(args);
 
uint16_t apat = args.fAttnPatt & args.fAttnMask;
int irc = ::write(fFdPipeWrite, (void*) &apat, sizeof(apat));
if (irc < 0)
throw Rexception("RtclAttnShuttle::AttnHandler()",
"write() failed: ", errno);
return 0;
}
 
/trunk/tools/src/librlinktpp/RtclAttnShuttle.hpp
1,6 → 1,6
// $Id: RtclAttnShuttle.hpp 495 2013-03-06 17:13:48Z mueller $
// $Id: RtclAttnShuttle.hpp 625 2014-12-30 16:17:45Z mueller $
//
// Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
// Copyright 2013-2014 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
13,6 → 13,7
//
// Revision History:
// Date Rev Version Comment
// 2014-12-30 625 1.1 adopt to Rlink V4 attn logic
// 2013-03-01 493 1.0 Initial version
// 2013-01-14 475 0.5 First draft
// ---------------------------------------------------------------------------
19,7 → 20,7
 
/*!
\file
\version $Id: RtclAttnShuttle.hpp 495 2013-03-06 17:13:48Z mueller $
\version $Id: RtclAttnShuttle.hpp 625 2014-12-30 16:17:45Z mueller $
\brief Declaration of class RtclAttnShuttle.
*/
 
47,7 → 48,7
void Remove();
 
protected:
int AttnHandler(const RlinkServer::AttnArgs& args);
int AttnHandler(RlinkServer::AttnArgs& args);
void TclChannelHandler(int mask);
static void ThunkTclChannelHandler(ClientData cdata, int mask);
 
/trunk/tools/bin/tbrun_tbwrri
0,0 → 1,116
#!/bin/bash
# $Id: tbrun_tbwrri 622 2014-12-28 20:45:26Z mueller $
#
# Revision History:
# Date Rev Version Comment
# 2014-12-27 622 1.0 Initial version
#
 
docmd ()
{
echo "$1"
if [[ -z "$optdry" ]] ; then
eval "$1"
fi
}
 
optdry=""
optlsuf=""
optstack=""
optghw=""
opttbw=""
optpack=""
optrri=""
optpcom=""
optcuff=""
 
# handle options
while (( $# > 0 )) ; do
case $1 in
-dry|--dry) optdry=$1 ; shift 1 ;;
-lsuf|--lsuf) optlsuf=$2 ; shift 2 ;;
-stack|--stack) optstack=$2 ; shift 2 ;;
-ghw|--ghw) optghw=$2 ; shift 2 ;;
-tbw|--tbw) opttbw=$2 ; shift 2 ;;
-pack|--pack) optpack=$2 ; shift 2 ;;
-rri|--rri) optrri=$2 ; shift 2 ;;
-cuff|--cuff) optcuff=$1 ; shift 1 ;;
-pcom|--pcom) optpcom=$1 ; shift 1 ;;
-*) echo "tbrun_tbwrri-E: invalid option '$1'"; exit 1 ;;
*) break;;
esac
done
 
# complain if no tbench defined
if (( $# == 0 )) ; then
echo "Usage: tbrun_tbwrri [opts] testbench rricmds..."
echo " Options:"
echo " --dry dry run, print commands, don't execute"
echo " --lsuf suff use '_<suff>.log' as suffix for log file"
echo " --stack nnn use <nnn> as ghdl stack size"
echo " --ghw fname write ghw file with name '<fname>.ghw"
echo " --tbw opts append <opts> to tbw command"
echo " --pack plist add '--pack=<=plist>' option to ti_rri"
echo " --rri opts append <opts> to ti_rri command"
echo " --cuff use cuff and not serport"
echo " --pcom print test comments"
exit 1
fi
 
tbench=$1
shift 1
 
tbenchname=$(basename $tbench)
tbenchpath=$(dirname $tbench)
 
# check for ghdl with _ssim, _fsim, _tsim
isghdlxsim=""
if [[ $tbench =~ _[sft]sim$ ]] ; then
isghdlxsim=true
logsuff=""
fi
 
# issue makes
if [[ -n "$isghdlxsim" ]] ; then docmd "make -C $tbenchpath ghdl_tmp_clean"; fi
docmd "make -C $tbenchpath $tbenchname"
exitstat=$?
if [[ -n "$isghdlxsim" ]] ; then docmd "make -C $tbenchpath ghdl_tmp_clean"; fi
 
if (( $exitstat > 0 )) ; then exit $exitstat; fi
 
# determine logfile name
logsuff="_dsim"
if [[ $tbenchname =~ _[sft]sim$ ]] ; then logsuff=""; fi
if [[ -n "$optlsuf" ]] ; then logsuff="_$optlsuf"; fi
 
logfile="${tbenchname}${logsuff}.log"
 
# now build actual test command
cmd="time ti_rri --run=\"tbw $tbench -fifo"
if [[ -n "$opttbw" ]] ; then cmd+=" $opttbw"; fi
if [[ -n "$optstack" ]] ; then cmd+=" --stack-max-size=$optstack"; fi
if [[ -n "$optghw" ]] ; then cmd+=" --wave=$optghw.ghw"; fi
cmd+=" 2>&1 | ghdl_assert_filter\""
cmd+=" --fifo --logl=3"
if [[ -n "$optpack" ]] ; then cmd+=" --pack=$optpack"; fi
if [[ -n "$optrri" ]] ; then cmd+=" $optrri"; fi
cmd+=" --"
 
if [[ -n "$optcuff" ]] ; then
cmd+=" \"rlc oob -sbdata 8 0x2\" \"rlc oob -sbdata 16 0x4\""
fi
 
while (( $# > 0 )) ; do
cmd+=" "
if [[ $1 =~ " " ]] ; then cmd+="\""; fi
cmd+="$1"
if [[ $1 =~ " " ]] ; then cmd+="\""; fi
shift 1
done
cmd+=" | tee $logfile"
 
pcomtag=""
if [[ -n "$optpcom" ]] ; then pcomtag="^\#|"; fi
# FAIL, PASS, DONE come from tbs
cmd+=" | egrep \"(${pcomtag}-[EFW]:|FAIL|PASS|DONE)\""
docmd "$cmd"
trunk/tools/bin/tbrun_tbwrri Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: trunk/tools/bin/ticonv_pdpcp =================================================================== --- trunk/tools/bin/ticonv_pdpcp (revision 27) +++ trunk/tools/bin/ticonv_pdpcp (revision 28) @@ -1,5 +1,5 @@ #!/usr/bin/perl -w -# $Id: ticonv_pdpcp 609 2014-12-07 19:35:25Z mueller $ +# $Id: ticonv_pdpcp 622 2014-12-28 20:45:26Z mueller $ # # Copyright 2013-2014 by Walter F.J. Mueller # @@ -14,6 +14,7 @@ # # Revision History: # Date Rev Version Comment +# 2014-12-27 622 1.2.1 use wmembe now # 2014-12-07 609 1.2 use rlink::anena (for rlink v4) # 2014-07-31 576 1.1 add --cmax option (default = 3); support .sdef # 2014-07-26 575 1.0.4 add --tout option (sets wtcpu timeout) @@ -124,14 +125,15 @@ } elsif ($cmd =~ /^(wr[0-7]|wps|wal|wah|wmi|wm|stapc)\s+([0-7]+)$/) { push @cmdlist, "-$1 0$2"; - # (write) data type commands: wibrb --- - } elsif ($cmd =~ /^(wibrb)\s+([0-7]+)/) { - my $base = oct($2); - my $be = $base & 0x3; - if ($be == 0) { - push @cmdlist, "-wibrb 0$2"; + # (write) data type commands: wmembe --- + } elsif ($cmd =~ /^wmembe\s+([01]+)/) { + my $val = oct("0b$1"); + my $be = $val & 0x3; + my $stick = $val & 0x4; + if ($stick == 0) { + push @cmdlist, "-wmembe $be"; } else { - push @cmdlist, sprintf "-wibrb 0%6.6o -be %o", $base&0177700, $be; + push @cmdlist, "-wmembe $be -stick"; } # (read) [d=data] type commands: rrx,rps,rm,rmi --------------------
/trunk/tools/bin/tbw
1,7 → 1,7
#!/usr/bin/perl -w
# $Id: tbw 575 2014-07-27 20:55:41Z mueller $
# $Id: tbw 619 2014-12-23 13:17:41Z mueller $
#
# Copyright 2007-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
# Copyright 2007-2015 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
14,6 → 14,8
#
# Revision History:
# Date Rev Version Comment
# 2015-01-04 629 1.2.6 BUGFIX: setup proper dsc values after -fifo
# 2014-12-23 619 1.2.5 add -fifo and -verbose options
# 2014-07-27 575 1.2.4 use xtwi to start ISim models
# 2011-11-06 420 1.2.3 fix tbw.dat parsing (allow / in file names)
# 2010-05-23 294 1.2.2 handle tb_code's in non-local directories
44,6 → 46,8
my $tb_code;
my $is_isim;
my $is_isim_run;
my $is_fifo;
my $is_verbose;
 
my @args_pos; # list of positional args
my @args_nam; # list of named args
84,6 → 88,18
}
}
 
if (scalar(@ARGV) && $ARGV[0] eq "-fifo") {
push @file_dsc, {tag=>'rlink_cext_fifo_rx', val=>'<fifo>'};
push @file_dsc, {tag=>'rlink_cext_fifo_tx', val=>'<fifo>'};
push @file_dsc, {tag=>'rlink_cext_conf', val=>'<null>'};
$is_fifo = 1;
shift @ARGV;
}
if (scalar(@ARGV) && $ARGV[0] eq "-verbose") {
$is_verbose = 1;
shift @ARGV;
}
 
if (not -e $tb_code) {
print "tbw-E: $tb_code not existing or not executable\n";
print_usage;
97,7 → 113,7
my $tbwdat_file = "tbw.dat";
$tbwdat_file = "$tb_code_path/tbw.dat" unless (-r "tbw.dat");
 
if (-r $tbwdat_file) {
if ((!$is_fifo) && -r $tbwdat_file) {
my $ok = 0;
my $done = 0;
 
121,20 → 137,17
}
 
#
# if no matching stanza found, setup default _stim linkage
# if no tbw.dat or no matching stanza found, setup defaults
#
 
unless (scalar (@file_dsc)) {
push @file_dsc, {tag=>$tb_code_stem . "_stim",
val=>$tb_code_stem . "_stim.dat"};
}
 
if (0) {
foreach my $dsc (@file_dsc) {
my $tag = $dsc->{tag};
my $val = $dsc->{val};
printf " %s = %s\n", $tag, $val;
if (!$is_fifo) {
unless (scalar (@file_dsc)) {
push @file_dsc, {tag=>$tb_code_stem . "_stim",
val=>$tb_code_stem . "_stim.dat"};
}
} else {
push @file_dsc, {tag=>"rlink_cext_fifo_rx",
val=>"<fifo>"};
}
 
#
175,6 → 188,14
}
}
 
if ($is_verbose) {
foreach my $dsc (@file_dsc) {
my $tag = $dsc->{tag};
my $val = $dsc->{val};
printf " %s = %s\n", $tag, $val;
}
}
 
#
# now handle all specified file descriptors
#
252,14 → 273,17
 
# ----------------------------------------------------------------------------
sub print_usage {
print "usage: tbw <tb_code> [-run] [filedefs] [opts]\n";
print " -run for _ISim tb's, runs the tb with a 'run all' command\n";
print "usage: tbw <tb_code> [opts] [filedefs] [ghdl-opts]\n";
print " opts\n";
print " -run for _ISim tb's, runs the tb with a 'run all' command\n";
print " -fifo use rlink_cext fifo, ignore tbw.dat\n";
print " -verbose show the used tag,value settings before execution\n";
print " filedefs define tb input, either filename in tbw.dat order or\n";
print " tag=name or tag=[<content>] pairs with tag matching one in in\n";
print " tbw.dat. The [<content>] form allows to give data inline, e.g.\n";
print " like \"_conf=[.rpmon 1]\"\n";
print " opts are all other options starting with a '-', they are passed\n";
print " to the testbench. Some useful ghdl options are:\n";
print " ghdl-opts are all other options starting with a '-', they are\n";
print " passed to the testbench. Some useful ghdl options are:\n";
print " --wave=x.ghw\n";
print " --stack-max-size=16384\n";
print " --stop-time=1ns --disp-time --trace-processes\n";
/trunk/tools/bin/ti_w11
1,9 → 1,10
#!/usr/bin/perl -w
# $Id: ti_w11 570 2014-07-20 19:05:11Z mueller $
# $Id: ti_w11 619 2014-12-23 13:17:41Z mueller $
#
# Revision History:
# Date Rev Version Comment
# 2014-07-13 570 1.2 bugfix: split options args into ti_rri opts and cmds
# 2014-12-23 619 1.2.1 use -fifo tbw option for test bench starts
# 2014-07-13 570 1.2 BUGFIX: split options args into ti_rri opts and cmds
# 2013-05-05 516 1.1 renamed to ti_w11
# 2013-04-26 510 1.0 Initial version (derived from dorri)
#
24,9 → 25,9
my $opt_tmu;
my $tirri;
my $val_term;
my $val_tb_s3 = "tbw $sysbase/s3board/tb/tb_w11a_s3";
my $val_tb_n2 = "tbw $sysbase/nexys2/tb/tb_w11a_n2";
my $val_tb_n3 = "tbw $sysbase/nexys3/tb/tb_w11a_n3";
my $val_tb_s3 = "tbw $sysbase/s3board/tb/tb_w11a_s3 -fifo";
my $val_tb_n2 = "tbw $sysbase/nexys2/tb/tb_w11a_n2 -fifo";
my $val_tb_n3 = "tbw $sysbase/nexys3/tb/tb_w11a_n3 -fifo";
my $val_tb;
my $val_e;
 
/trunk/tools/bin/ghdl_assert_filter
0,0 → 1,29
#!/usr/bin/perl -w
# $Id: ghdl_assert_filter 620 2014-12-25 10:48:35Z mueller $
#
# Copyright 2014- 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 2, 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
# 2014-12-23 620 1.0 Initial version
 
use 5.10.0; # require Perl 5.10 or higher
use strict; # require strict checking
 
autoflush STDOUT 1 if (-p STDOUT); # autoflush if output into pipe
autoflush STDOUT 1 if (-t STDOUT); # autoflush if output into term
 
while (<>) {
next if /:\@0ms:\(assertion warning\): NUMERIC_STD.*metavalue detected/;
next if /:\@0ms:\(assertion warning\): CONV_INTEGER: There is an 'U'/;
print;
}
trunk/tools/bin/ghdl_assert_filter Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: trunk/tools/bin/tbrun_tbw =================================================================== --- trunk/tools/bin/tbrun_tbw (nonexistent) +++ trunk/tools/bin/tbrun_tbw (revision 28) @@ -0,0 +1,97 @@ +#!/bin/bash +# $Id: tbrun_tbw 622 2014-12-28 20:45:26Z mueller $ +# +# Revision History: +# Date Rev Version Comment +# 2014-12-27 622 1.0.1 add --stack, --ghw, --tbw, --pcom +# 2014-12-26 621 1.0 Initial version +# + +docmd () +{ + echo "$1" + if [[ -z "$optdry" ]] ; then + eval "$1" + fi +} + +optdry="" +optlsuf="" +optstack="" +optghw="" +opttbw="" +optpcom="" + +# handle options +while (( $# > 0 )) ; do + case $1 in + -dry|--dry) optdry=$1 ; shift 1 ;; + -lsuf|--lsuf) optlsuf=$2 ; shift 2 ;; + -stack|--stack) optstack=$2 ; shift 2 ;; + -ghw|--ghw) optghw=$2 ; shift 2 ;; + -tbw|--tbw) opttbw=$2 ; shift 2 ;; + -pcom|--pcom) optpcom=$1 ; shift 1 ;; + -*) echo "tbrun_tbw-E: invalid option '$1'"; exit 1 ;; + *) break;; + esac +done + +tbench=$1 +stimfile=$2 + +# complain if no tbench defined +if (( $# == 0 )) ; then + echo "Usage: tbrun_tbw [opts] testbench [stimfile]" + echo " Options:" + echo " --dry dry run, print commands, don't execute" + echo " --lsuf suff use '_.log' as suffix for log file" + echo " --stack nnn use as ghdl stack size" + echo " --ghw fname write ghw file with name '.ghw" + echo " --tbw opts append to tbw command" + exit 1 +fi + +# check for ISim +isisim="" +if [[ $tbench =~ _ISim ]] ; then + isisim=true +fi + +# check for ghdl with _ssim, _fsim, _tsim +isghdlxsim="" +if [[ "$isisim" == "" ]] && [[ $tbench =~ _[sft]sim$ ]] ; then + isghdlxsim=true + logsuff="" +fi + +# issue makes +if [[ -n "$isghdlxsim" ]] ; then docmd "make ghdl_tmp_clean"; fi +docmd "make $tbench" +exitstat=$? +if [[ -n "$isghdlxsim" ]] ; then docmd "make ghdl_tmp_clean"; fi + +if (( $exitstat > 0 )) ; then exit $exitstat; fi + +# determine logfile name +logsuff="_dsim" +if [[ $tbench =~ _[sft]sim$ ]] ; then logsuff=""; fi +if [[ -n "$optlsuf" ]] ; then logsuff="_$optlsuf"; fi + +logfile="${tbench}${logsuff}.log" + +# now build actual test command (a tbw|filter|tee|egrep pipe) +cmd="time tbw $tbench" +if [[ -n "$isisim" ]] ; then cmd+=" -run"; fi +if [[ -n "$stimfile" ]] ; then cmd+=" $stimfile"; fi +if [[ -n "$opttbw" ]] ; then cmd+=" $opttbw"; fi +if [[ -n "$optstack" ]] ; then cmd+=" --stack-max-size=$optstack"; fi +if [[ -n "$optghw" ]] ; then cmd+=" --wave=$optghw.ghw"; fi +cmd+=" 2>&1" +if [[ -z "$isisim" ]] ; then cmd+=" | ghdl_assert_filter"; fi +cmd+=" | tee $logfile" + +pcomtag="" +if [[ -n "$optpcom" ]] ; then pcomtag="^C|"; fi +# FAIL, PASS, DONE come from tbs; ERROR comes from ISim +cmd+=" | egrep \"(${pcomtag}-[EFW]:|ERROR|FAIL|PASS|DONE)\"" +docmd "$cmd"
trunk/tools/bin/tbrun_tbw Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: trunk/tools/oskit/rt11-40_rk/rt11-40_rk_boot.tcl =================================================================== --- trunk/tools/oskit/rt11-40_rk/rt11-40_rk_boot.tcl (revision 27) +++ trunk/tools/oskit/rt11-40_rk/rt11-40_rk_boot.tcl (revision 28) @@ -1,10 +1,10 @@ -# $Id: rt11-40_rk_boot.tcl 517 2013-05-09 21:34:45Z mueller $ +# $Id: rt11-40_rk_boot.tcl 622 2014-12-28 20:45:26Z mueller $ # # Setup file for RT-11 V4.0 RK05 based system # # Usage: # -# telnet_starter -d DL0 & +# console_starter -d DL0 & # ti_w11 -xxx @rt11-40_rk_boot.tcl ( -xxx depends on sim or fpga connect) #
/trunk/tools/oskit/unix-v5_rk/uv5_rk_boot.tcl
1,10 → 1,10
# $Id: uv5_rk_boot.tcl 517 2013-05-09 21:34:45Z mueller $
# $Id: uv5_rk_boot.tcl 622 2014-12-28 20:45:26Z mueller $
#
# Setup file for Unix V5 RK05 based system
#
# Usage:
#
# telnet_starter -d DL0 &
# console_starter -d DL0 &
# ti_w11 -xxx @uv5_boot.tcl ( -xxx depends on sim or fpga connect)
 
# setup w11 cpu
/trunk/tools/oskit/211bsd_rk/211bsd_rk_boot.tcl
1,11 → 1,11
# $Id: 211bsd_rk_boot.tcl 517 2013-05-09 21:34:45Z mueller $
# $Id: 211bsd_rk_boot.tcl 622 2014-12-28 20:45:26Z mueller $
#
# Setup file for 211bsd RK05 based system
#
# Usage:
#
# telnet_starter -d DL0 &
# telnet_starter -d DL1 &
# console_starter -d DL0 &
# console_starter -d DL1 &
# ti_w11 -xxx @211bsd_rk_boot.tcl ( -xxx depends on sim or fpga connect)
#
 
/trunk/tools/oskit/rsx11m-31_rk/rsx11m-31_rk_boot.tcl
1,11 → 1,11
# $Id: rsx11m-31_rk_boot.tcl 517 2013-05-09 21:34:45Z mueller $
# $Id: rsx11m-31_rk_boot.tcl 622 2014-12-28 20:45:26Z mueller $
#
# Setup file for RSX11-M V3.1 RK05 based system
#
# Usage:
#
# telnet_starter -d DL0 &
# telnet_starter -d DL1 &
# console_starter -d DL0 &
# console_starter -d DL1 &
# ti_w11 -xxx @rsx11m-31_rk_boot.tcl ( -xxx depends on sim or fpga connect)
#
 
/trunk/tools/oskit/rsx11m-40_rk/rsx11m-40_rk_boot.tcl
1,11 → 1,11
# $Id: rsx11m-40_rk_boot.tcl 525 2013-07-06 12:19:39Z mueller $
# $Id: rsx11m-40_rk_boot.tcl 622 2014-12-28 20:45:26Z mueller $
#
# Setup file for RSX11-M V4.0 RK05 based system
#
# Usage:
#
# telnet_starter -d DL0 &
# telnet_starter -d DL1 &
# console_starter -d DL0 &
# console_starter -d DL1 &
# ti_w11 -xxx @rsx11m-40_rk_boot.tcl ( -xxx depends on sim or fpga connect)
#
 
/trunk/tools/dox/w11_vhd_all.Doxyfile
5,7 → 5,7
#---------------------------------------------------------------------------
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = "w11 - vhd"
PROJECT_NUMBER = 0.62
PROJECT_NUMBER = 0.63
PROJECT_BRIEF = "W11 CPU core and support modules"
PROJECT_LOGO =
OUTPUT_DIRECTORY = $(RETRODOXY)/w11/vhd
/trunk/tools/dox/w11_cpp.Doxyfile
5,7 → 5,7
#---------------------------------------------------------------------------
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = "w11 - cpp"
PROJECT_NUMBER = 0.62
PROJECT_NUMBER = 0.63
PROJECT_BRIEF = "Backend server for Rlink and w11"
PROJECT_LOGO =
OUTPUT_DIRECTORY = $(RETRODOXY)/w11/cpp
/trunk/tools/dox/w11_tcl.Doxyfile
5,7 → 5,7
#---------------------------------------------------------------------------
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = "w11 - tcl"
PROJECT_NUMBER = 0.62
PROJECT_NUMBER = 0.63
PROJECT_BRIEF = "Backend server for Rlink and w11"
PROJECT_LOGO =
OUTPUT_DIRECTORY = $(RETRODOXY)/w11/tcl
/trunk/rtl/sys_gen/tst_rlink/rbd_tst_rlink.vhd
1,4 → 1,4
-- $Id: rbd_tst_rlink.vhd 603 2014-11-09 22:50:26Z mueller $
-- $Id: rbd_tst_rlink.vhd 620 2014-12-25 10:48:35Z mueller $
--
-- Copyright 2011-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
--
59,8 → 59,8
RB_LAM : out slv16; -- rbus: look at me
RB_STAT : out slv4; -- rbus: status flags
RB_SRES_TOP : in rb_sres_type; -- top-level rb_sres, for rbd_mon
RXSD : in slbit; -- serport rxsd, for rbd_emon
RXACT : in slbit; -- serport rxact, for rbd_emon
RXSD : in slbit; -- serport rxsd, for rbd_eyemon
RXACT : in slbit; -- serport rxact, for rbd_eyemon
STAT : out slv8 -- status flags
 
);
83,18 → 83,18
signal TIM1_DONE : slbit := '0';
signal TIM1_BUSY : slbit := '0';
 
constant rbaddr_mon : slv16 := x"ffe8"; -- ffe8/8: 1111 1111 1110 1xxx
constant rbaddr_test : slv16 := x"ffe0"; -- ffe0/8: 1111 1111 1110 0xxx
constant rbaddr_emon : slv16 := x"ffd0"; -- ffd0/4: 1111 1111 1101 00xx
constant rbaddr_tim1 : slv16 := x"fe11"; -- fe11/1: 1111 1110 0001 0001
constant rbaddr_tim0 : slv16 := x"fe10"; -- fe10/1: 1111 1110 0001 0000
constant rbaddr_bram : slv16 := x"fe00"; -- fe00/2: 1111 1110 0000 00xx
constant rbaddr_rbmon : slv16 := x"ffe8"; -- ffe8/8: 1111 1111 1110 1xxx
constant rbaddr_tester : slv16 := x"ffe0"; -- ffe0/8: 1111 1111 1110 0xxx
constant rbaddr_eyemon : slv16 := x"ffd0"; -- ffd0/4: 1111 1111 1101 00xx
constant rbaddr_tim1 : slv16 := x"fe11"; -- fe11/1: 1111 1110 0001 0001
constant rbaddr_tim0 : slv16 := x"fe10"; -- fe10/1: 1111 1110 0001 0000
constant rbaddr_bram : slv16 := x"fe00"; -- fe00/2: 1111 1110 0000 00xx
begin
 
TEST : rbd_tester
generic map (
RB_ADDR => rbaddr_test)
RB_ADDR => rbaddr_tester)
port map (
CLK => CLK,
RESET => RESET,
116,7 → 116,7
MON : rbd_rbmon
generic map (
RB_ADDR => rbaddr_mon,
RB_ADDR => rbaddr_rbmon,
AWIDTH => 9)
port map (
CLK => CLK,
128,7 → 128,7
 
EMON : rbd_eyemon
generic map (
RB_ADDR => rbaddr_emon,
RB_ADDR => rbaddr_eyemon,
RDIV => slv(to_unsigned(0,8)))
port map (
CLK => CLK,
/trunk/rtl/sys_gen/w11a/nexys2/sys_conf.vhd
1,6 → 1,6
-- $Id: sys_conf.vhd 509 2013-04-21 20:46:20Z mueller $
-- $Id: sys_conf.vhd 619 2014-12-23 13:17:41Z mueller $
--
-- Copyright 2010-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
-- Copyright 2010-2014 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
16,9 → 16,10
-- Description: Definitions for sys_w11a_n2 (for synthesis)
--
-- Dependencies: -
-- Tool versions: xst 11.4, 13.1; ghdl 0.26-0.29
-- Tool versions: xst 11.4-14.7; ghdl 0.26-0.31
-- Revision History:
-- Date Rev Version Comment
-- 2014-12-22 619 1.2.1 add _rbmon_awidth
-- 2013-04-21 509 1.2 add fx2 settings
-- 2011-11-19 428 1.1.1 use clksys=56 (58 no closure after numeric_std...)
-- 2010-11-27 341 1.1 add dcm and memctl related constants (clksys=58)
47,6 → 48,8
 
constant sys_conf_ser2rri_defbaud : integer := 115200; -- default 115k baud
 
constant sys_conf_rbmon_awidth : integer := 9; -- use 0 to disable rbmon
 
-- fx2 settings: petowidth=10 -> 2^10 30 MHz clocks -> ~33 usec
constant sys_conf_fx2_petowidth : positive := 10;
constant sys_conf_fx2_ccwidth : positive := 5;
/trunk/rtl/sys_gen/w11a/nexys2/tb/sys_conf_sim.vhd
1,6 → 1,6
-- $Id: sys_conf_sim.vhd 509 2013-04-21 20:46:20Z mueller $
-- $Id: sys_conf_sim.vhd 619 2014-12-23 13:17:41Z mueller $
--
-- Copyright 2010-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
-- Copyright 2010-2014 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
16,9 → 16,10
-- Description: Definitions for sys_w11a_n2 (for simulation)
--
-- Dependencies: -
-- Tool versions: xst 11.4, 13.1; ghdl 0.26-0.29
-- Tool versions: xst 11.4-14.7; ghdl 0.26-0.31
-- Revision History:
-- Date Rev Version Comment
-- 2014-12-22 619 1.2.1 add _rbmon_awidth
-- 2013-04-21 509 1.2 add fx2 settings
-- 2011-11-27 433 1.1.1 use /1*1 to skip dcm in sim, _ssim fails with dcm
-- 2010-11-27 341 1.1 add dcm and memctl related constants (clksys=58)
43,6 → 44,8
 
constant sys_conf_ser2rri_cdinit : integer := 1-1; -- 1 cycle/bit in sim
 
constant sys_conf_rbmon_awidth : integer := 9; -- use 0 to disable rbmon
 
-- fx2 settings: petowidth=10 -> 2^10 30 MHz clocks -> ~33 usec
constant sys_conf_fx2_petowidth : positive := 10;
constant sys_conf_fx2_ccwidth : positive := 5;
/trunk/rtl/sys_gen/w11a/nexys2/sys_w11a_n2.vhd
1,4 → 1,4
-- $Id: sys_w11a_n2.vhd 614 2014-12-20 15:00:45Z mueller $
-- $Id: sys_w11a_n2.vhd 620 2014-12-25 10:48:35Z mueller $
--
-- Copyright 2010-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
--
21,7 → 21,8
-- bplib/bpgen/sn_humanio_rbus
-- bplib/fx2rlink/rlink_sp1c_fx2
-- bplib/fx2rlink/ioleds_sp1c_fx2
-- vlib/rri/rb_sres_or_3
-- vlib/rbus/rb_sres_or_4
-- vlib/rbus/rbd_rbmon
-- w11a/pdp11_core_rbus
-- w11a/pdp11_core
-- w11a/pdp11_bram
41,6 → 42,7
--
-- Synthesized (xst):
-- Date Rev ise Target flop lutl lutm slic t peri
-- 2014-12-22 619 14.7 131013 xc3s1200e-4 1828 5131 366 3263 ok: +rbmon
-- 2014-12-20 614 14.7 131013 xc3s1200e-4 1714 4896 366 3125 ok: -RL11,rlv4
-- 2014-06-08 561 14.7 131013 xc3s1200e-4 1626 4821 360 3052 ok: +RL11
-- 2014-06-01 558 14.7 131013 xc3s1200e-4 1561 4597 334 2901 ok:
69,6 → 71,8
--
-- Revision History:
-- Date Rev Version Comment
-- 2014-12-24 620 1.6.2 relocate ibus window and hio rbus address
-- 2014-12-22 619 1.6.1 add rbus monitor rbd_rbmon
-- 2014-08-28 588 1.6 use new rlink v4 iface generics and 4 bit STAT
-- 2014-08-15 583 1.5 rb_mreq addr now 16 bit
-- 2013-04-20 509 1.4 added fx2 (cuff) support; ATOWIDTH=7
146,6 → 150,7
use work.genlib.all;
use work.serportlib.all;
use work.rblib.all;
use work.rbdlib.all;
use work.rlinklib.all;
use work.fx2lib.all;
use work.fx2rlinklib.all;
218,11 → 223,12
signal SER_MONI : serport_moni_type := serport_moni_init;
signal FX2_MONI : fx2ctl_moni_type := fx2ctl_moni_init;
 
signal RB_MREQ : rb_mreq_type := rb_mreq_init;
signal RB_SRES : rb_sres_type := rb_sres_init;
signal RB_SRES_CPU : rb_sres_type := rb_sres_init;
signal RB_SRES_IBD : rb_sres_type := rb_sres_init;
signal RB_SRES_HIO : rb_sres_type := rb_sres_init;
signal RB_MREQ : rb_mreq_type := rb_mreq_init;
signal RB_SRES : rb_sres_type := rb_sres_init;
signal RB_SRES_CPU : rb_sres_type := rb_sres_init;
signal RB_SRES_IBD : rb_sres_type := rb_sres_init;
signal RB_SRES_HIO : rb_sres_type := rb_sres_init;
signal RB_SRES_RBMON : rb_sres_type := rb_sres_init;
 
signal RESET : slbit := '0';
signal CE_USEC : slbit := '0';
274,9 → 280,10
 
signal DISPREG : slv16 := (others=>'0');
 
constant rbaddr_core0 : slv16 := "0000000000000000";
constant rbaddr_ibus : slv16 := "0000000010000000";
constant rbaddr_hio : slv16 := "0000000011000000";
constant rbaddr_rbmon : slv16 := x"ffe8"; -- ffe8/0008: 1111 1111 1110 1xxx
constant rbaddr_hio : slv16 := x"fef0"; -- fef0/0004: 1111 1110 1111 00xx
constant rbaddr_ibus0 : slv16 := x"4000"; -- 4000/1000: 0100 xxxx xxxx xxxx
constant rbaddr_core0 : slv16 := x"0000"; -- 0000/0020: 0000 0000 000x xxxx
 
begin
 
389,18 → 396,34
IO_FX2_DATA => IO_FX2_DATA
);
 
RB_SRES_OR : rb_sres_or_3
RB_SRES_OR : rb_sres_or_4
port map (
RB_SRES_1 => RB_SRES_CPU,
RB_SRES_2 => RB_SRES_IBD,
RB_SRES_3 => RB_SRES_HIO,
RB_SRES_4 => RB_SRES_RBMON,
RB_SRES_OR => RB_SRES
);
RBMON : if sys_conf_rbmon_awidth > 0 generate
begin
RBMON : rbd_rbmon
generic map (
RB_ADDR => rbaddr_rbmon,
AWIDTH => sys_conf_rbmon_awidth)
port map (
CLK => CLK,
RESET => RESET,
RB_MREQ => RB_MREQ,
RB_SRES => RB_SRES_RBMON,
RB_SRES_SUM => RB_SRES
);
end generate RBMON;
RB2CP : pdp11_core_rbus
generic map (
RB_ADDR_CORE => rbaddr_core0,
RB_ADDR_IBUS => rbaddr_ibus)
RB_ADDR_IBUS => rbaddr_ibus0)
port map (
CLK => CLK,
RESET => RESET,
/trunk/rtl/sys_gen/w11a/nexys2/sys_w11a_n2.vbom
4,6 → 4,7
../../../vlib/genlib/genlib.vhd
../../../vlib/serport/serportlib.vbom
../../../vlib/rbus/rblib.vhd
../../../vlib/rbus/rbdlib.vhd
../../../vlib/rlink/rlinklib.vbom
../../../bplib/fx2lib/fx2lib.vhd
../../../bplib/fx2rlink/fx2rlinklib.vbom
22,7 → 23,8
../../../bplib/bpgen/sn_humanio_rbus.vbom
../../../bplib/fx2rlink/rlink_sp1c_fx2.vbom
../../../bplib/fx2rlink/ioleds_sp1c_fx2.vbom
../../../vlib/rbus/rb_sres_or_3.vbom
../../../vlib/rbus/rb_sres_or_4.vbom
../../../vlib/rbus/rbd_rbmon.vbom
../../../w11a/pdp11_core_rbus.vbom
../../../w11a/pdp11_core.vbom
../../../w11a/pdp11_bram.vbom
/trunk/rtl/sys_gen/w11a/nexys3/sys_conf.vhd
1,6 → 1,6
-- $Id: sys_conf.vhd 538 2013-10-06 17:21:25Z mueller $
-- $Id: sys_conf.vhd 621 2014-12-26 21:20:05Z mueller $
--
-- Copyright 2011-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
-- Copyright 2011-2014 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
16,9 → 16,11
-- Description: Definitions for sys_w11a_n3 (for synthesis)
--
-- Dependencies: -
-- Tool versions: xst 13.1, 14.6; ghdl 0.29
-- Tool versions: xst 13.1-14.7; ghdl 0.29-0.31
-- Revision History:
-- Date Rev Version Comment
-- 2014-12-26 621 1.2.2 use 68 MHz, get occasional problems with 72 MHz
-- 2014-12-22 619 1.2.1 add _rbmon_awidth
-- 2013-10-06 538 1.2 pll support, use clksys_vcodivide ect
-- 2013-10-05 537 1.1.1 use 72 MHz, no closure w/ ISE 14.x for 80 anymore
-- 2013-04-21 509 1.1 add fx2 settings
43,8 → 45,8
package sys_conf is
 
constant sys_conf_clksys_vcodivide : positive := 25;
constant sys_conf_clksys_vcomultiply : positive := 18; -- dcm 72 MHz
constant sys_conf_clksys_outdivide : positive := 1; -- sys 72 MHz
constant sys_conf_clksys_vcomultiply : positive := 17; -- dcm 68 MHz
constant sys_conf_clksys_outdivide : positive := 1; -- sys 68 MHz
constant sys_conf_clksys_gentype : string := "DCM";
constant sys_conf_memctl_read0delay : positive := 4;
53,6 → 55,8
 
constant sys_conf_ser2rri_defbaud : integer := 115200; -- default 115k baud
 
constant sys_conf_rbmon_awidth : integer := 9; -- use 0 to disable rbmon
 
-- fx2 settings: petowidth=10 -> 2^10 30 MHz clocks -> ~33 usec
constant sys_conf_fx2_petowidth : positive := 10;
constant sys_conf_fx2_ccwidth : positive := 5;
/trunk/rtl/sys_gen/w11a/nexys3/tb/sys_conf_sim.vhd
1,6 → 1,6
-- $Id: sys_conf_sim.vhd 538 2013-10-06 17:21:25Z mueller $
-- $Id: sys_conf_sim.vhd 619 2014-12-23 13:17:41Z mueller $
--
-- Copyright 2011-2013 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
-- Copyright 2011-2014 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
16,9 → 16,10
-- Description: Definitions for sys_w11a_n3 (for simulation)
--
-- Dependencies: -
-- Tool versions: xst 13.1, 14.6; ghdl 0.29
-- Tool versions: xst 13.1-14.7; ghdl 0.29-0.31
-- Revision History:
-- Date Rev Version Comment
-- 2014-12-22 619 1.3.1 add _rbmon_awidth
-- 2013-10-06 538 1.3 pll support, use clksys_vcodivide ect
-- 2013-04-21 509 1.2 add fx2 settings
-- 2011-11-25 432 1.0 Initial version (cloned from _n3)
41,7 → 42,9
constant sys_conf_memctl_writedelay : positive := 5;
 
constant sys_conf_ser2rri_cdinit : integer := 1-1; -- 1 cycle/bit in sim
 
constant sys_conf_rbmon_awidth : integer := 9; -- use 0 to disable rbmon
 
-- fx2 settings: petowidth=10 -> 2^10 30 MHz clocks -> ~33 usec
constant sys_conf_fx2_petowidth : positive := 10;
constant sys_conf_fx2_ccwidth : positive := 5;
/trunk/rtl/sys_gen/w11a/nexys3/sys_w11a_n3.vhd
1,4 → 1,4
-- $Id: sys_w11a_n3.vhd 614 2014-12-20 15:00:45Z mueller $
-- $Id: sys_w11a_n3.vhd 620 2014-12-25 10:48:35Z mueller $
--
-- Copyright 2011-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
--
21,7 → 21,8
-- bplib/bpgen/sn_humanio_rbus
-- bplib/fx2rlink/rlink_sp1c_fx2
-- bplib/fx2rlink/ioleds_sp1c_fx2
-- vlib/rri/rb_sres_or_3
-- vlib/rbus/rb_sres_or_4
-- vlib/rbus/rbd_rbmon
-- w11a/pdp11_core_rbus
-- w11a/pdp11_core
-- w11a/pdp11_bram
41,6 → 42,7
--
-- Synthesized (xst):
-- Date Rev ise Target flop lutl lutm slic t peri
-- 2014-12-22 619 14.7 131013 xc6slx16-2 1742 3767 150 1350 ok: +rbmon
-- 2014-12-20 614 14.7 131013 xc6slx16-2 1640 3692 150 1297 ok: -RL11,rlv4
-- 2014-06-08 561 14.7 131013 xc6slx16-2 1531 3500 142 1165 ok: +RL11
-- 2014-05-29 556 14.7 131013 xc6slx16-2 1459 3342 128 1154 ok:
50,6 → 52,8
--
-- Revision History:
-- Date Rev Version Comment
-- 2014-12-24 620 1.7.2 relocate ibus window and hio rbus address
-- 2014-12-22 619 1.7.1 add rbus monitor rbd_rbmon
-- 2014-08-28 588 1.7 use new rlink v4 iface generics and 4 bit STAT
-- 2014-08-15 583 1.6 rb_mreq addr now 16 bit
-- 2013-10-06 538 1.5 pll support, use clksys_vcodivide ect
108,6 → 112,7
use work.genlib.all;
use work.serportlib.all;
use work.rblib.all;
use work.rbdlib.all;
use work.rlinklib.all;
use work.fx2lib.all;
use work.fx2rlinklib.all;
181,11 → 186,12
signal SER_MONI : serport_moni_type := serport_moni_init;
signal FX2_MONI : fx2ctl_moni_type := fx2ctl_moni_init;
 
signal RB_MREQ : rb_mreq_type := rb_mreq_init;
signal RB_SRES : rb_sres_type := rb_sres_init;
signal RB_SRES_CPU : rb_sres_type := rb_sres_init;
signal RB_SRES_IBD : rb_sres_type := rb_sres_init;
signal RB_SRES_HIO : rb_sres_type := rb_sres_init;
signal RB_MREQ : rb_mreq_type := rb_mreq_init;
signal RB_SRES : rb_sres_type := rb_sres_init;
signal RB_SRES_CPU : rb_sres_type := rb_sres_init;
signal RB_SRES_IBD : rb_sres_type := rb_sres_init;
signal RB_SRES_HIO : rb_sres_type := rb_sres_init;
signal RB_SRES_RBMON : rb_sres_type := rb_sres_init;
 
signal RESET : slbit := '0';
signal CE_USEC : slbit := '0';
237,9 → 243,10
 
signal DISPREG : slv16 := (others=>'0');
 
constant rbaddr_core0 : slv16 := "0000000000000000";
constant rbaddr_ibus : slv16 := "0000000010000000";
constant rbaddr_hio : slv16 := "0000000011000000";
constant rbaddr_rbmon : slv16 := x"ffe8"; -- ffe8/0008: 1111 1111 1110 1xxx
constant rbaddr_hio : slv16 := x"fef0"; -- fef0/0004: 1111 1110 1111 00xx
constant rbaddr_ibus0 : slv16 := x"4000"; -- 4000/1000: 0100 xxxx xxxx xxxx
constant rbaddr_core0 : slv16 := x"0000"; -- 0000/0020: 0000 0000 000x xxxx
 
begin
 
357,18 → 364,34
IO_FX2_DATA => IO_FX2_DATA
);
 
RB_SRES_OR : rb_sres_or_3
RB_SRES_OR : rb_sres_or_4
port map (
RB_SRES_1 => RB_SRES_CPU,
RB_SRES_2 => RB_SRES_IBD,
RB_SRES_3 => RB_SRES_HIO,
RB_SRES_4 => RB_SRES_RBMON,
RB_SRES_OR => RB_SRES
);
RBMON : if sys_conf_rbmon_awidth > 0 generate
begin
RBMON : rbd_rbmon
generic map (
RB_ADDR => rbaddr_rbmon,
AWIDTH => sys_conf_rbmon_awidth)
port map (
CLK => CLK,
RESET => RESET,
RB_MREQ => RB_MREQ,
RB_SRES => RB_SRES_RBMON,
RB_SRES_SUM => RB_SRES
);
end generate RBMON;
 
RB2CP : pdp11_core_rbus
generic map (
RB_ADDR_CORE => rbaddr_core0,
RB_ADDR_IBUS => rbaddr_ibus)
RB_ADDR_IBUS => rbaddr_ibus0)
port map (
CLK => CLK,
RESET => RESET,
/trunk/rtl/sys_gen/w11a/nexys3/sys_w11a_n3.vbom
4,6 → 4,7
../../../vlib/genlib/genlib.vhd
../../../vlib/serport/serportlib.vbom
../../../vlib/rbus/rblib.vhd
../../../vlib/rbus/rbdlib.vhd
../../../vlib/rlink/rlinklib.vbom
../../../bplib/fx2lib/fx2lib.vhd
../../../bplib/fx2rlink/fx2rlinklib.vbom
22,7 → 23,8
../../../bplib/bpgen/sn_humanio_rbus.vbom
../../../bplib/fx2rlink/rlink_sp1c_fx2.vbom
../../../bplib/fx2rlink/ioleds_sp1c_fx2.vbom
../../../vlib/rbus/rb_sres_or_3.vbom
../../../vlib/rbus/rb_sres_or_4.vbom
../../../vlib/rbus/rbd_rbmon.vbom
../../../w11a/pdp11_core_rbus.vbom
../../../w11a/pdp11_core.vbom
../../../w11a/pdp11_bram.vbom
/trunk/rtl/sys_gen/w11a/s3board/sys_conf.vhd
1,6 → 1,6
-- $Id: sys_conf.vhd 314 2010-07-09 17:38:41Z mueller $
-- $Id: sys_conf.vhd 619 2014-12-23 13:17:41Z mueller $
--
-- Copyright 2007-2008 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
-- Copyright 2007-2014 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
16,9 → 16,10
-- Description: Definitions for sys_w11a_s3 (for synthesis)
--
-- Dependencies: -
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2; ghdl 0.18-0.25
-- Tool versions: xst 8.1-14.7; ghdl 0.18-0.31
-- Revision History:
-- Date Rev Version Comment
-- 2014-12-22 619 1.1.2 add _rbmon_awidth
-- 2010-05-05 288 1.1.1 add sys_conf_hio_debounce
-- 2008-02-23 118 1.1 add memory config
-- 2007-09-23 84 1.0 Initial version
33,6 → 34,7
 
constant sys_conf_hio_debounce : boolean := true; -- instantiate debouncers
constant sys_conf_ser2rri_cdinit : integer := 434-1; -- 50000000/115200
constant sys_conf_rbmon_awidth : integer := 9; -- use 0 to disable rbmon
 
constant sys_conf_bram : integer := 0; -- no bram, use cache
constant sys_conf_bram_awidth : integer := 14; -- bram size (16 kB)
/trunk/rtl/sys_gen/w11a/s3board/tb/sys_conf_sim.vhd
1,6 → 1,6
-- $Id: sys_conf_sim.vhd 314 2010-07-09 17:38:41Z mueller $
-- $Id: sys_conf_sim.vhd 619 2014-12-23 13:17:41Z mueller $
--
-- Copyright 2007-2008 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
-- Copyright 2007-2014 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
16,9 → 16,10
-- Description: Definitions for sys_w11a_s3 (for simulation)
--
-- Dependencies: -
-- Tool versions: xst 8.1, 8.2, 9.1, 9.2; ghdl 0.18-0.25
-- Tool versions: xst 8.1-14.7; ghdl 0.18-0.31
-- Revision History:
-- Date Rev Version Comment
-- 2014-12-22 619 1.1.2 add _rbmon_awidth
-- 2010-05-05 288 1.1.1 add sys_conf_hio_debounce
-- 2008-02-23 118 1.1 add memory config
-- 2007-09-23 84 1.0 Initial version
33,7 → 34,8
 
constant sys_conf_hio_debounce : boolean := false; -- no debouncers
constant sys_conf_ser2rri_cdinit : integer := 1-1; -- 1 cycle/bit in sim
constant sys_conf_rbmon_awidth : integer := 9; -- use 0 to disable rbmon
 
constant sys_conf_bram : integer := 0; -- no bram, use cache
constant sys_conf_bram_awidth : integer := 14; -- bram size (16 kB)
constant sys_conf_mem_losize : integer := 8#037777#; -- 1 MByte
/trunk/rtl/sys_gen/w11a/s3board/sys_w11a_s3.vhd
1,4 → 1,4
-- $Id: sys_w11a_s3.vhd 614 2014-12-20 15:00:45Z mueller $
-- $Id: sys_w11a_s3.vhd 620 2014-12-25 10:48:35Z mueller $
--
-- Copyright 2007-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
--
19,7 → 19,8
-- bplib/bpgen/bp_rs232_2l4l_iob
-- bplib/bpgen/sn_humanio
-- vlib/rlink/rlink_sp1c
-- vlib/rbus/rb_sres_or_2
-- vlib/rbus/rb_sres_or_3
-- vlib/rbus/rbd_rbmon
-- w11a/pdp11_core_rbus
-- w11a/pdp11_core
-- w11a/pdp11_bram
39,6 → 40,7
--
-- Synthesized (xst):
-- Date Rev ise Target flop lutl lutm slic t peri
-- 2014-12-22 619 14.7 131013 xc3s1000-4 1569 4768 302 2994 OK: +rbmon
-- 2014-12-20 614 14.7 131013 xc3s1000-4 1455 4523 302 2807 OK: -RL11,rlv4
-- 2014-06-08 561 14.7 131013 xc3s1000-4 1374 4580 286 2776 OK: +RL11
-- 2014-06-01 558 14.7 131013 xc3s1000-4 1301 4306 270 2614 OK:
76,6 → 78,8
--
-- Revision History:
-- Date Rev Version Comment
-- 2014-12-24 620 1.6.2 relocate ibus window and hio rbus address
-- 2014-12-22 619 1.6.1 add rbus monitor rbd_rbmon
-- 2014-08-28 588 1.6 use new rlink v4 iface and 4 bit STAT
-- 2014-08-15 583 1.5 rb_mreq addr now 16 bit
-- 2011-12-21 442 1.4.4 use rlink_sp1c; hio led usage now a for n2/n3
162,6 → 166,7
use work.genlib.all;
use work.serportlib.all;
use work.rblib.all;
use work.rbdlib.all;
use work.rlinklib.all;
use work.bpgenlib.all;
use work.s3boardlib.all;
220,6 → 225,7
signal RB_SRES : rb_sres_type := rb_sres_init;
signal RB_SRES_CPU : rb_sres_type := rb_sres_init;
signal RB_SRES_IBD : rb_sres_type := rb_sres_init;
signal RB_SRES_RBMON : rb_sres_type := rb_sres_init;
 
signal RESET : slbit := '0';
signal CE_USEC : slbit := '0';
269,9 → 275,10
 
signal DISPREG : slv16 := (others=>'0');
 
constant rbaddr_core0 : slv16 := "0000000000000000";
constant rbaddr_ibus : slv16 := "0000000010000000";
constant rbaddr_hio : slv16 := "0000000011000000";
constant rbaddr_rbmon : slv16 := x"ffe8"; -- ffe8/0008: 1111 1111 1110 1xxx
constant rbaddr_hio : slv16 := x"fef0"; -- fef0/0004: 1111 1110 1111 00xx
constant rbaddr_ibus0 : slv16 := x"4000"; -- 4000/1000: 0100 xxxx xxxx xxxx
constant rbaddr_core0 : slv16 := x"0000"; -- 0000/0020: 0000 0000 000x xxxx
 
begin
 
355,17 → 362,33
SER_MONI => SER_MONI
);
RB_SRES_OR : rb_sres_or_2
RB_SRES_OR : rb_sres_or_3
port map (
RB_SRES_1 => RB_SRES_CPU,
RB_SRES_2 => RB_SRES_IBD,
RB_SRES_3 => RB_SRES_RBMON,
RB_SRES_OR => RB_SRES
);
RBMON : if sys_conf_rbmon_awidth > 0 generate
begin
RBMON : rbd_rbmon
generic map (
RB_ADDR => rbaddr_rbmon,
AWIDTH => sys_conf_rbmon_awidth)
port map (
CLK => CLK,
RESET => RESET,
RB_MREQ => RB_MREQ,
RB_SRES => RB_SRES_RBMON,
RB_SRES_SUM => RB_SRES
);
end generate RBMON;
 
RP2CP : pdp11_core_rbus
generic map (
RB_ADDR_CORE => rbaddr_core0,
RB_ADDR_IBUS => rbaddr_ibus)
RB_ADDR_IBUS => rbaddr_ibus0)
port map (
CLK => CLK,
RESET => RESET,
/trunk/rtl/sys_gen/w11a/s3board/sys_w11a_s3.vbom
3,6 → 3,7
../../../vlib/genlib/genlib.vhd
../../../vlib/serport/serportlib.vbom
../../../vlib/rbus/rblib.vhd
../../../vlib/rbus/rbdlib.vhd
../../../vlib/rlink/rlinklib.vbom
../../../bplib/bpgen/bpgenlib.vbom
../../../bplib/s3board/s3boardlib.vbom
15,7 → 16,8
../../../bplib/bpgen/bp_rs232_2l4l_iob.vbom
../../../bplib/bpgen/sn_humanio.vbom
../../../vlib/rlink/rlink_sp1c.vbom
../../../vlib/rbus/rb_sres_or_2.vbom
../../../vlib/rbus/rb_sres_or_3.vbom
../../../vlib/rbus/rbd_rbmon.vbom
../../../w11a/pdp11_core_rbus.vbom
../../../w11a/pdp11_core.vbom
../../../w11a/pdp11_bram.vbom
/trunk/rtl/sys_gen/tst_rlink_cuff/nexys2/sys_tst_rlink_cuff_n2.vhd
1,4 → 1,4
-- $Id: sys_tst_rlink_cuff_n2.vhd 614 2014-12-20 15:00:45Z mueller $
-- $Id: sys_tst_rlink_cuff_n2.vhd 620 2014-12-25 10:48:35Z mueller $
--
-- Copyright 2012-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
--
40,6 → 40,7
--
-- Revision History:
-- Date Rev Version Comment
-- 2014-12-24 620 1.1.1 relocate hio rbus address
-- 2014-08-15 583 1.1 rb_mreq addr now 16 bit
-- 2012-12-29 466 1.0 Initial version; derived from sys_tst_fx2loop_n2
-- the now obsoleted sys_tst_rlink_n2_cuff design
160,7 → 161,7
signal FX2_TX2AFULL : slbit := '0';
signal FX2_MONI : fx2ctl_moni_type := fx2ctl_moni_init;
 
constant rbaddr_hio : slv16 := "0000000011000000"; -- 110000xx
constant rbaddr_hio : slv16 := x"fef0"; -- fef0/4: 1111 1110 1111 00xx
 
begin
 
/trunk/rtl/sys_gen/tst_rlink_cuff/nexys3/sys_tst_rlink_cuff_n3.vhd
1,4 → 1,4
-- $Id: sys_tst_rlink_cuff_n3.vhd 614 2014-12-20 15:00:45Z mueller $
-- $Id: sys_tst_rlink_cuff_n3.vhd 620 2014-12-25 10:48:35Z mueller $
--
-- Copyright 2013-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
--
36,6 → 36,7
--
-- Revision History:
-- Date Rev Version Comment
-- 2014-12-24 620 1.2.1 relocate hio rbus address
-- 2014-08-15 583 1.2 rb_mreq addr now 16 bit
-- 2013-10-06 538 1.1 pll support, use clksys_vcodivide ect
-- 2012-12-29 466 1.0 Initial version; derived from sys_tst_rlink_cuff_n2
158,7 → 159,7
signal FX2_TX2AFULL : slbit := '0';
signal FX2_MONI : fx2ctl_moni_type := fx2ctl_moni_init;
 
constant rbaddr_hio : slv16 := "0000000011000000"; -- 110000xx
constant rbaddr_hio : slv16 := x"fef0"; -- fef0/4: 1111 1110 1111 00xx
 
begin
 
/trunk/rtl/sys_gen/tst_rlink_cuff/atlys/sys_tst_rlink_cuff_atlys.vhd
1,4 → 1,4
-- $Id: sys_tst_rlink_cuff_atlys.vhd 583 2014-08-16 07:40:12Z mueller $
-- $Id: sys_tst_rlink_cuff_atlys.vhd 620 2014-12-25 10:48:35Z mueller $
--
-- Copyright 2013-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
--
35,6 → 35,7
--
-- Revision History:
-- Date Rev Version Comment
-- 2014-12-24 620 1.1.1 relocate hio rbus address
-- 2014-08-15 583 1.1 rb_mreq addr now 16 bit
-- 2013-01-06 472 1.0 Initial version; derived from sys_tst_rlink_cuff_n3
-- and sys_tst_fx2loop_atlys
141,7 → 142,7
signal FX2_TX2AFULL : slbit := '0';
signal FX2_MONI : fx2ctl_moni_type := fx2ctl_moni_init;
 
constant rbaddr_hio : slv16 := "0000000011000000"; -- 110000xx
constant rbaddr_hio : slv16 := x"fef0"; -- fef0/4: 1111 1110 1111 00xx
 
begin
 
/trunk/rtl/w11a/tb/tb_pdp11core.vhd
1,6 → 1,6
-- $Id: tb_pdp11core.vhd 444 2011-12-25 10:04:58Z mueller $
-- $Id: tb_pdp11core.vhd 621 2014-12-26 21:20:05Z mueller $
--
-- Copyright 2006-2011 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
-- Copyright 2006-2014 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
22,10 → 22,11
-- To test: pdp11_core
--
-- Target Devices: generic
-- Tool versions: ghdl 0.18-0.29; ISim 11.3
-- Tool versions: ghdl 0.18-0.31; ISim 14.7
--
-- Verified (with tb_pdp11core_stim.dat):
-- Date Rev Code ghdl ise Target Comment
-- 2014-12-23 620 - 0.31 14.7 131013 - u:ok
-- 2010-12-30 351 - 0.29 - - u:ok
-- 2010-12-30 351 _ssim 0.29 12.1 M53d xc3s1000 u:ok
-- 2010-06-20 308 - 0.29 - - u:ok
46,6 → 47,7
--
-- Revision History:
-- Date Rev Version Comment
-- 2014-12-26 621 1.4.1 adopt wmembe,ribr,wibr emulation to new 4k window
-- 2011-12-23 444 1.4 use new simclk/simclkcnt
-- 2011-11-18 427 1.3.2 now numeric_std clean
-- 2011-01-02 352 1.3.1 rename .cpmon->.rlmon
180,6 → 182,7
variable irnum : slv3 := (others=>'0');
variable idin : slv16 := (others=>'0');
variable imsk : slv16 := (others=>'1');
variable idin3 : slv3 := (others=>'0');
variable ichk : boolean := false;
variable idosta: slbit := '0';
 
198,15 → 201,14
variable ien : slbit := '0';
variable ibit : integer := 0;
variable imemi : boolean := false;
variable ioff : slv6 := (others=>'0');
variable iaddr : slv16 := (others=>'0');
variable idoibr : boolean := false;
 
variable r_addr : slv22_1 := (others=>'0');
variable r_ena_22bit : slbit := '0';
variable r_ena_ubmap : slbit := '0';
variable r_ibrbase : slv(c_ibrb_ibf_base) := (others=>'0');
variable r_ibrbe : slv2 := (others=>'0');
 
variable r_membe : slv2 := "11";
variable r_membestick : slbit := '0';
begin
 
312,7 → 314,7
when ".rbmon" => -- .rbmon (ignore it)
readempty(iline);
 
when ".scntl" => -- .scntl
when ".scntl" => -- .scntl
read_ea(iline, ibit);
read_ea(iline, ien);
assert (ibit>=SB_CNTL'low and ibit<=SB_CNTL'high)
365,7 → 367,7
irnum := slv(to_unsigned(rind, 3));
readoct_ea(iline, idin);
 
-- Note: there are no field definitions for wal, wah, wibrb because
-- Note: there are no field definitions for wal, wah, wmembe because
-- there is no corresponding cp command. Therefore the
-- rbus field definitions are used here
when "wal " => -- wal
385,14 → 387,10
testempty_ea(iline);
next file_loop;
 
when "wibrb " => -- wibrb
readoct_ea(iline, idin);
r_ibrbase := idin(c_ibrb_ibf_base);
if idin(c_ibrb_ibf_be) /= "00" then
r_ibrbe := idin(c_ibrb_ibf_be);
else
r_ibrbe := "11";
end if;
when "wmembe" => -- wmembe
read_ea(iline, idin3);
r_membestick := idin3(c_membe_rbf_stick);
r_membe := idin3(c_membe_rbf_be);
testempty_ea(iline);
next file_loop;
 
415,12 → 413,12
when "ribr " => -- ribr
ifunc := c_cpfunc_rmem;
idoibr := true;
readoct_ea(iline, ioff);
readoct_ea(iline, iaddr);
readtagval2_ea(iline, "d", ichk, idin, imsk, 8);
when "wibr " => -- wibr
ifunc := c_cpfunc_wmem;
idoibr := true;
readoct_ea(iline, ioff);
readoct_ea(iline, iaddr);
readoct_ea(iline, idin);
 
when "rps " => -- rps
471,12 → 469,11
 
end if;
CP_ADDR_be <= r_membe;
if idoibr then
CP_ADDR_addr(15 downto 13) <= "111";
CP_ADDR_addr(c_ibrb_ibf_base) <= r_ibrbase;
CP_ADDR_addr(5 downto 1) <= ioff(5 downto 1);
CP_ADDR_addr(15 downto 13) <= "111";
CP_ADDR_addr(12 downto 1) <= iaddr(12 downto 1);
CP_ADDR_racc <= '1';
CP_ADDR_be <= r_ibrbe;
CP_ADDR_ena_22bit <= '0';
CP_ADDR_ena_ubmap <= '0';
else
527,9 → 524,14
idelta := idelta - 1;
end loop;
 
if imemi then -- rmi or wmi seen ? then inc ar
if imemi then -- rmi or wmi seen ? then inc ar
r_addr := slv(unsigned(r_addr) + 1);
end if;
 
if ifunc = c_cpfunc_wmem and -- emulate be sticky logic of rbus iface
r_membestick = '0' then
r_membe := "11";
end if;
write(oline, dcycle, right, 4);
write(oline, string'(" "));
/trunk/rtl/w11a/tb/tb_pdp11core_stim.dat
1,7 → 1,8
# $Id: tb_pdp11core_stim.dat 614 2014-12-20 15:00:45Z mueller $
# $Id: tb_pdp11core_stim.dat 621 2014-12-26 21:20:05Z mueller $
#
# Revision History:
# Date Rev Version Comment
# 2014-12-26 621 2.5 adopt wmembe,ribr,wibr emulation to new 4k window
# 2014-12-20 614 2.4 adopted to rlink v4
# 2014-07-13 569 2.3 after ECO-026: correct test 31.1 wrong V=1 cases
# correct test 37.2: 2 V=1 cases have regs now updated
114,12 → 115,11
#
C via ibr (ibrb 177700)
#
wibrb 177700
wibr 76 000017 -- set all cc flags in psw
ribr 76 d=000017 -- ! psw
wibr 177776 000017 -- set all cc flags in psw
ribr 177776 d=000017 -- ! psw
rps d=000017
wibr 76 000000 -- set all cc flags in psw
ribr 76 d=000000 -- ! psw
wibr 177776 000000 -- set all cc flags in psw
ribr 177776 d=000000 -- ! psw
rps d=000000
#
C write register set 1, sm,um stack
177,17 → 177,16
#
C read IB space via ibr: MMU SAR supervisor mode (16 bit regs)
#
wibrb 172200
ribr 40 d=012340
ribr 42 d=012342
ribr 44 d=012344
ribr 172240 d=012340
ribr 172242 d=012342
ribr 172244 d=012344
#
C byte write IB space via ibr: MMU SAR supervisor mode (16 bit regs)
#
wibrb 172201 -- write low byte
wibr 40 177000
wibr 42 177002
wibr 44 177004
wmembe 101 -- write low byte (set sticky flag)
wibr 172240 177000
wibr 172242 177002
wibr 172244 177004
wal 172240 -- ! verify
brm 3
d=012000
194,10 → 193,10
d=012002
d=012004
#
wibrb 172202 -- write high byte
wibr 40 000377
wibr 42 022377
wibr 44 044377
wmembe 110 -- write high byte (set sticky flag)
wibr 172240 000377
wibr 172242 022377
wibr 172244 044377
wal 172240 -- ! verify
brm 3
d=000000
204,10 → 203,10
d=022002
d=044004
#
wibrb 172203 -- write high and low byte (both be set)
wibr 40 012340
wibr 42 012342
wibr 44 012344
wmembe 011 -- write high and low byte
wibr 172240 012340
wibr 172242 012342
wibr 172244 012344
wal 172240 -- ! verify
brm 3
d=012340
/trunk/rtl/w11a/tb/Makefile
1,7 → 1,8
# $Id: Makefile 575 2014-07-27 20:55:41Z mueller $
# $Id: Makefile 621 2014-12-26 21:20:05Z mueller $
#
# Revision History:
# Date Rev Version Comment
# 2014_12_26 621 1.4.2 use tbrun_tbw for check_* targets
# 2014-07-27 545 1.4.1 make reference board configurable via XTW_BOARD
# 2011-08-13 405 1.4 use includes from rtl/make
# 2010-12-30 351 1.3 retire tb_rripdp_pdp11core tb_rriext_pdp11core
51,16 → 52,12
grep FAIL $*.simh_log
 
check_dsim: tb_pdp11core tb_pdp11core_stim.dat
time tbw tb_pdp11core |\
tee tb_pdp11core_dsim.log |\
egrep "(FAIL|DONE)" || true
tbrun_tbw tb_pdp11core || true
@ echo "# diff to reference"
diff tb_pdp11core_out_ref.dat tb_pdp11core_dsim.log
 
check_ssim: tb_pdp11core_ssim tb_pdp11core_stim.dat
time tbw tb_pdp11core_ssim |\
tee tb_pdp11core_ssim.log |\
egrep "(FAIL|DONE)" || true
tbrun_tbw tb_pdp11core_ssim || true
@ echo "# diff to reference"
diff tb_pdp11core_out_ref.dat tb_pdp11core_ssim.log
 
/trunk/rtl/w11a/pdp11_core_rbus.vhd
1,4 → 1,4
-- $Id: pdp11_core_rbus.vhd 591 2014-09-06 17:45:38Z mueller $
-- $Id: pdp11_core_rbus.vhd 621 2014-12-26 21:20:05Z mueller $
--
-- Copyright 2007-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
--
20,8 → 20,15
--
-- Target Devices: generic
-- Tool versions: xst 8.2-14.7; ghdl 0.18-0.31
--
-- Synthesized (xst):
-- Date Rev ise Target flop lutl lutm slic t peri
-- 2014-12-21 591 14.7 131013 xc6slx16-2 52 118 0 58 s 4.9
--
-- Revision History: -
-- Date Rev Version Comment
-- 2014-12-26 621 1.4 use full size 4k word ibus window
-- 2014-12-21 617 1.3.1 use separate RB_STAT bits for cmderr and cmdmerr
-- 2014-09-05 591 1.3 use new rlink v4 iface and 4 bit STAT
-- 2014-08-15 583 1.2 rb_mreq addr now 16 bit
-- 2011-11-18 427 1.1.1 now numeric_std clean
49,12 → 56,12
--
-- rbus registers:
--
-- Address Bits Name r/w/i Function
-- Addr Bits Name r/w/f Function
--
-- bbb00000 conf r/w/- cpu configuration (e.g. cpu type)
-- 00000 conf r/w/- cpu configuration (e.g. cpu type)
-- (currently unused, all bits MBZ)
-- bbb00001 cntl -/f/- cpu control
-- 3:0 func function code
-- 00001 cntl -/f/- cpu control
-- 3:00 func function code
-- 0000: noop
-- 0001: start
-- 0010: stop
61,25 → 68,24
-- 0011: continue
-- 0100: step
-- 1111: reset (soft)
-- bbb00010 stat r/-/- cpu status
-- 7:04 cpurust r/-/- cp_stat: cpurust
-- 3 cpuhalt r/-/- cp_stat: cpuhalt
-- 2 cpugo r/-/- cp_stat: cpugo
-- 1 cmdmerr r/-/- cp_stat: cmdmerr
-- 0 cmderr r/-/- cp_stat: cmderr
-- bbb00011 psw r/w/- processor status word access
-- bbb00100 al r/w/- address register, low
-- bbb00101 ah r/w/- address register, high
-- 7 ubm r/w/- ubmap access
-- 6 p22 r/w/- 22bit access
-- 5: 0 addr r/w/- addr(21:16)
-- bbb00110 mem r/w/- memory access
-- bbb00111 memi r/w/- memory access, inc address
-- bbb01rrr gpr[] r/w/- general purpose regs
-- bbb10000 ibrb r/w/- ibr base address
-- 12:06 base r/w/- ibr window base address
-- 1:00 we r/w/- byte enables (00 equivalent to 11)
-- www----- ibr[] r/w/- ibr window (32 words)
-- 00010 stat r/-/- cpu status
-- 7:04 cpurust r/-/- cp_stat: cpurust
-- 3 cpuhalt r/-/- cp_stat: cpuhalt
-- 2 cpugo r/-/- cp_stat: cpugo
-- 1 cmdmerr r/-/- cp_stat: cmdmerr
-- 0 cmderr r/-/- cp_stat: cmderr
-- 00011 psw r/w/- processor status word access
-- 00100 al r/w/- address register, low
-- 00101 ah r/w/- address register, high
-- 7 ubm r/w/- ubmap access
-- 6 p22 r/w/- 22bit access
-- 5:00 addr r/w/- addr(21:16)
-- 00110 mem r/w/- memory access
-- 00111 memi r/w/- memory access, inc address
-- 01rrr gpr[] r/w/- general purpose regs
-- 10000 membe r/w/- memory write byte enables
-- 3 stick r/w/- sticky flag
-- 1:00 be r/w/- byte enables
--
 
library ieee;
94,8 → 100,8
 
entity pdp11_core_rbus is -- core to rbus interface
generic (
RB_ADDR_CORE : slv16 := slv(to_unsigned(2#0000000000000000#,16));
RB_ADDR_IBUS : slv16 := slv(to_unsigned(2#0000000010000000#,16)));
RB_ADDR_CORE : slv16 := slv(to_unsigned(16#0000#,16));
RB_ADDR_IBUS : slv16 := slv(to_unsigned(16#4000#,16)));
port (
CLK : in slbit; -- clock
RESET : in slbit; -- reset
131,9 → 137,8
addr : slv22_1; -- address register
ena_22bit : slbit; -- 22bit enable
ena_ubmap : slbit; -- ubmap enable
ibrbase : slv(c_ibrb_ibf_base); -- ibr base address
ibrbe : slv2; -- ibr byte enables
ibrberet : slv2; -- ibr byte enables (for readback)
membe : slv2; -- memory write byte enables
membestick : slbit; -- memory write byte enables sticky
doinc : slbit; -- at cmdack: do addr reg inc
waitstep : slbit; -- at cmdack: wait for cpu step complete
end record regs_type;
146,7 → 151,7
'0', -- cpugo_1
(others=>'0'), -- addr
'0','0', -- ena_22bit, ena_ubmap
(others=>'0'),"00","00", -- ibrbase, ibrbe, ibrberet
"11",'0', -- membe,membestick
'0','0' -- doinc, waitstep
);
 
212,7 → 217,7
if RB_MREQ.addr(15 downto 5)=RB_ADDR_CORE(15 downto 5) then
n.rbselc := '1';
end if;
if RB_MREQ.addr(15 downto 5)=RB_ADDR_IBUS(15 downto 5) then
if RB_MREQ.addr(15 downto 12)=RB_ADDR_IBUS(15 downto 12) then
n.rbseli := '1';
end if;
end if;
253,7 → 258,7
end if;
end if;
when c_rbaddr_stat => -- stat -------------------------
when c_rbaddr_stat => -- stat ------------------
irb_dout(c_stat_rbf_cmderr) := CP_STAT.cmderr;
irb_dout(c_stat_rbf_cmdmerr) := CP_STAT.cmdmerr;
irb_dout(c_stat_rbf_cpugo) := CP_STAT.cpugo;
260,7 → 265,7
irb_dout(c_stat_rbf_cpuhalt) := CP_STAT.cpuhalt;
irb_dout(c_stat_rbf_cpurust) := CP_STAT.cpurust;
 
when c_rbaddr_psw => -- psw --------------------------
when c_rbaddr_psw => -- psw -------------------
if irbena = '1' then
n.cpfunc := c_cpfunc_rpsw;
n.cpfunc(0) := RB_MREQ.we;
267,7 → 272,7
icpreq := '1';
end if;
when c_rbaddr_al => -- al ---------------------------
when c_rbaddr_al => -- al --------------------
irb_dout(c_al_rbf_addr) := r.addr(c_al_rbf_addr);
if RB_MREQ.we = '1' then
n.addr := (others=>'0'); -- write to al clears ah !!
276,7 → 281,7
n.addr(c_al_rbf_addr) := RB_MREQ.din(c_al_rbf_addr);
end if;
 
when c_rbaddr_ah => -- ah ---------------------------
when c_rbaddr_ah => -- ah --------------------
irb_dout(c_ah_rbf_ena_ubmap) := r.ena_ubmap;
irb_dout(c_ah_rbf_ena_22bit) := r.ena_22bit;
irb_dout(c_ah_rbf_addr) := r.addr(21 downto 16);
286,7 → 291,7
n.ena_ubmap := RB_MREQ.din(c_ah_rbf_ena_ubmap);
end if;
 
when c_rbaddr_mem => -- mem -----------------
when c_rbaddr_mem => -- mem -------------------
if irbena = '1' then
n.cpfunc := c_cpfunc_rmem;
n.cpfunc(0) := RB_MREQ.we;
293,7 → 298,7
icpreq := '1';
end if;
when c_rbaddr_memi => -- memi ----------------
when c_rbaddr_memi => -- memi ------------------
if irbena = '1' then
n.cpfunc := c_cpfunc_rmem;
n.cpfunc(0) := RB_MREQ.we;
304,7 → 309,7
when c_rbaddr_r0 | c_rbaddr_r1 |
c_rbaddr_r2 | c_rbaddr_r3 |
c_rbaddr_r4 | c_rbaddr_r5 |
c_rbaddr_sp | c_rbaddr_pc => -- r* ------------------
c_rbaddr_sp | c_rbaddr_pc => -- r* -----------------
if irbena = '1' then
n.cpfunc := c_cpfunc_rreg;
n.cpfunc(0) := RB_MREQ.we;
311,17 → 316,12
icpreq := '1';
end if;
when c_rbaddr_ibrb => -- ibrb ----------------
irb_dout(c_ibrb_ibf_base) := r.ibrbase;
irb_dout(c_ibrb_ibf_be) := r.ibrberet;
when c_rbaddr_membe => -- membe -----------------
irb_dout(c_membe_rbf_be) := r.membe;
irb_dout(c_membe_rbf_stick) := r.membestick;
if RB_MREQ.we = '1' then
n.ibrbase := RB_MREQ.din(c_ibrb_ibf_base);
n.ibrberet := RB_MREQ.din(c_ibrb_ibf_be);
if RB_MREQ.din(c_ibrb_ibf_be) = "00" then -- both be=0 ?
n.ibrbe := "11";
else -- otherwise take 2 LSB's
n.ibrbe := RB_MREQ.din(c_ibrb_ibf_be);
end if;
n.membe := RB_MREQ.din(c_membe_rbf_be);
n.membestick := RB_MREQ.din(c_membe_rbf_stick);
end if;
when others =>
341,11 → 341,19
n.cpreq := '0'; -- cpreq only for 1 cycle
 
if (r.rbselc or r.rbseli)='0' or irbena='0' then -- rbus cycle abort
if r.cpfunc = c_cpfunc_wmem and -- if wmem command
r.membestick = '0' then -- and be's not sticky
n.membe := "11"; -- re-enable both bytes
end if;
n.state := s_idle; -- quit
else
irb_dout := CP_DOUT;
irb_err := CP_STAT.cmderr or CP_STAT.cmdmerr;
if CP_STAT.cmdack = '1' then -- normal cycle end
if r.cpfunc = c_cpfunc_wmem and -- if wmem command
r.membestick = '0' then -- and be's not sticky
n.membe := "11"; -- re-enable both bytes
end if;
if r.doinc = '1' then
n.addr := slv(unsigned(r.addr) + 1);
end if;
374,19 → 382,18
when others => null;
end case;
 
icpaddr := cp_addr_init;
icpaddr.addr := r.addr;
icpaddr.racc := '0';
icpaddr.be := "11";
icpaddr.ena_22bit := r.ena_22bit;
icpaddr.ena_ubmap := r.ena_ubmap;
icpaddr := cp_addr_init;
icpaddr.be := r.membe;
if r.rbseli = '1' and irbena = '1' then
icpaddr.addr(15 downto 13) := "111";
icpaddr.addr(c_ibrb_ibf_base) := r.ibrbase;
icpaddr.addr(5 downto 1) := RB_MREQ.addr(4 downto 0);
if r.rbseli = '0' then -- access via cp
icpaddr.addr := r.addr;
icpaddr.racc := '0';
icpaddr.ena_22bit := r.ena_22bit;
icpaddr.ena_ubmap := r.ena_ubmap;
else -- access via ibus window
icpaddr.addr(15 downto 13) := "111";
icpaddr.addr(12 downto 1) := RB_MREQ.addr(11 downto 0);
icpaddr.racc := '1';
icpaddr.be := r.ibrbe;
icpaddr.ena_22bit := '0';
icpaddr.ena_ubmap := '0';
end if;
403,8 → 410,8
RB_SRES.busy <= irb_busy;
RB_SRES.dout <= irb_dout;
RB_STAT(3) <= '0';
RB_STAT(2) <= CP_STAT.cmderr or CP_STAT.cmdmerr;
RB_STAT(3) <= CP_STAT.cmderr;
RB_STAT(2) <= CP_STAT.cmdmerr;
RB_STAT(1) <= CP_STAT.cpuhalt or CP_STAT.cpurust(CP_STAT.cpurust'left);
RB_STAT(0) <= CP_STAT.cpugo;
 
/trunk/rtl/w11a/pdp11.vhd
1,4 → 1,4
-- $Id: pdp11.vhd 589 2014-08-30 12:43:16Z mueller $
-- $Id: pdp11.vhd 621 2014-12-26 21:20:05Z mueller $
--
-- Copyright 2006-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
--
562,7 → 562,7
 
type cp_addr_type is record -- control port address
addr : slv22_1; -- address
racc : slbit; -- ibr access
racc : slbit; -- ibus remote access
be : slv2; -- byte enables
ena_22bit : slbit; -- enable 22 bit mode
ena_ubmap : slbit; -- enable unibus mapper
650,12 → 650,12
constant c_rbaddr_sp : slv5 := "01110"; -- R/W gpr 6 (sp)
constant c_rbaddr_pc : slv5 := "01111"; -- R/W gpr 7 (pc)
constant c_rbaddr_ibrb : slv5 := "10000"; -- R/W ibr base address
constant c_rbaddr_membe: slv5 := "10000"; -- R/W memory write byte enables
 
subtype c_al_rbf_addr is integer range 15 downto 1; -- al: address
constant c_ah_rbf_ena_ubmap: integer := 7; -- ah: ubmap
constant c_ah_rbf_ena_22bit: integer := 6; -- ah: 22bit
subtype c_ah_rbf_addr is integer range 5 downto 0; -- ah: address
subtype c_al_rbf_addr is integer range 15 downto 1; -- al: address
constant c_ah_rbf_ena_ubmap: integer := 7; -- ah: ubmap
constant c_ah_rbf_ena_22bit: integer := 6; -- ah: 22bit
subtype c_ah_rbf_addr is integer range 5 downto 0; -- ah: address
 
constant c_stat_rbf_cmderr: integer := 0; -- stat field: cmderr
constant c_stat_rbf_cmdmerr: integer := 1; -- stat field: cmdmerr
663,9 → 663,9
constant c_stat_rbf_cpuhalt: integer := 3; -- stat field: cpuhalt
subtype c_stat_rbf_cpurust is integer range 7 downto 4; -- cpurust
 
subtype c_ibrb_ibf_base is integer range 12 downto 6; -- ibrb: base addr
subtype c_ibrb_ibf_be is integer range 1 downto 0; -- ibrb: be's
subtype c_membe_rbf_be is integer range 1 downto 0; -- membe: be's
constant c_membe_rbf_stick: integer := 2; -- membe: sticky flag
 
-- -------------------------------------
component pdp11_gpr is -- general purpose registers
1082,8 → 1082,8
 
component pdp11_core_rbus is -- core to rbus interface
generic (
RB_ADDR_CORE : slv16 := slv(to_unsigned(2#0000000000000000#,16));
RB_ADDR_IBUS : slv16 := slv(to_unsigned(2#0000000010000000#,16)));
RB_ADDR_CORE : slv16 := slv(to_unsigned(16#0000#,16));
RB_ADDR_IBUS : slv16 := slv(to_unsigned(16#4000#,16)));
port (
CLK : in slbit; -- clock
RESET : in slbit; -- reset
/trunk/rtl/vlib/rlink/rlinklib.vhd
1,4 → 1,4
-- $Id: rlinklib.vhd 610 2014-12-09 22:44:43Z mueller $
-- $Id: rlinklib.vhd 617 2014-12-21 14:18:53Z mueller $
--
-- Copyright 2007-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
--
20,6 → 20,7
--
-- Revision History:
-- Date Rev Version Comment
-- 2014-12-21 617 4.1 use stat(2) to signal rbus timeout
-- 2014-10-12 596 4.0 now rlink v4.0 iface, 4 bit STAT
-- 2014-08-15 583 3.5 rb_mreq addr now 16 bit
-- 2013-04-21 509 3.3.2 add rlb_moni record definition
81,7 → 82,8
 
subtype c_rlink_stat_rbf_stat is integer range 7 downto 4; -- ext status bits
constant c_rlink_stat_rbf_attn: integer := 3; -- attention flags set
constant c_rlink_stat_rbf_rbnak: integer := 1; -- rbus no ack or timeout
constant c_rlink_stat_rbf_rbtout: integer := 2; -- rbus timeout
constant c_rlink_stat_rbf_rbnak: integer := 1; -- rbus no ack
constant c_rlink_stat_rbf_rberr: integer := 0; -- rbus err bit set
 
constant c_rlink_nakcode_ccrc : slv3 := "000"; -- cmd crc error
/trunk/rtl/vlib/rlink/tb/tb_rlink_stim.dat
1,7 → 1,8
# $Id: tb_rlink_stim.dat 596 2014-10-17 19:50:07Z mueller $
# $Id: tb_rlink_stim.dat 617 2014-12-21 14:18:53Z mueller $
#
# Revision History:
# Date Rev Version Comment
# 2014-12-21 617 4.0.1 rlink signals now tout and nak on separate stat bits
# 2014-10-12 596 4.0 rewritten for rlink v4
# ... all history v1->v3 droped
# 2007-06-17 58 1.0 Initial version
316,9 → 317,9
C with data
sop
wreg 0 x"ffe0" x"03ff" 00000000 -- cntl := (nbusy=1023)
wreg 1 x"ffe4" x"1234" 00000010 -- data := 1234
wreg 1 x"ffe4" x"1234" 00000100 -- data := 1234
rreg 2 x"ffe3" x"0020" 00000000 -- ncyc >? 0020 (ncyc=TO(32))
rreg 3 x"ffe4" x"5555" 00000010 -- data >? 5555
rreg 3 x"ffe4" x"5555" 00000100 -- data >? 5555
rreg 4 x"ffe3" x"0020" 00000000 -- ncyc >? 0020 (ncyc=TO(32))
eop
.iowt 10
325,9 → 326,9
#
C with dinc
sop
wreg 0 x"ffe5" x"1234" 00000010 -- dinc := 1234
wreg 0 x"ffe5" x"1234" 00000100 -- dinc := 1234
rreg 1 x"ffe3" x"0020" 00000000 -- ncyc >? 0020 (ncyc=TO(32))
rreg 2 x"ffe5" x"5555" 00000010 -- dinc >? 5555
rreg 2 x"ffe5" x"5555" 00000100 -- dinc >? 5555
rreg 3 x"ffe3" x"0020" 00000000 -- ncyc >? 0020 (ncyc=TO(32))
eop
.iowt 10
334,9 → 335,9
#
C with fifo
sop
wreg 0 x"ffe6" x"3300" 00000010 -- fifo := 3300
wreg 0 x"ffe6" x"3300" 00000100 -- fifo := 3300
rreg 1 x"ffe3" x"0020" 00000000 -- ncyc >? 0020 (ncyc=TO(32))
rreg 2 x"ffe6" x"5555" 00000010 -- fifo >? 5555
rreg 2 x"ffe6" x"5555" 00000100 -- fifo >? 5555
rreg 3 x"ffe3" x"0020" 00000000 -- ncyc >? 0020 (ncyc=TO(32))
eop
.iowt 10
343,9 → 344,9
#
C with lnak
sop
wreg 0 x"ffe7" x"aaaa" 00000010 -- lnak := aaaa {nak=1}
wreg 0 x"ffe7" x"aaaa" 00000100 -- lnak := aaaa {nak=1}
rreg 1 x"ffe3" x"0020" 00000000 -- ncyc >? 0020 (ncyc=TO(32))
rreg 2 x"ffe7" x"5555" 00000010 -- lnak >? 5555 {nak=1}
rreg 2 x"ffe7" x"5555" 00000100 -- lnak >? 5555 {nak=1}
rreg 3 x"ffe3" x"0020" 00000000 -- ncyc >? 0020 (ncyc=TO(32))
eop
.iowt 10
/trunk/rtl/vlib/rlink/rlink_core.vhd
1,4 → 1,4
-- $Id: rlink_core.vhd 614 2014-12-20 15:00:45Z mueller $
-- $Id: rlink_core.vhd 620 2014-12-25 10:48:35Z mueller $
--
-- Copyright 2007-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
--
38,6 → 38,7
--
-- Revision History:
-- Date Rev Version Comment
-- 2014-12-21 617 4.1 use stat(_rbf_rbtout) to signal rbus timeout
-- 2014-12-20 614 4.0 largely rewritten; 2 FSMs; v3 protocol; 4 bit STAT
-- 2014-08-15 583 3.5 rb_mreq addr now 16 bit; add s_rxaddrl state
-- 2011-11-19 427 3.1.3 now numeric_std clean
184,8 → 185,8
end entity rlink_core;
 
architecture syn of rlink_core is
 
constant rbaddr : slv16:= "1111111111111100"; -- core config base (top 4)
-- core config registers (top 4 in rbus space)
constant rbaddr : slv16 := x"fffc"; -- fffc/4: 1111 1111 1111 11xx
constant rbaddr_cntl : slv2 := "11"; -- cntl address offset
constant rbaddr_stat : slv2 := "10"; -- stat address offset
constant rbaddr_id1 : slv2 := "01"; -- id1 address offset
345,7 → 346,8
rbre : slbit; -- rbus re signal
rbwe : slbit; -- rbus we signal
rbdout : slv16; -- rbus dout
rbnak: slbit; -- rbus no ack or timeout
rbtout: slbit; -- rbus timeout
rbnak: slbit; -- rbus no ack
rberr : slbit; -- rbus err bit set
blkabo : slbit; -- blk abort
cnt : slv(cntawidth-1 downto 0); -- word count for rblk and wblk
363,7 → 365,7
sb_idle, -- state
'0','0','0','0', -- rbinit,rbaval,rbre,rbwe
(others=>'0'), -- rbdout
'0','0', -- rbnak,rberr
'0','0','0', -- rbtout,rbnak,rberr
'0', -- blkabo
cnt_zero, -- cnt
cnt_zero, -- dcnt
1116,7 → 1118,7
n.state := sl_txdcntl; -- next: send dcnt lsb
 
when sl_txdcntl => -- sl_txdcntl: send dcnt lsb ---------
n.babo := R_BREGS.rbnak or R_BREGS.rberr; -- remember blk abort
n.babo := R_BREGS.blkabo; -- remember blk abort
ido := '0' & R_BREGS.dcnt(f_byte0); -- send dcnt lsb
ival := '1';
if RL_HOLD = '0' then -- wait for accept
1152,10 → 1154,11
n.state := sl_txcntl; -- next: send cnt lsb (holding attn)
when sl_txstat => -- sl_txstat: send status ------------
ido(c_rlink_stat_rbf_stat) := R_BREGS.stat;
ido(c_rlink_stat_rbf_attn) := has_attn;
ido(c_rlink_stat_rbf_rbnak) := R_BREGS.rbnak;
ido(c_rlink_stat_rbf_rberr) := R_BREGS.rberr;
ido(c_rlink_stat_rbf_stat) := R_BREGS.stat;
ido(c_rlink_stat_rbf_attn) := has_attn;
ido(c_rlink_stat_rbf_rbtout) := R_BREGS.rbtout;
ido(c_rlink_stat_rbf_rbnak) := R_BREGS.rbnak;
ido(c_rlink_stat_rbf_rberr) := R_BREGS.rberr;
ival := '1';
if RL_HOLD ='0' then -- wait for accept
irtwea := '1';
1343,8 → 1346,9
when sb_idle => -- sb_idle: wait for cmd ------------
if L2B_GO = '1' then -- if cmd seen
n.stat := RB_STAT; -- always latch external status bits
n.rbnak := '0';
n.rberr := '0';
n.rbtout := '0';
n.rbnak := '0';
n.rberr := '0';
n.blkabo := '0';
n.dathpend := '0';
dcnt_clear := '1';
1379,13 → 1383,13
n.rbaval := '1'; -- extend aval
bto_go := '1'; -- activate rbus timeout counter
if RB_SRES_TOT.err = '1' then -- latch rbus error flag
n.rberr := '1';
n.rberr := '1';
n.blkabo := '1';
end if;
n.rbdout := RB_SRES_TOT.dout; -- latch data (follow till valid)
if RB_SRES_TOT.busy='0' or bto_end='1' then -- wait non-busy or timeout
if RB_SRES_TOT.busy='1' and bto_end='1' then -- if timeout and busy
n.rbnak := '1'; -- set rbus nak flag
n.rbtout := '1'; -- set rbus timeout flag
n.blkabo := '1';
elsif RB_SRES_TOT.ack = '0' then -- if non-busy and no ack
n.rbnak := '1'; -- set rbus nak flag
1458,12 → 1462,12
n.rbaval := '1'; -- extend aval
bto_go := '1'; -- activate rbus timeout counter
if RB_SRES_TOT.err = '1' then -- latch rbus error flag
n.rberr := '1';
n.rberr := '1';
n.blkabo := '1';
end if;
if RB_SRES_TOT.busy='0' or bto_end='1' then -- wait non-busy or timeout
if RB_SRES_TOT.busy='1' and bto_end='1' then -- if timeout and busy
n.rbnak := '1'; -- set rbus nak flag
n.rbtout := '1'; -- set rbus timeout flag
n.blkabo := '1';
elsif RB_SRES_TOT.ack='0' then -- if non-busy and no ack
n.rbnak := '1'; -- set rbus nak flag
/trunk/rtl/vlib/rbus/rbd_rbmon.vhd
1,4 → 1,4
-- $Id: rbd_rbmon.vhd 593 2014-09-14 22:21:33Z mueller $
-- $Id: rbd_rbmon.vhd 620 2014-12-25 10:48:35Z mueller $
--
-- Copyright 2010-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
--
24,12 → 24,15
--
-- Synthesized (xst):
-- Date Rev ise Target flop lutl lutm slic t peri
-- 2014-12-22 619 14.7 131013 xc6slx16-2 114 209 - 72 s 5.6
-- 2014-12-21 593 14.7 131013 xc6slx16-2 99 207 - 77 s 7.0
-- 2010-12-27 349 12.1 M53d xc3s1000-4 95 228 - 154 s 10.4
--
-- Revision History:
-- Date Rev Version Comment
-- 2014-12-22 619 5.0 reorganized, supports now 16 bit addresses
-- 2014-09-13 593 4.1 change default address -> ffe8
-- 2014-08-15 583 4.0 rb_mreq addr now 16 bit
-- 2014-08-15 583 4.0 rb_mreq addr now 16 bit (but only 8 bit recorded)
-- 2011-11-19 427 1.0.3 now numeric_std clean
-- 2011-03-27 374 1.0.2 rename ncyc -> nbusy because it counts busy cycles
-- 2010-12-31 352 1.0.1 simplify irb_ack logic
36,31 → 39,34
-- 2010-12-27 349 1.0 Initial version
------------------------------------------------------------------------------
--
-- Address Bits Name r/w/f Function
-- bbbbbb00 cntl r/w/f Control register
-- 00 go r/w/f writing 1 clears add
-- bbbbbb01 alim r/w/- Address limit register
-- 15:08 hilim r/w/- upper address limit (def: ff)
-- 07:00 lolim r/w/- lower address limit (def: 00)
-- bbbbbb10 addr r/w/- Address register
-- 15 wrap r/0/- line address wrapped (cleared on write)
-- *:02 laddr r/w/- line address
-- 01:00 waddr r/w/- word address
-- bbbbbb11 data r/w/- Data register
-- Addr Bits Name r/w/f Function
-- 000 cntl r/w/f Control register
-- 02 wena r/w/- wrap enable
-- 01 stop r/w/f writing 1 stops moni
-- 00 start r/w/f writing 1 starts moni and clears addr
-- 001 stat r/w/- Status register
-- 00 wrap r/-/- line address wrapped (cleared on go)
-- 010 hilim r/w/- upper address limit (def: 0xfffb)
-- 011 lolim r/w/- lower address limit (def: 0x0000)
-- 100 addr r/w/- Address register
-- *:02 laddr r/w/- line address
-- 01:00 waddr r/w/- word address
-- 101 data r/w/- Data register
--
-- data format:
-- word 3 15 : ack
-- 14 : busy
-- 13 : err
-- 12 : nak
-- 11 : tout
-- 09 : init
-- 08 : we
-- 07:00 : addr
-- word 2 data
-- word 1 15:00 : delay to prev (lsb's)
-- word 0 15:12 : delay to prev (msb's)
-- 11:00 : number of busy cycles
-- word 3 15 : burst (2nd re/we in a aval sequence)
-- 14 : tout (busy in last re-we cycle)
-- 13 : nak (no ack in last non-busy cycle)
-- 12 : ack (ack seen)
-- 11 : busy (busy seen)
-- 10 : err (err seen)
-- 09 : we (write cycle)
-- 08 : init (init cycle)
-- 07:00 : delay to prev (msb's)
-- word 2 15:10 : delay to prev (lsb's)
-- 09:00 : number of busy cycles
-- word 1 : data
-- word 0 : addr
--
 
 
88,39 → 94,44
 
architecture syn of rbd_rbmon is
 
constant rbaddr_cntl : slv2 := "00"; -- cntl address offset
constant rbaddr_alim : slv2 := "01"; -- alim address offset
constant rbaddr_addr : slv2 := "10"; -- addr address offset
constant rbaddr_data : slv2 := "11"; -- data address offset
constant rbaddr_cntl : slv3 := "000"; -- cntl address offset
constant rbaddr_stat : slv3 := "001"; -- stat address offset
constant rbaddr_hilim : slv3 := "010"; -- hilim address offset
constant rbaddr_lolim : slv3 := "011"; -- lolim address offset
constant rbaddr_addr : slv3 := "100"; -- addr address offset
constant rbaddr_data : slv3 := "101"; -- data address offset
 
constant cntl_rbf_go : integer := 0;
subtype alim_rbf_hilim is integer range 15 downto 8;
subtype alim_rbf_lolim is integer range 7 downto 0;
constant addr_rbf_wrap : integer := 15;
constant cntl_rbf_wena : integer := 2;
constant cntl_rbf_stop : integer := 1;
constant cntl_rbf_start : integer := 0;
subtype stat_rbf_bsize is integer range 15 downto 13;
constant stat_rbf_wrap : integer := 0;
subtype addr_rbf_laddr is integer range 2+AWIDTH-1 downto 2;
subtype addr_rbf_waddr is integer range 1 downto 0;
 
constant dat3_rbf_ack : integer := 15;
constant dat3_rbf_busy : integer := 14;
constant dat3_rbf_err : integer := 13;
constant dat3_rbf_nak : integer := 12;
constant dat3_rbf_tout : integer := 11;
constant dat3_rbf_init : integer := 9;
constant dat3_rbf_we : integer := 8;
subtype dat3_rbf_addr is integer range 7 downto 0;
subtype dat0_rbf_ndlymsb is integer range 15 downto 12;
subtype dat0_rbf_nbusy is integer range 11 downto 0;
constant dat3_rbf_burst : integer := 15;
constant dat3_rbf_tout : integer := 14;
constant dat3_rbf_nak : integer := 13;
constant dat3_rbf_ack : integer := 12;
constant dat3_rbf_busy : integer := 11;
constant dat3_rbf_err : integer := 10;
constant dat3_rbf_we : integer := 9;
constant dat3_rbf_init : integer := 8;
subtype dat3_rbf_ndlymsb is integer range 7 downto 0;
subtype dat2_rbf_ndlylsb is integer range 15 downto 10;
subtype dat2_rbf_nbusy is integer range 9 downto 0;
 
type regs_type is record -- state registers
rbsel : slbit; -- rbus select
wena : slbit; -- wena flag (wrap enable)
go : slbit; -- go flag
hilim : slv8; -- upper address limit
lolim : slv8; -- lower address limit
hilim : slv16; -- upper address limit
lolim : slv16; -- lower address limit
wrap : slbit; -- laddr wrap flag
laddr : slv(AWIDTH-1 downto 0); -- line address
waddr : slv2; -- word address
rbtake_1 : slbit; -- rb capture active in last cycle
rbaddr : slv8; -- rbus trace: addr
rbaddr : slv16; -- rbus trace: addr
rbinit : slbit; -- rbus trace: init
rbwe : slbit; -- rbus trace: we
rback : slbit; -- rbus trace: ack seen
128,9 → 139,10
rberr : slbit; -- rbus trace: err seen
rbnak : slbit; -- rbus trace: nak detected
rbtout : slbit; -- rbus trace: tout detected
rbburst : slbit; -- rbus trace: burst detected
rbdata : slv16; -- rbus trace: data
rbnbusy : slv12; -- rbus number of busy cycles
rbndly : slv20; -- rbus delay to prev. access
rbnbusy : slv10; -- rbus number of busy cycles
rbndly : slv14; -- rbus delay to prev. access
end record regs_type;
 
constant laddrzero : slv(AWIDTH-1 downto 0) := (others=>'0');
138,9 → 150,9
constant regs_init : regs_type := (
'0', -- rbsel
'0', -- go (default is off)
(others=>'1'), -- hilim (def: ff)
(others=>'0'), -- lolim (def: 00)
'0','0', -- wena,go
x"fffb", -- hilim (def: fffb)
x"0000", -- lolim (def: 0000)
'0', -- wrap
laddrzero, -- laddr
"00", -- waddr
147,14 → 159,14
'0', -- rbtake_1
(others=>'0'), -- rbaddr
'0','0','0','0','0', -- rbinit,rbwe,rback,rbbusy,rberr
'0','0', -- rbnak,rbtout
'0','0','0', -- rbnak,rbtout,rbburst
(others=>'0'), -- rbdata
(others=>'0'), -- rbnbusy
(others=>'0') -- rbndly
);
 
constant rbnbusylast : slv12 := (others=>'1');
constant rbndlylast : slv20 := (others=>'1');
constant rbnbusylast : slv10 := (others=>'1');
constant rbndlylast : slv14 := (others=>'1');
 
signal R_REGS : regs_type := regs_init;
signal N_REGS : regs_type := regs_init;
168,8 → 180,8
begin
 
assert AWIDTH<=13
report "assert(AWIDTH<=13): max address width supported"
assert AWIDTH>=9 and AWIDTH<=14
report "assert(AWIDTH>=9 and AWIDTH<=14): unsupported AWIDTH"
severity failure;
 
BRAM1 : ram_1swsr_wfirst_gen
217,8 → 229,8
variable irb_err : slbit := '0';
variable irb_dout : slv16 := (others=>'0');
variable irbena : slbit := '0';
variable ibramen : slbit := '0';
variable ibramwe : slbit := '0';
variable ibramen : slbit := '0'; -- BRAM enable
variable ibramwe : slbit := '0'; -- BRAN we
variable rbtake : slbit := '0';
variable laddr_inc : slbit := '0';
variable idat0 : slv16 := (others=>'0');
244,7 → 256,7
-- rbus address decoder
n.rbsel := '0';
if RB_MREQ.aval='1' and RB_MREQ.addr(15 downto 2)=RB_ADDR(15 downto 2) then
if RB_MREQ.aval='1' and RB_MREQ.addr(15 downto 3)=RB_ADDR(15 downto 3) then
n.rbsel := '1';
ibramen := '1';
end if;
252,28 → 264,38
-- rbus transactions
if r.rbsel = '1' then
 
irb_ack := irbena; -- ack all accesses
irb_ack := irbena; -- ack all accesses
 
case RB_MREQ.addr(1 downto 0) is
case RB_MREQ.addr(2 downto 0) is
 
when rbaddr_cntl =>
when rbaddr_cntl => -- cntl ------------------
if RB_MREQ.we = '1' then
n.go := RB_MREQ.din(cntl_rbf_go);
if RB_MREQ.din(cntl_rbf_go)='1' then
n.wena := RB_MREQ.din(cntl_rbf_wena);
if RB_MREQ.din(cntl_rbf_start) = '1' then
n.go := '1';
n.wrap := '0';
n.laddr := laddrzero;
n.waddr := "00";
end if;
if RB_MREQ.din(cntl_rbf_stop) = '1' then
n.go := '0';
end if;
end if;
when rbaddr_alim =>
when rbaddr_stat => null; -- stat ------------------
 
when rbaddr_hilim => -- hilim -----------------
if RB_MREQ.we = '1' then
n.hilim := RB_MREQ.din(alim_rbf_hilim);
n.lolim := RB_MREQ.din(alim_rbf_lolim);
n.hilim := RB_MREQ.din;
end if;
when rbaddr_addr =>
when rbaddr_lolim => -- lolim -----------------
if RB_MREQ.we = '1' then
n.lolim := RB_MREQ.din;
end if;
when rbaddr_addr => -- addr ------------------
if RB_MREQ.we = '1' then
n.go := '0';
n.wrap := '0';
n.laddr := RB_MREQ.din(addr_rbf_laddr);
280,7 → 302,7
n.waddr := RB_MREQ.din(addr_rbf_waddr);
end if;
 
when rbaddr_data =>
when rbaddr_data => -- data ------------------
if r.go='1' or RB_MREQ.we='1' then
irb_err := '1';
end if;
291,23 → 313,29
end if;
end if;
 
when others => null;
when others => -- <> --------------------
irb_err := '1';
end case;
end if;
 
-- rbus output driver
if r.rbsel = '1' then
case RB_MREQ.addr(1 downto 0) is
when rbaddr_cntl =>
irb_dout(cntl_rbf_go) := r.go;
when rbaddr_alim =>
irb_dout(alim_rbf_hilim) := r.hilim;
irb_dout(alim_rbf_lolim) := r.lolim;
when rbaddr_addr =>
irb_dout(addr_rbf_wrap) := r.wrap;
case RB_MREQ.addr(2 downto 0) is
when rbaddr_cntl => -- cntl ------------------
irb_dout(cntl_rbf_wena) := r.wena;
irb_dout(cntl_rbf_start) := r.go;
when rbaddr_stat => -- stat ------------------
irb_dout(stat_rbf_bsize) := slv(to_unsigned(AWIDTH-9,3));
irb_dout(stat_rbf_wrap) := r.wrap;
when rbaddr_hilim => -- hilim -----------------
irb_dout := r.hilim;
when rbaddr_lolim => -- lolim -----------------
irb_dout := r.lolim;
when rbaddr_addr => -- addr ------------------
irb_dout(addr_rbf_laddr) := r.laddr;
irb_dout(addr_rbf_waddr) := r.waddr;
when rbaddr_data =>
when rbaddr_data => -- data ------------------
case r.waddr is
when "11" => irb_dout := BRAM1_DO(31 downto 16);
when "10" => irb_dout := BRAM1_DO(15 downto 0);
325,8 → 353,8
rbtake := '0';
if RB_MREQ.aval='1' and irbena='1' then -- aval and (re or we)
if unsigned(RB_MREQ.addr(7 downto 0))>=unsigned(r.lolim) and -- and in addr window
unsigned(RB_MREQ.addr(7 downto 0))<=unsigned(r.hilim) and
if unsigned(RB_MREQ.addr)>=unsigned(r.lolim) and -- and in addr window
unsigned(RB_MREQ.addr)<=unsigned(r.hilim) and
r.rbsel='0' then -- and not self
rbtake := '1';
end if;
336,7 → 364,7
end if;
 
if rbtake = '1' then -- if capture active
n.rbaddr := RB_MREQ.addr(7 downto 0); -- keep track of some state
n.rbaddr := RB_MREQ.addr; -- keep track of some state
n.rbinit := RB_MREQ.init;
n.rbwe := RB_MREQ.we;
if RB_MREQ.init='1' or RB_MREQ.we='1' then -- for write/init of din
366,6 → 394,7
ibramen := '1';
ibramwe := '1';
laddr_inc := '1';
n.rbburst := '1'; -- assume burst
end if;
if r.rbtake_1 = '1' then -- rbus transaction just ended
n.rbndly := (others=>'0'); -- clear delay counter
376,26 → 405,35
end if;
end if;
 
if RB_MREQ.aval = '0' then -- if aval gone
n.rbburst := '0'; -- clear burst flag
end if;
if laddr_inc = '1' then
n.laddr := slv(unsigned(r.laddr) + 1);
if r.go='1' and r.laddr=laddrlast then
n.wrap := '1';
if r.wena = '1' then
n.wrap := '1';
else
n.go := '0';
end if;
end if;
end if;
idat3 := (others=>'0');
idat3(dat3_rbf_ack) := r.rback;
idat3(dat3_rbf_busy) := r.rbbusy;
idat3(dat3_rbf_err) := r.rberr;
idat3(dat3_rbf_nak) := r.rbnak;
idat3(dat3_rbf_tout) := r.rbtout;
idat3(dat3_rbf_init) := r.rbinit;
idat3(dat3_rbf_we) := r.rbwe;
idat3(dat3_rbf_addr) := r.rbaddr;
idat2 := r.rbdata;
idat1 := r.rbndly(15 downto 0);
idat0(dat0_rbf_ndlymsb) := r.rbndly(19 downto 16);
idat0(dat0_rbf_nbusy) := r.rbnbusy;
idat3(dat3_rbf_burst) := r.rbburst;
idat3(dat3_rbf_tout) := r.rbtout;
idat3(dat3_rbf_nak) := r.rbnak;
idat3(dat3_rbf_ack) := r.rback;
idat3(dat3_rbf_busy) := r.rbbusy;
idat3(dat3_rbf_err) := r.rberr;
idat3(dat3_rbf_we) := r.rbwe;
idat3(dat3_rbf_init) := r.rbinit;
idat3(dat3_rbf_ndlymsb):= r.rbndly(13 downto 6);
idat2(dat2_rbf_ndlylsb):= r.rbndly( 5 downto 0);
idat2(dat2_rbf_nbusy) := r.rbnbusy;
idat1 := r.rbdata;
idat0 := r.rbaddr;
n.rbtake_1 := rbtake;
/trunk/rtl/vlib/rbus/rbdlib.vhd
1,4 → 1,4
-- $Id: rbdlib.vhd 603 2014-11-09 22:50:26Z mueller $
-- $Id: rbdlib.vhd 620 2014-12-25 10:48:35Z mueller $
--
-- Copyright 2010-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
--
43,11 → 43,8
 
package rbdlib is
-- ise 13.1 xst can bug check if generic defaults in a package are defined via
-- 'slv(to_unsigned())'. The conv_ construct prior to numeric_std was ok.
-- As workaround the ibus default addresses are defined here as constant.
constant rbaddr_tester : slv16 := slv(to_unsigned(16#ffe0#,16));
constant rbaddr_rbmon : slv16 := slv(to_unsigned(16#ffe8#,16));
constant rbaddr_rbmon : slv16 := x"ffe8"; -- ffe8/8: 1111 1111 1110 1xxx
constant rbaddr_tester : slv16 := x"ffe0"; -- ffe0/8: 1111 1111 1110 0xxx
 
component rbd_tester is -- rbus dev: rbus tester
-- complete rbus_aif interface
/trunk/doc/w11a_tb_guide.txt
1,4 → 1,4
# $Id: w11a_tb_guide.txt 609 2014-12-07 19:35:25Z mueller $
# $Id: w11a_tb_guide.txt 622 2014-12-28 20:45:26Z mueller $
 
Guide to running w11a test benches
 
53,40 → 53,36
all the rest is handled by the build environment.
An example of a post-synthesis model is given for the w11a core test.
 
- for convenience a wrapper script 'tbrun_tbw' is used to generate the
tbw|tee|egrep pipe. This script also checks with 'make' whether the
test bench is up-to-date or must be (re)-compiled.
 
2. Available unit tests benches -------------------------------------------
 
In the following the available tests are listed with
- the 'make' command to build them
- the pipe setup to run them
- the expected output (the run time measured on a 3 GHz system)
In the following the available tests are listed with their tbrun_tbw which
- will call 'make' to build them
- and create the pipe setup to run them
and the expected output (the run time measured on a 3 GHz system)
 
- serport receiver test
cd $RETROBASE/rtl/vlib/serport/tb
make tb_serport_uart_rx
time tbw tb_serport_uart_rx |\
tee tb_serport_uart_rx_dsim.log | egrep "(FAIL|DONE)"
tbrun_tbw tb_serport_uart_rx
-> 1269955.0 ns 63488: DONE
-> real 0m01.178s user 0m01.172s sys 0m00.020s
 
- serport receiver/transmitter test
make tb_serport_uart_rxtx
time tbw tb_serport_uart_rxtx |\
tee tb_serport_uart_rxtx_dsim.log | egrep "(FAIL|DONE)"
tbrun_tbw tb_serport_uart_rxtx
-> 52335.0 ns 2607: DONE
-> real 0m00.094s user 0m00.092s sys 0m00.008s
 
- serport autobauder test
make tb_serport_autobaud
time tbw tb_serport_autobaud |\
tee tb_serport_autobaud_dsim.log | egrep "(FAIL|DONE)"
tbrun_tbw tb_serport_autobaud
-> 367475.0 ns 18364: DONE
-> real 0m00.610s user 0m00.612s sys 0m00.004s
- 9 bit comma,data to Byte stream converter test
cd $RETROBASE/rtl/vlib/comlib/tb
make tb_cdata2byte
time tbw tb_cdata2byte |\
tee tb_cdata2byte_dsim.log | egrep "(FAIL|DONE)"
tbrun_tbw tb_cdata2byte
-> 7261.0 ns 354: DONE
-> real 0m0.385s user 0m0.041s sys 0m0.006s
 
93,9 → 89,7
- rlink core test
 
cd $RETROBASE/rtl/vlib/rlink/tb
make tb_rlink_direct
time tbw tb_rlink_direct |\
tee tb_rlink_direct_dsim.log | egrep "(FAIL|DONE)"
tbrun_tbw tb_rlink_direct
-> 78975.0 ns 3939: DONE
-> real 0m00.508s user 0m00.262s sys 0m00.028s
 
102,14 → 96,11
- rlink core test via serial port interface
 
cd $RETROBASE/rtl/vlib/rlink/tb
make tb_rlink_sp1c
time tbw tb_rlink_sp1c tb_rlink_sp1c_stim.dat |\
tee tb_rlink_sp1c_stim2_dsim.log | egrep "(FAIL|DONE)"
tbrun_tbw --lsuf stim2_dsim tb_rlink_sp1c tb_rlink_sp1c_stim.dat
-> 27595.0 ns 1370: DONE
-> real 0m0.250s user 0m0.108s sys 0m0.011s
 
time tbw tb_rlink_sp1c tb_rlink_stim.dat |\
tee tb_rlink_sp1c_dsim.log | egrep "(FAIL|DONE)"
tbrun_tbw --lsuf stim1_dsim tb_rlink_sp1c tb_rlink_stim.dat
-> 420295.0 ns 21005: DONE
-> real 0m02.271s user 0m01.360s sys 0m00.040s
 
116,17 → 107,13
- w11a core test (using behavioural model)
 
cd $RETROBASE/rtl/w11a/tb
make tb_pdp11core
time tbw tb_pdp11core |\
tee tb_pdp11core_dsim.log | egrep "(FAIL|DONE)"
tbrun_tbw tb_pdp11core
-> 1220255.0 ns 61073: DONE
-> real 0m10.736s user 0m10.713s sys 0m00.060s
 
- w11a core test (using post-synthesis model)
 
make ghdl_tmp_clean && make tb_pdp11core_ssim
time tbw tb_pdp11core_ssim |\
tee tb_pdp11core_ssim.log | egrep "(FAIL|DONE)"
tbrun_tbw tb_pdp11core_ssim
-> 1220255.0 ns 61073: DONE
-> real 1m09.738s user 1m09.588s sys 0m00.096s
 
133,9 → 120,7
- s3board sram controller test
 
cd $RETROBASE/rtl/bplib/s3board/tb
make tb_s3_sram_memctl
time tbw tb_s3_sram_memctl |\
tee tb_s3_sram_memctl_dsim.log | egrep "(FAIL|DONE)"
tbrun_tbw tb_s3_sram_memctl
-> 5015.0 ns 241: DONE
-> real 0m00.113s user 0m00.068s sys 0m00.016s
 
142,9 → 127,7
- nexys2/nexys3 cram controller test
 
cd $RETROBASE/rtl/bplib/nxcramlib/tb
make tb_nx_cram_memctl_as
time tbw tb_nx_cram_memctl_as |\
tee tb_nx_cram_memctl_as_dsim.log | egrep "(FAIL|DONE)"
tbrun_tbw tb_nx_cram_memctl_as
-> 24272.5 ns 1204: DONE
-> real 0m00.343s user 0m00.248s sys 0m00.100s
 
174,9 → 157,7
- sys_tst_serloop_s3 test bench
 
cd $RETROBASE/rtl/sys_gen/tst_serloop/s3board/tb
make tb_tst_serloop_s3
time tbw tb_tst_serloop_s3 |\
tee tb_tst_serloop_s3_dsim.log | egrep "(FAIL|DONE)"
tbrun_tbw tb_tst_serloop_s3
-> 301353.3 ns 18068: DONE
-> real 0m1.422s user 0m1.372s sys 0m0.024s
 
183,15 → 164,11
- sys_tst_serloop_n2 test bench
 
cd $RETROBASE/rtl/sys_gen/tst_serloop/nexys2/tb
make tb_tst_serloop1_n2
time tbw tb_tst_serloop1_n2 |\
tee tb_tst_serloop1_n2_dsim.log | egrep "(FAIL|DONE)"
tbrun_tbw tb_tst_serloop1_n2
-> 361560.0 ns 18068: DONE
-> real 0m1.341s user 0m1.340s sys 0m0.016s
 
make tb_tst_serloop2_n2
time tbw tb_tst_serloop2_n2 |\
tee tb_tst_serloop2_n2_dsim.log | egrep "(FAIL|DONE)"
tbrun_tbw tb_tst_serloop2_n2
-> 304353.3 ns 18248: DONE
-> real 0m1.933s user 0m1.924s sys 0m0.024s
 
198,9 → 175,7
- sys_tst_serloop_n3 test bench
 
cd $RETROBASE/rtl/sys_gen/tst_serloop/nexys3/tb
make tb_tst_serloop1_n3
time tbw tb_tst_serloop1_n3 |\
tee tb_tst_serloop1_n3_dsim.log | egrep "(FAIL|DONE)"
tbrun_tbw tb_tst_serloop1_n3
-> 361560.0 ns 18068: DONE
-> real 0m1.371s user 0m1.372s sys 0m0.016s
 
212,32 → 187,26
- sys_tst_rlink_s3 test bench
 
cd $RETROBASE/rtl/sys_gen/tst_rlink/s3board/tb
make tb_tst_rlink_s3
time ti_rri --run="tbw tb_tst_rlink_s3" --fifo --logl=3 -- \
"package require tst_rlink" "tst_rlink::setup" "tst_rlink::test_all" |\
tee tb_tst_rlink_s3_dsim.log | egrep "(-[EFW]:|FAIL|PEND|DONE)"
-> 672560.0 ns 33618: DONE
-> user 0m03.355s
tbrun_tbwrri --pack tst_rlink tb_tst_rlink_s3 \
"tst_rlink::setup" "tst_rlink::test_all"
-> 1377680.0 ns 68874: DONE
-> real 0m6.876s user 0m6.790s sys 0m0.060s
 
- sys_tst_rlink_n2 test bench
 
cd $RETROBASE/rtl/sys_gen/tst_rlink/nexys2/tb
make tb_tst_rlink_n2
time ti_rri --run="tbw tb_tst_rlink_n2" --fifo --logl=3 -- \
"package require tst_rlink" "tst_rlink::setup" "tst_rlink::test_all" |\
tee tb_tst_rlink_n2_dsim.log | egrep "(-[EFW]:|FAIL|PEND|DONE)"
-> 674740.0 ns 33726: DONE
-> user 0m03.362s
tbrun_tbwrri --pack tst_rlink tb_tst_rlink_n2 \
"tst_rlink::setup" "tst_rlink::test_all"
-> 1378200.0 ns 68899: DONE
-> real 0m10.320s user 0m10.110s sys 0m0.204s
 
- sys_tst_rlink_n3 test bench
 
cd $RETROBASE/rtl/sys_gen/tst_rlink/nexys3/tb
make tb_tst_rlink_n3
time ti_rri --run="tbw tb_tst_rlink_n3" --fifo --logl=3 -- \
"package require tst_rlink" "tst_rlink::setup" "tst_rlink::test_all" |\
tee tb_tst_rlink_n3_dsim.log | egrep "(-[EFW]:|FAIL|PEND|DONE)"
-> 336390.0 ns 33618: DONE
-> user 0m03.434s
tbrun_tbwrri --pack tst_rlink tb_tst_rlink_n3 \
"tst_rlink::setup" "tst_rlink::test_all"
-> 689210.0 ns 68900: DONE
-> real 0m7.098s user 0m6.874s sys 0m0.191s
 
4c. w11a systems -----------------------------------------------------
 
248,14 → 217,17
backend process and thus scheduling of backend vs. ghdl process
can affect the result.
 
For convenience a wrapper script 'tbrun_tbwrri' is used to generate the
required quite long ti_rri command. Like for 'tbrun_tbw' the script also
checks with 'make' whether the test bench is up-to-date or must be
(re)-compiled.
 
- sys_w11a_s3 test bench
 
cd $RETROBASE/rtl/sys_gen/w11a/s3board/tb
make tb_w11a_s3
time ti_rri --pack=rw11 --run="tbw tb_w11a_s3" --fifo --logl=3 -- \
tbrun_tbwrri --pack rw11 tb_w11a_s3 \
"rw11::setup_cpu" \
"rw11::run_pdpcp ../../../../w11a/tb/tb_pdp11core_stim.dat" |\
tee tb_w11a_s3_stim2_dsim.log | egrep "(-[EFW]:|FAIL|PEND|DONE)"
"rw11::run_pdpcp ../../../../w11a/tb/tb_pdp11core_stim.dat"
-> 9864500.0 ns 493215: DONE
-> real 0m59.728s user 0m58.586s sys 0m0.576s
 
262,24 → 234,20
- sys_w11a_n2 test bench
 
cd $RETROBASE/rtl/sys_gen/w11a/nexys2/tb
make tb_w11a_n2
time ti_rri --pack=rw11 --run="tbw tb_w11a_n2" --fifo --logl=3 -- \
tbrun_tbwrri --pack rw11 --cuff tb_w11a_n2 \
"rw11::setup_cpu" \
"rw11::run_pdpcp ../../../../w11a/tb/tb_pdp11core_stim.dat" |\
tee tb_w11a_n2_stim2_dsim.log | egrep "(-[EFW]:|FAIL|PEND|DONE)"
-> 9880260.0 ns 494002: DONE
-> real 1m10.632s user 1m09.824s sys 0m0.599s
"rw11::run_pdpcp ../../../../w11a/tb/tb_pdp11core_stim.dat"
-> 3809180.0 ns 190448: DONE
-> real 0m55.733s user 0m55.504s sys 0m0.592s
 
- sys_w11a_n3 test bench
 
cd $RETROBASE/rtl/sys_gen/w11a/nexys3/tb
make tb_w11a_n3
time ti_rri --pack=rw11 --run="tbw tb_w11a_n3" --fifo --logl=3 -- \
tbrun_tbwrri --pack rw11 --cuff tb_w11a_n3 \
"rw11::setup_cpu" \
"rw11::run_pdpcp ../../../../w11a/tb/tb_pdp11core_stim.dat" |\
tee tb_w11a_n3_stim2_dsim.log | egrep "(-[EFW]:|FAIL|PEND|DONE)"
-> 6915376.6 ns 497892: DONE
-> real 1m07.862s user 1m07.695s sys 0m0.427s
"rw11::run_pdpcp ../../../../w11a/tb/tb_pdp11core_stim.dat"
-> 279834.9 ns 236133: DONE
-> real 0m59.998s user 0m59.676s sys 0m0.618s
 
A new, modular w11a test bench is under construction. So far it is very
incomplete. This very preliminary version can be executed with
287,10 → 255,8
- sys_w11a_n2 test bench
 
cd $RETROBASE/rtl/sys_gen/w11a/nexys2/tb
make tb_w11a_n2
time ti_rri --pack=rw11 --run="tbw tb_w11a_n2" --fifo --logl=3 -- \
"rw11::setup_cpu" "rw11::tbench @w11a_all.dat" | \
tee w11a_tbench_dsim.log | egrep "(-[EFW]:|FAIL|PASS|DONE)"
-> 7081280.0 ns 354053: DONE
-> real 0m43.742s user 0m44.084s sys 0m0.379s
tbrun_tbwrri --lsuf tbench_dsim --pack rw11 --cuff tb_w11a_n2 \
"rw11::setup_cpu" "rw11::tbench @w11a_all.dat"
-> 2638820.0 ns 131930: DONE
-> real 0m24.890s user 0m25.286s sys 0m0.439s
 
/trunk/doc/README.txt
21,6 → 21,62
 
2. Change Log ----------------------------------------------------------------
 
- trunk (2015-01-04: svn rev 28(oc) 629(wfjm); untagged w11a_V0.63) +++++++++
 
- Summary
- the w11a rbus interface used so far a narrow dynamically adjusted
rbus->ibus window. Replaces with a 4k word window for whole IO page.
- utilize rlink protocol version 4 features in w11a backend
- use attn notifies to dispatch attn handlers
- use larger blocks (7*512 rather 1*512 bytes) for rdma transfers
- use labo and merge csr updates with last block transfer
- this combined reduces the number of round trips by a factor 2 to 3,
and in some cases the throughput accordingly.
 
- Remarks on reference system
- still using tcl 8.5 (even though 8.6 is now default in Ub 14.04)
- don't use doxygen 1.8.8 and 1.8.9, it fails to generate vhdl docs
 
- New features
- new modules
- tools/bin
- ghdl_assert_filter - filter to suppress startup warnings
- tbrun_tbw - wrapper for tbw based test benches
- tbrun_tbwrri - wrapper for ti_rri + tbw based test benches
- tools/src/librw11
- Rw11Rdma - Rdma engine base class
- Rw11RdmaDisk - Rdma engine for disk emulation
 
- Changes
- rtl/vlib/rlink
- rlink_core - use 4th stat bit to signal rbus timeout
- rtl/vlib/rbus
- rbd_rbmon - reorganized, supports now 16 bit addresses
- rtl/w11a
- pdp11_core_rbus - use full size 4k word ibus window
- tools/bin/tbw - add -fifo and -verbose options
- tools/src/librtools
- Rexception - add ctor from RerrMsg
- tools/src/librlink
- RlinkCommandExpect - rblk/wblk done counts now expectable
- RlinkConnect - cleanups and minor enhancements
- RlinkServer - use attn notifies to dispatch handlers
- tools/src/librw11
- Rw11CntlRK11 - re-organize, use now Rw11RdmaDisk
- Rw11Cpu - add ibus address map
- tools/src/librwxxtpp
- RtclRw11CntlRK11 - add get/set for ChunkSize
- RtclRw11Cpu - add amap sub-command for ibus map access
 
- Resolved known issues from V0.62
- the rbus monitor (rbd_rbmon) has been updated to handle 16 bit addresses
 
- Known issues
- (V0.62): rlink v4 error recovery not yet implemented, will crash on error
- (V0.62): command lists aren't split to fit in retransmit buffer size
{both issues not relevant for w11 backend over USB usage because the
backend produces proper command lists and the USB channel is error free}
 
- trunk (2014-12-20: svn rev 27(oc) 614(wfjm); untagged w11a_V0.62) +++++++++
 
- Summary
/trunk/doc/man/man1/tbw.1
1,7 → 1,7
.\" -*- nroff -*-
.\" $Id: tbw.1 550 2014-02-03 08:16:57Z mueller $
.\" $Id: tbw.1 620 2014-12-25 10:48:35Z mueller $
.\"
.\" Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
.\" Copyright 2013-2014 by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
.\"
.\" ------------------------------------------------------------------
.
14,6 → 14,7
.
.SY tbw
.I TBPROG
.RI [ OPTIONS ]
.RI [ FILEDEF ]...
.RI [ GHDL-OPTIONS ]...
.
66,6 → 67,17
defined via the \fItbw.dat\fP file, for details see section FILES.
.
.\" ------------------------------------------------------------------
.SH OPTIONS
The options \fB\-run\fP, \fB\-fifo\fP and \fB\-verbose\fP are processed
by tbw itself. If more than one is given they must be in this order.
.IP \fB\-run\fR
Used for _ISim tb's, runs the tb with a 'run all' command.
.IP \fB\-fifo\fR
Forces usage of rlink_cext fifo, will ignore tbw.dat
.IP \fB\-verbose\fR
show the used tag,value settings before execution
 
.\" ------------------------------------------------------------------
.SH GHDL OPTIONS
All options are passed on to the test bench executable. The list of
available options for a \fBghdl\fP generated executable can be inquired
168,7 → 180,7
 
.SS Test benches controlled with \fBti_rri\fP
In these cases the test bench is started via \fBti_rri\fP using the
\fB\-\-run\fP and \fB\-\-fifo\fP options. Also here Usually a pipe with
\fB\-\-run\fP and \fB\-\-fifo\fP options. Also here usually a pipe with
\fBtee\fP and \fBegrep\fP is used, a typical example is
 
.EX
/trunk/doc/man/man1/ti_w11.1
1,5 → 1,5
.\" -*- nroff -*-
.\" $Id: ti_w11.1 563 2014-06-22 15:49:09Z mueller $
.\" $Id: ti_w11.1 620 2014-12-25 10:48:35Z mueller $
.\"
.\" Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
.\"
60,7 → 60,7
.IP \fB-e "\fR=\fIfile"\fR
load and execute \fIfile\fP. If the file type is '.mac' the file will
be on the fly compiled with \fBasm-11\fP(1), for all other file types
it is assumed that the are in \fBlda\fP(5) format.
it is assumed that they are in \fBlda\fP(5) format.
.
.\" ------------------------------------------------------------------
.SH EXAMPLES
/trunk/doc/man/man1/create_disk.1
1,5 → 1,5
.\" -*- nroff -*-
.\" $Id: create_disk.1 550 2014-02-03 08:16:57Z mueller $
.\" $Id: create_disk.1 622 2014-12-28 20:45:26Z mueller $
.\"
.\" Copyright 2013- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
.\"
52,8 → 52,7
creates a disk with all data bytes set to 0xff.
.IP \fBdead\fP
creates a disk with an alternating 0xdead 0xbeaf pattern. Can be helpful
to diagnose whether an operating system access previously in initialized
parts of a disk.
to diagnose whether an operating system accesses uninitialized parts of a disk.
.IP \fBtest\fP
creates a disk with a unique test pattern in each sector. The whole disk
is initialized with groups of 8 16bit words (in PDP-11 little endian) with
/trunk/Makefile
1,4 → 1,4
# $Id: Makefile 613 2014-12-20 08:47:50Z mueller $
# $Id: Makefile 623 2014-12-29 19:11:40Z mueller $
#
# 'Meta Makefile' for whole retro project
# allows to make all synthesis targets
55,11 → 55,11
SIM_all += rtl/vlib/serport/tb
SIM_all += rtl/w11a/tb
#
.PHONY : all all_sim all_syn
.PHONY : default all all_sim all_syn
.PHONY : clean clean_sim clean_sim_tmp clean_sym clean_sym_tmp
.PHONY : $(SYN_all) $(SIM_all)
#
all :
default :
@echo "No default action defined:"
@echo " for VHDL simulation/synthesis use:"
@echo " make -j `nproc` all_sim"
75,6 → 75,10
@echo " make all_tcl"
@echo " make all_dox"
#
all :
make -j `nproc` all_sim
make -j `nproc` all_syn
make -j `nproc` all_lib
#
clean : clean_sim clean_syn
#

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.