aboutsummaryrefslogtreecommitdiffstats
path: root/firmware/stats.c
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2015-06-06 14:01:37 +0200
committerClifford Wolf <clifford@clifford.at>2015-06-06 14:14:32 +0200
commit77ba5a18973bd02b461ab96047acfcc3fb62cf7b (patch)
tree573afedb6a3a14c91224e16724fa21ba3a939de2 /firmware/stats.c
downloadpicorv32-77ba5a18973bd02b461ab96047acfcc3fb62cf7b.tar.gz
picorv32-77ba5a18973bd02b461ab96047acfcc3fb62cf7b.zip
Initial import
Diffstat (limited to 'firmware/stats.c')
-rw-r--r--firmware/stats.c43
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");
+}
+