Skip to main content

luwen_api/chip/
eth_addr.rs

1// SPDX-FileCopyrightText: © 2023 Tenstorrent Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use 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}