Если реализовано напрямую, в полном сумматоре есть столько ворот. Рассматривали ли вы использование составных вентилей, таких как 8-битные примитивы или использование полусуммера ? У меня нет непосредственного опыта, но я не думаю, что полные сумматоры реализуются непосредственно с примитивами на практике, вместо этого они, вероятно, используют эти промежуточные части.
Вторая глава nand2tetris охватывает подход наполовину сумматора, который, если вы примените к своему коду, позволяет сделать небольшое упрощение:
carry_in = carry_out if (carry_out is not None) else carry_in
value_out = XOR(carry_in, XOR(bit_1, bit_2))
carry_out = OR(AND(bit_1, bit_2), AND(bit_1, carry_in), AND(bit_2, carry_in))
можно вместо этого записать в виде:
carry_in = carry_out if (carry_out is not None) else carry_in
half_sum = XOR(bit_1, bit_2)
half_carry = AND(bit_1, bit_2)
full_sum = XOR(carry_in, half_sum)
full_carry = AND(half_sum, carry_in)
value_out = full_sum
carry_out = OR(half_carry, full_carry)
Это уменьшает число Ворота за итерацию от 6 до 5, так что это должно уменьшить ваш вывод на 1/6. Тем не менее, я бы порекомендовал поместить это в отдельные ворота, поскольку половинный сумматор полезен независимо.