Four bit adder: Difference between revisions
Content added Content deleted
No edit summary |
MaiconSoft (talk | contribs) 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}} |