sim_pipe/
frame_gen.rs

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