8 votos

¿Cómo asignar una tabla de verdad a funciones lógicas ternarias?

Por favor, sea amable. Tengo una pregunta espinosa e importante de otro campo de la 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. He utilizado el algoritmo Espresso (por ejemplo, Logic Friday) para minimizar la tabla y escribir un VHDL eficiente. Todo funciona bien.

En lugar de minimizar y mapear la tabla de verdad a puertas NAND, me gustaría mapear a una función lógica ternaria arbitraria. No me interesa la lógica multivaluada, sino las funciones lógicas que tienen 3 variables de entrada. Hay 256 de estas funciones, y 3-en NAND es sólo uno de ellos. No todas estas 256 funciones pueden ser interesantes: algunas se reducen a sus hermanas de 2 variables de entrada.

Pregunta Cómo se puede mapear una tabla de verdad (por ejemplo, con 7 entradas) a cualquiera de estas funciones 3-in. 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 CPUs modernas pueden realizar operaciones lógicas ternarias arbitrarias en registros de 512 bits (por ejemplo, la instrucción vpternlog ), pero debido a la complejidad, los compiladores lo dejan en manos del programador, que no tiene ni idea de cómo optimizarlo.

0 votos

Ni siquiera hay una manera formal de "mapear" a un binario función. Y no todas las funciones binarias comprenden un sistema funcional completo. Lo mismo ocurre con las ternarias.

1 votos

Creo que esto es NP difícil para las funciones binarias.

0 votos

@user110971 No lo creo.. Creo que confundes con el problema del SAT.

4voto

Koala Puntos 6

Análisis

Observe que la instrucción codifica todo posibles funciones ternarias. Por lo tanto, dadas tres variables booleanas cualesquiera y cualquier operación a nivel de bits sobre ellas, siempre podemos encontrar el byte de codificación. Por ejemplo, si se da una función $$ f : \text{Bool} \times \text{Bool} \times \text{Bool} \rightarrow \text{Bool}, $$ entonces se puede encontrar el valor de verdad para cada combinación de valores de entrada, y almacenarlo en una tabla. Por ejemplo, si $$f(a,b,c) = a \& (!b | c),$$ entonces $$ f(a,b,c) = \text{TERN}_{{10110000}_2}(a, b, c),$$ como se puede ver en una tabla de verdad.

a b c | f
------+--
0 0 0 | 0
0 0 1 | 0
0 1 0 | 0
0 1 1 | 0
1 0 0 | 1
1 0 1 | 1
1 1 0 | 0
1 1 1 | 1

Como sólo hay 8 entradas para la codificación y sólo 2 resultados binarios, se puede codificar como un número de 8 bits, en este caso 0b10110000 = 0xB0.

Optimizaciones

Dada una situación arbitraria n -de valores booleanos, lo único que tenemos que hacer es convertir las funciones binarias en funciones ternarias. Podemos hacerlo porque sabemos que podemos calcular cualquier combinación de funciones. Partiendo de un árbol sintáctico abstracto de nodos unarios y binarios, empezaríamos representando las funciones unarias y binarias de forma similar a la "codificación" anterior.

Así, para nuestro f :

f = AND(a, OR(NOT(b), c)) = BIN[1000](a, BIN[1110](UNARY[10](b), c))

Utilizando la lógica recursiva, podemos combinar BIN y UNARY en:

f = AND(a, OR(NOT(b), c)) = BIN[1000](a, BIN[1011](b, c))

Que luego puede ser optimizado en (reglas de conversión siguen fácilmente de la lógica booleana):

f = AND(a, OR(NOT(b), c)) = TERN[10110000](a, b, c)

Observación

Esto es muy similar a cómo se calculan las tablas de consulta (LUT) de la FPGA. Estoy seguro de que puedes encontrar muchos textos y algoritmos para mapear la lógica a las LUTs. Por ejemplo: Flow-map ( http://cadlab.cs.ucla.edu/~cong/papers/tcad94.pdf )

1 votos

You say "conversions rules follow easily from boolean logic", thus I tried to build a Term Rewriting System (TRS) to do just that. <br/> The first 4-ary BF (of the most complex sort) BF[100010110,4] has truth table: <br/> 0000 => 1<br/> 0010 => 1<br/> 0100 => 1<br/> 1000 => 1<br/> A'B'C'D + A'B'CD' + A'BC'D' + AB'C'D' = BF[0xd1,3](A, BF[0x16,3](D,C,B), BF[0x02,3](C,B,A)) Which is the smallest reduction I could find by brute force searching. <br/> Mi pregunta: Cómo reescribirías esto (ineficientemente), no veo cómo las reglas de conversión de la lógica booleana son de ayuda aquí.

1 votos

Y después de 6 minutos de lectura este ni siquiera se puede eliminar el no muy funcional <br/>

1 votos

No es necesario reescribirlo. Simplemente haz una evaluación de fuerza bruta para cada combinación de valores de verdad.

2voto

HJLebbink Puntos 81

Extracto de mi propio respuesta .

  1. Traduce la tabla de verdad en una fórmula lógica; utiliza, por ejemplo, Logic Friday.
  2. Almacena la fórmula lógica en formato de ecuación de Synopsys (.eqn).

Contenido de BF_Q6.eqn:

INORDER = A B C D E F; 
OUTORDER = F0 F1;
F0 = (!A*!B*!C*!D*!E*F) + (!A*!B*!C*!D*E*!F) + (!A*!B*!C*D*!E*!F) + (!A*!B*C*!D*!E*!F) + (!A*B*!C*!D*!E*!F) + (A*!B*!C*!D*!E*!F);
F1 = (!A*!B*!C*!D*E) + (!A*!B*!C*D*!E) + (!A*!B*C*!D*!E) + (!A*B*!C*!D*!E) + (A*!B*!C*!D*!E);
  1. Utilice "ABC: A System for Sequential Synthesis and Verification" del Berkeley Verification and Synthesis Research Center.

En el ABC corro:

abc 01> read_eqn BF_Q6.eqn
abc 02> choice; if -K 3; ps
abc 03> lutpack -N 3 -S 3; ps
abc 04> show
abc 05> write_bench BF_Q6.bench

Es posible que tenga que ejecutar choice; if -K 3; ps varias veces para obtener mejores resultados.

El BF_Q6.bench resultante contiene los 3-LUTs para una FPGA:

INPUT(A)
INPUT(B)
INPUT(C)
INPUT(D)
INPUT(E)
INPUT(F)
OUTPUT(F0)
OUTPUT(F1)
n11         = LUT 0x01 ( B, C, D )
n12         = LUT 0x1 ( A, E )
n14         = LUT 0x9 ( A, E )
n16         = LUT 0xe9 ( B, C, D )
n18         = LUT 0x2 ( n11, n14 )
F1          = LUT 0xae ( n18, n12, n16 )
n21         = LUT 0xd9 ( F, n11, n14 )
n22         = LUT 0xd9 ( F, n12, n16 )
F0          = LUT 0x95 ( F, n21, n22 )

Esto se puede reescribir (mecánicamente) al C++ que estaba buscando.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X