code: def carrysave_adder(a, b, c, final_adder=ripple_add):
      
      a, b, c = libutils.match_bitwidth(a, b, c)
      partial_sum = a ^ b ^ c
      shift_carry = (a | b) & (a | c) & (b | c)
      return pyrtl.concat(final_adder(partial_sum[1:], shift_carry), partial_sum[0])
docs: Adds three wirevectors up in an efficient manner
      :param WireVector a, b, c : the three wires to add up
      :param function final_adder : The adder to use to do the final addition
      :return: a wirevector with length 2 longer than the largest input