luwen_api/chip/
eth_addr.rs1use std::fmt::Display;
5
6use crate::error::PlatformError;
7
8use super::{ChipComms, ChipInterface};
9
10#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
11pub struct EthAddr {
12 pub shelf_x: u8,
13 pub shelf_y: u8,
14 pub rack_x: u8,
15 pub rack_y: u8,
16}
17
18pub trait IntoChip<T>: Sized {
19 fn cinto(&self, chip: &dyn ChipComms, cif: &dyn ChipInterface) -> Result<T, PlatformError>;
20}
21
22pub fn get_local_chip_coord(
23 chip: &dyn ChipComms,
24 cif: &dyn ChipInterface,
25) -> Result<EthAddr, PlatformError> {
26 let mut coord = [0; 4];
27 chip.noc_read(cif, 0, 9, 0, 0x1108, &mut coord)?;
28 let coord = u32::from_le_bytes(coord);
29
30 Ok(EthAddr {
31 rack_x: (coord & 0xFF) as u8,
32 rack_y: ((coord >> 8) & 0xFF) as u8,
33 shelf_x: ((coord >> 16) & 0xFF) as u8,
34 shelf_y: ((coord >> 24) & 0xFF) as u8,
35 })
36}
37
38impl IntoChip<EthAddr> for EthAddr {
39 fn cinto(
40 &self,
41 _chip: &dyn ChipComms,
42 _cif: &dyn ChipInterface,
43 ) -> Result<EthAddr, PlatformError> {
44 Ok(*self)
45 }
46}
47
48impl IntoChip<EthAddr> for (Option<u8>, Option<u8>, Option<u8>, Option<u8>) {
49 fn cinto(
50 &self,
51 chip: &dyn ChipComms,
52 cif: &dyn ChipInterface,
53 ) -> Result<EthAddr, PlatformError> {
54 let local_coord = get_local_chip_coord(chip, cif)?;
55
56 let rack_x = self.0.unwrap_or(local_coord.rack_x);
57 let rack_y = self.1.unwrap_or(local_coord.rack_y);
58 let shelf_x = self.2.unwrap_or(local_coord.shelf_x);
59 let shelf_y = self.3.unwrap_or(local_coord.shelf_y);
60
61 Ok(EthAddr {
62 rack_x,
63 rack_y,
64 shelf_x,
65 shelf_y,
66 })
67 }
68}
69
70impl IntoChip<EthAddr> for (u8, u8, u8, u8) {
71 fn cinto(
72 &self,
73 _chip: &dyn ChipComms,
74 _cif: &dyn ChipInterface,
75 ) -> Result<EthAddr, PlatformError> {
76 let (rack_x, rack_y, shelf_x, shelf_y) = *self;
77
78 Ok(EthAddr {
79 rack_x,
80 rack_y,
81 shelf_x,
82 shelf_y,
83 })
84 }
85}
86
87impl IntoChip<EthAddr> for (u8, u8) {
88 fn cinto(
89 &self,
90 chip: &dyn ChipComms,
91 cif: &dyn ChipInterface,
92 ) -> Result<EthAddr, PlatformError> {
93 (None, None, Some(self.0), Some(self.1)).cinto(chip, cif)
94 }
95}
96
97impl Display for EthAddr {
98 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
99 f.write_fmt(format_args!(
100 "[{rack_x}, {rack_y}, {shelf_x}, {self_y}]",
101 rack_x = self.rack_x,
102 rack_y = self.rack_y,
103 shelf_x = self.shelf_x,
104 self_y = self.shelf_y
105 ))
106 }
107}