use super::{
interface::{INode, IRegister},
node_base::{NodeAttributeBase, NodeBase},
register_base::RegisterBase,
store::{CacheStore, NodeStore, ValueStore},
Device, GenApiResult, ValueCtxt,
};
#[derive(Debug, Clone)]
pub struct RegisterNode {
pub(crate) attr_base: NodeAttributeBase,
pub(crate) register_base: RegisterBase,
}
impl RegisterNode {
#[must_use]
pub fn register_base(&self) -> &RegisterBase {
&self.register_base
}
}
impl INode for RegisterNode {
fn node_base(&self) -> NodeBase {
let elem_base = &self.register_base.elem_base;
NodeBase::new(&self.attr_base, elem_base)
}
fn streamable(&self) -> bool {
self.register_base().streamable()
}
}
impl IRegister for RegisterNode {
#[tracing::instrument(skip(self, device, store, cx),
level = "trace",
fields(node = store.name_by_id(self.node_base().id()).unwrap()))]
fn read<T: ValueStore, U: CacheStore>(
&self,
buf: &mut [u8],
device: &mut impl Device,
store: &impl NodeStore,
cx: &mut ValueCtxt<T, U>,
) -> GenApiResult<()> {
let address = self.address(device, store, cx)?;
let length = self.length(device, store, cx)?;
self.register_base().read_and_cache(
self.node_base().id(),
address,
length,
buf,
device,
store,
cx,
)
}
#[tracing::instrument(skip(self, device, store, cx),
level = "trace",
fields(node = store.name_by_id(self.node_base().id()).unwrap()))]
fn write<T: ValueStore, U: CacheStore>(
&self,
buf: &[u8],
device: &mut impl Device,
store: &impl NodeStore,
cx: &mut ValueCtxt<T, U>,
) -> GenApiResult<()> {
self.register_base()
.write_and_cache(self.node_base().id(), buf, device, store, cx)
}
#[tracing::instrument(skip(self, device, store, cx),
level = "trace",
fields(node = store.name_by_id(self.node_base().id()).unwrap()))]
fn address<T: ValueStore, U: CacheStore>(
&self,
device: &mut impl Device,
store: &impl NodeStore,
cx: &mut ValueCtxt<T, U>,
) -> GenApiResult<i64> {
self.register_base().address(device, store, cx)
}
#[tracing::instrument(skip(self, device, store, cx),
level = "trace",
fields(node = store.name_by_id(self.node_base().id()).unwrap()))]
fn length<T: ValueStore, U: CacheStore>(
&self,
device: &mut impl Device,
store: &impl NodeStore,
cx: &mut ValueCtxt<T, U>,
) -> GenApiResult<i64> {
self.register_base().length(device, store, cx)
}
}