@@ -66,6 +66,7 @@ Layer::Layer(const LayerParams& params) :
6666 valuesDelivered (0 ),
6767 currentTimeSlotIndex (0 ),
6868 valuesPerPortPerWindow (params.values_per_port_per_window),
69+ targetMMPS (params.target_mps),
6970 isFinished (false ),
7071 fileMode (false ),
7172 shuffleEnabled (false ),
@@ -187,6 +188,57 @@ Layer::computeTimingParameters()
187188 DPRINTF (Layer, " Connection window: %d ps\n " ,
188189 getConnectionWindow ()
189190 );
191+
192+ if (targetMMPS >= 0 ) {
193+ double values_this_window =
194+ static_cast <double >(targetMMPS) * 1e6 *
195+ (static_cast <double >(getConnectionWindow ()) / 1e12 );
196+
197+ DPRINTF (Layer,
198+ " Values this window: %f\n " ,
199+ values_this_window
200+ );
201+
202+ // spread them evenly across ports, round *up*
203+ valuesPerPortPerWindow =
204+ std::ceil (values_this_window / static_cast <double >(size));
205+
206+ DPRINTF (Layer,
207+ " Value per port per window: %lu\n " ,
208+ valuesPerPortPerWindow
209+ );
210+
211+ // safety: never let it exceed the hard structural cap
212+ valuesPerPortPerWindow =
213+ std::min<uint64_t >(valuesPerPortPerWindow,
214+ maxValuesPerWindow * size);
215+ DPRINTF (Layer,
216+ " Target MMPS: %f\n " ,
217+ targetMMPS
218+ );
219+ DPRINTF (Layer,
220+ " Values per port per window: %lu\n " ,
221+ valuesPerPortPerWindow
222+ );
223+ if (valuesPerPortPerWindow == 0 ) {
224+ fatal (" Layer %s: Target MMPS (%f) is too low!\n " ,
225+ name (), targetMMPS);
226+ }
227+ if (valuesPerPortPerWindow > (maxValuesPerWindow * size)) {
228+ warn (" Layer %s: Target MMPS (%f) is too high!\n " ,
229+ name (), targetMMPS);
230+ warn (" Layer %s: Setting values per port per \
231+ window to %lu\n " ,
232+ name (),(maxValuesPerWindow * size));
233+ }
234+ }
235+
236+ if (valuesPerPortPerWindow > maxValues) {
237+ fatal (" Values per port per window (%lu) \
238+ exceeds max values (%lu)\n " ,
239+ name (), valuesPerPortPerWindow, maxValues);
240+ }
241+
190242}
191243
192244// Calculate the time slot based on network component delays
@@ -305,6 +357,14 @@ Layer::processValues(
305357 );
306358 break ;
307359 }
360+ if (valuesPerPortPerWindow > rlTimeSlots) {
361+ warn (" Layer %s: values per port per window (%lu) "
362+ " exceeds RL time slots (%lu)\n " ,
363+ name (), valuesPerPortPerWindow, rlTimeSlots);
364+ warn (" Layer %s: setting values per port per window to %lu\n " ,
365+ name (), rlTimeSlots);
366+ valuesPerPortPerWindow = rlTimeSlots;
367+ }
308368 // Check if we've already reached the maximum values
309369 if (valuesDelivered >= maxValues && !infinite_mode) {
310370 break ; // Exit the loop immediately if we've reached max values
@@ -449,7 +509,7 @@ Layer::processValues(
449509 uint64_t payload;
450510 used_payloads.reserve (valuesPerPortPerWindow);
451511 while (used_payloads.size () < valuesPerPortPerWindow) {
452- uint64_t p = scheduler.generateRandomPayload (rlTimeSlots - 1 );
512+ uint64_t p = scheduler.generateRandomPayload (rlTimeSlots);
453513 if (std::find (used_payloads.begin (),
454514 used_payloads.end (),
455515 p)
@@ -458,6 +518,18 @@ Layer::processValues(
458518 }
459519 }
460520
521+ // Sort the payloads in ascending order
522+ std::sort (used_payloads.begin (), used_payloads.end ());
523+
524+ // print the payloads
525+ DPRINTF (Layer,
526+ " BufferedPort %lu: payloads for %lu: " ,
527+ src_addr, value_dest
528+ );
529+ for (auto p : used_payloads) {
530+ DPRINTF (Layer, " %lu " , p);
531+ }
532+
461533 for (auto p : used_payloads) {
462534 // Calculate precise delivery time
463535 // within the connection window
0 commit comments