1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#![allow(non_upper_case_globals)]

use crate::generated::binding::*;
use std::fmt;
use std::fmt::Formatter;

#[derive(Debug)]
/// Represents a architecture type of device
pub enum Arch {
    /// Warboy architecture
    Warboy = FuriosaSmiArch_FURIOSA_SMI_ARCH_WARBOY as isize,
    /// RNGD architecture
    Rngd = FuriosaSmiArch_FURIOSA_SMI_ARCH_RNGD as isize,
    /// RNGD-Max architecture
    RngdMax = FuriosaSmiArch_FURIOSA_SMI_ARCH_RNGD_MAX as isize,
    /// RNGD-S architecture
    RngdS = FuriosaSmiArch_FURIOSA_SMI_ARCH_RNGD_S as isize,
}

impl Arch {
    pub(crate) fn from(raw: FuriosaSmiArch) -> Arch {
        match raw {
            FuriosaSmiArch_FURIOSA_SMI_ARCH_WARBOY => Arch::Warboy,
            FuriosaSmiArch_FURIOSA_SMI_ARCH_RNGD => Arch::Rngd,
            FuriosaSmiArch_FURIOSA_SMI_ARCH_RNGD_MAX => Arch::RngdMax,
            FuriosaSmiArch_FURIOSA_SMI_ARCH_RNGD_S => Arch::RngdS,
            _ => panic!("unknown arch"),
        }
    }
}

impl fmt::Display for Arch {
    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
        let s = match self {
            Arch::Warboy => "warboy",
            Arch::Rngd => "rngd",
            Arch::RngdS => "rngd_s",
            Arch::RngdMax => "rngd_max",
        };
        write!(f, "{}", s)
    }
}

/// Represents a device link type
pub enum LinkType {
    /// Unknown link type
    Unknown =
        FuriosaSmiDeviceToDeviceLinkType_FURIOSA_SMI_DEVICE_TO_DEVICE_LINK_TYPE_UNKNOWN as isize,
    /// Link type under same machine
    Interconnect =
        FuriosaSmiDeviceToDeviceLinkType_FURIOSA_SMI_DEVICE_TO_DEVICE_LINK_TYPE_INTERCONNECT
            as isize,
    /// Link type under same cpu
    Cpu = FuriosaSmiDeviceToDeviceLinkType_FURIOSA_SMI_DEVICE_TO_DEVICE_LINK_TYPE_CPU as isize,
    /// Link type under same switch
    Bridge =
        FuriosaSmiDeviceToDeviceLinkType_FURIOSA_SMI_DEVICE_TO_DEVICE_LINK_TYPE_BRIDGE as isize,
    /// Link type under same socket
    Noc = FuriosaSmiDeviceToDeviceLinkType_FURIOSA_SMI_DEVICE_TO_DEVICE_LINK_TYPE_NOC as isize,
}

impl LinkType {
    pub(crate) fn from(raw: FuriosaSmiDeviceToDeviceLinkType) -> LinkType {
        match raw {
            FuriosaSmiDeviceToDeviceLinkType_FURIOSA_SMI_DEVICE_TO_DEVICE_LINK_TYPE_UNKNOWN => {
                LinkType::Unknown
            }
            FuriosaSmiDeviceToDeviceLinkType_FURIOSA_SMI_DEVICE_TO_DEVICE_LINK_TYPE_INTERCONNECT => {
                LinkType::Interconnect
            }
            FuriosaSmiDeviceToDeviceLinkType_FURIOSA_SMI_DEVICE_TO_DEVICE_LINK_TYPE_CPU => {
                LinkType::Cpu
            }
            FuriosaSmiDeviceToDeviceLinkType_FURIOSA_SMI_DEVICE_TO_DEVICE_LINK_TYPE_BRIDGE => {
                LinkType::Bridge
            }
            FuriosaSmiDeviceToDeviceLinkType_FURIOSA_SMI_DEVICE_TO_DEVICE_LINK_TYPE_NOC => {
                LinkType::Noc
            }
            _ => panic!("unknown linktype"),
        }
    }
}

impl fmt::Display for LinkType {
    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
        let s = match self {
            LinkType::Unknown => "Unknown",
            LinkType::Interconnect => "Interconnect",
            LinkType::Cpu => "Cpu",
            LinkType::Bridge => "Bridge",
            LinkType::Noc => "Noc",
        };
        write!(f, "{}", s)
    }
}