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
val mem_write_callback =
pure {
c:
"mem_write_callback"} :
forall 'n,
0 < 'n <= max_mem_access . (
string,
physaddrbits,
int(
'n),
bits(
8 * 'n)) ->
unit
function mem_write_callback(_) = ()
val mem_read_callback =
pure {
c:
"mem_read_callback"} :
forall 'n,
0 < 'n <= max_mem_access . (
string,
physaddrbits,
int(
'n),
bits(
8 * 'n)) ->
unit
function mem_read_callback(_) = ()
val mem_exception_callback =
pure {
c:
"mem_exception_callback"} : (
physaddrbits,
exc_code) ->
unit
function mem_exception_callback(_) = ()
val pc_write_callback =
pure {
c:
"pc_write_callback"} :
xlenbits ->
unit
function pc_write_callback(_) = ()
val xreg_full_write_callback =
pure {
c:
"xreg_full_write_callback"} : (
string,
regidx,
xlenbits) ->
unit
function xreg_full_write_callback(_) = ()
val csr_full_write_callback =
pure {
c:
"csr_full_write_callback"} : (
string,
csreg,
xlenbits) ->
unit
function csr_full_write_callback(_) = ()
val csr_full_read_callback =
pure {
c:
"csr_full_read_callback"} : (
string,
csreg,
xlenbits) ->
unit
function csr_full_read_callback(_) = ()
val trap_callback =
pure {
c:
"trap_callback"} :
unit ->
unit
function trap_callback(_) = ()
function csr_name_write_callback(
name :
string,
value :
xlenbits) ->
unit = {
let csr =
csr_name_map(
name);
csr_full_write_callback(
name,
csr,
value);
}
function csr_id_write_callback(
csr :
csreg,
value :
xlenbits) ->
unit = {
let name =
csr_name_map(
csr);
csr_full_write_callback(
name,
csr,
value);
}
function csr_name_read_callback(
name :
string,
value :
xlenbits) ->
unit = {
let csr =
csr_name_map(
name);
csr_full_read_callback(
name,
csr,
value);
}
function csr_id_read_callback(
csr :
csreg,
value :
xlenbits) ->
unit = {
let name =
csr_name_map(
csr);
csr_full_read_callback(
name,
csr,
value);
}
overload csr_write_callback = {
csr_name_write_callback,
csr_id_write_callback,
csr_full_write_callback}
overload csr_read_callback = {
csr_name_read_callback,
csr_id_read_callback,
csr_full_read_callback}
function long_csr_write_callback(
name :
string,
name_high :
string,
value :
bits(
64)) ->
unit = {
csr_write_callback(
name,
value[
xlen - 1 ..
0]);
if xlen == 32
then csr_write_callback(
name_high,
value[
63 ..
32]);
}