Por favor se amable. Tengo una pregunta espinosa e importante de un campo diferente de ingeniería cuya respuesta puede ser bastante conocida en ingeniería eléctrica. Hice una pregunta similar en StackOverflow
Supongamos que tengo una tabla de verdad de 5 entradas y 1 salida. Utilicé el algoritmo Espresso (p. Ej., Logic Friday) para minimizar la tabla y escribir algunos VHDL eficientes. Todo funciona bien
En lugar de minimizar y asignar la tabla de verdad a las puertas NAND, me gustaría asignar a una función lógica ternaria arbitraria. No me interesa la lógica de valores múltiples, sino las funciones lógicas que tienen 3 variables de entrada. Hay 256 de estas funciones, y NAND de 3 pulgadas es solo una de ellas. No todas estas 256 funciones pueden ser interesantes: algunas se reducen a sus 2 hermanos variables de entrada.
Pregunta : ¿cómo puede asignar una tabla de verdad (por ejemplo, con 7 entradas) a cualquiera de estas funciones de 3 entradas? Una herramienta que haga algo similar sería genial, pero un método sobre cómo simplificar a funciones ternarias arbitrarias sería lo mejor.
Antecedentes: las CPU modernas pueden realizar operaciones lógicas ternarias arbitrarias en registros de 512 bits (por ejemplo, instrucción vpternlog ), pero debido a la complejidad, los compiladores se lo dejan al programador, que no tiene ni idea de cómo optimizar esto.
fuente
Respuestas:
Análisis
Tenga en cuenta que la instrucción codifica todas las funciones ternarias posibles. Por lo tanto, dadas las tres variables booleanas y las operaciones en bits, siempre podemos encontrar el byte de codificación. Por ejemplo, si se le asigna una función
Como solo hay 8 entradas para codificar y solo 2 resultados binarios, esto puede codificarse como un número de 8 bits, en este caso 0b10110000 = 0xB0.
Optimizaciones
Dada una función arbitraria n -ary de valores booleanos, todo lo que tenemos que hacer es convertir las funciones binarias en funciones ternarias. Podemos hacer esto, porque sabemos que podemos calcular cualquier combinación de funciones. Partiendo de un árbol de sintaxis abstracta de nodos unarios y binarios, comenzaríamos representando funciones unarias y binarias de manera similar a la "codificación" anterior.
Entonces, para nuestra f :
Usando lógica recursiva, podemos combinar BIN y UNARY en:
Que luego se puede optimizar (las reglas de conversión se siguen fácilmente de la lógica booleana):
Observación
Esto es muy similar a cómo se calculan las tablas de búsqueda FPGA (LUT). Estoy bastante seguro de que puede encontrar muchos textos y algoritmos para asignar lógica a LUT. Por ejemplo: Flow-map ( http://cadlab.cs.ucla.edu/~cong/papers/tcad94.pdf )
fuente
Extracto de mi propia respuesta .
Contenido de BF_Q6.eqn:
En ABC ejecuto:
Es posible que deba ejecutar
choice; if -K 3; ps
varias veces para obtener mejores resultados.El BF_Q6.bench resultante contiene las 3 LUT para un FPGA:
Esto se puede reescribir (mecánicamente) en el C ++ que estaba buscando.
fuente