class LogicGate: # Clase llamada LogicGate
def __init__(self,n): # Constructor de la clase LogicGate
self.name = n # Variable label obtiene el valor por parametro de n
self.output = None # Variable Output obtiene el valor nulo
def getName(self): # Metodo de la clase LogicGate llamado getLabel
return self.name # Devuelve de label(getter)
def getOutput(self): # Metodo de la clase LogicGate llamado geOutput
self.output = self.performGateLogic() # Variable Output obtiene el valor return del metodo performGateLogic
return self.output # Devuelve el valor obtenido
class BinaryGate(LogicGate): # Clase BinaryGate hereda LogicGate
def __init__(self,n): # Constructor de BinaryGate con parametro n
LogicGate.__init__(self,n) # Declara el constructor de la clase LogicGate
self.pinA = None # Variable pinA valor nulo
self.pinB = None # Variable pinB valor nulo
def getPinA(self): # Metodo de la clase BinaryGate llamado getPinA
if self.pinA == None:
return int(input("Enter Pin A input for gate "+self.getName()+"-->")) # Cambia el tipo de dato a entero + obtiene el valor del usuario +
# Utiliza Inherits para llamar el metodo getLabel de LogicGate
else:
return self.pinA.getFrom().getOutput()
def getPinB(self): # Metodo de la clase BinaryGate llamado getPinB
if self.pinB == None:
return int(input("Enter Pin B input for gate "+self.getName()+"-->")) # Cambia el tipo de dato a entero + obtiene el valor del usuario
else:
return self.pinB.getFrom().getOutput()
def setNextPin(self,source): # Metodo llamado setNextPin con source por parametro
if self.pinA == None: # If PinA es nulo
self.pinA = source # Se le otorga el valor a PinA
else:
if self.pinB == None:
self.pinB = source
else:
print("Cannot Connect: NO EMPTY PINS on this gate")
class AndGate(BinaryGate): # Clase llamada AndGate hereda BinaryGate
def __init__(self,n): # Constructor de la clase con this y n por parametro
BinaryGate.__init__(self,n)
def performGateLogic(self): # Metodo performGateLogic de la clase
a = self.getPinA() # a obtiene el valor devuelto de getPinA clase heredada
b = self.getPinB()
if a==1 and b==1: # Condicion para ejecutar codigo si a & b son 1
return 1 # Devuelve
else:
return 0
class OrGate(BinaryGate):
def __init__(self,n):
BinaryGate.__init__(self,n)
def performGateLogic(self):
a = self.getPinA()
b = self.getPinB()
if a ==1 or b==1:
return 1
else:
return 0
class UnaryGate(LogicGate): # Clase llamada UnaryGate hereda LogicGate
def __init__(self,n): # Constructor de la clase UnaryGate
LogicGate.__init__(self,n) # Declara constructor de LogicGate
self.pin = None # Pin nulo
def getPin(self): # Metodo llamado getPin
if self.pin == None:
return int(input("Enter Pin input for gate "+self.getName()+"-->")) # Devuelve en tipo entero el input del usuario y llama al metodo
# getLabel heredado de LogicGate
else:
return self.pin.getFrom().getOutput()
def setNextPin(self,source):
if self.pin == None:
self.pin = source
else:
print("Cannot Connect: NO EMPTY PINS on this gate")
class NotGate(UnaryGate): # Clase llamada NotGate
def __init__(self,n): # Constructor
UnaryGate.__init__(self,n)
def performGateLogic(self): # Metodo llamado performGateLogic
if self.getPin():
return 0
else:
return 1
class Connector: # Clase llamada conector
def __init__(self, fgate, tgate): # Constructor de la clase & contiene dos parametros
self.fromgate = fgate # Otorga el valor del parametro a la variable
self.togate = tgate
tgate.setNextPin(self)
def getFrom(self): # Metodo Getter
return self.fromgate
def getTo(self): # Metodo Getter
return self.togate
def main():
gateOne = AndGate("gateOne")
# Se declara un objeto de la clase AndGate esta hereda BinaryGate y luego es heredada por la SuperClass LogicGate
# pasando el valor de n(parametro) por todas las clases. Luego para calcularlo e imprimirlo es llamado con print el metodo getOutput().
# performGateLogic() este metodo tiene dos variables a = int(input) al igual que b luego es evaluado si ambos son 1 return 1 else 0.
print(gateOne.getOutput())
gateTwo = OrGate("gateTwo")
# Para el OrGate es exactamente igual que AndGate ya que ambas utilizan la clase BinaryGate
# se ejectuta de la misma manera.
gateThree = NotGate("gateThree")
# NotGate utiliza la clase UnaryGate y esta hereda a LogicGate lleva por parametro el string y lo guarda en LigicGate Class Name.
# Termina ciendo ejecutada igualmente con la unica diferencia que devuelve lo contrario de AndGate.
connectorOne = Connector(gateOne,gateTwo)
print("")
# Connector es una clase utilizada para cambiar a un tipo de boolean diferente tiene dos variables en su constructor y son igualadas a los
# objetos dados por parametro. Luego se ejecuta el metodo setNextPin() que es parte de los objetos enviados por parametro.
main()