Elementos lógicos
Buen día, estoy comenzando una serie de artículos sobre cómo escribir una máquina virtual en el idioma Golang. Elegí este idioma porque es fácil de leer y tiene las funciones necesarias en la biblioteca estándar que serán útiles en el futuro.
Este artículo no contiene absolutamente ninguna información nueva para aquellos que saben cómo hacer tablas de verdad para puertas lógicas simples. Si sabe cómo hacerlo, no pierda el tiempo y pase a la segunda parte.
Una puerta lógica es un dispositivo con una o más entradas y una o más salidas. En esta parte consideraremos solo el más simple de ellos. Para modelar puertas, usaremos solo las señales 0 y 1, sin usar las características de entrada y salida de las puertas reales.
Como trabajaremos con Golang, cada elemento puede representarse como una función.
En Go, la función se ve así:
func ( ) {
Tampón
Este es el elemento más simple que tiene una entrada y una salida. En la práctica, se usa para amplificar una señal o crear un retraso; a veces puede ser reemplazado por un conductor.
en el caso del búfer, nuestra función se verá así:
func Buf(v bool) bool { return v }
Inversor
El mismo búfer, solo la salida invierte la señal.
en el caso de un inversor, la función se verá así:
func Inv(v bool) bool { return !v }
O
Este elemento necesita al menos una señal igual a 1 para obtener 1 en la salida.
func Or(v, s bool) bool { return v || s }
Y
Siempre devuelve 1, cuando se suministra 1 a todas sus entradas, en todos los demás casos devuelve 0.
func And(v, s bool) bool { return v && s }
O exclusivo
Para obtener 1 en la salida, es necesario que se apliquen diferentes señales (0 y 1) o (1 y 0) a la entrada. Esta operación es útil porque le permite intercambiar dos variables sin usar memoria adicional.
func Xor(v, s bool) bool {
O no
Funciona como un elemento OR, solo un inversor está conectado a su salida, de donde obtenemos una señal.
func Nor(v, s bool) bool { return !(v || s) }
Y no
El elemento funciona exactamente igual que el elemento And, solo la señal se invierte en la salida.
func Nand(v, s bool) bool { return !(v && s) }
O exclusivo con inversión
El elemento funciona de la misma manera que el elemento OR, solo la señal se invierte en la salida.
func Xnor(v, s bool) bool {
Ahora que las funciones están escritas, puede ensamblarlas en el paquete Gate, sobre la base de lo cual implementaremos cosas más complejas. Nuestra jerarquía de paquetes será similar a una jerarquía de abstracción de computadora real. El código fuente se puede encontrar
aquí .