use crate::constraints::SpectralConstraint;
use crate::fwht::FWHT;
use crate::signal::SpectralSignal;
pub struct SpectralByte;
impl SpectralByte {
pub fn verify_full_adder(
a: &SpectralSignal,
b: &SpectralSignal,
cin: &SpectralSignal,
sum: &SpectralSignal,
cout: &SpectralSignal,
ab_xor: &SpectralSignal,
ab_and: &SpectralSignal,
cin_and_xor: &SpectralSignal,
) -> bool {
if !SpectralConstraint::verify_xor(a, b, ab_xor) {
return false;
}
if !SpectralConstraint::verify_xor(ab_xor, cin, sum) {
return false;
}
if !SpectralConstraint::verify_and(a, b, ab_and) {
return false;
}
if !SpectralConstraint::verify_and(cin, ab_xor, cin_and_xor) {
return false;
}
let f_cout = FWHT::fwht(cout);
let f_part1 = FWHT::fwht(ab_and);
let f_part2 = FWHT::fwht(cin_and_xor);
for i in 0..f_cout.values.len() {
if f_cout.values[i] != f_part1.values[i].add(f_part2.values[i]) {
return false;
}
}
true
}
pub fn verify_full_subtractor(
a: &SpectralSignal,
b: &SpectralSignal,
b_in: &SpectralSignal,
diff: &SpectralSignal,
b_out: &SpectralSignal,
ab_xor: &SpectralSignal,
not_a_and_b: &SpectralSignal,
bin_and_not_xor: &SpectralSignal,
) -> bool {
if !SpectralConstraint::verify_xor(a, b, ab_xor) {
return false;
}
if !SpectralConstraint::verify_xor(ab_xor, b_in, diff) {
return false;
}
let mut not_a_vals = Vec::new();
for v in &a.values {
not_a_vals.push(1 - *v);
}
let not_a = SpectralSignal::new(not_a_vals);
if !SpectralConstraint::verify_and(¬_a, b, not_a_and_b) {
return false;
}
let mut not_xor_vals = Vec::new();
for v in &ab_xor.values {
not_xor_vals.push(1 - *v);
}
let not_xor = SpectralSignal::new(not_xor_vals);
if !SpectralConstraint::verify_and(b_in, ¬_xor, bin_and_not_xor) {
return false;
}
let f_bout = FWHT::fwht(b_out);
let f_p1 = FWHT::fwht(not_a_and_b);
let f_p2 = FWHT::fwht(bin_and_not_xor);
for i in 0..f_bout.values.len() {
if f_bout.values[i] != f_p1.values[i].add(f_p2.values[i]) {
return false;
}
}
true
}
}