Логический контур в ТКС в основном DAG , состоящий из и, или, не ворота, а то , что известно «функциональная полнота» они могут вычислить все возможные функции. Например, это основной принцип в АЛУ .
Задача: создать схему, чтобы определить, делится ли 8-значное двоичное число на 3, и каким-то образом визуализировать ваш результат (например, на каком-то изображении)
Критерии оценки для избирателей основаны на том, хорошо ли обобщает код для генерации схемы числа произвольного размера, и является ли алгоритмически созданная визуализация компактной / сбалансированной, но все же удобочитаемой для человека (то есть визуализация с помощью ручной компоновки не допускается). то есть визуализация только для n = 8, но код в идеале будет работать для всех n. Победившая заявка только что проголосовала.
Несколько похожий вопрос: постройте умножающую машину, используя логические вентили NAND
gate-golf
? этот тег не существует. Примечание для участников: пожалуйста, укажите, какой язык / инструмент визуализации вы используете. если кто-то хочет ввести комментарий плз. в противном случае примет победитель tonite. Спасибо большое респондентам, что «БТЭ» прошло лучше, чем ожидалось!Ответы:
График поддерживает 3 логических значения на каждом уровне i. Они представляют тот факт, что старшие биты i числа равны 0, 1 или 2 mod 3. На каждом уровне мы вычисляем следующие три бита на основе предыдущих трех бит и следующего входного бита.
Вот код Python, который сгенерировал график. Просто измените N, чтобы получить другое количество бит, или K, чтобы получить другой модуль. Запустите вывод программы python через точку, чтобы сгенерировать изображение.
источник
Глубина: 7 (логарифмическая), 18x AND, 6x OR, 7x XOR, 31 вентиль (линейный)
Позвольте мне вычислить сумму цифр в базе четыре, по модулю три:
схема нарисована в Logisim
Обобщение, формально (надеюсь, несколько читабельно):
сейчас на английском:
В то время как в числе более двух битов, возьмите две младшие пары битов и сложите их по модулю 3, затем добавьте результат к обратной части числа, а затем верните, если последняя пара равна нулю по модулю 3. Если есть нечетное число количество битов в числе, добавьте дополнительный нулевой бит к вершине, затем отполируйте с постоянным значением распространения.
Добавление сзади, а не вперед гарантирует, что дерево дополнений будет сбалансированным, а не связанным списком. Это, в свою очередь, обеспечивает логарифмическую глубину в количестве битов: пять вентилей и три уровня для отмены пары, и дополнительный вентиль в конце.
Конечно, если требуется приблизительная планарность, передайте верхнюю пару без изменений на следующий слой, а не оборачивайте ее спереди. Однако это легче сказать, чем реализовать (даже в псевдокоде). Если число битов в числе является степенью двойки (как в любой современной компьютерной системе по состоянию на март 2014 года), то одиночных пар не будет, однако.
Если планировщик сохраняет локальность / выполняет минимизацию длины маршрута, он должен сохранять читаемость схемы.
Этот код Ruby сгенерирует принципиальную схему для любого количества бит (даже одного). Для печати откройте в Logisim и экспортируйте как изображение:
наконец, когда меня попросили создать вывод для 32 бит, мой Layouter генерирует это. По общему признанию, это не очень компактно для очень широких входов:
источник
2 × 24 НЕ, 2 × 10 + 5 И, 2 × 2 + 5 ИЛИ, 2 × 2 НОР
Это полностью не масштабируется. Вроде нет совсем. Возможно я постараюсь улучшить это.
Я проверил это для чисел до 30, и это работало отлично.
Эти две большие цепи подсчитывают количество активных входов:
Если разница этих чисел
0
или3
число делится на3
. В нижнем правом углу контура в основном отображает каждую допустимая комбинация (4,4
,4,1
,3,3
,3,0
,2, 2
,1, 1
,0, 0
) или в.Маленький кружочек в середине - это светодиод, который горит, если число делится на 3, и выключается в противном случае.
источник