furiosa_visa_std/runtime/
convert.rs1use 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}