use super::*; #[test] fn simple_direct() { let mut value = cache::Initializer::default(); value.set(Feature::f as u32); // F (and other extensions with CSRs) -> Zicsr assert!(imply_features(value).test(Feature::zicsr as u32)); } #[test] fn simple_indirect() { let mut value = cache::Initializer::default(); value.set(Feature::q as u32); // Q -> D, D -> F, F -> Zicsr assert!(imply_features(value).test(Feature::zicsr as u32)); } #[test] fn complex_zcd() { let mut value = cache::Initializer::default(); // C & D -> Zcd value.set(Feature::c as u32); assert!(!imply_features(value).test(Feature::zcd as u32)); value.set(Feature::d as u32); assert!(imply_features(value).test(Feature::zcd as u32)); } #[test] fn group_simple_forward() { let mut value = cache::Initializer::default(); // A -> Zalrsc & Zaamo (forward implication) value.set(Feature::a as u32); let value = imply_features(value); assert!(value.test(Feature::zalrsc as u32)); assert!(value.test(Feature::zaamo as u32)); } #[test] fn group_simple_backward() { let mut value = cache::Initializer::default(); // Zalrsc & Zaamo -> A (reverse implication) value.set(Feature::zalrsc as u32); value.set(Feature::zaamo as u32); assert!(imply_features(value).test(Feature::a as u32)); } #[test] fn group_complex_convergence() { let mut value = cache::Initializer::default(); // Needs 3 iterations to converge // (and 4th iteration for convergence checking): // 1. [Zvksc] -> Zvks & Zvbc // 2. Zvks -> Zvksed & Zvksh & Zvkb & Zvkt // 3a. [Zvkned] & [Zvknhb] & [Zvkb] & Zvkt -> {Zvkn} // 3b. Zvkn & Zvbc -> {Zvknc} value.set(Feature::zvksc as u32); value.set(Feature::zvkned as u32); value.set(Feature::zvknhb as u32); value.set(Feature::zvkb as u32); let value = imply_features(value); assert!(value.test(Feature::zvkn as u32)); assert!(value.test(Feature::zvknc as u32)); }