Skip to content

Commit 8f3b5e7

Browse files
committed
every class is serializable except for RequestGenCPU and GeneratorRequest
1 parent 24c0aa1 commit 8f3b5e7

File tree

2 files changed

+108
-66
lines changed

2 files changed

+108
-66
lines changed

src/sst/elements/miranda/mirandaCPU.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ class RequestGenCPU : public SST::Component {
151151
SST_SER(srcReqEvent);
152152
SST_SER(stdMemHandlers);
153153

154+
// TODO - fails as there is no serialize_impl for GeneratorRequest
154155
//SST_SER(pendingRequests);
155156
SST_SER(memMgr);
156157

src/sst/elements/miranda/mirandaGenerator.h

Lines changed: 107 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ typedef enum {
3232
READ,
3333
WRITE,
3434
REQ_FENCE,
35-
CUSTOM,
36-
OPCOUNT
35+
CUSTOM,
36+
OPCOUNT
3737
} ReqOperation;
3838

3939

40-
class GeneratorRequest {
40+
class GeneratorRequest : public SST::Core::Serialization::serializable {
4141
public:
4242
GeneratorRequest() {
4343
reqID = nextGeneratorRequestID++;
@@ -77,6 +77,16 @@ class GeneratorRequest {
7777
void setIssueTime(const uint64_t now) {
7878
issueTime = now;
7979
}
80+
81+
virtual void serialize_order(SST::Core::Serialization::serializer& ser) override {
82+
SST_SER(reqID);
83+
SST_SER(issueTime);
84+
SST_SER(dependsOn);
85+
SST_SER(nextGeneratorRequestID);
86+
}
87+
88+
ImplementVirtualSerializable(SST::Miranda::GeneratorRequest)
89+
8090
protected:
8191
uint64_t reqID;
8292
uint64_t issueTime;
@@ -88,33 +98,30 @@ class GeneratorRequest {
8898
template<typename QueueType>
8999
class MirandaRequestQueue {
90100
public:
91-
MirandaRequestQueue() {
92-
theQ = (QueueType*) malloc(sizeof(QueueType) * 16);
93-
maxCapacity = 16;
94-
curSize = 0;
95-
}
96-
~MirandaRequestQueue() {
97-
free(theQ);
98-
}
99-
100-
bool empty() const {
101-
return 0 == curSize;
102-
}
103-
104-
void resize(const uint32_t newSize) {
105-
// printf("Resizing MirandaQueue from: %" PRIu32 " to %" PRIu32 "\n",
106-
// curSize, newSize);
107-
108-
QueueType * newQ = (QueueType *) malloc(sizeof(QueueType) * newSize);
109-
for(uint32_t i = 0; i < curSize; ++i) {
110-
newQ[i] = theQ[i];
111-
}
112-
113-
free(theQ);
114-
theQ = newQ;
115-
maxCapacity = newSize;
116-
curSize = std::min(curSize, newSize);
117-
}
101+
MirandaRequestQueue() {
102+
theQ = (QueueType*) malloc(sizeof(QueueType) * 16);
103+
maxCapacity = 16;
104+
curSize = 0;
105+
}
106+
~MirandaRequestQueue() {
107+
free(theQ);
108+
}
109+
110+
bool empty() const {
111+
return 0 == curSize;
112+
}
113+
114+
void resize(const uint32_t newSize) {
115+
QueueType * newQ = (QueueType *) malloc(sizeof(QueueType) * newSize);
116+
for(uint32_t i = 0; i < curSize; ++i) {
117+
newQ[i] = theQ[i];
118+
}
119+
120+
free(theQ);
121+
theQ = newQ;
122+
maxCapacity = newSize;
123+
curSize = std::min(curSize, newSize);
124+
}
118125

119126
uint32_t size() const {
120127
return curSize;
@@ -124,72 +131,91 @@ class MirandaRequestQueue {
124131
return maxCapacity;
125132
}
126133

127-
QueueType at(const uint32_t index) {
128-
return theQ[index];
129-
}
134+
QueueType at(const uint32_t index) {
135+
return theQ[index];
136+
}
130137

131-
void erase(const std::vector<uint32_t> eraseList) {
138+
void erase(const std::vector<uint32_t> eraseList) {
132139
if(0 == eraseList.size()) {
133140
return;
134141
}
135142

136-
QueueType* newQ = (QueueType*) malloc(sizeof(QueueType) * maxCapacity);
143+
QueueType* newQ = (QueueType*) malloc(sizeof(QueueType) * maxCapacity);
137144

138-
uint32_t nextSkipIndex = 0;
139-
uint32_t nextSkip = eraseList.at(nextSkipIndex);
140-
uint32_t nextNewQIndex = 0;
145+
uint32_t nextSkipIndex = 0;
146+
uint32_t nextSkip = eraseList.at(nextSkipIndex);
147+
uint32_t nextNewQIndex = 0;
141148

142-
for(uint32_t i = 0; i < curSize; ++i) {
143-
if(nextSkip == i) {
144-
nextSkipIndex++;
149+
for(uint32_t i = 0; i < curSize; ++i) {
150+
if(nextSkip == i) {
151+
nextSkipIndex++;
145152

146-
if(nextSkipIndex >= eraseList.size()) {
147-
nextSkip = curSize;
148-
} else {
149-
nextSkip = eraseList.at(nextSkipIndex);
150-
}
151-
} else {
152-
newQ[nextNewQIndex] = theQ[i];
153-
nextNewQIndex++;
154-
}
155-
}
153+
if(nextSkipIndex >= eraseList.size()) {
154+
nextSkip = curSize;
155+
} else {
156+
nextSkip = eraseList.at(nextSkipIndex);
157+
}
158+
} else {
159+
newQ[nextNewQIndex] = theQ[i];
160+
nextNewQIndex++;
161+
}
162+
}
156163

157-
free(theQ);
164+
free(theQ);
158165

159-
theQ = newQ;
166+
theQ = newQ;
160167
curSize = nextNewQIndex;
161-
}
168+
}
162169

163170
void push_back(QueueType t) {
164-
if(curSize == maxCapacity) {
165-
resize(maxCapacity + 16);
166-
}
171+
if(curSize == maxCapacity) {
172+
resize(maxCapacity + 16);
173+
}
174+
175+
theQ[curSize] = t;
176+
curSize++;
177+
}
178+
179+
void serialize_order(SST::Core::Serialization::serializer& ser) {
180+
SST_SER(theQ);
181+
SST_SER(maxCapacity);
182+
SST_SER(curSize);
183+
}
167184

168-
theQ[curSize] = t;
169-
curSize++;
170-
}
171185
private:
172-
QueueType* theQ;
173-
uint32_t maxCapacity;
174-
uint32_t curSize;
186+
QueueType* theQ;
187+
uint32_t maxCapacity;
188+
uint32_t curSize;
175189
};
176190

177191
class MemoryOpRequest : public GeneratorRequest {
178192
public:
179-
MemoryOpRequest(const uint64_t cAddr,
193+
MemoryOpRequest(const uint64_t cAddr,
180194
const uint64_t cLength,
181195
const ReqOperation cOpType) :
182196
GeneratorRequest(),
183197
addr(cAddr), length(cLength), op(cOpType)
184-
{ assert (op == READ || op == WRITE); }
185-
198+
{
199+
assert (op == READ || op == WRITE);
200+
}
201+
MemoryOpRequest() = default;
186202
~MemoryOpRequest() {}
203+
187204
ReqOperation getOperation() const { return op; }
188205
bool isRead() const { return op == READ; }
189206
bool isWrite() const { return op == WRITE; }
190207
uint64_t getAddress() const { return addr; }
191208
uint64_t getLength() const { return length; }
192209

210+
virtual void serialize_order(SST::Core::Serialization::serializer& ser) override {
211+
SST::Miranda::GeneratorRequest::serialize_order(ser);
212+
SST_SER(addr);
213+
SST_SER(length);
214+
SST_SER(op);
215+
}
216+
217+
ImplementSerializable(SST::Miranda::MemoryOpRequest)
218+
193219
protected:
194220
uint64_t addr;
195221
uint64_t length;
@@ -200,11 +226,19 @@ class CustomOpRequest : public GeneratorRequest {
200226
public:
201227
CustomOpRequest(Interfaces::StandardMem::CustomData* cData) :
202228
GeneratorRequest(), data(cData) {}
229+
CustomOpRequest() = default;
203230
~CustomOpRequest() {}
204231

205232
ReqOperation getOperation() const { return CUSTOM; }
206233
Interfaces::StandardMem::CustomData* getPayload() { return data; }
207234

235+
virtual void serialize_order(SST::Core::Serialization::serializer& ser) override {
236+
SST::Miranda::GeneratorRequest::serialize_order(ser);
237+
SST_SER(data);
238+
}
239+
240+
ImplementSerializable(SST::Miranda::CustomOpRequest)
241+
208242
protected:
209243
Interfaces::StandardMem::CustomData* data;
210244
};
@@ -214,6 +248,13 @@ class FenceOpRequest : public GeneratorRequest {
214248
FenceOpRequest() : GeneratorRequest() {}
215249
~FenceOpRequest() {}
216250
ReqOperation getOperation() const { return REQ_FENCE; }
251+
252+
virtual void serialize_order(SST::Core::Serialization::serializer& ser) override {
253+
SST::Miranda::GeneratorRequest::serialize_order(ser);
254+
}
255+
256+
ImplementSerializable(SST::Miranda::FenceOpRequest)
257+
217258
};
218259

219260
class RequestGenerator : public SubComponent {

0 commit comments

Comments
 (0)