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 |
# |