use crate::util::*;
#[inline]
pub fn ob_data_word_id_to_lane(data_word_id: u8) -> u8 {
if data_word_id <= *VALID_OL_CONNECT0_ID.end() {
data_word_id % VALID_OL_CONNECT0_ID.start()
} else if data_word_id <= *VALID_OL_CONNECT1_ID.end() {
7 + (data_word_id % VALID_OL_CONNECT1_ID.start())
} else if data_word_id <= *VALID_OL_CONNECT2_ID.end() {
14 + (data_word_id % VALID_OL_CONNECT2_ID.start())
} else {
21 + (data_word_id % VALID_OL_CONNECT3_ID.start())
}
}
#[inline]
pub fn ob_data_word_id_to_input_number_connector(data_word_id: u8) -> u8 {
data_word_id & 0b111
}
#[inline]
pub fn lane_id_to_lane_number(lane_id: u8, is_inner_barrel_lane: bool) -> u8 {
if is_inner_barrel_lane {
ib_data_word_id_to_lane(lane_id)
} else {
ob_data_word_id_to_lane(lane_id)
}
}
#[inline]
pub fn ob_data_word_id_to_connector(data_word_id: u8) -> u8 {
(data_word_id >> 3) & 0b11
}
#[inline]
pub fn ib_data_word_id_to_lane(data_word_id: u8) -> u8 {
data_word_id & 0x1F
}
pub const VALID_IL_ID: RangeInclusive<u8> = 0x20..=0x28;
pub const VALID_ML_CONNECT0_ID: RangeInclusive<u8> = 0x43..=0x46;
pub const VALID_ML_CONNECT1_ID: RangeInclusive<u8> = 0x48..=0x4B;
pub const VALID_ML_CONNECT2_ID: RangeInclusive<u8> = 0x53..=0x56;
pub const VALID_ML_CONNECT3_ID: RangeInclusive<u8> = 0x58..=0x5B;
pub const VALID_OL_CONNECT0_ID: RangeInclusive<u8> = 0x40..=0x46;
pub const VALID_OL_CONNECT1_ID: RangeInclusive<u8> = 0x48..=0x4E;
pub const VALID_OL_CONNECT2_ID: RangeInclusive<u8> = 0x50..=0x56;
pub const VALID_OL_CONNECT3_ID: RangeInclusive<u8> = 0x58..=0x5E;
#[repr(transparent)]
#[derive(Clone, Copy, PartialEq, PartialOrd)]
pub struct IbLane(u8);
#[repr(transparent)]
#[derive(Clone, Copy, PartialEq, PartialOrd)]
pub struct ObLane(u8);
#[cfg(test)]
mod tests {
use super::*;
use pretty_assertions::assert_eq;
#[test]
fn test_ob_data_word_id_to_lane() {
let data_words_ob = DATA_WORDS_OB.chunks_exact(16);
data_words_ob
.into_iter()
.enumerate()
.for_each(|(idx, data_word)| {
let id = data_word[9];
let lane = ob_data_word_id_to_lane(id);
assert_eq!(lane, (idx + 6) as u8);
});
}
#[test]
fn test_ob_data_word_id_to_input_number_connector() {
let data_words_ob = DATA_WORDS_OB.chunks_exact(16); let correct_input_number_connector = [6, 0, 1, 2];
data_words_ob
.into_iter()
.enumerate()
.for_each(|(idx, data_word)| {
let id = data_word[9];
let input_number_connector = ob_data_word_id_to_input_number_connector(id);
assert_eq!(input_number_connector, correct_input_number_connector[idx])
});
}
#[test]
fn test_ob_data_word_id_to_connector() {
let data_words_ob = DATA_WORDS_OB.chunks_exact(16); let correct_connector = [0, 1, 1, 1];
data_words_ob
.into_iter()
.enumerate()
.for_each(|(idx, data_word)| {
let id = data_word[9];
let connector = ob_data_word_id_to_connector(id);
assert_eq!(connector, correct_connector[idx])
});
}
}