aboutsummaryrefslogtreecommitdiff
path: root/riscv/extension.h
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2013-08-13 00:51:07 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2013-08-13 00:51:07 -0700
commitbbb0f2179c858c77918ef37dbfcd7bb5f3fd0417 (patch)
tree63bcac40261140f5628d1e12182d658005eae300 /riscv/extension.h
parent04c2d491c4bbb424a59273d4ebee62ddfe3379f9 (diff)
downloadspike-bbb0f2179c858c77918ef37dbfcd7bb5f3fd0417.zip
spike-bbb0f2179c858c77918ef37dbfcd7bb5f3fd0417.tar.gz
spike-bbb0f2179c858c77918ef37dbfcd7bb5f3fd0417.tar.bz2
Implement RoCC and add a dummy RoCC
Enable it with --extension=dummy
Diffstat (limited to 'riscv/extension.h')
-rw-r--r--riscv/extension.h33
1 files changed, 33 insertions, 0 deletions
diff --git a/riscv/extension.h b/riscv/extension.h
new file mode 100644
index 0000000..218deb4
--- /dev/null
+++ b/riscv/extension.h
@@ -0,0 +1,33 @@
+#ifndef _RISCV_COPROCESSOR_H
+#define _RISCV_COPROCESSOR_H
+
+#include "processor.h"
+#include <map>
+#include <string>
+#include <vector>
+#include <functional>
+
+class extension_t
+{
+ public:
+ virtual std::vector<insn_desc_t> get_instructions() = 0;
+ virtual const char* name() = 0;
+ virtual ~extension_t();
+
+ void set_processor(processor_t* _p) { p = _p; }
+ protected:
+ processor_t* p;
+
+ void illegal_instruction();
+ void raise_interrupt();
+ void clear_interrupt();
+};
+
+std::map<std::string, std::function<extension_t*()>>& extensions();
+
+#define REGISTER_EXTENSION(name, constructor) \
+ class register_##name { \
+ public: register_##name() { extensions()[#name] = constructor; } \
+ }; static register_##name dummy_##name;
+
+#endif