use crate::error::FpgadError;
use crate::platforms::platform::OverlayHandler;
use crate::softeners::error::FpgadSoftenerError;
use crate::softeners::xilinx_dfx_mgr;
use crate::softeners::xilinx_dfx_mgr::xilinx_dfx_mgr_helpers;
use crate::system_io;
use log::{debug, trace};
use std::option::Option;
use std::path::Path;
pub struct XilinxDfxMgrOverlayHandler {}
impl XilinxDfxMgrOverlayHandler {
pub(crate) fn new(_: &str) -> Self {
XilinxDfxMgrOverlayHandler {}
}
}
impl OverlayHandler for XilinxDfxMgrOverlayHandler {
fn apply_overlay(&self, source_path: &Path, lookup_path: &Path) -> Result<String, FpgadError> {
trace!(
"apply_overlay called with source_path='{}', lookup_path='{}'",
source_path.display(),
lookup_path.display()
);
let (parent_dir, _) = system_io::extract_path_and_filename(source_path)?;
let firmware_name = xilinx_dfx_mgr_helpers::extract_firmware_name(source_path)?;
debug!("Extracted firmware-name='{}' from dtbo", firmware_name);
let bitstream_path = parent_dir.join(&firmware_name);
if !bitstream_path.exists() {
return Err(FpgadSoftenerError::DfxMgr(format!(
"Bitstream file '{}' not found in lookup path '{}'",
firmware_name,
parent_dir.display()
))
.into());
}
trace!("Found bitstream at '{}'", bitstream_path.display());
xilinx_dfx_mgr::load_overlay(&bitstream_path, source_path).map_err(|e| e.into())
}
fn remove_overlay(&self, slot_handle: Option<&str>) -> Result<String, FpgadError> {
Ok(xilinx_dfx_mgr::remove(slot_handle)?)
}
fn status(&self) -> Result<String, FpgadError> {
Ok(xilinx_dfx_mgr::list_package()?)
}
fn overlay_fs_path(&self) -> Result<&Path, FpgadError> {
Err(FpgadSoftenerError::DfxMgr("Not Applicable".to_string()).into())
}
}