use std::sync::Arc;
use crate::{DeviceInfo, EthAddr};
pub trait ChipInterface: 'static {
fn get_device_info(&self) -> Result<Option<DeviceInfo>, Box<dyn std::error::Error>>;
fn axi_read(&self, addr: u32, data: &mut [u8]) -> Result<(), Box<dyn std::error::Error>>;
fn axi_write(&self, addr: u32, data: &[u8]) -> Result<(), Box<dyn std::error::Error>>;
fn noc_read(
&self,
noc_id: u8,
x: u8,
y: u8,
addr: u64,
data: &mut [u8],
) -> Result<(), Box<dyn std::error::Error>>;
fn noc_write(
&self,
noc_id: u8,
x: u8,
y: u8,
addr: u64,
data: &[u8],
) -> Result<(), Box<dyn std::error::Error>>;
fn noc_broadcast(
&self,
noc_id: u8,
addr: u64,
data: &[u8],
) -> Result<(), Box<dyn std::error::Error>>;
fn eth_noc_read(
&self,
eth_addr: EthAddr,
noc_id: u8,
x: u8,
y: u8,
addr: u64,
data: &mut [u8],
) -> Result<(), Box<dyn std::error::Error>>;
fn eth_noc_write(
&self,
eth_addr: EthAddr,
noc_id: u8,
x: u8,
y: u8,
addr: u64,
data: &[u8],
) -> Result<(), Box<dyn std::error::Error>>;
fn eth_noc_broadcast(
&self,
eth_addr: EthAddr,
noc_id: u8,
addr: u64,
data: &[u8],
) -> Result<(), Box<dyn std::error::Error>>;
fn as_any(&self) -> &dyn std::any::Any;
}
impl ChipInterface for Arc<dyn ChipInterface + Send + Sync> {
fn get_device_info(&self) -> Result<Option<DeviceInfo>, Box<dyn std::error::Error>> {
self.as_ref().get_device_info()
}
fn axi_read(&self, addr: u32, data: &mut [u8]) -> Result<(), Box<dyn std::error::Error>> {
self.as_ref().axi_read(addr, data)
}
fn axi_write(&self, addr: u32, data: &[u8]) -> Result<(), Box<dyn std::error::Error>> {
self.as_ref().axi_write(addr, data)
}
fn noc_read(
&self,
noc_id: u8,
x: u8,
y: u8,
addr: u64,
data: &mut [u8],
) -> Result<(), Box<dyn std::error::Error>> {
self.as_ref().noc_read(noc_id, x, y, addr, data)
}
fn noc_write(
&self,
noc_id: u8,
x: u8,
y: u8,
addr: u64,
data: &[u8],
) -> Result<(), Box<dyn std::error::Error>> {
self.as_ref().noc_write(noc_id, x, y, addr, data)
}
fn noc_broadcast(
&self,
noc_id: u8,
addr: u64,
data: &[u8],
) -> Result<(), Box<dyn std::error::Error>> {
self.as_ref().noc_broadcast(noc_id, addr, data)
}
fn eth_noc_read(
&self,
eth_addr: EthAddr,
noc_id: u8,
x: u8,
y: u8,
addr: u64,
data: &mut [u8],
) -> Result<(), Box<dyn std::error::Error>> {
self.as_ref()
.eth_noc_read(eth_addr, noc_id, x, y, addr, data)
}
fn eth_noc_write(
&self,
eth_addr: EthAddr,
noc_id: u8,
x: u8,
y: u8,
addr: u64,
data: &[u8],
) -> Result<(), Box<dyn std::error::Error>> {
self.as_ref()
.eth_noc_write(eth_addr, noc_id, x, y, addr, data)
}
fn eth_noc_broadcast(
&self,
eth_addr: EthAddr,
noc_id: u8,
addr: u64,
data: &[u8],
) -> Result<(), Box<dyn std::error::Error>> {
self.as_ref()
.eth_noc_broadcast(eth_addr, noc_id, addr, data)
}
fn as_any(&self) -> &dyn std::any::Any {
self.as_ref().as_any()
}
}