Por favor seja gentil. Tenho uma pergunta espinhosa e importante de um campo diferente da engenharia, cuja resposta pode ser bastante conhecida na engenharia elétrica. Fiz uma pergunta semelhante no StackOverflow
Suponha que eu tenha uma tabela verdade de 5 entradas e 1 saída. Eu usei o algoritmo Espresso (por exemplo, Logic Friday) para minimizar a tabela e escrever alguns VHDL eficientes. Tudo funciona bem.
Em vez de minimizar e mapear a tabela verdade para portas NAND, eu gostaria de mapear para uma função lógica ternária arbitrária. Não estou interessado em lógica com valores múltiplos, mas em funções lógicas que possuem três variáveis de entrada. Existem 256 dessas funções, e o NAND de 3 polegadas é apenas uma delas. Nem todas essas 256 funções podem ser interessantes: algumas se reduzem a seus dois irmãos variáveis de entrada.
Pergunta : como você pode mapear uma tabela verdade (por exemplo, com 7 entradas) para qualquer uma dessas funções de 3 entradas. Uma ferramenta que faça algo semelhante seria ótima, mas um método para simplificar as funções ternárias arbitrárias seria o melhor.
Antecedentes: as CPUs modernas podem executar operações lógicas ternárias arbitrárias em registros de 512 bits (por exemplo, instrução vpternlog ), mas devido à complexidade, os compiladores deixam isso para o programador, que é um pouco ignorante sobre como otimizar isso.
fonte
Respostas:
Análise
Observe que a instrução codifica todas as funções ternárias possíveis. Portanto, dadas as três variáveis booleanas e as operações bit a bit, podemos sempre encontrar o byte de codificação. Por exemplo, se for dada uma função
Como existem apenas 8 entradas para codificação e apenas 2 resultados binários, isso pode ser codificado como um número de 8 bits, neste caso 0b10110000 = 0xB0.
Otimizações
Dado um n arbitrário função arar dos valores booleanos, tudo o que precisamos fazer é converter funções binárias em funções ternárias. Podemos fazer isso, porque sabemos que podemos calcular qualquer combinação de funções. Partindo de uma árvore de sintaxe abstrata de nós unários e binários, começaríamos representando funções unárias e binárias de maneira semelhante à "codificação" acima.
Então, para o nosso f :
Usando lógica recursiva, podemos combinar BIN e UNARY em:
Que pode então ser otimizado (regras de conversão seguem facilmente a partir da lógica booleana):
Observação
Isso é muito semelhante ao modo como as tabelas de pesquisa FPGA (LUTs) são calculadas. Tenho certeza de que você pode encontrar muitos textos e algoritmos para mapear a lógica para LUTs. Por exemplo: Mapa de fluxo ( http://cadlab.cs.ucla.edu/~cong/papers/tcad94.pdf )
fonte
Trecho da minha própria resposta .
Conteúdo de BF_Q6.eqn:
No ABC eu corro:
Pode ser necessário executar
choice; if -K 3; ps
várias vezes para obter melhores resultados.O BF_Q6.bench resultante contém os 3-LUTs para um FPGA:
Isso pode ser reescrito (mecanicamente) no C ++ que eu estava procurando.
fonte