sim_pipe/
frame_gen.rs

1// Copyright (c) 2025 Graphcore Ltd. All rights reserved.
2
3use std::rc::Rc;
4
5use gwr_model_builder::EntityGet;
6use gwr_models::data_frame::DataFrame;
7use gwr_track::entity::Entity;
8
9/// A frame Generator that can be used by the `Source` to produce frames on
10/// the fly.
11#[derive(EntityGet)]
12pub struct FrameGen {
13    entity: Rc<Entity>,
14    payload_bytes: usize,
15    overhead_bytes: usize,
16    num_send_frames: usize,
17    num_sent_frames: usize,
18}
19
20impl FrameGen {
21    #[must_use]
22    pub fn new(
23        parent: &Rc<Entity>,
24        overhead_bytes: usize,
25        payload_bytes: usize,
26        num_send_frames: usize,
27    ) -> Self {
28        Self {
29            entity: Rc::new(Entity::new(parent, "frame_gen")),
30            overhead_bytes,
31            payload_bytes,
32            num_send_frames,
33            num_sent_frames: 0,
34        }
35    }
36}
37
38impl Iterator for FrameGen {
39    type Item = DataFrame;
40    fn next(&mut self) -> Option<Self::Item> {
41        if self.num_sent_frames < self.num_send_frames {
42            self.num_sent_frames += 1;
43
44            // Set `src` to a unique value to aid debug (frame count).
45            Some(DataFrame::new(
46                &self.entity,
47                self.overhead_bytes,
48                self.payload_bytes,
49            ))
50        } else {
51            None
52        }
53    }
54}