Пожалуйста, будь добр. У меня острый и важный вопрос из другой области техники, ответ на который может быть довольно хорошо известен в электротехнике. Я задал похожий вопрос на StackOverflow
Предположим, у меня есть таблица истинности 5 входов и 1 выход. Я использовал алгоритм Espresso (например, Logic Friday), чтобы свернуть таблицу и написать эффективный VHDL. Все отлично работает
Вместо того, чтобы свести к минимуму и отобразить таблицу истинности для вентилей NAND, я хотел бы отобразить на произвольную троичную логическую функцию. Меня не интересует многозначная логика, а логические функции с 3 входными переменными. Есть 256 из этих функций, и 3-в NAND является лишь одной из них. Не все из этих 256 функций могут быть интересны: некоторые сводят к своим 2 братьям и сестрам входных переменных.
Вопрос : как вы можете отобразить таблицу истинности (например, с 7 входами) на любую из этих 3-х функций. Было бы неплохо использовать инструмент, который делает нечто подобное, но лучше всего использовать метод упрощения до произвольных троичных функций.
Предыстория: современные процессоры могут выполнять произвольные троичные логические операции над 512-битными регистрами (например, инструкция vpternlog ), но из-за сложности компиляторы оставляют это на усмотрение программиста, который в некоторой степени не знает, как это оптимизировать.
источник
Ответы:
Анализ
Обратите внимание, что инструкция кодирует все возможные троичные функции. Таким образом, с учетом любых трех логических переменных и любых побитовых операций над ними мы всегда можем найти байт кодирования. Например, если дана функция
Поскольку для кодирования имеется только 8 входов и только 2 двоичных результата, это можно кодировать как 8-битное число, в данном случае 0b10110000 = 0xB0.
Оптимизации
Учитывая произвольную n -ную функцию булевых значений, все, что нам нужно сделать, - это преобразовать двоичные функции в троичные функции. Мы можем сделать это, потому что мы знаем, что мы можем вычислить любую комбинацию функций. Начиная с абстрактного синтаксического дерева унарных и двоичных узлов, мы начнем с представления унарных и двоичных функций способом, аналогичным описанному выше «кодирование».
Итак, для нашего ф :
Используя рекурсивную логику, мы можем объединить BIN и UNARY в:
Который затем можно оптимизировать (правила преобразования легко следуют из логической логики):
наблюдение
Это очень похоже на то, как рассчитываются таблицы поиска FPGA (LUT). Я уверен, что вы можете найти много текстов и алгоритмов для отображения логики в LUT. Например: Flow-map ( http://cadlab.cs.ucla.edu/~cong/papers/tcad94.pdf )
источник
Выдержка из моего собственного ответа .
Содержание BF_Q6.eqn:
В ABC я бегу:
Возможно, вам придется запустить
choice; if -K 3; ps
несколько раз, чтобы получить лучшие результаты.Результирующий BF_Q6.bench содержит 3-LUT для FPGA:
Это можно переписать (механически) в C ++, который я искал.
источник