-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrvdebug-dm-data.tcl
64 lines (53 loc) · 1.97 KB
/
rvdebug-dm-data.tcl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
defn rvdebug-dm-data.tcl 2023-06-13
#=========== rvdebug-dmi-abstract.tcl =================
#
# 2023-06-13 pds initial cut
incl rvdebug-dm.tcl ;# the debug module, to which the abstract program facility belongs
#
# ABSTRACT DATA REGISTERS (THRU DMI)
#
namespace eval DM::DATA {
proc xfer {datanum data {mode 0}} { ;# mode: 0=read, 1=write-read
variable DATA0_DMI_ADDR
variable DATA1_DMI_ADDR
variable DATA2_DMI_ADDR
variable DATA3_DMI_ADDR
variable DATA4_DMI_ADDR
variable DATA5_DMI_ADDR
variable DATA6_DMI_ADDR
variable DATA7_DMI_ADDR
variable DATA8_DMI_ADDR
variable DATA9_DMI_ADDR
variable DATA10_DMI_ADDR
variable DATA11_DMI_ADDR
# convert string to numeric ... DO NOT use braces of expr when strings are involved
set datanum [expr $datanum]
set data [expr $data]
set mode [expr $mode]
# assemble numeric value from bit-fields ... MUST use braces of expr when numerics are involved
set data_x 0
set data_x [expr { $data_x | (($data & ((1 << 32) - 1)) << 0) }] ;# [31:0]
switch $datanum {
0 { set data_addr $DATA0_DMI_ADDR }
1 { set data_addr $DATA1_DMI_ADDR }
2 { set data_addr $DATA2_DMI_ADDR }
3 { set data_addr $DATA3_DMI_ADDR }
4 { set data_addr $DATA4_DMI_ADDR }
5 { set data_addr $DATA5_DMI_ADDR }
6 { set data_addr $DATA6_DMI_ADDR }
7 { set data_addr $DATA7_DMI_ADDR }
8 { set data_addr $DATA8_DMI_ADDR }
9 { set data_addr $DATA9_DMI_ADDR }
10 { set data_addr $DATA10_DMI_ADDR }
11 { set data_addr $DATA11_DMI_ADDR }
default { echo "only data regs 0..11 allowed" }
}
if [expr { $mode == 1 }] {
DTM::DMI::write $data_addr $data_x ;# addr data
}
set data_x [DTM::DMI::read $data_addr 0] ;# addr data
# vanity output style, many-line
# echo "dtm:dmi_abstractdata ($datanum [format 0x%08x $data] $mode): i=[format %d $datanum], data=[format 0x%08x $data_x]"
return $data_x
}
}