# Sumador restador de 4 bits
from machine import Pin
#Pines del primer número
a0 = Pin(0, Pin.IN, Pin.PULL_DOWN)
a1 = Pin(1, Pin.IN, Pin.PULL_DOWN)
a2 = Pin(2, Pin.IN, Pin.PULL_DOWN)
a3 = Pin(3, Pin.IN, Pin.PULL_DOWN)
#Pines del segundo número
b0 = Pin(4, Pin.IN, Pin.PULL_DOWN)
b1 = Pin(5, Pin.IN, Pin.PULL_DOWN)
b2 = Pin(6, Pin.IN, Pin.PULL_DOWN)
b3 = Pin(7, Pin.IN, Pin.PULL_DOWN)
#Pin del selector de suma o resta
sel = Pin(15, Pin.IN, Pin.PULL_UP)
#Pines del resultado
s0 = Pin(16, Pin.OUT)
s1 = Pin(17, Pin.OUT)
s2 = Pin(18, Pin.OUT)
s3 = Pin(19, Pin.OUT)
c_out = Pin(20, Pin.OUT)
while(1):
a = a0.value() + 2*a1.value() + 4*a2.value() + 8*a3.value()
b = b0.value() + 2*b1.value() + 4*b2.value() + 8*b3.value()
select = sel.value()
if(select == 0):
r = a + b
else:
r = a + ((~b)&0b1111) + 1
cad = "{:05b}".format(r)
s0.value(int(cad[4]))
s1.value(int(cad[3]))
s2.value(int(cad[2]))
s3.value(int(cad[1]))
c_out.value(int(cad[0]))
"""
def suma_1b(a, b,c):
suma = a^b^c
c_o = (a&b)|(a&c)|(b&c)
return suma, c_o
def suma_4b(a, b, c_i):
s0, c0 = suma_1b(a[0], b[0], c_i)
s1, c1 = suma_1b(a[1], b[1], c0)
s2, c2 = suma_1b(a[2], b[2], c1)
s3, c3 = suma_1b(a[3], b[3], c2)
return [s0, s1, s2, s3], c3
while(1):
select = sel.value()
a = [a0.value(), a1.value(), a2.value(), a3.value()]
if(select == 0):
b = [b0.value(), b1.value(), b2.value(), b3.value()]
else:
b = [b0.value()^1, b1.value()^1, b2.value()^1, b3.value()^1]
suma, carry_out = suma_4b(a, b, select)
s0.value(suma[0])
s1.value(suma[1])
s2.value(suma[2])
s3.value(suma[3])
c_out.value(carry_out)
"""