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

Reply via email to