use onerom_config::chip::ChipType;
use onerom_config::hw::Board;
use onerom_metadata::BitModes;
use crate::image::{ChipSetType, CsConfig, CsLogic};
use crate::v2::addr_layout::derive_addr_layout;
use crate::v2::alg_config::bit_mode_for;
use crate::v2::cs_data_layout::derive_cs_data_layout;
use crate::v2::slot_context::{SlotContext, socket_pin_offset};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct CompatResult {
pub num_addr_pins: u8,
pub slot_size_bytes: u32,
pub pin_offset: i16,
pub num_fly_lead_pins: u8,
}
impl CompatResult {
pub fn is_native(&self) -> bool {
self.pin_offset == 0
}
pub fn is_overhang(&self) -> bool {
self.pin_offset > 0
}
pub fn requires_fly_leads(&self) -> bool {
self.pin_offset < 0
}
}
pub fn is_v2_chip(chip_type: ChipType) -> bool {
!chip_type.is_plugin() && crate::SUPPORTED_CHIP_TYPES_V2.contains(&chip_type)
}
pub fn check_chip_on_board(board: Board, chip_type: ChipType) -> Option<CompatResult> {
if !is_v2_chip(chip_type) {
return None;
}
let pin_offset = socket_pin_offset(chip_type.chip_pins(), board.chip_pins())?;
let bit_mode = bit_mode_for(chip_type, board);
let cs_config = CsConfig::new(
Some(CsLogic::ActiveLow),
Some(CsLogic::Ignore),
Some(CsLogic::Ignore),
);
let ctx = SlotContext {
board,
set_type: ChipSetType::Single,
chip_types: alloc::vec![chip_type],
cs_config,
bit_mode,
pin_offset,
force_16_bit: false,
multi_cs_config: None,
};
let addr_layout = derive_addr_layout(&ctx).ok()?;
derive_cs_data_layout(&ctx, Some(&addr_layout)).ok()?;
let bytes_per_word: u32 = if matches!(bit_mode, BitModes::BitMode16) {
2
} else {
1
};
let num_fly_lead_pins = if pin_offset < 0 {
let addr_line_start = if matches!(bit_mode, BitModes::BitMode16) {
1
} else {
0
};
chip_type.address_pins()[addr_line_start..]
.iter()
.filter(|&&ap| {
let sp = ap as i16 + pin_offset;
sp < 1 || sp > board.chip_pins() as i16
})
.count() as u8
} else {
0
};
Some(CompatResult {
num_addr_pins: addr_layout.num_addr_pins,
slot_size_bytes: (1u32 << addr_layout.num_addr_pins) * bytes_per_word,
pin_offset,
num_fly_lead_pins,
})
}