Four bit adder: Difference between revisions

Content added Content deleted
No edit summary
No edit summary
Line 1,551: Line 1,551:
vzeroupper
vzeroupper
ret $160</lang>
ret $160</lang>
=={{header|Delphi}}==
{{libheader| System.SysUtils}}
{{Trans|C#}}
<lang Delphi>
program Four_bit_adder;


{$APPTYPE CONSOLE}

uses
System.SysUtils;

Type
TBitAdderOutput = record
S, C: Boolean;
procedure Assign(_s, _C: Boolean);
function ToString: string;
end;

TNibbleBits = array[1..4] of Boolean;

TNibble = record
Bits: TNibbleBits;
procedure Assign(_Bits: TNibbleBits); overload;
procedure Assign(value: byte); overload;
function ToString: string;
end;

TFourBitAdderOutput = record
N: TNibble;
c: Boolean;
procedure Assign(_c: Boolean; _N: TNibbleBits);
function ToString: string;
end;

TLogic = record
class function GateNot(const A: Boolean): Boolean; static;
class function GateAnd(const A, B: Boolean): Boolean; static;
class function GateOr(const A, B: Boolean): Boolean; static;
class function GateXor(const A, B: Boolean): Boolean; static;
end;

TConstructiveBlocks = record
function HalfAdder(const A, B: Boolean): TBitAdderOutput;
function FullAdder(const A, B, CI: Boolean): TBitAdderOutput;
function FourBitAdder(const A, B: TNibble; const CI: Boolean): TFourBitAdderOutput;
end;



{ TBitAdderOutput }

procedure TBitAdderOutput.Assign(_s, _C: Boolean);
begin
s := _s;
c := _C;
end;

function TBitAdderOutput.ToString: string;
begin
Result := 'S' + ord(s).ToString + 'C' + ord(c).ToString;
end;

{ TNibble }

procedure TNibble.Assign(_Bits: TNibbleBits);
var
i: Integer;
begin
for i := 1 to 4 do
Bits[i] := _Bits[i];
end;

procedure TNibble.Assign(value: byte);
var
i: Integer;
begin
value := value and $0F;
for i := 1 to 4 do
Bits[i] := ((value shr (i - 1)) and 1) = 1;
end;

function TNibble.ToString: string;
var
i: Integer;
begin
Result := '';
for i := 4 downto 1 do
Result := Result + ord(Bits[i]).ToString;
end;

{ TFourBitAdderOutput }

procedure TFourBitAdderOutput.Assign(_c: Boolean; _N: TNibbleBits);
begin
N.Assign(_N);
c := _c;
end;

function TFourBitAdderOutput.ToString: string;
begin
Result := N.ToString + ' c=' + ord(c).ToString;
end;

{ TLogic }

class function TLogic.GateAnd(const A, B: Boolean): Boolean;
begin
Result := A and B;
end;

class function TLogic.GateNot(const A: Boolean): Boolean;
begin
Result := not A;
end;

class function TLogic.GateOr(const A, B: Boolean): Boolean;
begin
Result := A or B;
end;

class function TLogic.GateXor(const A, B: Boolean): Boolean;
begin
Result := GateOr(GateAnd(A, GateNot(B)), (GateAnd(GateNot(A), B)));
end;

{ TConstructiveBlocks }

function TConstructiveBlocks.FourBitAdder(const A, B: TNibble; const CI: Boolean):
TFourBitAdderOutput;
var
FA: array[1..4] of TBitAdderOutput;
i: Integer;
begin
FA[1] := FullAdder(A.Bits[1], B.Bits[1], CI);
Result.N.Bits[1] := FA[1].S;

for i := 2 to 4 do
begin
FA[i] := FullAdder(A.Bits[i], B.Bits[i], FA[i - 1].C);
Result.N.Bits[i] := FA[i].S;
end;
Result.C := FA[4].C;
end;

function TConstructiveBlocks.FullAdder(const A, B, CI: Boolean): TBitAdderOutput;
var
HA1, HA2: TBitAdderOutput;
begin
HA1 := HalfAdder(CI, A);
HA2 := HalfAdder(HA1.S, B);
Result.Assign(HA2.S, TLogic.GateOr(HA1.C, HA2.C));
end;

function TConstructiveBlocks.HalfAdder(const A, B: Boolean): TBitAdderOutput;
begin
Result.Assign(TLogic.GateXor(A, B), TLogic.GateAnd(A, B));
end;

var
j, k: Integer;
A, B: TNibble;
Blocks: TConstructiveBlocks;

begin
for k := 0 to 255 do
begin
A.Assign(0);
B.Assign(0);
for j := 0 to 7 do
begin
if j < 4 then
A.Bits[j + 1] := ((1 shl j) and k) > 0
else
B.Bits[j + 1 - 4] := ((1 shl j) and k) > 0;
end;

write(A.ToString, ' + ', B.ToString, ' = ');
Writeln(Blocks.FourBitAdder(A, B, false).ToString);
end;
Writeln;
Readln;
end.
</lang>
{{out}}
<pre>
0000 + 0000 = 0000 c=0
0001 + 0000 = 0001 c=0
0010 + 0000 = 0010 c=0
0011 + 0000 = 0011 c=0
0100 + 0000 = 0100 c=0
0101 + 0000 = 0101 c=0
0110 + 0000 = 0110 c=0
0111 + 0000 = 0111 c=0
1000 + 0000 = 1000 c=0
1001 + 0000 = 1001 c=0
1010 + 0000 = 1010 c=0
1011 + 0000 = 1011 c=0
1100 + 0000 = 1100 c=0
1101 + 0000 = 1101 c=0
1110 + 0000 = 1110 c=0
1111 + 0000 = 1111 c=0
0000 + 0001 = 0001 c=0
0001 + 0001 = 0010 c=0
0010 + 0001 = 0011 c=0
0011 + 0001 = 0100 c=0
0100 + 0001 = 0101 c=0
0101 + 0001 = 0110 c=0
0110 + 0001 = 0111 c=0
0111 + 0001 = 1000 c=0
1000 + 0001 = 1001 c=0
1001 + 0001 = 1010 c=0
1010 + 0001 = 1011 c=0
1011 + 0001 = 1100 c=0
1100 + 0001 = 1101 c=0
1101 + 0001 = 1110 c=0
1110 + 0001 = 1111 c=0
1111 + 0001 = 0000 c=1
0000 + 0010 = 0010 c=0
0001 + 0010 = 0011 c=0
0010 + 0010 = 0100 c=0
0011 + 0010 = 0101 c=0
0100 + 0010 = 0110 c=0
0101 + 0010 = 0111 c=0
0110 + 0010 = 1000 c=0
0111 + 0010 = 1001 c=0
1000 + 0010 = 1010 c=0
1001 + 0010 = 1011 c=0
1010 + 0010 = 1100 c=0
1011 + 0010 = 1101 c=0
1100 + 0010 = 1110 c=0
1101 + 0010 = 1111 c=0
1110 + 0010 = 0000 c=1
1111 + 0010 = 0001 c=1
0000 + 0011 = 0011 c=0
0001 + 0011 = 0100 c=0
0010 + 0011 = 0101 c=0
0011 + 0011 = 0110 c=0
0100 + 0011 = 0111 c=0
0101 + 0011 = 1000 c=0
0110 + 0011 = 1001 c=0
0111 + 0011 = 1010 c=0
1000 + 0011 = 1011 c=0
1001 + 0011 = 1100 c=0
1010 + 0011 = 1101 c=0
1011 + 0011 = 1110 c=0
1100 + 0011 = 1111 c=0
1101 + 0011 = 0000 c=1
1110 + 0011 = 0001 c=1
1111 + 0011 = 0010 c=1
0000 + 0100 = 0100 c=0
0001 + 0100 = 0101 c=0
0010 + 0100 = 0110 c=0
0011 + 0100 = 0111 c=0
0100 + 0100 = 1000 c=0
0101 + 0100 = 1001 c=0
0110 + 0100 = 1010 c=0
0111 + 0100 = 1011 c=0
1000 + 0100 = 1100 c=0
1001 + 0100 = 1101 c=0
1010 + 0100 = 1110 c=0
1011 + 0100 = 1111 c=0
1100 + 0100 = 0000 c=1
1101 + 0100 = 0001 c=1
1110 + 0100 = 0010 c=1
1111 + 0100 = 0011 c=1
0000 + 0101 = 0101 c=0
0001 + 0101 = 0110 c=0
0010 + 0101 = 0111 c=0
0011 + 0101 = 1000 c=0
0100 + 0101 = 1001 c=0
0101 + 0101 = 1010 c=0
0110 + 0101 = 1011 c=0
0111 + 0101 = 1100 c=0
1000 + 0101 = 1101 c=0
1001 + 0101 = 1110 c=0
1010 + 0101 = 1111 c=0
1011 + 0101 = 0000 c=1
1100 + 0101 = 0001 c=1
1101 + 0101 = 0010 c=1
1110 + 0101 = 0011 c=1
1111 + 0101 = 0100 c=1
0000 + 0110 = 0110 c=0
0001 + 0110 = 0111 c=0
0010 + 0110 = 1000 c=0
0011 + 0110 = 1001 c=0
0100 + 0110 = 1010 c=0
0101 + 0110 = 1011 c=0
0110 + 0110 = 1100 c=0
0111 + 0110 = 1101 c=0
1000 + 0110 = 1110 c=0
1001 + 0110 = 1111 c=0
1010 + 0110 = 0000 c=1
1011 + 0110 = 0001 c=1
1100 + 0110 = 0010 c=1
1101 + 0110 = 0011 c=1
1110 + 0110 = 0100 c=1
1111 + 0110 = 0101 c=1
0000 + 0111 = 0111 c=0
0001 + 0111 = 1000 c=0
0010 + 0111 = 1001 c=0
0011 + 0111 = 1010 c=0
0100 + 0111 = 1011 c=0
0101 + 0111 = 1100 c=0
0110 + 0111 = 1101 c=0
0111 + 0111 = 1110 c=0
1000 + 0111 = 1111 c=0
1001 + 0111 = 0000 c=1
1010 + 0111 = 0001 c=1
1011 + 0111 = 0010 c=1
1100 + 0111 = 0011 c=1
1101 + 0111 = 0100 c=1
1110 + 0111 = 0101 c=1
1111 + 0111 = 0110 c=1
0000 + 1000 = 1000 c=0
0001 + 1000 = 1001 c=0
0010 + 1000 = 1010 c=0
0011 + 1000 = 1011 c=0
0100 + 1000 = 1100 c=0
0101 + 1000 = 1101 c=0
0110 + 1000 = 1110 c=0
0111 + 1000 = 1111 c=0
1000 + 1000 = 0000 c=1
1001 + 1000 = 0001 c=1
1010 + 1000 = 0010 c=1
1011 + 1000 = 0011 c=1
1100 + 1000 = 0100 c=1
1101 + 1000 = 0101 c=1
1110 + 1000 = 0110 c=1
1111 + 1000 = 0111 c=1
0000 + 1001 = 1001 c=0
0001 + 1001 = 1010 c=0
0010 + 1001 = 1011 c=0
0011 + 1001 = 1100 c=0
0100 + 1001 = 1101 c=0
0101 + 1001 = 1110 c=0
0110 + 1001 = 1111 c=0
0111 + 1001 = 0000 c=1
1000 + 1001 = 0001 c=1
1001 + 1001 = 0010 c=1
1010 + 1001 = 0011 c=1
1011 + 1001 = 0100 c=1
1100 + 1001 = 0101 c=1
1101 + 1001 = 0110 c=1
1110 + 1001 = 0111 c=1
1111 + 1001 = 1000 c=1
0000 + 1010 = 1010 c=0
0001 + 1010 = 1011 c=0
0010 + 1010 = 1100 c=0
0011 + 1010 = 1101 c=0
0100 + 1010 = 1110 c=0
0101 + 1010 = 1111 c=0
0110 + 1010 = 0000 c=1
0111 + 1010 = 0001 c=1
1000 + 1010 = 0010 c=1
1001 + 1010 = 0011 c=1
1010 + 1010 = 0100 c=1
1011 + 1010 = 0101 c=1
1100 + 1010 = 0110 c=1
1101 + 1010 = 0111 c=1
1110 + 1010 = 1000 c=1
1111 + 1010 = 1001 c=1
0000 + 1011 = 1011 c=0
0001 + 1011 = 1100 c=0
0010 + 1011 = 1101 c=0
0011 + 1011 = 1110 c=0
0100 + 1011 = 1111 c=0
0101 + 1011 = 0000 c=1
0110 + 1011 = 0001 c=1
0111 + 1011 = 0010 c=1
1000 + 1011 = 0011 c=1
1001 + 1011 = 0100 c=1
1010 + 1011 = 0101 c=1
1011 + 1011 = 0110 c=1
1100 + 1011 = 0111 c=1
1101 + 1011 = 1000 c=1
1110 + 1011 = 1001 c=1
1111 + 1011 = 1010 c=1
0000 + 1100 = 1100 c=0
0001 + 1100 = 1101 c=0
0010 + 1100 = 1110 c=0
0011 + 1100 = 1111 c=0
0100 + 1100 = 0000 c=1
0101 + 1100 = 0001 c=1
0110 + 1100 = 0010 c=1
0111 + 1100 = 0011 c=1
1000 + 1100 = 0100 c=1
1001 + 1100 = 0101 c=1
1010 + 1100 = 0110 c=1
1011 + 1100 = 0111 c=1
1100 + 1100 = 1000 c=1
1101 + 1100 = 1001 c=1
1110 + 1100 = 1010 c=1
1111 + 1100 = 1011 c=1
0000 + 1101 = 1101 c=0
0001 + 1101 = 1110 c=0
0010 + 1101 = 1111 c=0
0011 + 1101 = 0000 c=1
0100 + 1101 = 0001 c=1
0101 + 1101 = 0010 c=1
0110 + 1101 = 0011 c=1
0111 + 1101 = 0100 c=1
1000 + 1101 = 0101 c=1
1001 + 1101 = 0110 c=1
1010 + 1101 = 0111 c=1
1011 + 1101 = 1000 c=1
1100 + 1101 = 1001 c=1
1101 + 1101 = 1010 c=1
1110 + 1101 = 1011 c=1
1111 + 1101 = 1100 c=1
0000 + 1110 = 1110 c=0
0001 + 1110 = 1111 c=0
0010 + 1110 = 0000 c=1
0011 + 1110 = 0001 c=1
0100 + 1110 = 0010 c=1
0101 + 1110 = 0011 c=1
0110 + 1110 = 0100 c=1
0111 + 1110 = 0101 c=1
1000 + 1110 = 0110 c=1
1001 + 1110 = 0111 c=1
1010 + 1110 = 1000 c=1
1011 + 1110 = 1001 c=1
1100 + 1110 = 1010 c=1
1101 + 1110 = 1011 c=1
1110 + 1110 = 1100 c=1
1111 + 1110 = 1101 c=1
0000 + 1111 = 1111 c=0
0001 + 1111 = 0000 c=1
0010 + 1111 = 0001 c=1
0011 + 1111 = 0010 c=1
0100 + 1111 = 0011 c=1
0101 + 1111 = 0100 c=1
0110 + 1111 = 0101 c=1
0111 + 1111 = 0110 c=1
1000 + 1111 = 0111 c=1
1001 + 1111 = 1000 c=1
1010 + 1111 = 1001 c=1
1011 + 1111 = 1010 c=1
1100 + 1111 = 1011 c=1
1101 + 1111 = 1100 c=1
1110 + 1111 = 1101 c=1
1111 + 1111 = 1110 c=1
</pre>
=={{header|Elixir}}==
=={{header|Elixir}}==
{{works with|Elixir|1.1}}
{{works with|Elixir|1.1}}