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"
40namespace SST::Interfaces {
102 template <
typename classT, auto funcT,
typename dataT =
void>
123 template <
typename classT, auto funcT,
typename dataT =
void>
124 using Handler2 [[deprecated(
125 "The name Handler2 has been deprecated and will be removed in SST 17. Please rename Handler2 to Handler.")]]
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) ) {
253 ImplementVirtualSerializable(SST::Interfaces::StandardMem::Request);
254 virtual void serialize_order(SST::Core::Serialization::serializer& ser)
override
266 static std::atomic<id_t> main_id;
290 class Read :
public Request
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
342 void serialize_order(SST::Core::Serialization::serializer& ser)
override
344 StandardMem::Request::serialize_order(ser);
352 ImplementSerializable(SST::Interfaces::StandardMem::Read);
356 class ReadResp :
public Request
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) :
370 ReadResp(
Read* readEv, std::vector<uint8_t> respData) :
371 Request(readEv->getID(), readEv->getAllFlags()),
372 pAddr(readEv->pAddr),
373 vAddr(readEv->vAddr),
380 virtual ~ReadResp() {}
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);
434 class Write :
public Request
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) :
452 virtual Request* makeResponse()
override {
return new WriteResp(
this); }
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;
560 void serialize_order(SST::Core::Serialization::serializer& ser)
override
562 StandardMem::Request::serialize_order(ser);
570 ImplementSerializable(SST::Interfaces::StandardMem::WriteResp);
578 class FlushAddr :
public Request
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) :
592 virtual ~FlushAddr() {}
594 virtual Request* makeResponse()
override {
return new FlushResp(
this); }
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);
645 class FlushCache :
public Request
648 explicit FlushCache(uint32_t depth = std::numeric_limits<uint32_t>::max(), flags_t flags = 0,
Addr instPtr = 0,
655 virtual ~FlushCache() {}
657 virtual Request* makeResponse()
override {
return new FlushResp(
this); }
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);
694 class FlushResp :
public Request
697 FlushResp(id_t
id,
Addr physAddr, uint64_t size, flags_t flags = 0,
Addr vAddr = 0,
Addr instPtr = 0,
706 explicit FlushResp(
FlushAddr* fl, flags_t newFlags = 0) :
707 Request(fl->getID(), fl->getAllFlags() | newFlags),
714 explicit FlushResp(
FlushCache* fc, flags_t newFlags = 0) :
715 Request(fc->getID(), fc->getAllFlags() | newFlags),
722 virtual ~FlushResp() {}
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);
774 class ReadLock :
public Request
778 Addr physAddr, uint64_t size, flags_t flags = 0,
Addr virtAddr = 0,
Addr instPtr = 0, uint32_t tid = 0) :
786 virtual ~ReadLock() {}
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);
840 class WriteUnlock :
public Request
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) :
855 virtual ~WriteUnlock() {}
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);
917 class LoadLink :
public Request
921 Addr physAddr, uint64_t size, flags_t flags = 0,
Addr virtAddr = 0,
Addr instPtr = 0, uint32_t tid = 0) :
929 virtual ~LoadLink() {}
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);
983 class StoreConditional :
public Request
986 StoreConditional(
Addr physAddr, uint64_t size, std::vector<uint8_t> wData, flags_t flags = 0,
Addr virtAddr = 0,
987 Addr instPtr = 0, uint32_t tid = 0) :
997 virtual ~StoreConditional() {}
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;
1032 StoreConditional() :
1038 StandardMem::Request::serialize_order(ser);
1054 class MoveData :
public Request
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) :
1069 virtual ~MoveData() {}
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);
1123 class InvNotify :
public Request
1126 InvNotify(
Addr pAddr, uint64_t size, flags_t flags = 0,
Addr vAddr = 0,
Addr iPtr = 0, uint32_t tid = 0) :
1134 virtual ~InvNotify() {}
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);
1185 virtual ~CustomData() {}
1186 virtual Addr getRoutingAddress() = 0;
1187 virtual uint64_t getSize() = 0;
1188 virtual CustomData* makeResponse() = 0;
1189 virtual bool needsResponse() = 0;
1190 virtual std::string getString() = 0;
1195 ImplementVirtualSerializable(CustomData);
1198 class CustomReq :
public Request
1201 explicit CustomReq(
CustomData* data, flags_t flags = 0,
Addr iPtr = 0, uint32_t tid = 0) :
1207 virtual ~CustomReq() {}
1209 virtual Request* makeResponse()
override {
return new CustomResp(
this); }
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);
1287 class CustomResp :
public Request
1290 CustomResp(id_t
id,
CustomData* data, flags_t flags = 0,
Addr iPtr = 0, uint32_t tid = 0) :
1297 Request(req->getID(), req->getAllFlags()),
1298 data(req->
getData().makeResponse()),
1302 virtual ~CustomResp() {}
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);
1386 RequestConverter() {}
1387 virtual ~RequestConverter() {}
1401 out.
fatal(CALL_INFO, -1,
"Error: Event converter for FlushCache requests is not implemented.\n");
1415 ImplementVirtualSerializable(RequestConverter);
1422 RequestHandler() =
default;
1426 virtual ~RequestHandler() =
default;
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");
1494 ImplementSerializable(RequestHandler);
1579 SST::SubComponent::serialize_order(ser);
Main component object for the simulation.
Definition component.h:32
Definition serializable.h:25
This class is basically a wrapper for objects to declare the order in which their members should be s...
Definition serializer.h:43
Base class for Events - Items sent across links to communicate between components.
Definition event.h:41
CustomData * releaseData()
Obtain the CustomData object associated with this request.
Definition stdMem.h:1265
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 request to a new value.
Definition stdMem.h:1258
void setData(CustomData *d)
Set the CustomData object associated with this request to a new value.
Definition stdMem.h:1244
const CustomData & getData() const
Get the CustomData object associated with this request.
Definition stdMem.h:1236
void setData(CustomData *d)
Set the CustomData object associated with this response to a new value.
Definition stdMem.h:1339
CustomData * releaseData()
Obtain the CustomData object associated with this response.
Definition stdMem.h:1360
CustomData * resetData(CustomData *d=nullptr)
Reset the CustomData object associated with this response to a new value.
Definition stdMem.h:1353
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
Response to a flush request.
Definition stdMem.h:695
Notifies endpoint that an address has been invalidated from the L1.
Definition stdMem.h:1124
Conditional atomic update.
Definition stdMem.h:918
Move: move data from one address to another Returns a WriteResp.
Definition stdMem.h:1055
Locked atomic update -> guaranteed success A ReadLock must be followed by a WriteUnlock.
Definition stdMem.h:775
Response to a Read.
Definition stdMem.h:357
Read request.
Definition stdMem.h:291
Request * makeResponse() override
Create read response.
Definition stdMem.h:310
Base class for StandardMem commands.
Definition stdMem.h:141
Flag
Flags that modify requests.
Definition stdMem.h:151
Response to a Write.
Definition stdMem.h:506
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
WriteResp(Write *wr)
Automatically construct a write response from a Write.
Definition stdMem.h:519
virtual ~WriteResp()
Destructor.
Definition stdMem.h:528
Request to write data.
Definition stdMem.h:435
Generic interface to Memory models.
Definition stdMem.h:76
SSTHandlerBase< void, Request * > HandlerBase
Base handler for request handling.
Definition stdMem.h:82
virtual Request * recvUntimedData()=0
Receive any data during the init()/complete() phases.
virtual Request * poll()=0
Receive a Request response from the side of the link.
virtual Addr getLineSize()=0
Get cache/memory line size (in bytes) from the memory system.
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
void serialize_order(SST::Core::Serialization::serializer &ser) override
Serialization function.
Definition stdMem.h:1577
StandardMem()
Default constructor, used for serialization ONLY.
Definition stdMem.h:1510
virtual void sendUntimedData(Request *req)=0
Sends a memory-based request during the init()/complete() phases.
virtual void setMemoryMappedAddressRegion(Addr start, Addr size)=0
Sets the physical memory address(es), if any, that are mapped to this endpoint.
SSTHandler< void, Request *, classT, dataT, funcT > Handler
Used to create checkpointable handlers for request handling.
Definition stdMem.h:103
virtual void send(Request *req)=0
Send a Request through the interface.
Output object provides consistent method for outputting data to stdout, stderr and/or sst debug file.
Definition output.h:58
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
@ STDERR
Definition output.h:65
Parameter store.
Definition params.h:65
Base template for handlers which take a class defined argument.
Definition ssthandler.h:79
Base template for the class.
Definition ssthandler.h:1102
A class to convert between a component's view of time and the core's view of time.
Definition timeConverter.h:31