/// This function confirms that all of the input expressions are direct SATInts, and returns vectors for each input of their bits
/// This function also normalizes direct SATInt operands to a common value range by zero-padding.
// TODO: In the future it may be possible to optimize operations between integers with different bit sizes
// TODO: this could be optimized by just going over the sections of both vectors where the ranges intersect
let (binding, old_min, old_max) = validate_direct_int_operands(vec![value.as_ref().clone()])?;
// There are no expressions to sum, this is a degenerate case that we can handle by returning a constant 0
// Validate all operands are direct SATInts and extract their bit vectors, also calculate a common min and max for all operands to normalize them to the same size by padding with zeroes as needed to simplify the addition logic.
// Addition is implemented as a series of pairwise additions. The bits of the output are defined by iterating over all possible output values, and for each output value k, ORing together ANDs for each pair of input values i,j where i+j=k. This is effectively a big disjunction of all possible ways to sum to k.