diff options
author | Andrew Waterman <waterman@cs.berkeley.edu> | 2013-08-13 00:51:07 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@cs.berkeley.edu> | 2013-08-13 00:51:07 -0700 |
commit | bbb0f2179c858c77918ef37dbfcd7bb5f3fd0417 (patch) | |
tree | 63bcac40261140f5628d1e12182d658005eae300 /riscv/extension.h | |
parent | 04c2d491c4bbb424a59273d4ebee62ddfe3379f9 (diff) | |
download | spike-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.h | 33 |
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 |