entrenar/monitor/inference/safety_andon/sil.rs
1//! Safety Integrity Level (IEC 61508)
2
3use serde::{Deserialize, Serialize};
4
5/// Safety Integrity Level (IEC 61508)
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
7pub enum SafetyIntegrityLevel {
8 /// QM: No safety requirements (games, entertainment)
9 /// - Ring buffer traces
10 /// - Best-effort logging
11 QM,
12
13 /// SIL 1: Low safety requirements
14 /// - Persistent traces
15 /// - Hash verification
16 SIL1,
17
18 /// SIL 2: Medium safety requirements
19 /// - Hash chain
20 /// - Redundant storage
21 SIL2,
22
23 /// SIL 3: High safety requirements (automotive ASIL C)
24 /// - Hash chain with signatures
25 /// - Triple redundant storage
26 /// - Hardware security module
27 SIL3,
28
29 /// SIL 4: Highest safety requirements (automotive ASIL D)
30 /// - All SIL 3 requirements
31 /// - Formal verification of trace system
32 /// - Independent safety monitor
33 SIL4,
34}
35
36impl SafetyIntegrityLevel {
37 /// Get string representation
38 pub fn as_str(&self) -> &'static str {
39 match self {
40 SafetyIntegrityLevel::QM => "QM",
41 SafetyIntegrityLevel::SIL1 => "SIL1",
42 SafetyIntegrityLevel::SIL2 => "SIL2",
43 SafetyIntegrityLevel::SIL3 => "SIL3",
44 SafetyIntegrityLevel::SIL4 => "SIL4",
45 }
46 }
47
48 /// Get minimum confidence threshold for this level
49 pub fn min_confidence(&self) -> f32 {
50 match self {
51 SafetyIntegrityLevel::QM => 0.0, // No requirement
52 SafetyIntegrityLevel::SIL1 => 0.5,
53 SafetyIntegrityLevel::SIL2 => 0.7,
54 SafetyIntegrityLevel::SIL3 => 0.8,
55 SafetyIntegrityLevel::SIL4 => 0.9,
56 }
57 }
58
59 /// Get maximum allowed latency in nanoseconds
60 pub fn max_latency_ns(&self) -> u64 {
61 match self {
62 SafetyIntegrityLevel::QM => u64::MAX, // No requirement
63 SafetyIntegrityLevel::SIL1 => 100_000_000, // 100ms
64 SafetyIntegrityLevel::SIL2 => 50_000_000, // 50ms
65 SafetyIntegrityLevel::SIL3 => 10_000_000, // 10ms
66 SafetyIntegrityLevel::SIL4 => 1_000_000, // 1ms
67 }
68 }
69}