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"
37namespace SST::Interfaces {
99 template <
typename classT,
typename dataT =
void>
101 [[deprecated(
"Handler has been deprecated. Please use Handler2 instead as it supports checkpointing.")]] =
122 template <
typename classT, auto funcT,
typename dataT =
void>
132#define PRI_ADDR PRIx64
140 using id_t = uint64_t;
141 using flags_t = uint32_t;
149 F_NONCACHEABLE = 1 << 1,
152 F_RESERVED = 1 << 16,
155 explicit Request(flags_t fl = 0)
160 Request(id_t rid, flags_t flags = 0) :
165 virtual ~Request() {}
167 id_t getID() {
return id; }
171 virtual bool needsResponse() = 0;
174 virtual SST::Event* convert(RequestConverter* converter) = 0;
176 virtual void handle(RequestHandler* handler) = 0;
179 virtual std::string getString() = 0;
182 void setNoncacheable() { flags |=
static_cast<int>(Flag::F_NONCACHEABLE); }
183 void unsetNoncacheable() { flags &= ~(
static_cast<int>(Flag::F_NONCACHEABLE)); }
184 bool getNoncacheable() {
return flags &
static_cast<int>(Flag::F_NONCACHEABLE); }
186 void setSuccess() { unsetFail(); }
187 void unsetSuccess() { setFail(); }
188 bool getSuccess() {
return (flags &
static_cast<int>(Flag::F_FAIL)) == 0; }
189 bool getFail() {
return flags &
static_cast<int>(Flag::F_FAIL); }
190 void setFail() { flags |=
static_cast<int>(Flag::F_FAIL); }
191 void unsetFail() { flags &= ~(
static_cast<int>(Flag::F_FAIL)); }
193 void setTrace() { flags |=
static_cast<int>(Flag::F_TRACE); }
194 void unsetTrace() { flags &= (~static_cast<int>(Flag::F_TRACE)); }
195 bool getTrace() {
return flags &
static_cast<int>(Flag::F_TRACE); }
197 void setFlag(flags_t flag) { flags |= flag; }
198 void setFlag(
Flag flag) { flags |=
static_cast<flags_t
>(flag); }
199 void unsetFlag(flags_t flag) { flags &= (~flag); }
200 void unsetFlag(
Flag flag) { flags &= ~(
static_cast<flags_t
>(flag)); }
201 bool getFlag(flags_t flag) {
return flags & flag; }
202 bool getFlag(
Flag flag) {
return flags &
static_cast<flags_t
>(flag); }
204 void clearAllFlags() { flags = 0; }
205 flags_t getAllFlags() {
return flags; }
207 std::string getFlagString()
210 std::ostringstream str;
212 if ( getNoncacheable() ) {
213 str <<
"F_NONCACHEABLE";
234 for (
unsigned int i = 4; i <
sizeof(flags_t) * CHAR_BIT; i++ ) {
235 flags_t shift = 1 << i;
236 if ( getFlag(shift) ) {
250 ImplementVirtualSerializable(SST::Interfaces::StandardMem::Request);
251 virtual void serialize_order(SST::Core::Serialization::serializer& ser)
override
263 static std::atomic<id_t> main_id;
287 class Read :
public Request
290 Read(
Addr physAddr, uint64_t size, flags_t flags = 0,
Addr virtAddr = 0,
Addr instPtr = 0, uint32_t tid = 0) :
309 std::vector<uint8_t> datavec(
315 bool needsResponse()
override {
return true; }
317 SST::Event* convert(RequestConverter* converter)
override {
return converter->convert(
this); }
319 void handle(RequestHandler* handler)
override {
return handler->handle(
this); }
321 std::string getString()
override
323 std::ostringstream str;
324 str <<
"ID: " <<
id <<
", Type: Read, Flags: [" << getFlagString() <<
"], PhysAddr: 0x" << std::hex << pAddr
325 <<
", VirtAddr: 0x" << vAddr;
326 str <<
", Size: " << std::dec << size <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec
339 void serialize_order(SST::Core::Serialization::serializer& ser)
override
341 StandardMem::Request::serialize_order(ser);
349 ImplementSerializable(SST::Interfaces::StandardMem::Read);
353 class ReadResp :
public Request
356 ReadResp(id_t rid,
Addr physAddr, uint64_t size, std::vector<uint8_t> respData, flags_t flags = 0,
357 Addr virtAddr = 0,
Addr instPtr = 0, uint32_t tid = 0) :
367 ReadResp(
Read* readEv, std::vector<uint8_t> respData) :
368 Request(readEv->getID(), readEv->getAllFlags()),
369 pAddr(readEv->pAddr),
370 vAddr(readEv->vAddr),
377 virtual ~ReadResp() {}
379 Request* makeResponse()
override {
return nullptr; }
381 bool needsResponse()
override {
return false; }
385 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
387 std::string getString()
override
389 std::ostringstream str;
390 str <<
"ID: " <<
id <<
", Type: ReadResp, Flags: [" << getFlagString() <<
"] PhysAddr: 0x" << std::hex
392 str <<
", VirtAddr: 0x" << vAddr <<
", Size: " << std::dec << size <<
", InstPtr: 0x" << std::hex << iPtr;
393 str <<
", ThreadID: " << std::dec << tid <<
", Payload: 0x" << std::hex;
394 str << std::setfill(
'0');
395 for ( std::vector<uint8_t>::iterator it = data.begin(); it != data.end(); it++ ) {
396 str << std::setw(2) << static_cast<unsigned>(*it);
405 std::vector<uint8_t> data;
416 StandardMem::Request::serialize_order(ser);
431 class Write :
public Request
435 Write(
Addr physAddr, uint64_t size, std::vector<uint8_t> wData,
bool posted =
false, flags_t flags = 0,
436 Addr virtAddr = 0,
Addr instPtr = 0, uint32_t tid = 0) :
449 virtual Request* makeResponse()
override {
return new WriteResp(
this); }
451 virtual bool needsResponse()
override {
return !posted; }
455 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
457 std::string getString()
override
459 std::ostringstream str;
460 str <<
"ID: " <<
id <<
", Type: Write, Flags: [" << getFlagString() <<
"], PhysAddr: 0x" << std::hex
462 str <<
", VirtAddr: 0x" << vAddr <<
", Size: " << std::dec << size <<
", Posted: " << (posted ?
"T" :
"F");
463 str <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec << tid <<
", Payload: 0x"
465 str << std::setfill(
'0');
466 for ( std::vector<uint8_t>::iterator it = data.begin(); it != data.end(); it++ ) {
467 str << std::setw(2) << static_cast<unsigned>(*it);
476 std::vector<uint8_t> data;
488 StandardMem::Request::serialize_order(ser);
517 Request(wr->getID(), wr->getAllFlags()),
527 virtual Request* makeResponse()
override {
return nullptr; }
529 virtual bool needsResponse()
override {
return false; }
531 SST::Event* convert(RequestConverter* converter)
override {
return converter->convert(
this); }
533 void handle(RequestHandler* handler)
override {
return handler->handle(
this); }
535 std::string getString()
override
537 std::ostringstream str;
538 str <<
"ID: " <<
id <<
", Type: WriteResp, Flags: [" << getFlagString() <<
"], PhysAddr: 0x" << std::hex
540 str <<
", VirtAddr: 0x" << vAddr <<
", Size: " << std::dec << size <<
", InstPtr: 0x" << std::hex << iPtr;
541 str <<
", ThreadID: " << std::dec << tid;
557 void serialize_order(SST::Core::Serialization::serializer& ser)
override
559 StandardMem::Request::serialize_order(ser);
567 ImplementSerializable(SST::Interfaces::StandardMem::WriteResp);
575 class FlushAddr :
public Request
578 FlushAddr(
Addr physAddr, uint64_t size,
bool inv, uint32_t depth, flags_t flags = 0,
Addr virtAddr = 0,
579 Addr instPtr = 0, uint32_t tid = 0) :
589 virtual ~FlushAddr() {}
591 virtual Request* makeResponse()
override {
return new FlushResp(
this); }
593 virtual bool needsResponse()
override {
return true; }
597 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
599 std::string getString()
override
601 std::ostringstream str;
602 str <<
"ID: " <<
id <<
", Type: FlushAddr, Flags: [" << getFlagString() <<
"], PhysAddr: 0x" << std::hex
604 str <<
", VirtAddr: 0x" << vAddr <<
", Size: " << std::dec << size <<
", Inv: " << (inv ?
"T" :
"F");
605 str <<
", Depth: " << depth <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec << tid;
625 StandardMem::Request::serialize_order(ser);
642 class FlushCache :
public Request
645 explicit FlushCache(uint32_t depth = std::numeric_limits<uint32_t>::max(), flags_t flags = 0,
Addr instPtr = 0,
652 virtual ~FlushCache() {}
654 virtual Request* makeResponse()
override {
return new FlushResp(
this); }
656 virtual bool needsResponse()
override {
return true; }
660 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
662 std::string getString()
override
664 std::ostringstream str;
665 str <<
"ID: " <<
id <<
", Type: FlushCache, Flags: [" << getFlagString() <<
"], ";
666 str <<
"Depth: " << std::dec << depth <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec
679 StandardMem::Request::serialize_order(ser);
691 class FlushResp :
public Request
694 FlushResp(id_t
id,
Addr physAddr, uint64_t size, flags_t flags = 0,
Addr vAddr = 0,
Addr instPtr = 0,
703 explicit FlushResp(
FlushAddr* fl, flags_t newFlags = 0) :
704 Request(fl->getID(), fl->getAllFlags() | newFlags),
711 explicit FlushResp(
FlushCache* fc, flags_t newFlags = 0) :
712 Request(fc->getID(), fc->getAllFlags() | newFlags),
719 virtual ~FlushResp() {}
721 virtual Request* makeResponse()
override {
return nullptr; }
723 virtual bool needsResponse()
override {
return false; }
727 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
729 std::string getString()
override
731 std::ostringstream str;
732 str <<
"ID: " <<
id <<
", Type: FlushResp, Flags: [" << getFlagString() <<
"], PhysAddr: 0x" << std::hex
734 str <<
", VirtAddr: 0x" << vAddr <<
", Size: " << std::dec << size;
735 str <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec << tid;
752 StandardMem::Request::serialize_order(ser);
771 class ReadLock :
public Request
775 Addr physAddr, uint64_t size, flags_t flags = 0,
Addr virtAddr = 0,
Addr instPtr = 0, uint32_t tid = 0) :
783 virtual ~ReadLock() {}
785 Request* makeResponse()
override
787 std::vector<uint8_t> datavec(size, 0);
789 return new ReadResp(
id, pAddr, size, datavec, flags, vAddr, iPtr, tid);
792 bool needsResponse()
override {
return true; }
796 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
798 std::string getString()
override
800 std::ostringstream str;
801 str <<
"ID: " <<
id <<
", Type: ReadLock, Flags: [" << getFlagString() <<
"] PhysAddr: 0x" << std::hex
802 << pAddr <<
", VirtAddr: 0x" << vAddr;
803 str <<
", Size: " << std::dec << size <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec
822 StandardMem::Request::serialize_order(ser);
837 class WriteUnlock :
public Request
840 WriteUnlock(
Addr physAddr, uint64_t size, std::vector<uint8_t> wData,
bool posted =
false, flags_t flags = 0,
841 Addr virtAddr = 0,
Addr instPtr = 0, uint32_t tid = 0) :
852 virtual ~WriteUnlock() {}
854 virtual Request* makeResponse()
override {
return new WriteResp(
id, pAddr, size, flags, vAddr = 0, iPtr, tid); }
856 virtual bool needsResponse()
override {
return !posted; }
860 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
862 std::string getString()
override
864 std::ostringstream str;
865 str <<
"ID: " <<
id <<
", Type: WriteUnlock, Flags: [" << getFlagString() <<
"], PhysAddr: 0x" << std::hex
867 str <<
", VirtAddr: 0x" << vAddr <<
", Size: " << std::dec << size <<
", Posted: " << (posted ?
"T" :
"F");
868 str <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec << tid <<
", Payload: 0x"
870 str << std::setfill(
'0');
871 for ( std::vector<uint8_t>::iterator it = data.begin(); it != data.end(); it++ ) {
872 str << std::setw(2) << static_cast<unsigned>(*it);
881 std::vector<uint8_t> data;
893 StandardMem::Request::serialize_order(ser);
914 class LoadLink :
public Request
918 Addr physAddr, uint64_t size, flags_t flags = 0,
Addr virtAddr = 0,
Addr instPtr = 0, uint32_t tid = 0) :
926 virtual ~LoadLink() {}
928 Request* makeResponse()
override
930 std::vector<uint8_t> datavec(size, 0);
932 return new ReadResp(
id, pAddr, size, datavec, flags, vAddr, iPtr, tid);
935 bool needsResponse()
override {
return true; }
939 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
941 std::string getString()
override
943 std::ostringstream str;
944 str <<
"ID: " <<
id <<
", Type: LoadLink, Flags: [" << getFlagString() <<
"] PhysAddr: 0x" << std::hex
945 << pAddr <<
", VirtAddr: 0x" << vAddr;
946 str <<
", Size: " << std::dec << size <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec
965 StandardMem::Request::serialize_order(ser);
980 class StoreConditional :
public Request
983 StoreConditional(
Addr physAddr, uint64_t size, std::vector<uint8_t> wData, flags_t flags = 0,
Addr virtAddr = 0,
984 Addr instPtr = 0, uint32_t tid = 0) :
994 virtual ~StoreConditional() {}
997 virtual Request* makeResponse()
override {
return new WriteResp(
id, pAddr, size, flags, vAddr, iPtr, tid); }
999 virtual bool needsResponse()
override {
return true; }
1003 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
1005 std::string getString()
override
1007 std::ostringstream str;
1008 str <<
"ID: " <<
id <<
", Type: StoreConditional, Flags: [" << getFlagString() <<
"], PhysAddr: 0x"
1009 << std::hex << pAddr;
1010 str <<
", VirtAddr: 0x" << vAddr <<
", Size: " << std::dec << size;
1011 str <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec << tid <<
", Payload: 0x"
1013 str << std::setfill(
'0');
1014 for ( std::vector<uint8_t>::iterator it = data.begin(); it != data.end(); it++ ) {
1015 str << std::setw(2) << static_cast<unsigned>(*it);
1024 std::vector<uint8_t> data;
1029 StoreConditional() :
1035 StandardMem::Request::serialize_order(ser);
1051 class MoveData :
public Request
1054 MoveData(
Addr pSrc,
Addr pDst, uint64_t size,
bool posted =
false, flags_t flags = 0,
Addr vSrc = 0,
1055 Addr vDst = 0,
Addr iPtr = 0, uint32_t tid = 0) :
1066 virtual ~MoveData() {}
1068 virtual Request* makeResponse()
override {
return new WriteResp(
id, pDst, size, flags, vDst, iPtr, tid); }
1070 virtual bool needsResponse()
override {
return !posted; }
1074 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
1076 std::string getString()
override
1078 std::ostringstream str;
1079 str <<
"ID: " <<
id <<
", Type: MoveData, Flags: [" << getFlagString() <<
"], SrcPhysAddr: 0x" << std::hex
1081 str <<
", SrcVirtAddr: 0x" << vSrc <<
", DstPhysAddr: 0x" << pDst <<
", DstVirtAddr: 0x" << vDst;
1082 str <<
", Size: " << std::dec << size <<
", Posted: " << (posted ?
"T" :
"F");
1083 str <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec << tid;
1104 StandardMem::Request::serialize_order(ser);
1120 class InvNotify :
public Request
1123 InvNotify(
Addr pAddr, uint64_t size, flags_t flags = 0,
Addr vAddr = 0,
Addr iPtr = 0, uint32_t tid = 0) :
1131 virtual ~InvNotify() {}
1133 virtual Request* makeResponse()
override {
return nullptr; }
1135 virtual bool needsResponse()
override {
return false; }
1139 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
1141 std::string getString()
override
1143 std::ostringstream str;
1144 str <<
"ID: " <<
id <<
", Type: InvNotify, Flags: [" << getFlagString() <<
"], PhysAddr: 0x" << std::hex
1146 str <<
", VirtAddr: 0x" << vAddr <<
", Size: " << std::dec << size;
1147 str <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec << tid;
1164 StandardMem::Request::serialize_order(ser);
1182 virtual ~CustomData() {}
1183 virtual Addr getRoutingAddress() = 0;
1184 virtual uint64_t getSize() = 0;
1185 virtual CustomData* makeResponse() = 0;
1186 virtual bool needsResponse() = 0;
1187 virtual std::string getString() = 0;
1192 ImplementVirtualSerializable(CustomData);
1195 class CustomReq :
public Request
1198 explicit CustomReq(
CustomData* data, flags_t flags = 0,
Addr iPtr = 0, uint32_t tid = 0) :
1204 virtual ~CustomReq() {}
1206 virtual Request* makeResponse()
override {
return new CustomResp(
this); }
1208 virtual bool needsResponse()
override {
return data->needsResponse(); }
1212 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
1214 std::string getString()
override
1216 std::ostringstream str;
1217 str <<
"ID: " <<
id <<
", Type: CustomReq, Flags: [" << getFlagString() <<
"], " << data->getString();
1218 str <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec << tid;
1275 StandardMem::Request::serialize_order(ser);
1284 class CustomResp :
public Request
1287 CustomResp(id_t
id,
CustomData* data, flags_t flags = 0,
Addr iPtr = 0, uint32_t tid = 0) :
1294 Request(req->getID(), req->getAllFlags()),
1295 data(req->
getData().makeResponse()),
1299 virtual ~CustomResp() {}
1301 virtual Request* makeResponse()
override {
return nullptr; }
1303 virtual bool needsResponse()
override {
return false; }
1307 void handle(
RequestHandler* handler)
override {
return handler->handle(
this); }
1309 std::string getString()
override
1311 std::ostringstream str;
1312 str <<
"ID: " <<
id <<
", Type: CustomResp, Flags: [" << getFlagString() <<
"], " << data->getString();
1313 str <<
", InstPtr: 0x" << std::hex << iPtr <<
", ThreadID: " << std::dec << tid;
1370 StandardMem::Request::serialize_order(ser);
1383 RequestConverter() {}
1384 virtual ~RequestConverter() {}
1398 out.
fatal(CALL_INFO, -1,
"Error: Event converter for FlushCache requests is not implemented.\n");
1412 ImplementVirtualSerializable(RequestConverter);
1419 RequestHandler() =
default;
1423 virtual ~RequestHandler() =
default;
1426 virtual void handle(
Read* UNUSED(request))
1428 out->fatal(CALL_INFO, -1,
"Error: RequestHandler for Read requests is not implemented\n");
1430 virtual void handle(
ReadResp* UNUSED(request))
1432 out->fatal(CALL_INFO, -1,
"Error: RequestHandler for ReadResp requests is not implemented\n");
1434 virtual void handle(
Write* UNUSED(request))
1436 out->fatal(CALL_INFO, -1,
"Error: RequestHandler for Write requests is not implemented\n");
1438 virtual void handle(
WriteResp* UNUSED(request))
1440 out->fatal(CALL_INFO, -1,
"Error: RequestHandler for WriteResp requests is not implemented\n");
1442 virtual void handle(
FlushAddr* UNUSED(request))
1444 out->fatal(CALL_INFO, -1,
"Error: RequestHandler for FlushAddr requests is not implemented\n");
1446 virtual void handle(
FlushCache* UNUSED(request))
1448 out->fatal(CALL_INFO, -1,
"Error: RequestHandler for FlushCache requests is not implemented\n");
1450 virtual void handle(
FlushResp* UNUSED(request))
1452 out->fatal(CALL_INFO, -1,
"Error: RequestHandler for FlushResp requests is not implemented\n");
1454 virtual void handle(
ReadLock* UNUSED(request))
1456 out->fatal(CALL_INFO, -1,
"Error: RequestHandler for ReadLock requests is not implemented\n");
1460 out->fatal(CALL_INFO, -1,
"Error: RequestHandler for WriteUnlock requests is not implemented\n");
1462 virtual void handle(
LoadLink* UNUSED(request))
1464 out->fatal(CALL_INFO, -1,
"Error: RequestHandler for LoadLink requests is not implemented\n");
1468 out->fatal(CALL_INFO, -1,
"Error: RequestHandler for StoreConditional requests is not implemented\n");
1470 virtual void handle(
MoveData* UNUSED(request))
1472 out->fatal(CALL_INFO, -1,
"Error: RequestHandler for MoveData requests is not implemented\n");
1474 virtual void handle(
CustomReq* UNUSED(request))
1476 out->fatal(CALL_INFO, -1,
"Error: RequestHandler for CustomReq requests is not implemented\n");
1478 virtual void handle(
CustomResp* UNUSED(request))
1480 out->fatal(CALL_INFO, -1,
"Error: RequestHandler for CustomResp requests is not implemented\n");
1482 virtual void handle(
InvNotify* UNUSED(request))
1484 out->fatal(CALL_INFO, -1,
"Error: RequestHandler for InvNotify requests is not implemented\n");
1491 ImplementSerializable(RequestHandler);
1576 SST::SubComponent::serialize_order(ser);
Main component object for the simulation.
Definition component.h:31
Definition serializable.h:24
This class is basically a wrapper for objects to declare the order in which their members should be s...
Definition serializer.h:45
Base class for Events - Items sent across links to communicate between components.
Definition event.h:35
CustomData * releaseData()
Obtain the CustomData object associated with this request.
Definition stdMem.h:1262
CustomData & getData()
Get the CustomData object associated with this request.
Definition stdMem.h:1226
CustomData * resetData(CustomData *d=nullptr)
Reset the CustomData object associated with this request to a new value.
Definition stdMem.h:1255
void setData(CustomData *d)
Set the CustomData object associated with this request to a new value.
Definition stdMem.h:1241
const CustomData & getData() const
Get the CustomData object associated with this request.
Definition stdMem.h:1233
void setData(CustomData *d)
Set the CustomData object associated with this response to a new value.
Definition stdMem.h:1336
CustomData * releaseData()
Obtain the CustomData object associated with this response.
Definition stdMem.h:1357
CustomData * resetData(CustomData *d=nullptr)
Reset the CustomData object associated with this response to a new value.
Definition stdMem.h:1350
CustomData & getData()
Get the CustomData object associated with this response.
Definition stdMem.h:1321
const CustomData & getData() const
Get the CustomData object associated with this response.
Definition stdMem.h:1328
Response to a flush request.
Definition stdMem.h:692
Notifies endpoint that an address has been invalidated from the L1.
Definition stdMem.h:1121
Conditional atomic update.
Definition stdMem.h:915
Move: move data from one address to another Returns a WriteResp.
Definition stdMem.h:1052
Locked atomic update -> guaranteed success A ReadLock must be followed by a WriteUnlock.
Definition stdMem.h:772
Response to a Read.
Definition stdMem.h:354
Read request.
Definition stdMem.h:288
Request * makeResponse() override
Create read response.
Definition stdMem.h:307
Base class for StandardMem commands.
Definition stdMem.h:138
Flag
Flags that modify requests.
Definition stdMem.h:148
Response to a Write.
Definition stdMem.h:503
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:506
WriteResp(Write *wr)
Automatically construct a write response from a Write.
Definition stdMem.h:516
virtual ~WriteResp()
Destructor.
Definition stdMem.h:525
Request to write data.
Definition stdMem.h:432
Generic interface to Memory models.
Definition stdMem.h:73
SSTHandlerBase< void, Request * > HandlerBase
Base handler for request handling.
Definition stdMem.h:79
SSTHandler2< void, Request *, classT, dataT, funcT > Handler2
Used to create checkpointable handlers for request handling.
Definition stdMem.h:123
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.
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:1501
virtual Addr getLineSize()=0
Get cache/memory line size (in bytes) from the memory system.
uint64_t Addr
All Addresses can be 64-bit.
Definition stdMem.h:131
void serialize_order(SST::Core::Serialization::serializer &ser) override
Serialization function.
Definition stdMem.h:1574
StandardMem()
Default constructor, used for serialization ONLY.
Definition stdMem.h:1507
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.
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:54
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:154
@ STDERR
Definition output.h:61
Parameter store.
Definition params.h:58
Base template for the class.
Definition ssthandler.h:1274
Base template for handlers which take a class defined argument.
Definition ssthandler.h:110
Handler class with user-data argument.
Definition ssthandler.h:1137
A class to convert between a component's view of time and the core's view of time.
Definition timeConverter.h:28