
#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_Locked_Read,
  RubyRequestType_Locked_Write,
  RubyRequestType_RMW_Read,
  RubyRequestType_RMW_Write,
  RubyRequestType_NUM
};

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;
  unsigned proc_id;

  RubyRequest() {}
  RubyRequest(uint64_t _paddr, uint8_t* _data, int _len, uint64_t _pc, RubyRequestType _type, RubyAccessMode _access_mode, unsigned _proc_id = 100)
    : paddr(_paddr), data(_data), len(_len), pc(_pc), type(_type), access_mode(_access_mode), proc_id(_proc_id)
  {}
};

/**
 * 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);


/** 
 * libruby_issue_request error return codes 
 */
#define LIBRUBY_BUFFER_FULL -2
#define LIBRUBY_ALIASED_REQUEST -3

/**
 * 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);

/**
 * does not return until done
 */  
void libruby_playback_trace(char * trace_filename);

/*
 * enables the tracer and opens the trace file
 */ 
void libruby_start_tracing(char * record_filename);

/*
 * closes the trace file
 */ 
void libruby_stop_tracing();

/**
 * get time
 */
uint64_t libruby_get_time();
#endif
