Veuillez être gentil. J'ai une question épineuse et importante d'un domaine différent de l'ingénierie dont la réponse peut être assez bien connue en génie électrique. J'ai posé une question similaire sur StackOverflow
Supposons que j'ai une table de vérité de 5 entrées et 1 sortie. J'ai utilisé l'algorithme Espresso (par exemple, Logic Friday) pour minimiser la table et écrire du VHDL efficace. Tout fonctionne bien.
Au lieu de minimiser et de mapper la table de vérité aux portes NAND, je voudrais mapper sur une fonction logique ternaire arbitraire. Je ne suis pas intéressé par la logique à valeurs multiples, mais par les fonctions logiques qui ont 3 variables d'entrée. Il existe 256 de ces fonctions, et la NAND 3-in n'est que l'une d'entre elles. Toutes ces 256 fonctions peuvent ne pas être intéressantes: certaines se réduisent à leurs 2 frères et sœurs variables d'entrée.
Question : comment pouvez-vous mapper une table de vérité (par exemple, avec 7 entrées) à l'une de ces fonctions 3-in. Un outil qui fait quelque chose de similaire serait formidable, mais une méthode sur la façon de simplifier les fonctions ternaires arbitraires serait la meilleure.
Contexte: les processeurs modernes peuvent effectuer des opérations logiques ternaires arbitraires sur des registres 512 bits (par exemple, l'instruction vpternlog ), mais en raison de la complexité, les compilateurs laissent le soin au programmeur, qui ne sait pas du tout comment l'optimiser.
la source
Réponses:
Une analyse
Notez que l'instruction code toutes les fonctions ternaires possibles. Donc, étant donné les trois variables booléennes et les opérations binaires sur celles-ci, nous pouvons toujours trouver l'octet de codage. Par exemple, si on lui donne une fonction
Puisqu'il n'y a que 8 entrées à coder et seulement 2 résultats binaires, cela peut être codé comme un nombre à 8 bits, dans ce cas 0b10110000 = 0xB0.
Optimisations
Étant donné une fonction n -aire arbitraire de valeurs booléennes, tout ce que nous devons faire est de convertir les fonctions binaires en fonctions ternaires. Nous pouvons le faire, car nous savons que nous pouvons calculer n'importe quelle combinaison de fonctions. En partant d'un arbre de syntaxe abstraite de nœuds unaires et binaires, nous commencerions par représenter les fonctions unaires et binaires de la même manière que le "codage" ci-dessus.
Donc, pour notre f :
En utilisant une logique récursive, nous pouvons combiner BIN et UNARY en:
Qui peut ensuite être optimisé (les règles de conversion découlent facilement de la logique booléenne):
Observation
Ceci est très similaire à la façon dont les tables de recherche FPGA (LUT) sont calculées. Je suis sûr que vous pouvez trouver de nombreux textes et algorithmes pour mapper la logique aux LUT. Par exemple: Flow-map ( http://cadlab.cs.ucla.edu/~cong/papers/tcad94.pdf )
la source
Extrait de ma propre réponse .
Contenu de BF_Q6.eqn:
Dans ABC, je lance:
Vous devrez peut-être exécuter
choice; if -K 3; ps
plusieurs fois pour obtenir de meilleurs résultats.Le BF_Q6.bench résultant contient les 3-LUT pour un FPGA:
Cela peut être réécrit (mécaniquement) dans le C ++ que je cherchais.
la source