From dde49d52e437b3df873462c5d1284cbc8de95b88 Mon Sep 17 00:00:00 2001 From: "Walter F.J. Mueller" Date: Sun, 4 Jan 2015 19:18:35 +0000 Subject: [PATCH] - 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. --- Makefile | 10 +- doc/README.txt | 56 +++ doc/man/man1/create_disk.1 | 5 +- doc/man/man1/tbw.1 | 18 +- doc/man/man1/ti_w11.1 | 4 +- doc/w11a_tb_guide.txt | 144 +++---- rtl/sys_gen/tst_rlink/rbd_tst_rlink.vhd | 24 +- .../atlys/sys_tst_rlink_cuff_atlys.vhd | 5 +- .../nexys2/sys_tst_rlink_cuff_n2.vhd | 5 +- .../nexys3/sys_tst_rlink_cuff_n3.vhd | 5 +- rtl/sys_gen/w11a/nexys2/sys_conf.vhd | 9 +- rtl/sys_gen/w11a/nexys2/sys_w11a_n2.vbom | 4 +- rtl/sys_gen/w11a/nexys2/sys_w11a_n2.vhd | 47 ++- rtl/sys_gen/w11a/nexys2/tb/sys_conf_sim.vhd | 9 +- rtl/sys_gen/w11a/nexys3/sys_conf.vhd | 14 +- rtl/sys_gen/w11a/nexys3/sys_w11a_n3.vbom | 4 +- rtl/sys_gen/w11a/nexys3/sys_w11a_n3.vhd | 47 ++- rtl/sys_gen/w11a/nexys3/tb/sys_conf_sim.vhd | 11 +- rtl/sys_gen/w11a/s3board/sys_conf.vhd | 8 +- rtl/sys_gen/w11a/s3board/sys_w11a_s3.vbom | 4 +- rtl/sys_gen/w11a/s3board/sys_w11a_s3.vhd | 37 +- rtl/sys_gen/w11a/s3board/tb/sys_conf_sim.vhd | 10 +- rtl/vlib/rbus/rbd_rbmon.vhd | 228 ++++++----- rtl/vlib/rbus/rbdlib.vhd | 9 +- rtl/vlib/rlink/rlink_core.vhd | 36 +- rtl/vlib/rlink/rlinklib.vhd | 6 +- rtl/vlib/rlink/tb/tb_rlink_stim.dat | 19 +- rtl/w11a/pdp11.vhd | 24 +- rtl/w11a/pdp11_core_rbus.vhd | 129 +++--- rtl/w11a/tb/Makefile | 11 +- rtl/w11a/tb/tb_pdp11core.vhd | 50 +-- rtl/w11a/tb/tb_pdp11core_stim.dat | 43 +- tools/bin/ghdl_assert_filter | 29 ++ tools/bin/tbrun_tbw | 97 +++++ tools/bin/tbrun_tbwrri | 116 ++++++ tools/bin/tbw | 60 ++- tools/bin/ti_w11 | 11 +- tools/bin/ticonv_pdpcp | 18 +- tools/dox/w11_cpp.Doxyfile | 2 +- tools/dox/w11_tcl.Doxyfile | 2 +- tools/dox/w11_vhd_all.Doxyfile | 2 +- tools/oskit/211bsd_rk/211bsd_rk_boot.tcl | 6 +- .../oskit/rsx11m-31_rk/rsx11m-31_rk_boot.tcl | 6 +- .../oskit/rsx11m-40_rk/rsx11m-40_rk_boot.tcl | 6 +- tools/oskit/rt11-40_rk/rt11-40_rk_boot.tcl | 4 +- tools/oskit/unix-v5_rk/uv5_rk_boot.tcl | 4 +- tools/src/librlink/RlinkCommand.cpp | 41 +- tools/src/librlink/RlinkCommand.hpp | 20 +- tools/src/librlink/RlinkCommandExpect.hpp | 11 +- tools/src/librlink/RlinkCommandExpect.ipp | 41 +- tools/src/librlink/RlinkConnect.cpp | 56 ++- tools/src/librlink/RlinkConnect.hpp | 30 +- tools/src/librlink/RlinkConnect.ipp | 35 +- tools/src/librlink/RlinkPacketBufRcv.cpp | 7 +- tools/src/librlink/RlinkPacketBufRcv.hpp | 8 +- tools/src/librlink/RlinkPacketBufSnd.cpp | 11 +- tools/src/librlink/RlinkPacketBufSnd.hpp | 8 +- tools/src/librlink/RlinkServer.cpp | 120 ++++-- tools/src/librlink/RlinkServer.hpp | 28 +- tools/src/librlink/RlinkServer.ipp | 25 +- tools/src/librlinktpp/RtclAttnShuttle.cpp | 10 +- tools/src/librlinktpp/RtclAttnShuttle.hpp | 9 +- tools/src/librlinktpp/RtclRlinkConnect.cpp | 74 +++- tools/src/librlinktpp/RtclRlinkConnect.hpp | 12 +- tools/src/librtools/Rexception.cpp | 15 +- tools/src/librtools/Rexception.hpp | 11 +- tools/src/librw11/Makefile | 3 +- tools/src/librw11/Rw11.cpp | 11 +- tools/src/librw11/Rw11.hpp | 9 +- tools/src/librw11/Rw11Cntl.cpp | 34 +- tools/src/librw11/Rw11Cntl.hpp | 10 +- tools/src/librw11/Rw11CntlDL11.cpp | 31 +- tools/src/librw11/Rw11CntlDL11.hpp | 9 +- tools/src/librw11/Rw11CntlLP11.cpp | 28 +- tools/src/librw11/Rw11CntlLP11.hpp | 9 +- tools/src/librw11/Rw11CntlPC11.cpp | 30 +- tools/src/librw11/Rw11CntlPC11.hpp | 9 +- tools/src/librw11/Rw11CntlRK11.cpp | 377 ++++++++---------- tools/src/librw11/Rw11CntlRK11.hpp | 51 ++- tools/src/librw11/Rw11CntlRK11.ipp | 55 +++ tools/src/librw11/Rw11Cpu.cpp | 145 +++++-- tools/src/librw11/Rw11Cpu.hpp | 35 +- tools/src/librw11/Rw11Cpu.ipp | 64 ++- tools/src/librw11/Rw11CpuW11a.cpp | 10 +- tools/src/librw11/Rw11CpuW11a.hpp | 9 +- tools/src/librw11/Rw11Rdma.cpp | 236 +++++++++++ tools/src/librw11/Rw11Rdma.hpp | 117 ++++++ tools/src/librw11/Rw11Rdma.ipp | 100 +++++ tools/src/librw11/Rw11RdmaDisk.cpp | 208 ++++++++++ tools/src/librw11/Rw11RdmaDisk.hpp | 87 ++++ tools/src/librw11/Rw11RdmaDisk.ipp | 29 ++ tools/src/librwxxtpp/RtclRw11.cpp | 9 +- tools/src/librwxxtpp/RtclRw11Cntl.hpp | 9 +- tools/src/librwxxtpp/RtclRw11CntlRK11.cpp | 25 +- tools/src/librwxxtpp/RtclRw11CntlRK11.hpp | 10 +- tools/src/librwxxtpp/RtclRw11Cpu.cpp | 239 +++++++++-- tools/src/librwxxtpp/RtclRw11Cpu.hpp | 9 +- tools/tbench/test_cp_ibrbasics.tcl | 78 +++- tools/tbench/test_cp_membasics.tcl | 4 +- tools/tbench/test_cp_psw.tcl | 15 +- tools/tcl/rbbram/perf.tcl | 45 ++- tools/tcl/rbemon/util.tcl | 4 +- tools/tcl/rbmoni/test_rbtest.tcl | 143 ++++--- tools/tcl/rbmoni/test_regs.tcl | 54 +-- tools/tcl/rbmoni/util.tcl | 166 +++++--- tools/tcl/rbs3hio/util.tcl | 4 +- tools/tcl/rbtest/test_data.tcl | 7 +- tools/tcl/rbtest/util.tcl | 19 +- tools/tcl/rlink/util.tcl | 5 +- tools/tcl/rutil/util.tcl | 6 +- tools/tcl/rw11/cpucons.tcl | 7 +- tools/tcl/rw11/defs.tcl | 3 +- tools/tcl/tst_rlink/perf.tcl | 6 +- tools/tcl/tst_rlink/test_all.tcl | 6 +- 114 files changed, 3305 insertions(+), 1244 deletions(-) create mode 100755 tools/bin/ghdl_assert_filter create mode 100755 tools/bin/tbrun_tbw create mode 100755 tools/bin/tbrun_tbwrri create mode 100644 tools/src/librw11/Rw11CntlRK11.ipp create mode 100644 tools/src/librw11/Rw11Rdma.cpp create mode 100644 tools/src/librw11/Rw11Rdma.hpp create mode 100644 tools/src/librw11/Rw11Rdma.ipp create mode 100644 tools/src/librw11/Rw11RdmaDisk.cpp create mode 100644 tools/src/librw11/Rw11RdmaDisk.hpp create mode 100644 tools/src/librw11/Rw11RdmaDisk.ipp diff --git a/Makefile b/Makefile index fc6ab886..419a0444 100644 --- a/Makefile +++ b/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/rlink/tb 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 @@ all : @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 # diff --git a/doc/README.txt b/doc/README.txt index 53f022fe..c0e6f523 100644 --- a/doc/README.txt +++ b/doc/README.txt @@ -21,6 +21,62 @@ Release notes for w11a 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 diff --git a/doc/man/man1/create_disk.1 b/doc/man/man1/create_disk.1 index 94d473bd..0a8c1d8d 100644 --- a/doc/man/man1/create_disk.1 +++ b/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 .\" @@ -52,8 +52,7 @@ creates a disk with all sectors zero'ed. This is the default when no 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 diff --git a/doc/man/man1/tbw.1 b/doc/man/man1/tbw.1 index 0852d01d..1bb6c331 100644 --- a/doc/man/man1/tbw.1 +++ b/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 +.\" Copyright 2013-2014 by Walter F.J. Mueller .\" .\" ------------------------------------------------------------------ . @@ -14,6 +14,7 @@ tbw \- wrapper script to start ghdl based VHDL test benches . .SY tbw .I TBPROG +.RI [ OPTIONS ] .RI [ FILEDEF ]... .RI [ GHDL-OPTIONS ]... . @@ -65,6 +66,17 @@ In this case the communication between test bench and the controlling bench might open in addition a configuration file. This setup is also 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 @@ -168,7 +180,7 @@ produce a single \fIDONE\fP line .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 diff --git a/doc/man/man1/ti_w11.1 b/doc/man/man1/ti_w11.1 index 1da3e12e..588998dc 100644 --- a/doc/man/man1/ti_w11.1 +++ b/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 .\" @@ -60,7 +60,7 @@ start \fItb_w11a_n3\fP simulation (w11a on Nexys3 board) .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 diff --git a/doc/w11a_tb_guide.txt b/doc/w11a_tb_guide.txt index 1b5c2ed4..b4a4ede5 100644 --- a/doc/w11a_tb_guide.txt +++ b/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,98 +53,81 @@ Guide to running w11a test benches 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 - 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 - 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 - 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 - 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 - 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,33 +157,25 @@ Guide to running w11a test benches - 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 - 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 - 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 @@ Guide to running w11a test benches - 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,38 +217,37 @@ Guide to running w11a test benches 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 - 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 @@ Guide to running w11a test benches - 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 diff --git a/rtl/sys_gen/tst_rlink/rbd_tst_rlink.vhd b/rtl/sys_gen/tst_rlink/rbd_tst_rlink.vhd index 032ff743..6456821b 100644 --- a/rtl/sys_gen/tst_rlink/rbd_tst_rlink.vhd +++ b/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 -- @@ -59,8 +59,8 @@ entity rbd_tst_rlink is -- rbus device for tst_rlink 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 @@ architecture syn of rbd_tst_rlink is 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 @@ begin MON : rbd_rbmon generic map ( - RB_ADDR => rbaddr_mon, + RB_ADDR => rbaddr_rbmon, AWIDTH => 9) port map ( CLK => CLK, @@ -128,7 +128,7 @@ begin EMON : rbd_eyemon generic map ( - RB_ADDR => rbaddr_emon, + RB_ADDR => rbaddr_eyemon, RDIV => slv(to_unsigned(0,8))) port map ( CLK => CLK, diff --git a/rtl/sys_gen/tst_rlink_cuff/atlys/sys_tst_rlink_cuff_atlys.vhd b/rtl/sys_gen/tst_rlink_cuff/atlys/sys_tst_rlink_cuff_atlys.vhd index 810a2965..d11d1ec4 100644 --- a/rtl/sys_gen/tst_rlink_cuff/atlys/sys_tst_rlink_cuff_atlys.vhd +++ b/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 -- @@ -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 @@ architecture syn of sys_tst_rlink_cuff_atlys is 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 diff --git a/rtl/sys_gen/tst_rlink_cuff/nexys2/sys_tst_rlink_cuff_n2.vhd b/rtl/sys_gen/tst_rlink_cuff/nexys2/sys_tst_rlink_cuff_n2.vhd index 041a780b..83caff15 100644 --- a/rtl/sys_gen/tst_rlink_cuff/nexys2/sys_tst_rlink_cuff_n2.vhd +++ b/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 -- @@ -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 @@ architecture syn of sys_tst_rlink_cuff_n2 is 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 diff --git a/rtl/sys_gen/tst_rlink_cuff/nexys3/sys_tst_rlink_cuff_n3.vhd b/rtl/sys_gen/tst_rlink_cuff/nexys3/sys_tst_rlink_cuff_n3.vhd index 9e24c740..43c6b134 100644 --- a/rtl/sys_gen/tst_rlink_cuff/nexys3/sys_tst_rlink_cuff_n3.vhd +++ b/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 -- @@ -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 @@ architecture syn of sys_tst_rlink_cuff_n3 is 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 diff --git a/rtl/sys_gen/w11a/nexys2/sys_conf.vhd b/rtl/sys_gen/w11a/nexys2/sys_conf.vhd index ce71ca8d..ab4c7f08 100644 --- a/rtl/sys_gen/w11a/nexys2/sys_conf.vhd +++ b/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 +-- Copyright 2010-2014 by Walter F.J. Mueller -- -- 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 @@ package sys_conf is 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; diff --git a/rtl/sys_gen/w11a/nexys2/sys_w11a_n2.vbom b/rtl/sys_gen/w11a/nexys2/sys_w11a_n2.vbom index 799b5c93..ff655560 100644 --- a/rtl/sys_gen/w11a/nexys2/sys_w11a_n2.vbom +++ b/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 @@ sys_conf = sys_conf.vhd ../../../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 diff --git a/rtl/sys_gen/w11a/nexys2/sys_w11a_n2.vhd b/rtl/sys_gen/w11a/nexys2/sys_w11a_n2.vhd index be825c7a..9493751b 100644 --- a/rtl/sys_gen/w11a/nexys2/sys_w11a_n2.vhd +++ b/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 -- @@ -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.xlib.all; 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 @@ architecture syn of sys_w11a_n2 is 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 @@ architecture syn of sys_w11a_n2 is 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 @@ begin 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, diff --git a/rtl/sys_gen/w11a/nexys2/tb/sys_conf_sim.vhd b/rtl/sys_gen/w11a/nexys2/tb/sys_conf_sim.vhd index 1bb37c75..c02a0d40 100644 --- a/rtl/sys_gen/w11a/nexys2/tb/sys_conf_sim.vhd +++ b/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 +-- Copyright 2010-2014 by Walter F.J. Mueller -- -- 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 @@ package sys_conf is 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; diff --git a/rtl/sys_gen/w11a/nexys3/sys_conf.vhd b/rtl/sys_gen/w11a/nexys3/sys_conf.vhd index 5e83def8..b2ef5990 100644 --- a/rtl/sys_gen/w11a/nexys3/sys_conf.vhd +++ b/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 +-- Copyright 2011-2014 by Walter F.J. Mueller -- -- 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 @@ use work.slvtypes.all; 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 @@ package sys_conf is 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; diff --git a/rtl/sys_gen/w11a/nexys3/sys_w11a_n3.vbom b/rtl/sys_gen/w11a/nexys3/sys_w11a_n3.vbom index 7c8375fa..6e7c7e0e 100644 --- a/rtl/sys_gen/w11a/nexys3/sys_w11a_n3.vbom +++ b/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 @@ sys_conf = sys_conf.vhd ../../../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 diff --git a/rtl/sys_gen/w11a/nexys3/sys_w11a_n3.vhd b/rtl/sys_gen/w11a/nexys3/sys_w11a_n3.vhd index 017a64bd..39d7b882 100644 --- a/rtl/sys_gen/w11a/nexys3/sys_w11a_n3.vhd +++ b/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 -- @@ -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.xlib.all; 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 @@ architecture syn of sys_w11a_n3 is 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 @@ architecture syn of sys_w11a_n3 is 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 @@ begin 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, diff --git a/rtl/sys_gen/w11a/nexys3/tb/sys_conf_sim.vhd b/rtl/sys_gen/w11a/nexys3/tb/sys_conf_sim.vhd index 65d43a11..c4b6e702 100644 --- a/rtl/sys_gen/w11a/nexys3/tb/sys_conf_sim.vhd +++ b/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 +-- Copyright 2011-2014 by Walter F.J. Mueller -- -- 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 @@ package sys_conf is 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; diff --git a/rtl/sys_gen/w11a/s3board/sys_conf.vhd b/rtl/sys_gen/w11a/s3board/sys_conf.vhd index fa96e16f..92755830 100644 --- a/rtl/sys_gen/w11a/s3board/sys_conf.vhd +++ b/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 +-- Copyright 2007-2014 by Walter F.J. Mueller -- -- 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 @@ package sys_conf is 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) diff --git a/rtl/sys_gen/w11a/s3board/sys_w11a_s3.vbom b/rtl/sys_gen/w11a/s3board/sys_w11a_s3.vbom index 1edcf187..0ba13bac 100644 --- a/rtl/sys_gen/w11a/s3board/sys_w11a_s3.vbom +++ b/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 @@ sys_conf = sys_conf.vhd ../../../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 diff --git a/rtl/sys_gen/w11a/s3board/sys_w11a_s3.vhd b/rtl/sys_gen/w11a/s3board/sys_w11a_s3.vhd index bdeefdea..acd5c620 100644 --- a/rtl/sys_gen/w11a/s3board/sys_w11a_s3.vhd +++ b/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 -- @@ -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.slvtypes.all; 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 @@ architecture syn of sys_w11a_s3 is 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 @@ architecture syn of sys_w11a_s3 is 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 @@ begin 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, diff --git a/rtl/sys_gen/w11a/s3board/tb/sys_conf_sim.vhd b/rtl/sys_gen/w11a/s3board/tb/sys_conf_sim.vhd index 612f4c96..5f190d83 100644 --- a/rtl/sys_gen/w11a/s3board/tb/sys_conf_sim.vhd +++ b/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 +-- Copyright 2007-2014 by Walter F.J. Mueller -- -- 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 @@ package sys_conf is 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 diff --git a/rtl/vlib/rbus/rbd_rbmon.vhd b/rtl/vlib/rbus/rbd_rbmon.vhd index ae4f8a2b..29e27345 100644 --- a/rtl/vlib/rbus/rbd_rbmon.vhd +++ b/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 -- @@ -24,43 +24,49 @@ -- -- 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 -- 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 @@ end entity rbd_rbmon; 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 @@ architecture syn of rbd_rbmon is 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,23 +150,23 @@ architecture syn of rbd_rbmon is 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 '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 @@ architecture syn of rbd_rbmon is 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 @@ begin 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 @@ begin -- 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,27 +264,37 @@ begin -- 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'; @@ -280,7 +302,7 @@ begin 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 @@ begin 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 @@ begin 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 @@ begin 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 @@ begin 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 @@ begin 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; diff --git a/rtl/vlib/rbus/rbdlib.vhd b/rtl/vlib/rbus/rbdlib.vhd index cdcc489d..12693b84 100644 --- a/rtl/vlib/rbus/rbdlib.vhd +++ b/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 -- @@ -43,11 +43,8 @@ use work.rblib.all; 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 diff --git a/rtl/vlib/rlink/rlink_core.vhd b/rtl/vlib/rlink/rlink_core.vhd index b251f087..bd533448 100644 --- a/rtl/vlib/rlink/rlink_core.vhd +++ b/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 -- @@ -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 @@ entity rlink_core is -- rlink core with 9bit interface 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 @@ architecture syn of rlink_core is 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 @@ architecture syn of rlink_core is 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 @@ begin 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 @@ begin 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 @@ begin 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 @@ begin 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 @@ begin 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 diff --git a/rtl/vlib/rlink/rlinklib.vhd b/rtl/vlib/rlink/rlinklib.vhd index 694b9781..eaeb6567 100644 --- a/rtl/vlib/rlink/rlinklib.vhd +++ b/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 -- @@ -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_cmd_rbf_code is integer range 2 downto 0; -- command code 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 diff --git a/rtl/vlib/rlink/tb/tb_rlink_stim.dat b/rtl/vlib/rlink/tb/tb_rlink_stim.dat index cbc288e7..f815812e 100644 --- a/rtl/vlib/rlink/tb/tb_rlink_stim.dat +++ b/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,36 +317,36 @@ C Test A3.11: check nbusy (use nbusy=3ff -> will cause time out) 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 # 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 # 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 # 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 diff --git a/rtl/w11a/pdp11.vhd b/rtl/w11a/pdp11.vhd index 3e9e371e..64da78b7 100644 --- a/rtl/w11a/pdp11.vhd +++ b/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 -- @@ -562,7 +562,7 @@ package pdp11 is 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 @@ package pdp11 is 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 @@ package pdp11 is 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 @@ end component; 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 diff --git a/rtl/w11a/pdp11_core_rbus.vhd b/rtl/w11a/pdp11_core_rbus.vhd index 40dc37da..994e9a8e 100644 --- a/rtl/w11a/pdp11_core_rbus.vhd +++ b/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 -- @@ -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,37 +56,36 @@ -- -- 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 -- 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 @@ use work.pdp11.all; 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 @@ architecture syn of pdp11_core_rbus is 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 @@ architecture syn of pdp11_core_rbus is '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 @@ architecture syn of pdp11_core_rbus is 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,21 +258,21 @@ architecture syn of pdp11_core_rbus is 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; 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; 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 @@ architecture syn of pdp11_core_rbus is 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,14 +291,14 @@ architecture syn of pdp11_core_rbus is 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; 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,24 +309,19 @@ architecture syn of pdp11_core_rbus is 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; 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 @@ architecture syn of pdp11_core_rbus is 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 @@ architecture syn of pdp11_core_rbus is 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 @@ architecture syn of pdp11_core_rbus is 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; diff --git a/rtl/w11a/tb/Makefile b/rtl/w11a/tb/Makefile index d4f35677..3a1f96a9 100644 --- a/rtl/w11a/tb/Makefile +++ b/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 @@ endif 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 diff --git a/rtl/w11a/tb/tb_pdp11core.vhd b/rtl/w11a/tb/tb_pdp11core.vhd index 4e167fea..d74a3fbc 100644 --- a/rtl/w11a/tb/tb_pdp11core.vhd +++ b/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 +-- Copyright 2006-2014 by Walter F.J. Mueller -- -- 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 @@ begin 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 @@ begin 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 @@ begin 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 @@ begin 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 @@ begin 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 @@ begin 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 @@ begin 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 @@ begin 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'(" ")); diff --git a/rtl/w11a/tb/tb_pdp11core_stim.dat b/rtl/w11a/tb/tb_pdp11core_stim.dat index 438656f5..9774bd99 100644 --- a/rtl/w11a/tb/tb_pdp11core_stim.dat +++ b/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 @@ rps d=000000 # 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,37 +177,36 @@ brm 3 # 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 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 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 diff --git a/tools/bin/ghdl_assert_filter b/tools/bin/ghdl_assert_filter new file mode 100755 index 00000000..f0fba2be --- /dev/null +++ b/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 +# +# 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; +} diff --git a/tools/bin/tbrun_tbw b/tools/bin/tbrun_tbw new file mode 100755 index 00000000..e3768f01 --- /dev/null +++ b/tools/bin/tbrun_tbw @@ -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" diff --git a/tools/bin/tbrun_tbwrri b/tools/bin/tbrun_tbwrri new file mode 100755 index 00000000..eb40eaa0 --- /dev/null +++ b/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 '_.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" + echo " --pack plist add '--pack=<=plist>' option to ti_rri" + echo " --rri opts append 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" diff --git a/tools/bin/tbw b/tools/bin/tbw index 2beadd99..47cfd621 100755 --- a/tools/bin/tbw +++ b/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 +# Copyright 2007-2015 by Walter F.J. Mueller # # 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 @@ use FileHandle; 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 ($tb_code_stem =~ /_ISim$/) { # is it an ISim executable ? } } +if (scalar(@ARGV) && $ARGV[0] eq "-fifo") { + push @file_dsc, {tag=>'rlink_cext_fifo_rx', val=>''}; + push @file_dsc, {tag=>'rlink_cext_fifo_tx', val=>''}; + push @file_dsc, {tag=>'rlink_cext_conf', val=>''}; + $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 @@ if (not -e $tb_code) { 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 (-r $tbwdat_file) { } # -# 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=>""}; } # @@ -175,6 +188,14 @@ if (0) { } } +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 @@ if ($is_isim_run) { # handle for isim 'run all' # ---------------------------------------------------------------------------- sub print_usage { - print "usage: tbw [-run] [filedefs] [opts]\n"; - print " -run for _ISim tb's, runs the tb with a 'run all' command\n"; + print "usage: tbw [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=[] pairs with tag matching one in in\n"; print " tbw.dat. The [] 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"; diff --git a/tools/bin/ti_w11 b/tools/bin/ti_w11 index 4b63a243..f1f74802 100755 --- a/tools/bin/ti_w11 +++ b/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_f = ''; 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; diff --git a/tools/bin/ticonv_pdpcp b/tools/bin/ticonv_pdpcp index 1247967d..d6126610 100755 --- a/tools/bin/ticonv_pdpcp +++ b/tools/bin/ticonv_pdpcp @@ -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 @@ while () { } 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 -------------------- diff --git a/tools/dox/w11_cpp.Doxyfile b/tools/dox/w11_cpp.Doxyfile index 43f161d6..865d65a2 100644 --- a/tools/dox/w11_cpp.Doxyfile +++ b/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 diff --git a/tools/dox/w11_tcl.Doxyfile b/tools/dox/w11_tcl.Doxyfile index c500bb7d..3c5ead96 100644 --- a/tools/dox/w11_tcl.Doxyfile +++ b/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 diff --git a/tools/dox/w11_vhd_all.Doxyfile b/tools/dox/w11_vhd_all.Doxyfile index 55b6c59a..1ab62bf2 100644 --- a/tools/dox/w11_vhd_all.Doxyfile +++ b/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 diff --git a/tools/oskit/211bsd_rk/211bsd_rk_boot.tcl b/tools/oskit/211bsd_rk/211bsd_rk_boot.tcl index 4080b50a..cdef7f24 100644 --- a/tools/oskit/211bsd_rk/211bsd_rk_boot.tcl +++ b/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) # diff --git a/tools/oskit/rsx11m-31_rk/rsx11m-31_rk_boot.tcl b/tools/oskit/rsx11m-31_rk/rsx11m-31_rk_boot.tcl index f67a608d..6ad5873e 100644 --- a/tools/oskit/rsx11m-31_rk/rsx11m-31_rk_boot.tcl +++ b/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) # diff --git a/tools/oskit/rsx11m-40_rk/rsx11m-40_rk_boot.tcl b/tools/oskit/rsx11m-40_rk/rsx11m-40_rk_boot.tcl index ed882056..4a9f1571 100644 --- a/tools/oskit/rsx11m-40_rk/rsx11m-40_rk_boot.tcl +++ b/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) # diff --git a/tools/oskit/rt11-40_rk/rt11-40_rk_boot.tcl b/tools/oskit/rt11-40_rk/rt11-40_rk_boot.tcl index 5344eb7f..1c31d0bb 100644 --- a/tools/oskit/rt11-40_rk/rt11-40_rk_boot.tcl +++ b/tools/oskit/rt11-40_rk/rt11-40_rk_boot.tcl @@ -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) # diff --git a/tools/oskit/unix-v5_rk/uv5_rk_boot.tcl b/tools/oskit/unix-v5_rk/uv5_rk_boot.tcl index 82156d02..dbc5ee35 100644 --- a/tools/oskit/unix-v5_rk/uv5_rk_boot.tcl +++ b/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 diff --git a/tools/src/librlink/RlinkCommand.cpp b/tools/src/librlink/RlinkCommand.cpp index ef0962a2..1ee19a6e 100644 --- a/tools/src/librlink/RlinkCommand.cpp +++ b/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 +// Copyright 2011-2015 by Walter F.J. Mueller // // 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::kFlagErrNak; 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 @@ void RlinkCommand::Print(std::ostream& os, const RlinkContext& cntx, // 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 @@ void RlinkCommand::Print(std::ostream& os, const RlinkContext& cntx, } } + // 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 @@ void RlinkCommand::Print(std::ostream& os, const RlinkContext& cntx, } 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 @@ void RlinkCommand::Print(std::ostream& os, const RlinkContext& cntx, const uint16_t* pdat = BlockPointer(); for (size_t i=0; iBlockCheck(i, pdat[i])) { @@ -373,7 +393,7 @@ void RlinkCommand::Print(std::ostream& os, const RlinkContext& cntx, const vector& emskvec = fpExpect->BlockMask(); for (size_t i=0; iBlockCheck(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 @@ void RlinkCommand::Print(std::ostream& os, const RlinkContext& cntx, size_t size = BlockSize(); size_t ncol = (80-4-5)/(dwidth+2); for (size_t i=0; i // @@ -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 @@ namespace Retro { 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); diff --git a/tools/src/librlink/RlinkCommandExpect.hpp b/tools/src/librlink/RlinkCommandExpect.hpp index 03769c5d..4eb5dd58 100644 --- a/tools/src/librlink/RlinkCommandExpect.hpp +++ b/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 +// Copyright 2011-2014 by Walter F.J. Mueller // // 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 @@ namespace Retro { 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& block); void SetBlock(const std::vector& block, const std::vector& blockmsk); @@ -56,16 +58,19 @@ namespace Retro { uint8_t StatusMask() const; uint16_t DataValue() const; uint16_t DataMask() const; + uint16_t DoneValue() const; const std::vector& BlockValue() const; const std::vector& 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; diff --git a/tools/src/librlink/RlinkCommandExpect.ipp b/tools/src/librlink/RlinkCommandExpect.ipp index d8fb1ed0..4f286459 100644 --- a/tools/src/librlink/RlinkCommandExpect.ipp +++ b/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 +// Copyright 2011-2014 by Walter F.J. Mueller // // 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,13 +13,14 @@ // // 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 // --------------------------------------------------------------------------- /*! \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 @@ inline void RlinkCommandExpect::SetData(uint16_t data, uint16_t datamsk) //------------------------------------------+----------------------------------- //! 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& block) { fBlockVal = block; @@ -102,6 +113,14 @@ inline uint16_t RlinkCommandExpect::DataMask() const //------------------------------------------+----------------------------------- //! FIXME_docs +inline uint16_t RlinkCommandExpect::DoneValue() const +{ + return fDataVal; +} + +//------------------------------------------+----------------------------------- +//! FIXME_docs + inline const std::vector& RlinkCommandExpect::BlockValue() const { return fBlockVal; @@ -134,6 +153,14 @@ inline bool RlinkCommandExpect::DataCheck(uint16_t val) const //------------------------------------------+----------------------------------- //! 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 @@ inline bool RlinkCommandExpect::DataIsChecked() const return fDataMsk != 0xffff; } +//------------------------------------------+----------------------------------- +//! FIXME_docs + +inline bool RlinkCommandExpect::DoneIsChecked() const +{ + return fDataMsk == 0; +} + } // end namespace Retro diff --git a/tools/src/librlink/RlinkConnect.cpp b/tools/src/librlink/RlinkConnect.cpp index de9f3d0c..26555008 100644 --- a/tools/src/librlink/RlinkConnect.cpp +++ b/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 +// Copyright 2011-2015 by Walter F.J. Mueller // // 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_RLMON; 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 @@ RlinkConnect::RlinkConnect() fspLog(new RlogFile(&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 @@ RlinkConnect::RlinkConnect() 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 @@ bool RlinkConnect::Open(const std::string& name, RerrMsg& emsg) 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 @@ bool RlinkConnect::Exec(RlinkCommandList& clist, RlinkContext& cntx, 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 @@ bool RlinkConnect::ExecPart(RlinkCommandList& clist, size_t ibeg, size_t iend, // 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 @@ int RlinkConnect::DecodeResponse(RlinkCommandList& clist, size_t ibeg, // 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 @@ int RlinkConnect::DecodeResponse(RlinkCommandList& clist, size_t ibeg, 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); diff --git a/tools/src/librlink/RlinkConnect.hpp b/tools/src/librlink/RlinkConnect.hpp index f8ff3aaa..54782cbe 100644 --- a/tools/src/librlink/RlinkConnect.hpp +++ b/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 +// Copyright 2011-2015 by Walter F.J. Mueller // // 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 @@ namespace Retro { 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 Rstats& Stats() const; const Rstats& SndStats() const; const Rstats& RcvStats() const; @@ -156,6 +164,12 @@ namespace Retro { 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 @@ namespace Retro { 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 @@ namespace Retro { 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 diff --git a/tools/src/librlink/RlinkConnect.ipp b/tools/src/librlink/RlinkConnect.ipp index cde292a5..c44be331 100644 --- a/tools/src/librlink/RlinkConnect.ipp +++ b/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 +// Copyright 2011-2015 by Walter F.J. Mueller // // 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. */ @@ -86,6 +87,34 @@ inline bool RlinkConnect::Exec(RlinkCommandList& clist) return Exec(clist, fContext); } +//------------------------------------------+----------------------------------- +//! 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 diff --git a/tools/src/librlink/RlinkPacketBufRcv.cpp b/tools/src/librlink/RlinkPacketBufRcv.cpp index cb5ccc96..33ac09c2 100644 --- a/tools/src/librlink/RlinkPacketBufRcv.cpp +++ b/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 // @@ -13,13 +13,14 @@ // // 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) // --------------------------------------------------------------------------- /*! \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 @@ RlinkPacketBufRcv::RlinkPacketBufRcv() 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 @@ void RlinkPacketBufRcv::ProcessDataFill() case kEcEop: // EOP seen SetFlagBit(kFlagEopSeen); // -> set eop and return fRcvState = kRcvDone; + fStats.Inc(kStatNRxPktByt, double(PktSize())); return; case kEcNak: // NAK seen diff --git a/tools/src/librlink/RlinkPacketBufRcv.hpp b/tools/src/librlink/RlinkPacketBufRcv.hpp index cd03133d..f9fafd65 100644 --- a/tools/src/librlink/RlinkPacketBufRcv.hpp +++ b/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 // @@ -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 @@ namespace Retro { // 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 diff --git a/tools/src/librlink/RlinkPacketBufSnd.cpp b/tools/src/librlink/RlinkPacketBufSnd.cpp index 4a6c0aba..e817f1a8 100644 --- a/tools/src/librlink/RlinkPacketBufSnd.cpp +++ b/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 // @@ -13,13 +13,14 @@ // // 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) // --------------------------------------------------------------------------- /*! \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 @@ RlinkPacketBufSnd::RlinkPacketBufSnd() : fRawBuf() { // Statistic setup + fStats.Define(kStatNTxPktByt, "NTxPktByt", "Tx packet bytes send"); fStats.Define(kStatNTxEsc, "NTxEsc", "Tx data escapes"); } @@ -108,8 +110,9 @@ bool RlinkPacketBufSnd::SndPacket(RlinkPort* port, RerrMsg& emsg) PutRawEsc(kEcEop); // fStats.Inc(kStatNTxEsc , double(nesc)); - return SndRaw(port, emsg); - + bool sndok = SndRaw(port, emsg); + if (sndok) fStats.Inc(kStatNTxPktByt, double(PktSize())); + return sndok; } //------------------------------------------+----------------------------------- diff --git a/tools/src/librlink/RlinkPacketBufSnd.hpp b/tools/src/librlink/RlinkPacketBufSnd.hpp index c2f8c418..024b86fe 100644 --- a/tools/src/librlink/RlinkPacketBufSnd.hpp +++ b/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 // @@ -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 @@ namespace Retro { // statistics counter indices enum stats { - kStatNTxEsc = 0 + kStatNTxPktByt=0, //!< Tx packet bytes send + kStatNTxEsc //!< Tx data escapes }; protected: diff --git a/tools/src/librlink/RlinkServer.cpp b/tools/src/librlink/RlinkServer.cpp index 30a6b480..98e990e9 100644 --- a/tools/src/librlink/RlinkServer.cpp +++ b/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 // @@ -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 @@ RlinkServer::RlinkServer() 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 @@ RlinkServer::RlinkServer() 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 @@ void RlinkServer::AddAttnHandler(const attnhdl_t& attnhdl, uint16_t mask, //------------------------------------------+----------------------------------- //! 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 lock(*fspConn); @@ -267,9 +303,9 @@ void RlinkServer::SignalAttnNotify(uint16_t apat) // 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::StartOrResume(bool resume) 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 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; - - 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)< lock(*fspConn); + + // FIXME_code: return code not used, yet 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; } diff --git a/tools/src/librlink/RlinkServer.hpp b/tools/src/librlink/RlinkServer.hpp index 94e85714..2815b352 100644 --- a/tools/src/librlink/RlinkServer.hpp +++ b/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 // @@ -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 @@ namespace Retro { public: struct AttnArgs { - uint16_t fAttnPatt; - uint16_t fAttnMask; - RlinkCommandList* fpClist; - size_t fOffset; + uint16_t fAttnPatt; // attnhdl_t; - typedef boost::function actnhdl_t; + typedef ReventLoop::pollhdl_t pollhdl_t; + typedef boost::function attnhdl_t; + typedef boost::function actnhdl_t; explicit RlinkServer(); virtual ~RlinkServer(); @@ -81,10 +80,11 @@ namespace Retro { 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 @@ namespace Retro { kStatNEloopPoll, //!< event loop turns (poll) kStatNWakeupEvt, //!< Wakeup events kStatNRlinkEvt, //!< Rlink data events - kStatNAttnRead, //!< Attn read commands + kStatNAttnHdl, // // @@ -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 @@ inline bool RlinkServer::ActnPending() const return !fActnList.empty(); } - //==========================================+=================================== // AttnArgs sub class @@ -123,8 +123,8 @@ inline bool RlinkServer::ActnPending() const inline RlinkServer::AttnArgs::AttnArgs() : fAttnPatt(0), fAttnMask(0), - fpClist(0), - fOffset(0) + fAttnHarvest(0), + fHarvestDone(false) {} //------------------------------------------+----------------------------------- @@ -133,19 +133,8 @@ inline RlinkServer::AttnArgs::AttnArgs() inline RlinkServer::AttnArgs::AttnArgs(uint16_t apatt, uint16_t amask) : fAttnPatt(apatt), fAttnMask(amask), - fpClist(0), - fOffset(0) -{} - -//------------------------------------------+----------------------------------- -//! Constructor - -inline RlinkServer::AttnArgs::AttnArgs(uint16_t apatt, uint16_t amask, - RlinkCommandList* pclist, size_t offset) - : fAttnPatt(apatt), - fAttnMask(amask), - fpClist(pclist), - fOffset(offset) + fAttnHarvest(0), + fHarvestDone(false) {} //==========================================+=================================== diff --git a/tools/src/librlinktpp/RtclAttnShuttle.cpp b/tools/src/librlinktpp/RtclAttnShuttle.cpp index 902c538a..679db534 100644 --- a/tools/src/librlinktpp/RtclAttnShuttle.cpp +++ b/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 // @@ -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 @@ void RtclAttnShuttle::Remove() //------------------------------------------+----------------------------------- //! 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; } diff --git a/tools/src/librlinktpp/RtclAttnShuttle.hpp b/tools/src/librlinktpp/RtclAttnShuttle.hpp index 5fbb6043..4a128d5b 100644 --- a/tools/src/librlinktpp/RtclAttnShuttle.hpp +++ b/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 +// Copyright 2013-2014 by Walter F.J. Mueller // // 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,13 +13,14 @@ // // 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 // --------------------------------------------------------------------------- /*! \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 @@ namespace Retro { 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); diff --git a/tools/src/librlinktpp/RtclRlinkConnect.cpp b/tools/src/librlinktpp/RtclRlinkConnect.cpp index 9e46183b..c4aae9ec 100644 --- a/tools/src/librlinktpp/RtclRlinkConnect.cpp +++ b/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 +// Copyright 2011-2015 by Walter F.J. Mueller // // 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 #include "boost/bind.hpp" +#include "boost/thread/locks.hpp" #include "librtcltools/Rtcl.hpp" #include "librtcltools/RtclOPtr.hpp" @@ -67,7 +70,8 @@ namespace Retro { RtclRlinkConnect::RtclRlinkConnect(Tcl_Interp* interp, const char* name) : RtclProxyOwned("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 @@ RtclRlinkConnect::RtclRlinkConnect(Tcl_Interp* interp, const char* name) 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 ("sysid", + boost::bind(&RlinkConnect::SysId, pobj)); + fGets.Add ("rbufsize", + boost::bind(&RlinkConnect::RbufSize, pobj)); + fGets.Add ("bsizemax", + boost::bind(&RlinkConnect::BlockSizeMax, pobj)); + fGets.Add ("bsizeprudent", + boost::bind(&RlinkConnect::BlockSizePrudent, pobj)); } //------------------------------------------+----------------------------------- @@ -132,8 +147,8 @@ int RtclRlinkConnect::M_close(RtclArgs& args) 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,30 +169,30 @@ int RtclRlinkConnect::M_exec(RtclArgs& args) 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); } 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); } 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); } else if (opt == "-wblk") { // -wblk addr block ?varStat ------ vector 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 @@ int RtclRlinkConnect::M_exec(RtclArgs& args) } 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 @@ int RtclRlinkConnect::M_exec(RtclArgs& args) 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 @@ int RtclRlinkConnect::M_exec(RtclArgs& args) 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 @@ int RtclRlinkConnect::M_config(RtclArgs& args) //------------------------------------------+----------------------------------- //! FIXME_docs +int RtclRlinkConnect::M_get(RtclArgs& args) +{ + // synchronize with server thread (really needed ??) + boost::lock_guard lock(Obj()); + return fGets.M_get(args); +} + +//------------------------------------------+----------------------------------- +//! FIXME_docs + int RtclRlinkConnect::M_default(RtclArgs& args) { if (!args.AllDone()) return kERR; @@ -732,8 +773,7 @@ int RtclRlinkConnect::M_default(RtclArgs& args) //------------------------------------------+----------------------------------- //! 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 @@ bool RtclRlinkConnect::ClistNonEmpty(RtclArgs& args, 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; } diff --git a/tools/src/librlinktpp/RtclRlinkConnect.hpp b/tools/src/librlinktpp/RtclRlinkConnect.hpp index 1cb031f7..21eede42 100644 --- a/tools/src/librlinktpp/RtclRlinkConnect.hpp +++ b/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 +// Copyright 2011-2015 by Walter F.J. Mueller // // 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 @@ namespace Retro { 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& varname); bool ConfigBase(RtclArgs& args, uint32_t& base); @@ -69,6 +72,7 @@ namespace Retro { protected: RtclOPtr fCmdnameObj[8]; + RtclGetList fGets; }; } // end namespace Retro diff --git a/tools/src/librtools/Rexception.cpp b/tools/src/librtools/Rexception.cpp index 1c584698..3350c824 100644 --- a/tools/src/librtools/Rexception.cpp +++ b/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 +// Copyright 2013-2014 by Walter F.J. Mueller // // 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. */ @@ -63,6 +64,14 @@ Rexception::Rexception(const std::string& meth, const std::string& text, : fErrmsg(meth,text,errnum) {} +//------------------------------------------+----------------------------------- +//! FIXME_docs + +Rexception::Rexception(const std::string& meth, const std::string& text, + const RerrMsg& errmsg) + : fErrmsg(meth,text+errmsg.Message()) +{} + //------------------------------------------+----------------------------------- //! Destructor diff --git a/tools/src/librtools/Rexception.hpp b/tools/src/librtools/Rexception.hpp index 80159bc1..31937d8b 100644 --- a/tools/src/librtools/Rexception.hpp +++ b/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 +// Copyright 2013-2014 by Walter F.J. Mueller // // 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,14 +13,15 @@ // // 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 // --------------------------------------------------------------------------- /*! \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 @@ namespace Retro { 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(); diff --git a/tools/src/librw11/Makefile b/tools/src/librw11/Makefile index 2686257a..5b30a6b3 100644 --- a/tools/src/librw11/Makefile +++ b/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 += Rw11Virt.o 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) # diff --git a/tools/src/librw11/Rw11.cpp b/tools/src/librw11/Rw11.cpp index 495e6032..4a0efb28 100644 --- a/tools/src/librw11/Rw11.cpp +++ b/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 +// Copyright 2013-2014 by Walter F.J. Mueller // // 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,13 +13,14 @@ // // 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 // --------------------------------------------------------------------------- /*! \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 @@ void Rw11::Dump(std::ostream& os, int ind, const char* text) const //------------------------------------------+----------------------------------- //! FIXME_docs -int Rw11::AttnHandler(const RlinkServer::AttnArgs& args) +int Rw11::AttnHandler(RlinkServer::AttnArgs& args) { + Server().GetAttnInfo(args); + for (size_t i=0; iW11AttnHandler(); return 0; } diff --git a/tools/src/librw11/Rw11.hpp b/tools/src/librw11/Rw11.hpp index 69a8c9f6..7f9ae366 100644 --- a/tools/src/librw11/Rw11.hpp +++ b/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 +// Copyright 2013-2014 by Walter F.J. Mueller // // 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 @@ namespace Retro { 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 fspServ; diff --git a/tools/src/librw11/Rw11Cntl.cpp b/tools/src/librw11/Rw11Cntl.cpp index 4bd6e230..60856d48 100644 --- a/tools/src/librw11/Rw11Cntl.cpp +++ b/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 +// Copyright 2013-2014 by Walter F.J. Mueller // // 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,13 +13,14 @@ // // 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 // --------------------------------------------------------------------------- /*! \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 @@ Rw11Cntl::Rw11Cntl(const std::string& type) 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 @@ void Rw11Cntl::ConfigCntl(const std::string& name, uint16_t base, int lam, 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 diff --git a/tools/src/librw11/Rw11Cntl.hpp b/tools/src/librw11/Rw11Cntl.hpp index 4c41c7d7..1d66354f 100644 --- a/tools/src/librw11/Rw11Cntl.hpp +++ b/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 +// Copyright 2013-2014 by Walter F.J. Mueller // // 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 @@ namespace Retro { // statistics counter indices enum stats { kStatNAttnHdl = 0, - kStatNPrimFused, kStatNAttnNoAct, kDimStat }; @@ -90,8 +90,6 @@ namespace Retro { 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 diff --git a/tools/src/librw11/Rw11CntlDL11.cpp b/tools/src/librw11/Rw11CntlDL11.cpp index d5fc6b59..0ee232b2 100644 --- a/tools/src/librw11/Rw11CntlDL11.cpp +++ b/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 +// Copyright 2013-2014 by Walter F.J. Mueller // // 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 @@ Rw11CntlDL11::Rw11CntlDL11() 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; iRcvQueueEmpty()) { 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 @@ void Rw11CntlDL11::Dump(std::ostream& os, int ind, const char* text) const //------------------------------------------+----------------------------------- //! 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; diff --git a/tools/src/librw11/Rw11CntlDL11.hpp b/tools/src/librw11/Rw11CntlDL11.hpp index 30f66e7e..113c8703 100644 --- a/tools/src/librw11/Rw11CntlDL11.hpp +++ b/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 +// Copyright 2013-2014 by Walter F.J. Mueller // // 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 @@ namespace Retro { 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 diff --git a/tools/src/librw11/Rw11CntlLP11.cpp b/tools/src/librw11/Rw11CntlLP11.cpp index 8c1e7dfb..0593ab61 100644 --- a/tools/src/librw11/Rw11CntlLP11.cpp +++ b/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 +// Copyright 2013-2014 by Walter F.J. Mueller // // 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,13 +13,15 @@ // // 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 // --------------------------------------------------------------------------- /*! \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 @@ Rw11CntlLP11::Rw11CntlLP11() : Rw11CntlBase("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 +// Copyright 2013-2014 by Walter F.J. Mueller // // 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,13 +13,14 @@ // // 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 // --------------------------------------------------------------------------- /*! \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 @@ namespace Retro { 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: diff --git a/tools/src/librw11/Rw11CntlPC11.cpp b/tools/src/librw11/Rw11CntlPC11.cpp index e74e3e95..2c74e192 100644 --- a/tools/src/librw11/Rw11CntlPC11.cpp +++ b/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 +// Copyright 2013-2014 by Walter F.J. Mueller // // 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 @@ Rw11CntlPC11::Rw11CntlPC11() : Rw11CntlBase("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 +// Copyright 2013-2014 by Walter F.J. Mueller // // 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,13 +13,14 @@ // // 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 // --------------------------------------------------------------------------- /*! \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 @@ namespace Retro { 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: diff --git a/tools/src/librw11/Rw11CntlRK11.cpp b/tools/src/librw11/Rw11CntlRK11.cpp index 7e9d6184..74b88bb7 100644 --- a/tools/src/librw11/Rw11CntlRK11.cpp +++ b/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 +// Copyright 2013-2015 by Walter F.J. Mueller // 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 @@ Rw11CntlRK11::Rw11CntlRK11() 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::Dump(os, ind, " ^"); return; } @@ -298,18 +309,16 @@ void Rw11CntlRK11::Dump(std::ostream& os, int ind, const char* text) const //------------------------------------------+----------------------------------- //! 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 @@ int Rw11CntlRK11::AttnHandler(const RlinkServer::AttnArgs& args) 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 @@ int Rw11CntlRK11::AttnHandler(const RlinkServer::AttnArgs& args) // 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 @@ int Rw11CntlRK11::AttnHandler(const RlinkServer::AttnArgs& args) 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 @@ int Rw11CntlRK11::AttnHandler(const RlinkServer::AttnArgs& args) 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,185 +496,66 @@ int Rw11CntlRK11::AttnHandler(const RlinkServer::AttnArgs& args) 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; } //------------------------------------------+----------------------------------- //! FIXME_docs -int Rw11CntlRK11::RdmaHandler() +void Rw11CntlRK11::RdmaPreExecCB(int stat, size_t nword, + RlinkCommandList& clist) { + // 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; +} + +//------------------------------------------+----------------------------------- +//! FIXME_docs + +void Rw11CntlRK11::RdmaPostExecCB(int stat, size_t ndone, + RlinkCommandList& clist, size_t ncmd) +{ + if (stat == Rw11Rdma::kStatusBusy) return; + 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(); - uint8_t buf[512]; - - 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 + // 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) { - 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; - } - 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<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; i0) // 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 - 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); - uint16_t da = (fRd_rkda & kRKDA_M_DRSEL) | (cy<>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(lba, cy,hd,se); + uint16_t da = (fRd_rkda & kRKDA_M_DRSEL) | (cy< +// Copyright 2013-2015 by Walter F.J. Mueller // // 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 @@ namespace Retro { 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 @@ namespace Retro { // 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 @@ namespace Retro { 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 diff --git a/tools/src/librw11/Rw11CntlRK11.ipp b/tools/src/librw11/Rw11CntlRK11.ipp new file mode 100644 index 00000000..0c23e336 --- /dev/null +++ b/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 +// +// 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 diff --git a/tools/src/librw11/Rw11Cpu.cpp b/tools/src/librw11/Rw11Cpu.cpp index ef975a51..9c3e8f88 100644 --- a/tools/src/librw11/Rw11Cpu.cpp +++ b/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 // @@ -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 @@ -66,8 +68,7 @@ const uint16_t Rw11Cpu::kCp_addr_mem; 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_addr; 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 @@ Rw11Cpu::Rw11Cpu(const std::string& type) fType(type), fIndex(0), fBase(0), + fIBase(0x4000), fCpuGo(0), fCpuStat(0), fCpuGoMutex(), fCpuGoCond(), fCntlMap(), + fIAddrMap(), fStats() {} @@ -128,7 +135,8 @@ Rw11Cpu::~Rw11Cpu() 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 @@ void Rw11Cpu::Setup(Rw11* pw11) 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 @@ void Rw11Cpu::Start() return; } - //------------------------------------------+----------------------------------- //! FIXME_docs @@ -242,9 +287,11 @@ std::string Rw11Cpu::NextCntlName(const std::string& base) const //------------------------------------------+----------------------------------- //! 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::AddIbrb(RlinkCommandList& clist, uint16_t ibaddr) 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::AddRibr(RlinkCommandList& clist, uint16_t ibaddr) 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 @@ int Rw11Cpu::AddLalh(RlinkCommandList& clist, uint32_t addr, uint16_t mode) //------------------------------------------+----------------------------------- //! 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 @@ int Rw11Cpu::AddRMem(RlinkCommandList& clist, uint32_t addr, //! 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 @@ int Rw11Cpu::AddWMem(RlinkCommandList& clist, uint32_t addr, bool Rw11Cpu::MemRead(uint16_t addr, std::vector& 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::MemRead(uint16_t addr, std::vector& data, bool Rw11Cpu::MemWrite(uint16_t addr, const std::vector& 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 @@ bool Rw11Cpu::ProbeCntl(Rw11Probe& dsc) 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 @@ bool Rw11Cpu::ProbeCntl(Rw11Probe& dsc) // 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 @@ double Rw11Cpu::WaitCpuGoDown(double tout) //------------------------------------------+----------------------------------- //! 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 @@ void Rw11Cpu::Dump(std::ostream& os, int ind, const char* text) const 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 @@ void Rw11Cpu::Dump(std::ostream& os, int ind, const char* text) const 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; } diff --git a/tools/src/librw11/Rw11Cpu.hpp b/tools/src/librw11/Rw11Cpu.hpp index 1e005812..c09ae926 100644 --- a/tools/src/librw11/Rw11Cpu.hpp +++ b/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 +// Copyright 2013-2015 by Walter F.J. Mueller // // 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 @@ namespace Retro { const std::string& Type() const; size_t Index() const; uint16_t Base() const; + uint16_t IBase() const; void AddCntl(const boost::shared_ptr& spcntl); bool TestCntl(const std::string& name) const; @@ -79,7 +82,8 @@ namespace Retro { 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 @@ namespace Retro { 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& data, size_t nword, RerrMsg& emsg); @@ -110,6 +116,15 @@ namespace Retro { 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 @@ namespace Retro { 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 @@ namespace Retro { 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 @@ namespace Retro { 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 }; diff --git a/tools/src/librw11/Rw11Cpu.ipp b/tools/src/librw11/Rw11Cpu.ipp index 6728e90a..54edba5e 100644 --- a/tools/src/librw11/Rw11Cpu.ipp +++ b/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 +// Copyright 2013-2014 by Walter F.J. Mueller // // 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,14 +13,14 @@ // // 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 // --------------------------------------------------------------------------- /*! \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 @@ inline uint16_t Rw11Cpu::Base() const //------------------------------------------+----------------------------------- //! FIXME_docs +inline uint16_t Rw11Cpu::IBase() const +{ + return fIBase; +} + +//------------------------------------------+----------------------------------- +//! FIXME_docs + inline uint16_t Rw11Cpu::CpuStat() const { return fCpuStat; @@ -102,6 +110,54 @@ inline bool Rw11Cpu::CpuGo() const //------------------------------------------+----------------------------------- //! 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; diff --git a/tools/src/librw11/Rw11CpuW11a.cpp b/tools/src/librw11/Rw11CpuW11a.cpp index 0dce12e6..63ce165d 100644 --- a/tools/src/librw11/Rw11CpuW11a.cpp +++ b/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 +// Copyright 2013-2014 by Walter F.J. Mueller // // 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,13 +13,14 @@ // // 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 // --------------------------------------------------------------------------- /*! \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 @@ Rw11CpuW11a::~Rw11CpuW11a() //------------------------------------------+----------------------------------- //! 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; } diff --git a/tools/src/librw11/Rw11CpuW11a.hpp b/tools/src/librw11/Rw11CpuW11a.hpp index aa863363..73f6738c 100644 --- a/tools/src/librw11/Rw11CpuW11a.hpp +++ b/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 +// Copyright 2013-2014 by Walter F.J. Mueller // // 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 @@ namespace Retro { 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; diff --git a/tools/src/librw11/Rw11Rdma.cpp b/tools/src/librw11/Rw11Rdma.cpp new file mode 100644 index 00000000..07220ef1 --- /dev/null +++ b/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 +// +// 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 + +#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(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 diff --git a/tools/src/librw11/Rw11Rdma.hpp b/tools/src/librw11/Rw11Rdma.hpp new file mode 100644 index 00000000..791104ee --- /dev/null +++ b/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 +// +// 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 precb_t; + typedef boost::function 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 diff --git a/tools/src/librw11/Rw11Rdma.ipp b/tools/src/librw11/Rw11Rdma.ipp new file mode 100644 index 00000000..0f87d938 --- /dev/null +++ b/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 +// +// 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 diff --git a/tools/src/librw11/Rw11RdmaDisk.cpp b/tools/src/librw11/Rw11RdmaDisk.cpp new file mode 100644 index 00000000..c72d2f48 --- /dev/null +++ b/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 +// +// 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 dbuf(dsize); + RerrMsg emsg; + bool rc = fpUnit->VirtRead(fLba, nblk, + reinterpret_cast(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; iBlockSize()/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(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; iVirtWrite(fLba, nblock, + reinterpret_cast(fBuf.data()), emsg); + if (!rc) throw Rexception("Rw11RdmaDisk::PostRdmaHook()", + "VirtWrite() failed: ", emsg); + return; +} + + +} // end namespace Retro diff --git a/tools/src/librw11/Rw11RdmaDisk.hpp b/tools/src/librw11/Rw11RdmaDisk.hpp new file mode 100644 index 00000000..6bdaaabc --- /dev/null +++ b/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 +// +// 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 + +#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 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 diff --git a/tools/src/librw11/Rw11RdmaDisk.ipp b/tools/src/librw11/Rw11RdmaDisk.ipp new file mode 100644 index 00000000..008763cc --- /dev/null +++ b/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 +// +// 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 diff --git a/tools/src/librwxxtpp/RtclRw11.cpp b/tools/src/librwxxtpp/RtclRw11.cpp index 5a272898..5c1e3a07 100644 --- a/tools/src/librwxxtpp/RtclRw11.cpp +++ b/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 +// Copyright 2013-2014 by Walter F.J. Mueller // // 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,13 +13,14 @@ // // 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 // --------------------------------------------------------------------------- /*! \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 @@ int RtclRw11::ClassCmdConfig(RtclArgs& args) 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(pobj->ObjSPtr())); diff --git a/tools/src/librwxxtpp/RtclRw11Cntl.hpp b/tools/src/librwxxtpp/RtclRw11Cntl.hpp index 9b04706b..8eccf71c 100644 --- a/tools/src/librwxxtpp/RtclRw11Cntl.hpp +++ b/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 +// Copyright 2013-2015 by Walter F.J. Mueller // // 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 @@ namespace Retro { 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); diff --git a/tools/src/librwxxtpp/RtclRw11CntlRK11.cpp b/tools/src/librwxxtpp/RtclRw11CntlRK11.cpp index 62f0fab3..4723fdf7 100644 --- a/tools/src/librwxxtpp/RtclRw11CntlRK11.cpp +++ b/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 // @@ -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 @@ namespace Retro { RtclRw11CntlRK11::RtclRw11CntlRK11() : RtclRw11CntlBase("Rw11CntlRK11") -{} +{ + Rw11CntlRK11* pobj = &Obj(); + fGets.Add ("chunksize", + boost::bind(&Rw11CntlRK11::ChunkSize, pobj)); + fSets.Add ("chunksize", + boost::bind(&Rw11CntlRK11::SetChunkSize, pobj, _1)); +} //------------------------------------------+----------------------------------- //! Destructor @@ -91,4 +97,17 @@ int RtclRw11CntlRK11::FactoryCmdConfig(RtclArgs& args, RtclRw11Cpu& cpu) 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 diff --git a/tools/src/librwxxtpp/RtclRw11CntlRK11.hpp b/tools/src/librwxxtpp/RtclRw11CntlRK11.hpp index dfc8f412..7fa83317 100644 --- a/tools/src/librwxxtpp/RtclRw11CntlRK11.hpp +++ b/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 +// Copyright 2013-2015 by Walter F.J. Mueller // // 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 @@ namespace Retro { ~RtclRw11CntlRK11(); virtual int FactoryCmdConfig(RtclArgs& args, RtclRw11Cpu& cpu); + + protected: + virtual int M_stats(RtclArgs& args); }; } // end namespace Retro diff --git a/tools/src/librwxxtpp/RtclRw11Cpu.cpp b/tools/src/librwxxtpp/RtclRw11Cpu.cpp index 24211088..be8d4c94 100644 --- a/tools/src/librwxxtpp/RtclRw11Cpu.cpp +++ b/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 // @@ -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 @@ namespace Retro { 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 @@ int RtclRw11Cpu::M_add(RtclArgs& args) //------------------------------------------+----------------------------------- //! 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 @@ int RtclRw11Cpu::M_cp(RtclArgs& args) "-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 vardata; vector varstat; + string varprint; + string vardump; uint8_t estatdef_val = 0x00; uint8_t estatdef_msk = 0xff; @@ -223,7 +324,8 @@ int RtclRw11Cpu::M_cp(RtclArgs& args) } 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 @@ int RtclRw11Cpu::M_cp(RtclArgs& args) 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 @@ int RtclRw11Cpu::M_cp(RtclArgs& args) 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 @@ int RtclRw11Cpu::M_cp(RtclArgs& args) 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 RtclRw11Cpu::M_cp(RtclArgs& args) } + 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 @@ int RtclRw11Cpu::M_cp(RtclArgs& args) // 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= 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& varname) diff --git a/tools/src/librwxxtpp/RtclRw11Cpu.hpp b/tools/src/librwxxtpp/RtclRw11Cpu.hpp index bd5bcb08..136e7612 100644 --- a/tools/src/librwxxtpp/RtclRw11Cpu.hpp +++ b/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 +// Copyright 2013-2014 by Walter F.J. Mueller // // 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 @@ namespace Retro { 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 @@ namespace Retro { RlinkServer& Server(); RlinkConnect& Connect(); + bool GetIAddr(RtclArgs& args, uint16_t& ibaddr); bool GetVarName(RtclArgs& args, const char* argname, size_t nind, std::vector& varname); diff --git a/tools/tbench/test_cp_ibrbasics.tcl b/tools/tbench/test_cp_ibrbasics.tcl index 3267f32e..9cf2b137 100644 --- a/tools/tbench/test_cp_ibrbasics.tcl +++ b/tools/tbench/test_cp_ibrbasics.tcl @@ -1,10 +1,11 @@ -# $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 # License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory # # 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 \ $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 + # -------------------------------------------------------------------- diff --git a/tools/tbench/test_cp_membasics.tcl b/tools/tbench/test_cp_membasics.tcl index a041a446..6b6b75bd 100644 --- a/tools/tbench/test_cp_membasics.tcl +++ b/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 # License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory @@ -70,5 +70,3 @@ $cpu cp -wal 02200 \ $cpu cp -wal 02200 \ -brm 4 -edata {007700 007710 007720 007730} - - diff --git a/tools/tbench/test_cp_psw.tcl b/tools/tbench/test_cp_psw.tcl index 4904e7d4..8136763e 100644 --- a/tools/tbench/test_cp_psw.tcl +++ b/tools/tbench/test_cp_psw.tcl @@ -1,17 +1,18 @@ -# $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 +# Copyright 2013-2014 by Walter F.J. Mueller # 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 # 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 @@ foreach w { 000000 000017 } { } 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 } diff --git a/tools/tcl/rbbram/perf.tcl b/tools/tcl/rbbram/perf.tcl index 8bfe46b3..065ed3bc 100644 --- a/tools/tcl/rbbram/perf.tcl +++ b/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 +# Copyright 2011-2014 by Walter F.J. Mueller # # 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 @@ namespace eval rbbram { "\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 @@ namespace eval rbbram { # 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,14 +68,14 @@ namespace eval rbbram { # 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 \ -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 @@ namespace eval rbbram { # 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 @@ namespace eval rbbram { -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 @@ namespace eval rbbram { # 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 @@ namespace eval rbbram { # 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 @@ namespace eval rbbram { # 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}] } diff --git a/tools/tcl/rbemon/util.tcl b/tools/tcl/rbemon/util.tcl index 5d71e9cf..7abf3336 100644 --- a/tools/tcl/rbemon/util.tcl +++ b/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 # @@ -32,7 +32,7 @@ namespace eval rbemon { # # 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}] diff --git a/tools/tcl/rbmoni/test_rbtest.tcl b/tools/tcl/rbmoni/test_rbtest.tcl index c18462c8..dedb6370 100644 --- a/tools/tcl/rbmoni/test_rbtest.tcl +++ b/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 +# Copyright 2011-2014 by Walter F.J. Mueller # # 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,59 +41,72 @@ namespace eval rbmoni { 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] # #------------------------------------------------------------------------- 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}] ] \ [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 @@ namespace eval rbmoni { 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 @@ namespace eval rbmoni { # #------------------------------------------------------------------------- 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 @@ namespace eval rbmoni { # #------------------------------------------------------------------------- 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 @@ namespace eval rbmoni { 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 @@ namespace eval rbmoni { # #------------------------------------------------------------------------- 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 \ @@ -294,6 +303,36 @@ namespace eval rbmoni { if {$print} {puts [print]} raw_check $edat $emsk + # + #------------------------------------------------------------------------- + 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:" diff --git a/tools/tcl/rbmoni/test_regs.tcl b/tools/tcl/rbmoni/test_regs.tcl index 0f12c934..71d40f30 100644 --- a/tools/tcl/rbmoni/test_regs.tcl +++ b/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 # @@ -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 @@ namespace eval rbmoni { # #------------------------------------------------------------------------- rlc log " test 1: write/read cntl" - foreach val [list [regbld rbmoni::CNTL go] 0x0] { + 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: 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.cntl $val \ - -rreg rm.cntl -edata $val + -wreg rm.lolim $lolim -wreg rm.hilim $hilim \ + -rreg rm.lolim -edata $lolim -rreg rm.hilim -edata $hilim } # #------------------------------------------------------------------------- - 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 exec -estatdef $esdval $esdmsk \ - -wreg rm.alim $val \ - -rreg rm.alim -edata $val - } - # - #------------------------------------------------------------------------- - 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 @@ namespace eval rbmoni { } # #------------------------------------------------------------------------- - 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 # #------------------------------------------------------------------------- diff --git a/tools/tcl/rbmoni/util.tcl b/tools/tcl/rbmoni/util.tcl index 6b3d1a0c..f3690e5a 100644 --- a/tools/tcl/rbmoni/util.tcl +++ b/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 # @@ -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,59 +28,65 @@ namespace eval rbmoni { # # 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) # 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] - if {$nent == -1} { set nent $amax } + rlc exec -rreg rm.addr raddr \ + -rreg rm.stat rstat - rlc exec -rreg rm.addr raddr + set bsize [regget rbmoni::STAT(bsize) $rstat] + set amax [expr {( 512 << $bsize ) - 1}] + if {$nent == -1} { set nent $amax } 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 @@ namespace eval rbmoni { 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 @@ namespace eval rbmoni { } 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 @@ namespace eval rbmoni { 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 diff --git a/tools/tcl/rbs3hio/util.tcl b/tools/tcl/rbs3hio/util.tcl index f5be6c72..9952df48 100644 --- a/tools/tcl/rbs3hio/util.tcl +++ b/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 # @@ -34,7 +34,7 @@ namespace eval rbs3hio { # # 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}] diff --git a/tools/tcl/rbtest/test_data.tcl b/tools/tcl/rbtest/test_data.tcl index 398bec43..641b633e 100644 --- a/tools/tcl/rbtest/test_data.tcl +++ b/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 # @@ -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 @@ namespace eval rbtest { -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 # diff --git a/tools/tcl/rbtest/util.tcl b/tools/tcl/rbtest/util.tcl index b5c39602..10ac18dc 100644 --- a/tools/tcl/rbtest/util.tcl +++ b/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 # @@ -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 @@ namespace eval rbtest { 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 @@ namespace eval rbtest { # 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 @@ namespace eval rbtest { 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 @@ namespace eval rbtest { # 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] diff --git a/tools/tcl/rlink/util.tcl b/tools/tcl/rlink/util.tcl index 70e41635..edc8ed53 100644 --- a/tools/tcl/rlink/util.tcl +++ b/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 # @@ -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 provide rlink 1.0 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} # diff --git a/tools/tcl/rutil/util.tcl b/tools/tcl/rutil/util.tcl index fd2825fc..00f65734 100644 --- a/tools/tcl/rutil/util.tcl +++ b/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 # @@ -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 @@ namespace eval rutil { # 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] diff --git a/tools/tcl/rw11/cpucons.tcl b/tools/tcl/rw11/cpucons.tcl index 7f548103..c26856fa 100644 --- a/tools/tcl/rw11/cpucons.tcl +++ b/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 +# Copyright 2013-2015 by Walter F.J. Mueller # # 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 # 2013-04-26 510 1.0 Initial version # @@ -70,7 +71,7 @@ namespace eval rw11 { # proc "<" {args} { set str [join $args " "] - append str "\n" + append str "\r" cpu0tta0 type $str return "" } diff --git a/tools/tcl/rw11/defs.tcl b/tools/tcl/rw11/defs.tcl index 87b94600..e0d39611 100644 --- a/tools/tcl/rw11/defs.tcl +++ b/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 # @@ -27,7 +27,6 @@ namespace eval rw11 { # 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 ----------------------------------------- diff --git a/tools/tcl/tst_rlink/perf.tcl b/tools/tcl/tst_rlink/perf.tcl index 69b704bb..956a54e1 100644 --- a/tools/tcl/tst_rlink/perf.tcl +++ b/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 # @@ -36,14 +36,14 @@ namespace eval tst_rlink { -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. 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)}] diff --git a/tools/tcl/tst_rlink/test_all.tcl b/tools/tcl/tst_rlink/test_all.tcl index 6ca78622..4f88fdd5 100644 --- a/tools/tcl/tst_rlink/test_all.tcl +++ b/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 # @@ -33,8 +33,8 @@ namespace eval tst_rlink { # 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]"