furiosa_visa_std/runtime/
convert.rs

1use furiosa_mapping::{M, Pair};
2
3use super::Buffer;
4use super::ffi::{lib, rt};
5use crate::memory_tensor::{HbmTensor, HbmTensorView, HbmTensorViewMut};
6use crate::scalar::Scalar;
7
8fn to_buffer<D: Scalar, Chip: M, Element: M>(addr: u64) -> Buffer {
9    let len = <Pair<Chip, Element> as M>::SIZE * std::mem::size_of::<D>();
10    Buffer::from_raw(unsafe { lib().furiosa_buffer_from_npu(rt(), addr, len) })
11}
12
13impl<D: Scalar, Chip: M, Element: M> From<&HbmTensor<D, Chip, Element>> for Buffer {
14    fn from(tensor: &HbmTensor<D, Chip, Element>) -> Buffer {
15        to_buffer::<D, Chip, Element>(tensor.address())
16    }
17}
18
19impl<D: Scalar, Chip: M, Element: M> From<&HbmTensorView<'_, D, Chip, Element>> for Buffer {
20    fn from(view: &HbmTensorView<'_, D, Chip, Element>) -> Buffer {
21        to_buffer::<D, Chip, Element>(view.address())
22    }
23}
24
25impl<D: Scalar, Chip: M, Element: M> From<&HbmTensorViewMut<'_, D, Chip, Element>> for Buffer {
26    fn from(view: &HbmTensorViewMut<'_, D, Chip, Element>) -> Buffer {
27        to_buffer::<D, Chip, Element>(view.address())
28    }
29}
30
31impl<D: Scalar, Chip: M, Element: M> From<Buffer> for HbmTensor<D, Chip, Element> {
32    fn from(buf: Buffer) -> Self {
33        unsafe { HbmTensor::from_addr(lib().furiosa_buffer_addr(buf.as_ptr())) }
34    }
35}