1use core::ops::Deref;
2
3use super::NodeBase;
4
5#[derive(Debug, Clone, Copy)]
7pub struct MemoryRegion {
8 pub address: u64,
10 pub size: u64,
12}
13
14#[derive(Clone)]
16pub struct Memory<'a> {
17 node: NodeBase<'a>,
18}
19
20impl<'a> Memory<'a> {
21 pub(crate) fn new(node: NodeBase<'a>) -> Self {
22 Self { node }
23 }
24
25 pub fn regions(&self) -> impl Iterator<Item = MemoryRegion> + 'a {
29 self.node.reg().into_iter().flat_map(|reg| {
30 reg.map(|info| MemoryRegion {
31 address: info.address,
32 size: info.size.unwrap_or(0),
33 })
34 })
35 }
36
37 pub fn regions_array<const N: usize>(&self) -> heapless::Vec<MemoryRegion, N> {
39 let mut result = heapless::Vec::new();
40 for region in self.regions() {
41 if result.push(region).is_err() {
42 break;
43 }
44 }
45 result
46 }
47
48 pub fn total_size(&self) -> u64 {
50 self.regions().map(|r| r.size).sum()
51 }
52}
53
54impl<'a> Deref for Memory<'a> {
55 type Target = NodeBase<'a>;
56
57 fn deref(&self) -> &Self::Target {
58 &self.node
59 }
60}
61
62impl core::fmt::Debug for Memory<'_> {
63 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
64 let mut st = f.debug_struct("Memory");
65 st.field("name", &self.node.name());
66 for region in self.regions() {
67 st.field("region", ®ion);
68 }
69 st.finish()
70 }
71}