Here is my final working version:
declare GateMaker
fun {GateMaker F}
fun {$ Xs Ys}
fun {GateLoop Xs Ys}
case Xs#Ys of (X|Xr)#(Y|Yr) then
{F X Y}|{GateLoop Xr Yr}
end
end
in
thread {GateLoop Xs Ys} end
end
end
declare AndG OrG NandG NorG XorG
AndG ={GateMaker fun {$ X Y} X*Y end}
OrG ={GateMaker fun {$ X Y} X+Y-X*Y end}
NandG={GateMaker fun {$ X Y} 1-X*Y end}
NorG ={GateMaker fun {$ X Y} 1-X-Y+X*Y end}
XorG ={GateMaker fun {$ X Y} X+Y-2*X*Y end}
declare FullAdder
proc {FullAdder X Y Z ?C ?S}
K L M
in
K={AndG X Y}
L={AndG Y Z}
M={AndG X Z}
C={OrG K {OrG L M}}
S={XorG Z {XorG X Y}}
end
% Z0s=0|0|0|...
% {FullAdder X1s Y1s Z0s C1s S1s}
% {FullAdder X2s Y2s C1s C2s S2s}
% {FullAdder X3s Y3s C2s C3s S3s}
% {FullAdder Z0s Z0s C3s _ S4s}
declare TRepeat
fun {TRepeat Ws F}
thread {Map Ws fun {$ _} {F} end} end
end
declare ChainedAdder
local
Bit
in
fun {Bit N Xs}
thread {Map Xs fun {$ X} X.N end} end
end
proc {ChainedAdder Xs Ys ?Ss}
N Cs Zeros
in
N={Width Xs.1}
Zeros={TRepeat Xs fun {$} 0 end}
Cs={TRepeat Xs fun {$} {MakeTuple '#' N+1} end}
Ss={TRepeat Xs fun {$} {MakeTuple '#' N+1} end}
{Browse cs#Cs}
{Browse ss#Ss}
{Bit 1 Cs}=Zeros
for I in 1..N do
{FullAdder {Bit I Xs} {Bit I Ys} {Bit I Cs} {Bit I+1 Cs} {Bit I
Ss}}
end
{FullAdder Zeros Zeros {Bit N+1 Cs} _ {Bit N+1 Ss}}
end
end
declare
X=(0#1#1)|_
Y=(1#0#1)|_
S
{ChainedAdder X Y S}
{Browse inp(X Y)#sum(S)}
_________________________________________________________________________________
mozart-users mailing list
[email protected]
http://www.mozart-oz.org/mailman/listinfo/mozart-users