Four bit adder: Difference between revisions

→‎{{header|PicoLisp}}: Added PureBasic
(→‎{{header|PicoLisp}}: Added PureBasic)
Line 933:
: (4bitsAdder T T T T NIL NIL NIL T)
-> (T NIL NIL NIL NIL)</pre>
=={{header|PureBasic}}==
<lang PureBasic>;Because no representation for a solitary bit is present, bits are stored as bytes.
;Output values from the constructive building blocks is done using pointers (i.e. '*').
 
Procedure.b notGate(x)
ProcedureReturn ~x
EndProcedure
 
Procedure.b xorGate(x,y)
ProcedureReturn (x & notGate(y)) | (notGate(x) & y)
EndProcedure
Procedure halfadder(a, b, *sum.Byte, *carry.Byte)
*sum\b = xorGate(a, b)
*carry\b = a & b
EndProcedure
Procedure fulladder(a, b, c0, *sum.Byte, *c1.Byte)
Protected sum_ac.b, carry_ac.b, carry_sb.b
halfadder(c0, a, @sum_ac, @carry_ac)
halfadder(sum_ac, b, *sum, @carry_sb)
*c1\b = carry_ac | carry_sb
EndProcedure
 
Procedure fourbitsadder(a0, a1, a2, a3, b0, b1, b2, b3 , *s0.Byte, *s1.Byte, *s2.Byte, *s3.Byte, *v.Byte)
Protected.b c1, c2, c3
fulladder(a0, b0, 0, *s0, @c1)
fulladder(a1, b1, c1, *s1, @c2)
fulladder(a2, b2, c2, *s2, @c3)
fulladder(a3, b3, c3, *s3, *v)
EndProcedure
 
;// Test implementation, map two 4-character strings to the inputs of the fourbitsadder() and display results
Procedure.s test_4_bit_adder(a.s,b.s)
Protected.b s0, s1, s2, s3, v, i
Dim a.b(3)
Dim b.b(3)
For i = 0 To 3
a(i) = Val(Mid(a, 4 - i, 1))
b(i) = Val(Mid(b, 4 - i, 1))
Next
 
fourbitsadder(a(0), a(1), a(2), a(3), b(0), b(1), b(2), b(3), @s0, @s1, @s2, @s3, @v)
ProcedureReturn a + " + " + b + " = " + Str(s3) + Str(s2) + Str(s1) + Str(s0) + " overflow " + Str(v)
EndProcedure
 
If OpenConsole()
PrintN(test_4_bit_adder("0110","1110"))
Print(#CRLF$ + #CRLF$ + "Press ENTER to exit")
Input()
CloseConsole()
EndIf</lang>
Sample output:
<pre>0110 + 1110 = 0100 overflow 1</pre>
 
=={{header|Python}}==
Anonymous user