const gate = require('@runkit/learn/gate/3.0.0')
const halfAdder = (a, b) => ({sum: gate.xor(a, b), carry: gate.and(a,b)})
const fullAdder = (a, b, carry) => {
const result1 = halfAdder(a, b)
const result2 = halfAdder((carry || 0), result1.sum)
return {sum: result2.sum, carry: gate.or(result1.carry, result2.carry)}
}
const multiBitsSum = (inputA, inputB, carryIn) => {
let output = []
let carry = carryIn || 0
for (var i = 0; i < inputA.length; i++) {
let result = fullAdder(inputA[i], inputB[i], carry)
output[i] = result.sum
carry = result.carry
}
return {output: output, carry: carry}
}
const multiBitsSumByComps = (inputAHigh, inputBHigh, inputALow, inputBLow, carryIn) => {
let output = []
let carry = carryIn || 0
const lowResult = multiBitsSum(inputALow, inputBLow, carry)
const highResult = multiBitsSum(inputAHigh, inputBHigh, lowResult.carry)
return {output: highResult.output.concat(highResult.output), carry: highResult.carry}
}