00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef CORE_INTERFACES_SIMPLEMEM_H_
00015 #define CORE_INTERFACES_SIMPLEMEM_H_
00016
00017 #include <string>
00018 #include <utility>
00019 #include <map>
00020
00021 #include <sst/core/sst_types.h>
00022 #include <sst/core/module.h>
00023 #include <sst/core/params.h>
00024 #include <sst/core/link.h>
00025
00026 namespace SST {
00027
00028 class Component;
00029 class Event;
00030
00031 namespace Interfaces {
00032
00033
00034
00035
00036 class SimpleMem : public Module {
00037
00038 public:
00039
00040 typedef uint64_t Addr;
00041
00042
00043
00044
00045 class Request {
00046 public:
00047 typedef uint64_t id_t;
00048 typedef uint32_t flags_t;
00049
00050
00051
00052
00053 typedef enum {
00054 Read,
00055 Write,
00056 ReadResp,
00057 WriteResp
00058 } Command;
00059
00060
00061
00062
00063 typedef enum {
00064 F_NONCACHEABLE = 1<<1,
00065 F_LOCKED = 1<<2,
00066 F_LLSC = 1<<3,
00067 F_LLSC_RESP = 1<<4
00068 } Flags;
00069
00070
00071 typedef std::vector<uint8_t> dataVec;
00072
00073 Command cmd;
00074 Addr addr;
00075 size_t size;
00076 dataVec data;
00077 flags_t flags;
00078 id_t id;
00079 uint32_t groupId;
00080 Addr instrPtr;
00081 Addr virtualAddr;
00082
00083
00084 Request(Command cmd, Addr addr, size_t size, dataVec &data, flags_t flags = 0) :
00085 cmd(cmd), addr(addr), size(size), data(data), flags(flags), groupId(0),
00086 instrPtr(0), virtualAddr(0)
00087 {
00088
00089 id = main_id++;
00090 }
00091
00092
00093 Request(Command cmd, Addr addr, size_t size, flags_t flags = 0) :
00094 cmd(cmd), addr(addr), size(size), flags(flags), groupId(0),
00095 instrPtr(0), virtualAddr(0)
00096 {
00097
00098 id = main_id++;
00099 }
00100
00101
00102
00103
00104 void setGroupId(uint32_t _groupId)
00105 {
00106 groupId = _groupId;
00107 }
00108
00109
00110
00111
00112 void setPayload(const std::vector<uint8_t> & data_in )
00113 {
00114 data = data_in;
00115 }
00116
00117
00118
00119
00120 void setPayload(uint8_t *data_in, size_t len)
00121 {
00122 data.resize(len);
00123 for ( size_t i = 0 ; i < len ; i++ ) {
00124 data[i] = data_in[i];
00125 }
00126 }
00127
00128
00129
00130
00131 void setVirtualAddress(const Addr newVA) {
00132 virtualAddr = newVA;
00133 }
00134
00135
00136
00137
00138 uint64_t getVirtualAddress() {
00139 return (uint64_t) virtualAddr;
00140 }
00141
00142
00143
00144
00145 void setInstructionPointer(const Addr newIP) {
00146 instrPtr = newIP;
00147 }
00148
00149
00150
00151
00152 Addr getInstructionPointer() {
00153 return instrPtr;
00154 }
00155
00156 private:
00157 static id_t main_id;
00158 };
00159
00160
00161 class HandlerBase {
00162 public:
00163
00164 virtual void operator()(Request*) = 0;
00165 virtual ~HandlerBase() {}
00166 };
00167
00168
00169
00170
00171
00172
00173 template <typename classT, typename argT = void>
00174 class Handler : public HandlerBase {
00175 private:
00176 typedef void (classT::*PtrMember)(Request*, argT);
00177 classT* object;
00178 const PtrMember member;
00179 argT data;
00180
00181 public:
00182
00183
00184
00185
00186
00187 Handler( classT* const object, PtrMember member, argT data ) :
00188 object(object),
00189 member(member),
00190 data(data)
00191 {}
00192
00193 void operator()(Request* req) {
00194 return (object->*member)(req,data);
00195 }
00196 };
00197
00198
00199
00200
00201 template <typename classT>
00202 class Handler<classT, void> : public HandlerBase {
00203 private:
00204 typedef void (classT::*PtrMember)(Request*);
00205 classT* object;
00206 const PtrMember member;
00207
00208 public:
00209
00210
00211
00212
00213 Handler( classT* const object, PtrMember member ) :
00214 object(object),
00215 member(member)
00216 {}
00217
00218 void operator()(Request* req) {
00219 return (object->*member)(req);
00220 }
00221 };
00222
00223
00224
00225 SimpleMem(SST::Component *comp, Params ¶ms) { }
00226
00227
00228
00229
00230
00231 virtual bool initialize(const std::string &linkName, HandlerBase *handler = NULL) = 0;
00232
00233
00234
00235
00236 virtual void sendInitData(Request *req) = 0;
00237
00238
00239
00240
00241
00242
00243 virtual void sendInitData(SST::Event *ev) { getLink()->sendInitData(ev); }
00244
00245
00246
00247
00248
00249 virtual SST::Event* recvInitData() { return getLink()->recvInitData(); }
00250
00251
00252
00253
00254 virtual SST::Link* getLink(void) const = 0;
00255
00256
00257
00258
00259 virtual void sendRequest(Request *req) = 0;
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270 virtual Request* recvResponse(void) = 0;
00271
00272
00273 };
00274
00275 }
00276 }
00277
00278 #endif