@@ -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 {
4141public:
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+
8090protected:
8191 uint64_t reqID;
8292 uint64_t issueTime;
@@ -88,33 +98,30 @@ class GeneratorRequest {
8898template <typename QueueType>
8999class MirandaRequestQueue {
90100public:
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- }
171185private:
172- QueueType* theQ;
173- uint32_t maxCapacity;
174- uint32_t curSize;
186+ QueueType* theQ;
187+ uint32_t maxCapacity;
188+ uint32_t curSize;
175189};
176190
177191class MemoryOpRequest : public GeneratorRequest {
178192public:
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+
193219protected:
194220 uint64_t addr;
195221 uint64_t length;
@@ -200,11 +226,19 @@ class CustomOpRequest : public GeneratorRequest {
200226public:
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+
208242protected:
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
219260class RequestGenerator : public SubComponent {
0 commit comments