diff options
author | Yann Herklotz <git@yannherklotz.com> | 2022-11-24 18:49:44 +0000 |
---|---|---|
committer | Yann Herklotz <git@yannherklotz.com> | 2022-11-24 18:49:44 +0000 |
commit | 3291d86ec38031e191ec1e7e5e8ddfa74b77cb7c (patch) | |
tree | 7d604206a2deb29c9f097ff1f3b7de78f44b34a3 /firmware/stats.c | |
download | butterstick-3291d86ec38031e191ec1e7e5e8ddfa74b77cb7c.tar.gz butterstick-3291d86ec38031e191ec1e7e5e8ddfa74b77cb7c.zip |
Squashed 'picorv32/' content from commit f00a88c
git-subtree-dir: picorv32
git-subtree-split: f00a88c36eaab478b64ee27d8162e421049bcc66
Diffstat (limited to 'firmware/stats.c')
-rw-r--r-- | firmware/stats.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/firmware/stats.c b/firmware/stats.c new file mode 100644 index 0000000..80e22dd --- /dev/null +++ b/firmware/stats.c @@ -0,0 +1,42 @@ +// This is free and unencumbered software released into the public domain. +// +// Anyone is free to copy, modify, publish, use, compile, sell, or +// distribute this software, either in source code form or as a compiled +// binary, for any purpose, commercial or non-commercial, and by any +// means. + +#include "firmware.h" + +static void stats_print_dec(unsigned 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] = '.'; + print_chr(*(--p)); + } +} + +void stats(void) +{ + unsigned int num_cycles, num_instr; + __asm__ volatile ("rdcycle %0; rdinstret %1;" : "=r"(num_cycles), "=r"(num_instr)); + print_str("Cycle counter ........"); + stats_print_dec(num_cycles, 8, false); + print_str("\nInstruction counter .."); + stats_print_dec(num_instr, 8, false); + print_str("\nCPI: "); + stats_print_dec((num_cycles / num_instr), 0, false); + print_str("."); + stats_print_dec(((100 * num_cycles) / num_instr) % 100, 2, true); + print_str("\n"); +} + |