14 #ifndef SST_CORE_INTERFACES_STANDARDMEM_H 15 #define SST_CORE_INTERFACES_STANDARDMEM_H 17 #include "sst/core/link.h" 18 #include "sst/core/params.h" 19 #include "sst/core/serialization/serializable.h" 20 #include "sst/core/sst_types.h" 21 #include "sst/core/ssthandler.h" 22 #include "sst/core/subcomponent.h" 23 #include "sst/core/warnmacros.h" 102 template <
typename classT,
typename dataT =
void>
104 [[deprecated(
"Handler has been deprecated. Please use Handler2 instead as it supports checkpointing.")]] =
125 template <
typename classT, auto funcT,
typename dataT =
void>
135 #define PRI_ADDR PRIx64 143 using id_t = uint64_t;
144 using flags_t = uint32_t;
152 F_NONCACHEABLE = 1 << 1,
155 F_RESERVED = 1 << 16,
158 explicit Request(flags_t fl = 0)
163 Request(id_t rid, flags_t flags = 0) :
168 virtual ~Request() {}
170 id_t getID() {
return id; }
174 virtual bool needsResponse() = 0;
177 virtual SST::Event* convert(RequestConverter* converter) = 0;
179 virtual void handle(RequestHandler* handler) = 0;
182 virtual std::string getString() = 0;
185 void setNoncacheable() { flags |=
static_cast<int>(Flag::F_NONCACHEABLE); }
186 void unsetNoncacheable() { flags &= ~(
static_cast<int>(Flag::F_NONCACHEABLE)); }
187 bool getNoncacheable() {
return flags &
static_cast<int>(Flag::F_NONCACHEABLE); }
189 void setSuccess() { unsetFail(); }
190 void unsetSuccess() { setFail(); }
191 bool getSuccess() {
return (flags & static_cast<int>(Flag::F_FAIL)) == 0; }
192 bool getFail() {
return flags &
static_cast<int>(Flag::F_FAIL); }
193 void setFail() { flags |=
static_cast<int>(Flag::F_FAIL); }
194 void unsetFail() { flags &= ~(
static_cast<int>(Flag::F_FAIL)); }
196 void setTrace() { flags |=
static_cast<int>(Flag::F_TRACE); }
197 void unsetTrace() { flags &= (~static_cast<
int>(Flag::F_TRACE)); }
198 bool getTrace() {
return flags &
static_cast<int>(Flag::F_TRACE); }
200 void setFlag(flags_t flag) { flags |= flag; }
201 void setFlag(
Flag flag) { flags |=
static_cast<flags_t
>(flag); }
202 void unsetFlag(flags_t flag) { flags &= (~flag); }
203 void unsetFlag(
Flag flag) { flags &= ~(
static_cast<flags_t
>(flag)); }
204 bool getFlag(flags_t flag) {
return flags & flag; }
205 bool getFlag(
Flag flag) {
return flags &
static_cast<flags_t
>(flag); }
207 void clearAllFlags() { flags = 0; }
208 flags_t getAllFlags() {
return flags; }
210 std::string getFlagString()
213 std::ostringstream str;
215 if ( getNoncacheable() ) {
216 str <<
"F_NONCACHEABLE";
237 for (
unsigned int i = 4; i <
sizeof(flags_t) * CHAR_BIT; i++ ) {
238 flags_t shift = 1 << i;
239 if ( getFlag(shift) ) {
266 static std::atomic<id_t> main_id;
280 class StoreConditional;
293 Read(
Addr physAddr, uint64_t size, flags_t flags = 0,
Addr virtAddr = 0,
Addr instPtr = 0, uint32_t tid = 0) :
312 std::vector<uint8_t> datavec(
318 bool needsResponse()
override {
return true; }
320 SST::Event* convert(RequestConverter* converter)
override {
return converter->convert(
this); }
322 void handle(RequestHandler* handler)
override {
return handler->handle(
this); }
324 std::string getString()
override 326 std::ostringstream str;
327 str <<
"ID: " <<
id <<
", Type: Read, Flags: [" << getFlagString() <<
"], PhysAddr: 0x" << std::hex << pAddr
328 <<
", VirtAddr: 0x" << vAddr;
329 str <<
", Size: " << std::dec << size <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec
344 StandardMem::Request::serialize_order(ser);
359 ReadResp(id_t rid,
Addr physAddr, uint64_t size, std::vector<uint8_t> respData, flags_t flags = 0,
360 Addr virtAddr = 0,
Addr instPtr = 0, uint32_t tid = 0) :
371 Request(readEv->getID(), readEv->getAllFlags()),
372 pAddr(readEv->pAddr),
373 vAddr(readEv->vAddr),
382 Request* makeResponse()
override {
return nullptr; }
384 bool needsResponse()
override {
return false; }
388 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
390 std::string getString()
override 392 std::ostringstream str;
393 str <<
"ID: " <<
id <<
", Type: ReadResp, Flags: [" << getFlagString() <<
"] PhysAddr: 0x" << std::hex
395 str <<
", VirtAddr: 0x" << vAddr <<
", Size: " << std::dec << size <<
", InstPtr: 0x" << std::hex << iPtr;
396 str <<
", ThreadID: " << std::dec << tid <<
", Payload: 0x" << std::hex;
397 str << std::setfill(
'0');
398 for ( std::vector<uint8_t>::iterator it = data.begin(); it != data.end(); it++ ) {
399 str << std::setw(2) << static_cast<unsigned>(*it);
408 std::vector<uint8_t> data;
419 StandardMem::Request::serialize_order(ser);
438 Write(
Addr physAddr, uint64_t size, std::vector<uint8_t> wData,
bool posted =
false, flags_t flags = 0,
439 Addr virtAddr = 0,
Addr instPtr = 0, uint32_t tid = 0) :
454 virtual bool needsResponse()
override {
return !posted; }
458 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
460 std::string getString()
override 462 std::ostringstream str;
463 str <<
"ID: " <<
id <<
", Type: Write, Flags: [" << getFlagString() <<
"], PhysAddr: 0x" << std::hex
465 str <<
", VirtAddr: 0x" << vAddr <<
", Size: " << std::dec << size <<
", Posted: " << (posted ?
"T" :
"F");
466 str <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec << tid <<
", Payload: 0x" 468 str << std::setfill(
'0');
469 for ( std::vector<uint8_t>::iterator it = data.begin(); it != data.end(); it++ ) {
470 str << std::setw(2) << static_cast<unsigned>(*it);
479 std::vector<uint8_t> data;
491 StandardMem::Request::serialize_order(ser);
520 Request(wr->getID(), wr->getAllFlags()),
530 virtual Request* makeResponse()
override {
return nullptr; }
532 virtual bool needsResponse()
override {
return false; }
534 SST::Event* convert(RequestConverter* converter)
override {
return converter->convert(
this); }
536 void handle(RequestHandler* handler)
override {
return handler->handle(
this); }
538 std::string getString()
override 540 std::ostringstream str;
541 str <<
"ID: " <<
id <<
", Type: WriteResp, Flags: [" << getFlagString() <<
"], PhysAddr: 0x" << std::hex
543 str <<
", VirtAddr: 0x" << vAddr <<
", Size: " << std::dec << size <<
", InstPtr: 0x" << std::hex << iPtr;
544 str <<
", ThreadID: " << std::dec << tid;
562 StandardMem::Request::serialize_order(ser);
581 FlushAddr(
Addr physAddr, uint64_t size,
bool inv, uint32_t depth, flags_t flags = 0,
Addr virtAddr = 0,
582 Addr instPtr = 0, uint32_t tid = 0) :
596 virtual bool needsResponse()
override {
return true; }
600 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
602 std::string getString()
override 604 std::ostringstream str;
605 str <<
"ID: " <<
id <<
", Type: FlushAddr, Flags: [" << getFlagString() <<
"], PhysAddr: 0x" << std::hex
607 str <<
", VirtAddr: 0x" << vAddr <<
", Size: " << std::dec << size <<
", Inv: " << (inv ?
"T" :
"F");
608 str <<
", Depth: " << depth <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec << tid;
628 StandardMem::Request::serialize_order(ser);
648 explicit FlushCache(uint32_t depth = std::numeric_limits<uint32_t>::max(), flags_t flags = 0,
Addr instPtr = 0,
659 virtual bool needsResponse()
override {
return true; }
663 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
665 std::string getString()
override 667 std::ostringstream str;
668 str <<
"ID: " <<
id <<
", Type: FlushCache, Flags: [" << getFlagString() <<
"], ";
669 str <<
"Depth: " << std::dec << depth <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec
682 StandardMem::Request::serialize_order(ser);
697 FlushResp(id_t
id,
Addr physAddr, uint64_t size, flags_t flags = 0,
Addr vAddr = 0,
Addr instPtr = 0,
707 Request(fl->getID(), fl->getAllFlags() | newFlags),
715 Request(fc->getID(), fc->getAllFlags() | newFlags),
724 virtual Request* makeResponse()
override {
return nullptr; }
726 virtual bool needsResponse()
override {
return false; }
730 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
732 std::string getString()
override 734 std::ostringstream str;
735 str <<
"ID: " <<
id <<
", Type: FlushResp, Flags: [" << getFlagString() <<
"], PhysAddr: 0x" << std::hex
737 str <<
", VirtAddr: 0x" << vAddr <<
", Size: " << std::dec << size;
738 str <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec << tid;
755 StandardMem::Request::serialize_order(ser);
778 Addr physAddr, uint64_t size, flags_t flags = 0,
Addr virtAddr = 0,
Addr instPtr = 0, uint32_t tid = 0) :
788 Request* makeResponse()
override 790 std::vector<uint8_t> datavec(size, 0);
792 return new ReadResp(
id, pAddr, size, datavec, flags, vAddr, iPtr, tid);
795 bool needsResponse()
override {
return true; }
799 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
801 std::string getString()
override 803 std::ostringstream str;
804 str <<
"ID: " <<
id <<
", Type: ReadLock, Flags: [" << getFlagString() <<
"] PhysAddr: 0x" << std::hex
805 << pAddr <<
", VirtAddr: 0x" << vAddr;
806 str <<
", Size: " << std::dec << size <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec
825 StandardMem::Request::serialize_order(ser);
843 WriteUnlock(
Addr physAddr, uint64_t size, std::vector<uint8_t> wData,
bool posted =
false, flags_t flags = 0,
844 Addr virtAddr = 0,
Addr instPtr = 0, uint32_t tid = 0) :
857 virtual Request* makeResponse()
override {
return new WriteResp(
id, pAddr, size, flags, vAddr = 0, iPtr, tid); }
859 virtual bool needsResponse()
override {
return !posted; }
863 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
865 std::string getString()
override 867 std::ostringstream str;
868 str <<
"ID: " <<
id <<
", Type: WriteUnlock, Flags: [" << getFlagString() <<
"], PhysAddr: 0x" << std::hex
870 str <<
", VirtAddr: 0x" << vAddr <<
", Size: " << std::dec << size <<
", Posted: " << (posted ?
"T" :
"F");
871 str <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec << tid <<
", Payload: 0x" 873 str << std::setfill(
'0');
874 for ( std::vector<uint8_t>::iterator it = data.begin(); it != data.end(); it++ ) {
875 str << std::setw(2) << static_cast<unsigned>(*it);
884 std::vector<uint8_t> data;
896 StandardMem::Request::serialize_order(ser);
921 Addr physAddr, uint64_t size, flags_t flags = 0,
Addr virtAddr = 0,
Addr instPtr = 0, uint32_t tid = 0) :
931 Request* makeResponse()
override 933 std::vector<uint8_t> datavec(size, 0);
935 return new ReadResp(
id, pAddr, size, datavec, flags, vAddr, iPtr, tid);
938 bool needsResponse()
override {
return true; }
942 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
944 std::string getString()
override 946 std::ostringstream str;
947 str <<
"ID: " <<
id <<
", Type: LoadLink, Flags: [" << getFlagString() <<
"] PhysAddr: 0x" << std::hex
948 << pAddr <<
", VirtAddr: 0x" << vAddr;
949 str <<
", Size: " << std::dec << size <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec
968 StandardMem::Request::serialize_order(ser);
987 Addr instPtr = 0, uint32_t tid = 0) :
1000 virtual Request* makeResponse()
override {
return new WriteResp(
id, pAddr, size, flags, vAddr, iPtr, tid); }
1002 virtual bool needsResponse()
override {
return true; }
1006 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
1008 std::string getString()
override 1010 std::ostringstream str;
1011 str <<
"ID: " <<
id <<
", Type: StoreConditional, Flags: [" << getFlagString() <<
"], PhysAddr: 0x" 1012 << std::hex << pAddr;
1013 str <<
", VirtAddr: 0x" << vAddr <<
", Size: " << std::dec << size;
1014 str <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec << tid <<
", Payload: 0x" 1016 str << std::setfill(
'0');
1017 for ( std::vector<uint8_t>::iterator it = data.begin(); it != data.end(); it++ ) {
1018 str << std::setw(2) << static_cast<unsigned>(*it);
1027 std::vector<uint8_t> data;
1038 StandardMem::Request::serialize_order(ser);
1057 MoveData(
Addr pSrc,
Addr pDst, uint64_t size,
bool posted =
false, flags_t flags = 0,
Addr vSrc = 0,
1058 Addr vDst = 0,
Addr iPtr = 0, uint32_t tid = 0) :
1071 virtual Request* makeResponse()
override {
return new WriteResp(
id, pDst, size, flags, vDst, iPtr, tid); }
1073 virtual bool needsResponse()
override {
return !posted; }
1077 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
1079 std::string getString()
override 1081 std::ostringstream str;
1082 str <<
"ID: " <<
id <<
", Type: MoveData, Flags: [" << getFlagString() <<
"], SrcPhysAddr: 0x" << std::hex
1084 str <<
", SrcVirtAddr: 0x" << vSrc <<
", DstPhysAddr: 0x" << pDst <<
", DstVirtAddr: 0x" << vDst;
1085 str <<
", Size: " << std::dec << size <<
", Posted: " << (posted ?
"T" :
"F");
1086 str <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec << tid;
1107 StandardMem::Request::serialize_order(ser);
1126 InvNotify(
Addr pAddr, uint64_t size, flags_t flags = 0,
Addr vAddr = 0,
Addr iPtr = 0, uint32_t tid = 0) :
1136 virtual Request* makeResponse()
override {
return nullptr; }
1138 virtual bool needsResponse()
override {
return false; }
1142 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
1144 std::string getString()
override 1146 std::ostringstream str;
1147 str <<
"ID: " <<
id <<
", Type: InvNotify, Flags: [" << getFlagString() <<
"], PhysAddr: 0x" << std::hex
1149 str <<
", VirtAddr: 0x" << vAddr <<
", Size: " << std::dec << size;
1150 str <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec << tid;
1167 StandardMem::Request::serialize_order(ser);
1186 virtual Addr getRoutingAddress() = 0;
1187 virtual uint64_t getSize() = 0;
1189 virtual bool needsResponse() = 0;
1190 virtual std::string getString() = 0;
1211 virtual bool needsResponse()
override {
return data->needsResponse(); }
1215 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
1217 std::string getString()
override 1219 std::ostringstream str;
1220 str <<
"ID: " <<
id <<
", Type: CustomReq, Flags: [" << getFlagString() <<
"], " << data->getString();
1221 str <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec << tid;
1278 StandardMem::Request::serialize_order(ser);
1297 Request(req->getID(), req->getAllFlags()),
1298 data(req->
getData().makeResponse()),
1304 virtual Request* makeResponse()
override {
return nullptr; }
1306 virtual bool needsResponse()
override {
return false; }
1310 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
1312 std::string getString()
override 1314 std::ostringstream str;
1315 str <<
"ID: " <<
id <<
", Type: CustomResp, Flags: [" << getFlagString() <<
"], " << data->getString();
1316 str <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec << tid;
1373 StandardMem::Request::serialize_order(ser);
1401 out.
fatal(CALL_INFO, -1,
"Error: Event converter for FlushCache requests is not implemented.\n");
1429 virtual void handle(
Read* UNUSED(request))
1431 out->
fatal(CALL_INFO, -1,
"Error: RequestHandler for Read requests is not implemented\n");
1433 virtual void handle(
ReadResp* UNUSED(request))
1435 out->
fatal(CALL_INFO, -1,
"Error: RequestHandler for ReadResp requests is not implemented\n");
1437 virtual void handle(
Write* UNUSED(request))
1439 out->
fatal(CALL_INFO, -1,
"Error: RequestHandler for Write requests is not implemented\n");
1441 virtual void handle(
WriteResp* UNUSED(request))
1443 out->
fatal(CALL_INFO, -1,
"Error: RequestHandler for WriteResp requests is not implemented\n");
1445 virtual void handle(
FlushAddr* UNUSED(request))
1447 out->
fatal(CALL_INFO, -1,
"Error: RequestHandler for FlushAddr requests is not implemented\n");
1449 virtual void handle(
FlushCache* UNUSED(request))
1451 out->
fatal(CALL_INFO, -1,
"Error: RequestHandler for FlushCache requests is not implemented\n");
1453 virtual void handle(
FlushResp* UNUSED(request))
1455 out->
fatal(CALL_INFO, -1,
"Error: RequestHandler for FlushResp requests is not implemented\n");
1457 virtual void handle(
ReadLock* UNUSED(request))
1459 out->
fatal(CALL_INFO, -1,
"Error: RequestHandler for ReadLock requests is not implemented\n");
1463 out->
fatal(CALL_INFO, -1,
"Error: RequestHandler for WriteUnlock requests is not implemented\n");
1465 virtual void handle(
LoadLink* UNUSED(request))
1467 out->
fatal(CALL_INFO, -1,
"Error: RequestHandler for LoadLink requests is not implemented\n");
1471 out->
fatal(CALL_INFO, -1,
"Error: RequestHandler for StoreConditional requests is not implemented\n");
1473 virtual void handle(
MoveData* UNUSED(request))
1475 out->
fatal(CALL_INFO, -1,
"Error: RequestHandler for MoveData requests is not implemented\n");
1477 virtual void handle(
CustomReq* UNUSED(request))
1479 out->
fatal(CALL_INFO, -1,
"Error: RequestHandler for CustomReq requests is not implemented\n");
1481 virtual void handle(
CustomResp* UNUSED(request))
1483 out->
fatal(CALL_INFO, -1,
"Error: RequestHandler for CustomResp requests is not implemented\n");
1485 virtual void handle(
InvNotify* UNUSED(request))
1487 out->
fatal(CALL_INFO, -1,
"Error: RequestHandler for InvNotify requests is not implemented\n");
1535 virtual void send(Request* req) = 0;
1547 virtual Request*
poll() = 0;
1579 SST::SubComponent::serialize_order(ser);
1585 #endif // SST_CORE_INTERFACES_STANDARDMEM_H Output object provides consistent method for outputting data to stdout, stderr and/or sst debug file...
Definition: output.h:57
void setData(CustomData *d)
Set the CustomData object associated with this response to a new value.
Definition: stdMem.h:1339
Definition: stdMem.h:1419
This class is basically a wrapper for objects to declare the order in which their members should be s...
Definition: serializer.h:42
CustomData * releaseData()
Obtain the CustomData object associated with this response.
Definition: stdMem.h:1360
Definition: stdMem.h:1287
Base template for handlers which take a class defined argument.
Definition: ssthandler.h:109
void fatal(uint32_t line, const char *file, const char *func, int exit_code, const char *format,...) const
Output the fatal message with formatting as specified by the format parameter.
Definition: output.cc:156
Request * makeResponse() override
Create read response.
Definition: stdMem.h:310
Response to a Write.
Definition: stdMem.h:505
Base template for the class.
Definition: ssthandler.h:1273
Definition: stdMem.h:1383
Conditional atomic update.
Definition: stdMem.h:917
Handler class with user-data argument.
Definition: ssthandler.h:1136
virtual Request * poll()=0
Receive a Request response from the side of the link.
A class to convert between a component's view of time and the core's view of time.
Definition: timeConverter.h:27
CustomData & getData()
Get the CustomData object associated with this response.
Definition: stdMem.h:1324
const CustomData & getData() const
Get the CustomData object associated with this response.
Definition: stdMem.h:1331
const CustomData & getData() const
Get the CustomData object associated with this request.
Definition: stdMem.h:1236
Definition: simpleNetwork.cc:18
Base class for StandardMem commands.
Definition: stdMem.h:140
Response to a Read.
Definition: stdMem.h:356
virtual ~WriteResp()
Destructor.
Definition: stdMem.h:528
Move: move data from one address to another Returns a WriteResp.
Definition: stdMem.h:1054
Generic interface to Memory models.
Definition: stdMem.h:75
Definition: serializable.h:23
CustomData & getData()
Get the CustomData object associated with this request.
Definition: stdMem.h:1229
CustomData * resetData(CustomData *d=nullptr)
Reset the CustomData object associated with this response to a new value.
Definition: stdMem.h:1353
virtual void setMemoryMappedAddressRegion(Addr start, Addr size)=0
Sets the physical memory address(es), if any, that are mapped to this endpoint.
void serialize_order(SST::Core::Serialization::serializer &ser) override
Serialization function.
Definition: stdMem.h:1577
Definition: stdMem.h:1181
StandardMem()
Default constructor, used for serialization ONLY.
Definition: stdMem.h:1510
Locked atomic update -> guaranteed success A ReadLock must be followed by a WriteUnlock.
Definition: stdMem.h:774
virtual Request * recvUntimedData()=0
Receive any data during the init()/complete() phases.
Response to a flush request.
Definition: stdMem.h:694
Flag
Flags that modify requests.
Definition: stdMem.h:151
Read request.
Definition: stdMem.h:290
CustomData * resetData(CustomData *d=nullptr)
Reset the CustomData object associated with this request to a new value.
Definition: stdMem.h:1258
Notifies endpoint that an address has been invalidated from the L1.
Definition: stdMem.h:1123
Definition: stdMem.h:1198
WriteResp(id_t id, Addr physAddr, uint64_t size, flags_t flags=0, Addr virtAddr=0, Addr instPtr=0, uint32_t tid=0)
Manually construct a write response.
Definition: stdMem.h:509
Parameter store.
Definition: params.h:63
void setData(CustomData *d)
Set the CustomData object associated with this request to a new value.
Definition: stdMem.h:1244
virtual Addr getLineSize()=0
Get cache/memory line size (in bytes) from the memory system.
virtual void send(Request *req)=0
Send a Request through the interface.
virtual void sendUntimedData(Request *req)=0
Sends a memory-based request during the init()/complete() phases.
StandardMem(SST::ComponentId_t id, Params &UNUSED(params), TimeConverter *&UNUSED(time), HandlerBase *&UNUSED(handler))
Constructor, designed to be used via 'loadUserSubComponent' and 'loadAnonymousSubComponent'.
Definition: stdMem.h:1504
uint64_t Addr
All Addresses can be 64-bit.
Definition: stdMem.h:134
CustomData * releaseData()
Obtain the CustomData object associated with this request.
Definition: stdMem.h:1265
Base class for Events - Items sent across links to communicate between components.
Definition: event.h:40
SubComponent is a class loadable through the factory which allows dynamic functionality to be added t...
Definition: subcomponent.h:28
Request to write data.
Definition: stdMem.h:434
WriteResp(Write *wr)
Automatically construct a write response from a Write.
Definition: stdMem.h:519