use crate::connection::port_slice::PortSliceConnections;
use crate::io::IO;
pub fn check_for_gaps(connections: &[PortSliceConnections], io: &IO, debug_str: &str) {
let first = connections
.first()
.unwrap_or_else(|| panic!("{debug_str} is unconnected"));
let last = connections
.last()
.unwrap_or_else(|| panic!("{debug_str} is unconnected"));
assert!(
!first.is_empty(),
"Invalid connection found for {debug_str}"
);
assert!(!last.is_empty(), "Invalid connection found for {debug_str}");
let actual_msb = first[0].this.msb;
let gap = (io.width() - 1) - actual_msb;
assert!(
gap == 0,
"{debug_str}{} is unconnected",
slice_fmt(io.width() - 1, actual_msb + 1)
);
let actual_lsb = last[0].this.lsb;
let gap = actual_lsb;
assert!(
gap == 0,
"{debug_str}{} is unconnected",
slice_fmt(actual_lsb - 1, 0)
);
for i in 0..connections.len() - 1 {
let chunk_i_lsb = connections[i][0].this.lsb;
let chunk_i_plus_1_msb = connections[i + 1][0].this.msb;
assert!(
chunk_i_lsb == (chunk_i_plus_1_msb + 1),
"{debug_str}{} is unconnected",
slice_fmt(chunk_i_lsb - 1, chunk_i_plus_1_msb + 1),
);
}
}
fn slice_fmt(msb: usize, lsb: usize) -> String {
if msb == lsb {
format!("[{}]", msb)
} else {
format!("[{}:{}]", msb, lsb)
}
}