use crate::architecture::riscv::communication_interface::RiscvError;
use crate::probe::{CommandResult, DebugProbeError, DeferredResultIndex};
use std::fmt;
use std::time::Duration;
pub trait DtmAccess: Send + fmt::Debug {
fn init(&mut self) -> Result<(), RiscvError> {
Ok(())
}
fn target_reset_assert(&mut self) -> Result<(), DebugProbeError>;
fn target_reset_deassert(&mut self) -> Result<(), DebugProbeError>;
fn clear_error_state(&mut self) -> Result<(), RiscvError>;
fn read_deferred_result(
&mut self,
index: DeferredResultIndex,
) -> Result<CommandResult, RiscvError>;
fn execute(&mut self) -> Result<(), RiscvError>;
fn schedule_write(
&mut self,
address: u64,
value: u32,
) -> Result<Option<DeferredResultIndex>, RiscvError>;
fn schedule_read(&mut self, address: u64) -> Result<DeferredResultIndex, RiscvError>;
fn read_with_timeout(&mut self, address: u64, timeout: Duration) -> Result<u32, RiscvError>;
fn write_with_timeout(
&mut self,
address: u64,
value: u32,
timeout: Duration,
) -> Result<Option<u32>, RiscvError>;
fn read_idcode(&mut self) -> Result<Option<u32>, DebugProbeError>;
}