use crate::trellis::Trellis;
pub fn traceback<const S: usize>(
trellis: &Trellis<S>,
survivors: &[u64],
nstages: usize,
out: &mut Vec<u8>,
) {
let wps = S.div_ceil(64); out.clear();
let mut state = 0usize; for stage in (0..nstages).rev() {
let word = survivors[stage * wps + state / 64];
let slot = ((word >> (state % 64)) & 1) as usize; let branch = trellis.preds[state][slot];
out.push(branch.input);
state = branch.from;
}
out.reverse();
}
#[cfg(test)]
mod tests {
use super::*;
use crate::params::CodeParams;
use crate::trellis::Trellis;
#[test]
fn traceback_from_state0_reconstructs_inputs() {
let t = Trellis::<64>::from_params(&CodeParams::ccsds_r1_2()).unwrap();
let survivors = vec![0u64; 8]; let mut inputs = Vec::with_capacity(8);
traceback::<64>(&t, &survivors, 8, &mut inputs);
assert_eq!(inputs.len(), 8);
assert!(inputs.iter().all(|&b| b == 0)); }
}