Skip to content

Commit 232e5bd

Browse files
Added implementations of default callbacks for trace printing in riscv_default_callbacks.c
1 parent ffc1318 commit 232e5bd

File tree

5 files changed

+65
-81
lines changed

5 files changed

+65
-81
lines changed

Makefile

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -221,14 +221,7 @@ cloc:
221221
gcovr:
222222
gcovr -r . --html --html-detail -o index.html
223223

224-
c_preserve_fns=-c_preserve _set_Misa_C \
225-
-c_preserve mem_write_callback_default \
226-
-c_preserve mem_read_callback_default \
227-
-c_preserve xreg_write_callback_default \
228-
-c_preserve freg_write_callback_default \
229-
-c_preserve csr_write_callback_default \
230-
-c_preserve csr_read_callback_default \
231-
-c_preserve vreg_write_callback_default
224+
c_preserve_fns=-c_preserve _set_Misa_C
232225

233226
generated_definitions/c/riscv_model_$(ARCH).c: $(SAIL_SRCS) model/main.sail Makefile
234227
mkdir -p generated_definitions/c
Lines changed: 64 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,91 @@
11
#include "riscv_config.h"
2+
#include <stdlib.h>
23

3-
int zmem_write_callback_default(long unsigned int addr, long int width, lbits value);
4-
int zmem_read_callback_default(const char *type, long unsigned int addr,
5-
long int width, lbits value);
6-
int zxreg_write_callback_default(long unsigned int reg, long unsigned int value);
7-
int zfreg_write_callback_default(long unsigned int reg, long unsigned int value);
8-
int zcsr_write_callback_default(long unsigned int reg, long unsigned int value);
9-
int zcsr_read_callback_default(long unsigned int reg, long unsigned int value);
10-
int zvreg_write_callback_default(long unsigned int reg, lbits value);
4+
void zcsr_name_map_forwards(sail_string *rop, uint64_t);
115

12-
/* The model assumes that these functions do not change the state of the model.
6+
static uint8_t *get_lbits_data(lbits val)
7+
{
8+
uint8_t *data = (uint8_t *)calloc(val.len, sizeof(uint8_t));
9+
mpz_export(data, NULL, -1, 1, 0, 0, val.bits);
10+
return data;
11+
}
12+
13+
/* Implementations of default callbacks for trace printing.
14+
*
15+
* The model assumes that these functions do not change the state of the model.
1316
*/
14-
int mem_write_callback(uint64_t addr, uint64_t width, lbits value) {
15-
if (config_print_mem_access)
16-
zmem_write_callback_default(addr, width, value);
17+
int mem_write_callback(uint64_t addr, uint64_t width, lbits value)
18+
{
19+
if (config_print_mem_access) {
20+
char *lbits_data = get_lbits_data(value);
21+
printf("mem[0x%.16lX] <- 0x", addr);
22+
for (int i = width - 1; i >= 0; --i)
23+
printf("%02hhX", lbits_data[i]);
24+
printf("\n");
25+
free(lbits_data);
26+
}
1727
}
1828

1929
int mem_read_callback(const char *type, uint64_t addr, uint64_t width,
2030
lbits value)
2131
{
22-
if (config_print_mem_access)
23-
zmem_read_callback_default(type, addr, width, value);
32+
if (config_print_mem_access) {
33+
char *lbits_data = get_lbits_data(value);
34+
printf("mem[%s,0x%.16lX] -> 0x", type, addr);
35+
for (int i = width - 1; i >= 0; --i)
36+
printf("%02hhX", lbits_data[i]);
37+
printf("\n");
38+
free(lbits_data);
39+
}
2440
}
2541

2642
int mem_exception_callback(uint64_t addr, uint64_t num_of_exception) { }
2743

28-
int xreg_write_callback(unsigned reg, uint64_t value) {
44+
int xreg_write_callback(unsigned reg, uint64_t value)
45+
{
2946
if (config_print_reg)
30-
zxreg_write_callback_default(reg, value);
47+
printf("x%d <- 0x%.16lX\n", reg, value);
3148
}
3249

33-
int freg_write_callback(unsigned reg, uint64_t value) {
50+
int freg_write_callback(unsigned reg, uint64_t value)
51+
{
3452
/* TODO: will only print bits; should we print in floating point format? */
3553
if (config_print_reg)
36-
zfreg_write_callback_default(reg, value);
54+
printf("f%d <- 0x%.16lX\n", reg, value);
3755
}
3856

39-
int csr_write_callback(unsigned reg, uint64_t value) {
40-
if (config_print_reg)
41-
zcsr_write_callback_default(reg, value);
57+
int csr_write_callback(unsigned reg, uint64_t value)
58+
{
59+
if (config_print_reg) {
60+
sail_string csr_name;
61+
CREATE(sail_string)(&csr_name);
62+
zcsr_name_map_forwards(&csr_name, reg);
63+
printf("CSR %s <- 0x%.16lX (input: 0x%.16lX)\n", csr_name, value, value);
64+
KILL(sail_string)(&csr_name);
65+
}
4266
}
4367

44-
int csr_read_callback(unsigned reg, uint64_t value) {
45-
if (config_print_reg)
46-
zcsr_read_callback_default(reg, value);
68+
int csr_read_callback(unsigned reg, uint64_t value)
69+
{
70+
if (config_print_reg) {
71+
sail_string csr_name;
72+
CREATE(sail_string)(&csr_name);
73+
zcsr_name_map_forwards(&csr_name, reg);
74+
printf("CSR %s -> 0x%.16lX\n", csr_name, value);
75+
KILL(sail_string)(&csr_name);
76+
}
4777
}
4878

49-
int vreg_write_callback(unsigned reg, lbits value) {
50-
if (config_print_reg)
51-
zvreg_write_callback_default(reg, value);
79+
int vreg_write_callback(unsigned reg, lbits value)
80+
{
81+
if (config_print_reg) {
82+
char *lbits_data = get_lbits_data(value);
83+
printf("v%d <- ", reg);
84+
for (int i = value.len - 1; i >= 0; --i)
85+
printf("%02hhX", lbits_data[i]);
86+
printf("\n");
87+
free(lbits_data);
88+
}
5289
}
5390

5491
int pc_write_callback(uint64_t value) { }

model/riscv_csr_begin.sail

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -339,16 +339,3 @@ scattered function read_CSR
339339
val write_CSR : (csreg, xlenbits) -> xlenbits
340340
scattered function write_CSR
341341

342-
343-
/* Implementations of default callbacks for trace printing */
344-
345-
val csr_write_callback_default : (csreg, xlenbits) -> unit
346-
function csr_write_callback_default (csr, value) = {
347-
print_reg("csr " ^ csr_name_map(csr) ^ " <- " ^ BitStr(value) ^ " (input: " ^ BitStr(value) ^ ")")
348-
}
349-
350-
val csr_read_callback_default : (csreg, xlenbits) -> unit
351-
function csr_read_callback_default (csr, value) = {
352-
print_reg("csr " ^ csr_name_map(csr) ^ " -> " ^ BitStr(value))
353-
}
354-

model/riscv_types.sail

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -426,27 +426,3 @@ val freg_write_callback = pure {c: "freg_write_callback"} : (regidx, flenbits) -
426426
val csr_write_callback = pure {c: "csr_write_callback"} : (csreg, xlenbits) -> unit
427427
val csr_read_callback = pure {c: "csr_read_callback"} : (csreg, xlenbits) -> unit
428428

429-
/* Implementations of default callbacks for trace printing */
430-
431-
val mem_write_callback_default : forall 'n, 0 < 'n <= max_mem_access . (/* addr */ xlenbits, /* width */ int('n), /* value */ bits(8 * 'n)) -> unit
432-
function mem_write_callback_default (addr, width, value) = {
433-
print_mem("mem[" ^ BitStr(addr) ^ "] <- " ^ BitStr(value))
434-
}
435-
436-
val mem_read_callback_default : forall 'n, 0 < 'n <= max_mem_access . (/* access type */ string, /* addr */ xlenbits, /* width */ int('n), /* value */ bits(8 * 'n)) -> unit
437-
function mem_read_callback_default (t, addr, width, value) = {
438-
print_mem("mem[" ^ t ^ "," ^ BitStr(addr) ^ "] -> " ^ BitStr(value))
439-
}
440-
441-
val xreg_write_callback_default : (regidx, xlenbits) -> unit
442-
function xreg_write_callback_default (reg, value) = {
443-
print_reg("x" ^ dec_str(regidx_to_regno(reg)) ^ " <- " ^ BitStr(value))
444-
}
445-
446-
val freg_write_callback_default : (regidx, flenbits) -> unit
447-
function freg_write_callback_default (reg, value) = {
448-
/* todo: will only print bits; should we print in floating point format? */
449-
print_reg("f" ^ dec_str(regidx_to_regno(reg)) ^ " <- " ^ BitStr(value))
450-
}
451-
452-

model/riscv_vreg_type.sail

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -153,12 +153,3 @@ enum vmlsop = { VLM, VSM }
153153

154154
val vreg_write_callback = pure {c: "vreg_write_callback"} : (regidx, vregtype) -> unit
155155

156-
/* Implementations of default callbacks for trace printing */
157-
158-
val vreg_write_callback_default : (regidx, vregtype) -> unit
159-
function vreg_write_callback_default (reg, value) = {
160-
let VLEN = unsigned(vlenb) * 8;
161-
assert(0 < VLEN & VLEN <= sizeof(vlenmax));
162-
print_reg("v" ^ dec_str(regidx_to_regno(reg)) ^ " <- " ^ BitStr(value[VLEN - 1 .. 0]))
163-
}
164-

0 commit comments

Comments
 (0)