#[cfg(feature = "aurix")]
pub mod constants {
pub const MAX_MERGE_CYCLES: u32 = 500;
pub const MAX_INTERRUPT_LATENCY: u32 = 100;
pub const CACHE_LINE_SIZE: usize = 32;
pub const SUPPORTS_MULTICORE: bool = true;
pub const MAX_CORES: u8 = 3;
pub const MEMORY_ALIGNMENT: usize = 32;
pub const PLATFORM_NAME: &str = "AURIX";
}
#[cfg(feature = "stm32")]
pub mod constants {
pub const MAX_MERGE_CYCLES: u32 = 200;
pub const MAX_INTERRUPT_LATENCY: u32 = 50;
pub const CACHE_LINE_SIZE: usize = 32;
pub const SUPPORTS_MULTICORE: bool = false;
pub const MAX_CORES: u8 = 1;
pub const MEMORY_ALIGNMENT: usize = 4;
pub const PLATFORM_NAME: &str = "STM32";
}
#[cfg(feature = "cortex-m")]
pub mod constants {
pub const MAX_MERGE_CYCLES: u32 = 100;
pub const MAX_INTERRUPT_LATENCY: u32 = 25;
pub const CACHE_LINE_SIZE: usize = 32;
pub const SUPPORTS_MULTICORE: bool = false;
pub const MAX_CORES: u8 = 1;
pub const MEMORY_ALIGNMENT: usize = 4;
pub const PLATFORM_NAME: &str = "Cortex-M";
}
#[cfg(feature = "riscv")]
pub mod constants {
pub const MAX_MERGE_CYCLES: u32 = 300;
pub const MAX_INTERRUPT_LATENCY: u32 = 30;
pub const CACHE_LINE_SIZE: usize = 64;
pub const SUPPORTS_MULTICORE: bool = true;
pub const MAX_CORES: u8 = 8;
pub const MEMORY_ALIGNMENT: usize = 8;
pub const PLATFORM_NAME: &str = "RISC-V";
}
#[cfg(not(any(
feature = "aurix",
feature = "stm32",
feature = "cortex-m",
feature = "riscv"
)))]
pub mod constants {
pub const MAX_MERGE_CYCLES: u32 = 150;
pub const MAX_INTERRUPT_LATENCY: u32 = 40;
pub const CACHE_LINE_SIZE: usize = 32;
pub const SUPPORTS_MULTICORE: bool = false;
pub const MAX_CORES: u8 = 1;
pub const MEMORY_ALIGNMENT: usize = 4;
pub const PLATFORM_NAME: &str = "Generic";
}
pub mod validation {
#[cfg(feature = "aurix")]
pub const MAX_ACTIVE_NODES: usize = 3;
#[cfg(feature = "stm32")]
pub const MAX_ACTIVE_NODES: usize = 8;
#[cfg(feature = "cortex-m")]
pub const MAX_ACTIVE_NODES: usize = 4;
#[cfg(feature = "riscv")]
pub const MAX_ACTIVE_NODES: usize = 16;
#[cfg(not(any(
feature = "aurix",
feature = "stm32",
feature = "cortex-m",
feature = "riscv"
)))]
pub const MAX_ACTIVE_NODES: usize = 8;
#[cfg(feature = "aurix")]
pub const MAX_MEMORY_USAGE: usize = 8192;
#[cfg(feature = "stm32")]
pub const MAX_MEMORY_USAGE: usize = 2048;
#[cfg(feature = "cortex-m")]
pub const MAX_MEMORY_USAGE: usize = 1024;
#[cfg(feature = "riscv")]
pub const MAX_MEMORY_USAGE: usize = 4096;
#[cfg(not(any(
feature = "aurix",
feature = "stm32",
feature = "cortex-m",
feature = "riscv"
)))]
pub const MAX_MEMORY_USAGE: usize = 2048; }
pub mod error_handling {
#[allow(unused_imports)]
use crate::error::CRDTError;
#[cfg(feature = "aurix")]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AurixSafetyAction {
ContinueOperation,
SafeState,
SystemReset,
IsolateNode,
}
#[cfg(feature = "aurix")]
impl From<CRDTError> for AurixSafetyAction {
fn from(err: CRDTError) -> Self {
match err {
CRDTError::BufferOverflow => AurixSafetyAction::SafeState,
CRDTError::InvalidState => AurixSafetyAction::SystemReset,
CRDTError::InvalidNodeId => AurixSafetyAction::IsolateNode,
_ => AurixSafetyAction::ContinueOperation,
}
}
}
#[cfg(feature = "stm32")]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum STM32PowerAction {
Continue,
ReduceFrequency,
EnterStopMode,
EnterStandbyMode,
}
#[cfg(feature = "stm32")]
impl From<CRDTError> for STM32PowerAction {
fn from(err: CRDTError) -> Self {
match err {
CRDTError::BufferOverflow => STM32PowerAction::ReduceFrequency,
CRDTError::InvalidState => STM32PowerAction::EnterStopMode,
CRDTError::ConfigurationExceeded => STM32PowerAction::EnterStandbyMode,
_ => STM32PowerAction::Continue,
}
}
}
#[cfg(feature = "cortex-m")]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CortexMMemoryAction {
Continue,
CompactMemory,
ReduceCapacity,
ResetMinimal,
}
#[cfg(feature = "cortex-m")]
impl From<CRDTError> for CortexMMemoryAction {
fn from(err: CRDTError) -> Self {
match err {
CRDTError::BufferOverflow => CortexMMemoryAction::CompactMemory,
CRDTError::ConfigurationExceeded => CortexMMemoryAction::ReduceCapacity,
CRDTError::InvalidState => CortexMMemoryAction::ResetMinimal,
_ => CortexMMemoryAction::Continue,
}
}
}
#[cfg(feature = "riscv")]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RiscVPerformanceAction {
Continue,
OptimizePerformance,
DistributeLoad,
ScaleDown,
}
#[cfg(feature = "riscv")]
impl From<CRDTError> for RiscVPerformanceAction {
fn from(err: CRDTError) -> Self {
match err {
CRDTError::BufferOverflow => RiscVPerformanceAction::OptimizePerformance,
CRDTError::ConfigurationExceeded => RiscVPerformanceAction::DistributeLoad,
CRDTError::InvalidState => RiscVPerformanceAction::ScaleDown,
_ => RiscVPerformanceAction::Continue,
}
}
}
}
pub mod multicore {
#[allow(unused_imports)]
use super::constants;
#[allow(unused_imports)]
use crate::error::CRDTResult;
#[cfg(any(feature = "aurix", feature = "riscv"))]
pub trait MultiCoreCRDT {
fn core_count() -> u8 {
constants::MAX_CORES
}
fn distribute_work(&mut self, core_mask: u8) -> CRDTResult<()>;
fn collect_results(&mut self) -> CRDTResult<()>;
fn supports_core_local_ops() -> bool {
constants::SUPPORTS_MULTICORE
}
}
#[cfg(any(feature = "stm32", feature = "cortex-m"))]
pub trait SingleCoreCRDT {
fn optimize_single_core(&mut self) -> CRDTResult<()>;
fn supports_single_core_opts() -> bool {
true
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_platform_constants() {
assert!(constants::MAX_MERGE_CYCLES > 0);
assert!(constants::MAX_INTERRUPT_LATENCY > 0);
assert!(constants::CACHE_LINE_SIZE > 0);
assert!(constants::MAX_CORES > 0);
assert!(constants::MEMORY_ALIGNMENT > 0);
assert!(!constants::PLATFORM_NAME.is_empty());
}
#[test]
fn test_validation_constants() {
assert!(validation::MAX_ACTIVE_NODES > 0);
assert!(validation::MAX_MEMORY_USAGE > 0);
}
#[test]
fn test_platform_specific_values() {
#[cfg(feature = "aurix")]
{
assert_eq!(constants::MAX_CORES, 3);
assert_eq!(constants::MEMORY_ALIGNMENT, 32);
assert!(constants::SUPPORTS_MULTICORE);
assert_eq!(constants::PLATFORM_NAME, "AURIX");
}
#[cfg(feature = "stm32")]
{
assert_eq!(constants::MAX_CORES, 1);
assert_eq!(constants::MEMORY_ALIGNMENT, 4);
assert!(!constants::SUPPORTS_MULTICORE);
assert_eq!(constants::PLATFORM_NAME, "STM32");
}
#[cfg(feature = "cortex-m")]
{
assert_eq!(constants::MAX_CORES, 1);
assert_eq!(constants::MEMORY_ALIGNMENT, 4);
assert!(!constants::SUPPORTS_MULTICORE);
assert_eq!(constants::PLATFORM_NAME, "Cortex-M");
}
#[cfg(feature = "riscv")]
{
assert_eq!(constants::MAX_CORES, 8);
assert_eq!(constants::MEMORY_ALIGNMENT, 8);
assert!(constants::SUPPORTS_MULTICORE);
assert_eq!(constants::PLATFORM_NAME, "RISC-V");
}
}
#[cfg(feature = "aurix")]
#[test]
fn test_aurix_error_handling() {
use crate::error::CRDTError;
use error_handling::*;
let action: AurixSafetyAction = CRDTError::BufferOverflow.into();
assert_eq!(action, AurixSafetyAction::SafeState);
let action: AurixSafetyAction = CRDTError::InvalidState.into();
assert_eq!(action, AurixSafetyAction::SystemReset);
let action: AurixSafetyAction = CRDTError::InvalidNodeId.into();
assert_eq!(action, AurixSafetyAction::IsolateNode);
}
#[cfg(feature = "stm32")]
#[test]
fn test_stm32_error_handling() {
use crate::error::CRDTError;
use error_handling::*;
let action: STM32PowerAction = CRDTError::BufferOverflow.into();
assert_eq!(action, STM32PowerAction::ReduceFrequency);
let action: STM32PowerAction = CRDTError::InvalidState.into();
assert_eq!(action, STM32PowerAction::EnterStopMode);
}
}