All pastes #1845282 Raw Edit

Miscellany

public text v1 · immutable
#1845282 ·published 2010-03-19 01:14 UTC
rendered paste body
program Mad_Adder;  {$APPTYPE Console}


// en.wikipedia.org/wiki/Adder_%28electronics%29#Full_adder


//------------------------------------------------------------------------------


type    Bit             =       0..1;


var     NullBit         :       Bit
                        =       0;


//------------------------------------------------------------------------------


type    TAdder          =       class
        A               :       ^Bit;
        B               :       ^Bit;
        CIn             :       ^Bit;
        Cout            :       Bit;
        S               :       Bit;
        procedure       Compute ;
        end;


procedure TAdder.Compute;
var     tmp             :       Bit;
begin
tmp  := (A^  XOR B^  );
S    := (tmp XOR CIn^);
COut := (tmp AND CIn^) AND (A^ AND B^);
end;


//------------------------------------------------------------------------------


type    TByteAdder      =       class
        A               :       array[0..7] of Bit;
        B               :       array[0..7] of Bit;
        Adder           :       array[0..7] of TAdder;
        procedure       Compute (const A, B : Byte;  var Result : Byte;  var Carry : Bit);
        constructor     Create  ;
        destructor      Destroy ;  override;
        end;


procedure TByteAdder.Compute(const A, B : Byte;  var Result : Byte;  var Carry : Bit);
var     i               :       Integer;
begin
for i := 0 to 7 do begin
        Self.A[i] := A SHR i;
        Self.B[i] := B SHR i;
end;
for i := 0 to 7 do  Adder[i].Compute;
Result := (Byte(Adder[7].S) SHL 7) OR
          (Byte(Adder[6].S) SHL 6) OR
          (Byte(Adder[5].S) SHL 5) OR
          (Byte(Adder[4].S) SHL 4) OR
          (Byte(Adder[3].S) SHL 3) OR
          (Byte(Adder[2].S) SHL 2) OR
          (Byte(Adder[1].S) SHL 1) OR
          (Byte(Adder[0].S) SHL 0);
Carry := Adder[7].COut;
end;


constructor TByteAdder.Create;
var     i               :       Integer;
begin
inherited Create;
for i := 0 to 7 do begin
        Adder[i] := TAdder.Create;
        with Adder[i] do begin
                A := @Self.A[i];
                B := @Self.B[i];
                if (i <> 0) then CIn := @Adder[i - 1].Cout;
        end;
end;
Adder[0].CIn := @NullBit;
end;


destructor TByteAdder.Destroy;
var     i               :       Integer;
begin
for i := 0 to 7 do  Adder[i].Free;
inherited Destroy;
end;


//------------------------------------------------------------------------------


const   A               =       1;
        B               =       1;


var     ByteAdder       :       TByteAdder;
        Carry           :       Byte;
        Result          :       Byte;


begin
ByteAdder := TByteAdder.Create;
try
        ByteAdder.Compute(A, B, Result, Carry);
        Write(A, ' + ', B, ' = ', Result);
        if (Carry <> 0) then Write(' with carry');
        WriteLn;
finally
        ByteAdder.Free;
end;
end.