diff options
author | Clifford Wolf <clifford@clifford.at> | 2015-06-06 14:01:37 +0200 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2015-06-06 14:14:32 +0200 |
commit | 77ba5a18973bd02b461ab96047acfcc3fb62cf7b (patch) | |
tree | 573afedb6a3a14c91224e16724fa21ba3a939de2 /firmware/stats.c | |
download | picorv32-77ba5a18973bd02b461ab96047acfcc3fb62cf7b.tar.gz picorv32-77ba5a18973bd02b461ab96047acfcc3fb62cf7b.zip |
Initial import
Diffstat (limited to 'firmware/stats.c')
-rw-r--r-- | firmware/stats.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/firmware/stats.c b/firmware/stats.c new file mode 100644 index 0000000..c7b1b8e --- /dev/null +++ b/firmware/stats.c @@ -0,0 +1,43 @@ +#include <stdint.h> +#include <stdbool.h> +#define OUTPORT 0x10000000 + +static void print_str(const char *p) +{ + while (*p != 0) + *((volatile uint32_t*)OUTPORT) = *(p++); +} + +static void print_dec(int val, int digits, bool zero_pad) +{ + char buffer[32]; + char *p = buffer; + while (val || digits > 0) { + if (val) + *(p++) = '0' + val % 10; + else + *(p++) = zero_pad ? '0' : ' '; + val = val / 10; + digits--; + } + while (p != buffer) { + if (p[-1] == ' ' && p[-2] == ' ') p[-1] = '.'; + *((volatile uint32_t*)OUTPORT) = *(--p); + } +} + +void stats() +{ + int num_cycles, num_instr; + asm("rdcycle %0; rdinstret %1;" : "=r"(num_cycles), "=r"(num_instr)); + print_str("Cycle counter ........"); + print_dec(num_cycles, 8, false); + print_str("\nInstruction counter .."); + print_dec(num_instr, 8, false); + print_str("\nCPI: "); + print_dec((num_cycles / num_instr), 0, false); + print_str("."); + print_dec(((100 * num_cycles) / num_instr) % 100, 2, true); + print_str("\n"); +} + |