def int2vec(num, length=None): """Convert a signed integer to a BitVector.""" if num < 0: req_length = clog2(abs(num)) + 1 bv = uint2vec(2 ** req_length + num) else: req_length = clog2(num + 1) + 1 bv = uint2vec(num, req_length) if length: if length < req_length: raise ValueError("overflow: " + str(num)) else: bv.sext(length - req_length) return bv
def kogge_stone_add(A, B, cin=0): """Return symbolic logic for an N-bit Kogge-Stone adder.""" assert len(A) == len(B) stop = len(A) # generate/propagate logic g = [A[i] * B[i] for i in range(stop)] p = [Xor(A[i], B[i]) for i in range(stop)] for i in range(clog2(stop)): start = 1 << i for j in range(start, stop): g[j] = g[j] + p[j] * g[j-start] p[j] = p[j] * p[j-start] # sum logic s = [Xor(A[i], B[i], (cin if i == 0 else g[i-1])) for i in range(stop)] return BitVector(s), BitVector(g)