30 lines
724 B
Text
30 lines
724 B
Text
using Printf
|
|
|
|
xor{T<:Bool}(a::T, b::T) = (a&~b)|(~a&b)
|
|
|
|
halfadder{T<:Bool}(a::T, b::T) = (xor(a,b), a&b)
|
|
|
|
function fulladder{T<:Bool}(a::T, b::T, c::T=false)
|
|
(s, ca) = halfadder(c, a)
|
|
(s, cb) = halfadder(s, b)
|
|
(s, ca|cb)
|
|
end
|
|
|
|
function adder(a::BitArray{1}, b::BitArray{1}, c0::Bool=false)
|
|
len = length(a)
|
|
length(b) == len || error("Addend width mismatch.")
|
|
c = c0
|
|
s = falses(len)
|
|
for i in 1:len
|
|
(s[i], c) = fulladder(a[i], b[i], c)
|
|
end
|
|
(s, c)
|
|
end
|
|
|
|
function adder{T<:Integer}(m::T, n::T, wid::T=4, c0::Bool=false)
|
|
a = bitpack(digits(m, 2, wid))[1:wid]
|
|
b = bitpack(digits(n, 2, wid))[1:wid]
|
|
adder(a, b, c0)
|
|
end
|
|
|
|
Base.bits(n::BitArray{1}) = join(reverse(int(n)), "")
|