summaryrefslogtreecommitdiff
path: root/src/mem/ruby/libruby.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/ruby/libruby.hh')
-rw-r--r--src/mem/ruby/libruby.hh109
1 files changed, 109 insertions, 0 deletions
diff --git a/src/mem/ruby/libruby.hh b/src/mem/ruby/libruby.hh
new file mode 100644
index 000000000..5916c98e6
--- /dev/null
+++ b/src/mem/ruby/libruby.hh
@@ -0,0 +1,109 @@
+
+#ifndef LIBRUBY_H
+#define LIBRUBY_H
+
+#include <stdint.h>
+#include <ostream>
+
+typedef void* RubyPortHandle;
+enum RubyRequestType {
+ RubyRequestType_NULL,
+ RubyRequestType_IFETCH,
+ RubyRequestType_LD,
+ RubyRequestType_ST,
+ RubyRequestType_RMW
+};
+
+enum RubyAccessMode {
+ RubyAccessMode_User,
+ RubyAccessMode_Supervisor,
+ RubyAccessMode_Device
+};
+
+struct RubyRequest {
+ uint64_t paddr;
+ uint8_t* data;
+ int len;
+ uint64_t pc;
+ RubyRequestType type;
+ RubyAccessMode access_mode;
+
+ RubyRequest() {}
+ RubyRequest(uint64_t _paddr, uint8_t* _data, int _len, uint64_t _pc, RubyRequestType _type, RubyAccessMode _access_mode)
+ : paddr(_paddr), data(_data), len(_len), pc(_pc), type(_type), access_mode(_access_mode)
+ {}
+};
+
+/**
+ * Initialize the system. cfg_file is a Ruby-lang configuration script
+ */
+void libruby_init(const char* cfg_file);
+
+/**
+ * Tear down a configured system. Must be invoked after a call to libruby_init.
+ */
+void libruby_destroy();
+
+/**
+ * Print the last error encountered by ruby. Currently unimplemented.
+ */
+const char* libruby_last_error();
+
+/**
+ * Retrieve a handle to a RubyPort object, identified by name in the
+ * configuration. You also pass in the callback function you want
+ * this port to use when a request completes. Only one handle to a
+ * port is allowed at a time.
+ */
+RubyPortHandle libruby_get_port(const char* name, void (*hit_callback)(int64_t access_id));
+
+/**
+ * Retrieve a handle to a RubyPort object, identified by name in the
+ * configuration.
+ */
+RubyPortHandle libruby_get_port_by_name(const char* name);
+
+
+/**
+ * issue_request returns a unique access_id to identify the ruby
+ * transaction. This access_id is later returned to the caller via
+ * hit_callback (passed to libruby_get_port)
+ */
+int64_t libruby_issue_request(RubyPortHandle p, struct RubyRequest request);
+
+/**
+ * writes data directly into Ruby's data array. Note that this
+ * ignores caches, and should be considered incoherent after
+ * simulation starts.
+ */
+void libruby_write_ram(uint64_t paddr, uint8_t * data, int len);
+
+/**
+ * reads data directory from Ruby's data array. Note that this
+ * ignores caches, and should be considered incoherent after
+ * simulation starts
+ */
+void libruby_read_ram(uint64_t paddr, uint8_t * data, int len);
+
+/**
+ * tick the system n cycles. Eventually, will return the number of
+ * cycles until the next event, but for now it always returns 0
+ */
+int libruby_tick(int n);
+
+/**
+ * self explainitory
+ */
+void libruby_print_config(std::ostream & out);
+
+/**
+ * self explainitory
+ */
+void libruby_print_stats(std::ostream & out);
+
+
+/**
+ * get time
+ */
+uint64_t libruby_get_time();
+#endif