Fluid logic

Материал из Dwarf Fortress Wiki
Перейти к навигацииПерейти к поиску
Версия для печати больше не поддерживается и может содержать ошибки обработки. Обновите закладки браузера и используйте вместо этого функцию печати браузера по умолчанию.

Жидкостная логика — способ вычислений, использующий жидкость (обычно воду), управляемую различными методами, чтобы нажимать на нажимные пластины в определённое время и в определённом порядке и в идеале даже выполнять некоторую желаемую работу.

Схемы, основанные на бесконечном течении

Такие схемы относительно просты и дешевы, но требуют бесконечный источник и бесконечный приемник жидкости для работы. Хотя некоторых потерь воды можно избежать, построив дополнительные схемы для сохранения воды, закрывающиеся конструкции, такие как шлюзы, всегда будут уничтожать воду, так что в любом случае придётся её как-то возмещать. В приведённых примерах используются поднимающиеся мосты и шлюзы, так как у них одинаковая задержка в 100 тиков при включении/отключении сигналом. Мосты работают как инвертированные входы, так как они блокируют проход, когда получают сигнал включения, в отличие от шлюзов, которые при сигнале включения открываются. Каналы в схемах нужны для отвода жидкости.

AND

X
X
^
·

Элемент AND (И) создаётся просто расположением двух шлюзов подряд и подсоединением каждого к своему входу: XX. Когда оба шлюза получают сигнал включения, они открываются и позволяют воде пройти до нажимной пластины. Пластину необходимо настроить на реагирование на 4-7 (чтобы уменьшить число ложных срабатываний от того, что вода успела пройти, пока переключаются шлюзы, или от того, что вода не успела утечь, когда шлюзы закрылись).

  • Если использовать мосты вместо шлюзов, можно получить элемент NOR.
  • Выход можно инвертировать, настроив нажимную пластину на 0-3.
  • Можно использовать больше двух шлюзов, чтобы обрабатывать конъюнкцию более двух сигналов.
  • Можно поставить две пластины и настроить одну на 4-7, другую на 0-3, чтобы получить и сигнал, и его инверсию.
  • Можно, используя один шлюз и пластину на 0-3, сделать NOT.
  • NOT можно также сделать, использовав один мост и пластину на 4-7.

OR

X
^
·
X

Элемент OR (ИЛИ) создаётся расположением двух шлюзов параллельно и подключением каждого к своему входу: XX. Когда хотя бы один шлюз получает сигнал, он открывается и позволяет воде пройти и нажать на нажимную пластину. Пластину надо настроить на реагирование на 4-7 воду.

  • Используя мосты вместо шлюзов, можно получить NAND
  • Выход можно инвертировать, настроив пластины на 0-3.
  • Можно использовать больше двух шлюзов, чтобы обрабатывать дизъюнкцию более двух сигналов.
  • Можно поставить две пластины и настроить одну на 4-7, другую на 0-3, чтобы получить и сигнал, и его инверсию.

XOR

X
^
·
X

XOR (ИСКЛЮЧАЮЩЕЕ ИЛИ) можно создать, поставив мост и шлюз вместе. Красные мост и шлюз X вместе подключены к одному и тому же входу, а зелёные X вместе подключены к другому; за ними стоит нажимная пластина на 4-7. Можно убедиться, что эта схема работает как XOR: если сигналов на вход не подаётся, то вода упирается в шлюзы; если поданы оба входных сигнала, то вода упирается в мосты; если включен ровно один сигнал, то вода проходит и нажимает на пластину.

  • Если поменять местами шлюз и мост, привязанные к одному сигналу, то можно получить XNOR.
  • Выход можно инвертировать, настроив пластины на 0-3.
  • Можно поставить две пластины и настроить одну на 4-7, другую на 0-3, чтобы получить и сигнал, и его инверсию.
  • Обработка нескольких сигналов, хоть и возможна, требует экспоненциального количества шлюзов и мостов; проще присоединить выход к другому XOR.

Комбинируя шлюзы, мосты и нажимные пластины, можно получать более сложные схемы. Располагая шлюзы (или мосты) подряд связывает их как AND, параллельное расположение связывает как OR. Так можно получать сколь угодно сложные схемы: например, элемент XOR — это не что иное, как комбинация AND и OR: A XOR B = (A AND NOT B) OR (NOT A AND B). Но иногда проще использовать большее количество более простых элементов, не объединяя их в одно целое.

Водосберегающие схемы

На текущий момент не существует полностью жидкостносберегающих схем, и в любой схеме, использующей шлюзы или их эквивалент, нужно бороться с уничтожением жидкости. Возможным путём борьбы с уничтожением жидкости может быть использование люков. Кроме уничтожения жидкостей шлюзами, проблемой является испарение.

Передаточный логический вентиль

Для построения логических схем с использованием передаточного вентиля на жидкостной логике, по аналогии с электрической схемой, требуется заменить все источники питания +Vs на бесконечные источники воды, а в качестве земли использовать неограниченный по объёму дренаж. В таком случае, шлюзы будут эквиваленты передаточным вентилям, а мосты – инверторам. Как и в реальных электрических схемах, потребуется специальный инвертор, который будет подключен к питанию и земле.

Схемы на логике комплементарных элементов

Этот тип логики работает немного по-другому, чтобы минимизировать потребление воды. Здесь обычно на каждый вход приходится по две конструкции, так, что одна из них всегда будет открыта, а другая закрыта, поэтому во время работы будет течь очень мало воды, причём она будет течь только при смене состояния. Таким образом, этот вариант жидкостной логики концептуально очень похож на реальные КМОП-схемы, которые используют аналогичную парадигму для снижения энергопотребления.

Базовые схемы

Предположим, нам надо вычислить логическое выражение f. Это может быть просто AND или OR, или что-то более сложное. Это делается по следующей схеме:

A
^
B

Здесь A — это набор шлюзов или мостов, позволяющих воде течь только тогда, когда f истинно, B аналогично позволяет воде течь, когда f ложно, ^ — нажимная пластина, настроенная на нужный уровень. Обратите внимание, что в этой схеме не нужно отводить жидкость.

Примеры

В следующих примерах X — шлюз, — мост. Красные подключены к входу A, зелёные — к входу B.

NOT

^
X

Нажимную пластину нужно настроить на уровень воды 5-7. Когда вход выключается, мост опускается, а шлюз закрывается. Вода может течь на нажимную пластину и заполняет тайл с ней полностью, включая выход.

Когда вход включается, мост поднимается и отрезает входящий поток воды, а шлюз открывается, и вода на нажимной пластине растекается на освободившийся тайл. Уровень воды на пластине становится 3-4, что недостаточно для активации пластины, и она отключается.

Откачка воды необязательна: растекания воды на два открытых тайла достаточно для создания измеримо разного уровня жидкости. Эта идея используется для всех элементов в этом типе логики.

AND

X
X
^

OR

^ X
X

В элементе AND пластина должна реагировать на 6-7 или 7-7. Так как OR, по сути, является NOR'ом с инвертированным выходом, пластину в схеме нужно настроить на низкий уровень воды, рекомендуется 0-5.

XOR

Эта схема немного отличается от предыдущих. Выражение для включения такое: (A and not B) or (not A and B). Выражение для выключения: (A and B) or (not A and not B).

Схема, таким образом, выглядит так:

X X
^
X X

Если на обоих входах одно и то же значение (оба включены или выключены), то два закрытых шлюза или поднятых моста будут блокировать поток воды. Второй ряд шлюзов за нажимной плитой гарантирует, что у воды будет место для растекания, чтобы уменьшить уровень жидкости на пластине. Любая комбинация одного включающего и одного выключающего сигнала даёт воде путь до нажимной пластины. Пластина должна реагировать на 7-7, чтобы избежать ложных срабатываний.

Плюсы и минусы

Основное преимущество такой логики в том, что она использует намного меньше воды, чем схемы на бесконечном течении. Одной реки достаточно для обеспечения даже очень сложных систем. Также из таких схем не надо отводить воду.

Недостатками такой схемы являются большая ресурсоёмкость и необходимость в более тщательном планировании, так как шлюзы часто загораживают проход. Такие системы сильно зависят от точного уровня жидкости и требуют, чтобы приходящая вода была на уровне 7/7. Могут понадобиться дополнительные сооружения (резервуары или системы помп) для поддержания уровня жидкости или увеличения её давления для ускорения работы схемы. Это особенно актуально, если вы решили использовать магму/лаву в качестве жидкости.

Улучшение скорости работы

Основные факторы, влияющие на скорость работы этих схем — задержки шлюзов и мостов и задержка выключения нажимных плит. Их невозможно устранить, хотя использование дверей и люков, где это возможно, может их уменьшить.

Другой фактор — скорость течения воды. Её можно улучшить. Можно подавать воду под давлением, если заставить воду течь из резервуара на несколько z-уровней выше. В схемах на бесконечном течении можно заменить пластину на ступеньку вверх, ведущую в комнату 2x1 на уровне выше. Один тайл там можно сделать ступенькой вниз, другой — нажимной плитой. Это заставит воду вытекать оттуда быстрее. Для уменьшения задержки при выключении можно настроить пластину на 7-7. Это чуть увеличит потребление воды, но оно всё ещё останется относительно малым.

Детектор фронта сигнала (Edge Detector)

Иногда полезно иметь схему, которая бы зависела не от уровня сигнала, а от его смены — например, включение рычага может активировать одно событие, а его выключение — другое.

Z+0
X
X
Z=-1
^ #
^ #

Обе нажимные пластины должны активироваться на 2-6. Привяжите нижнюю пластину к машинам, которые надо активировать при переходе от выключенного состояния входа к включенному, и верхнюю — к машинам, которые надо активировать при переходе от включенного состояния входа к выключенному, затем привяжите необходимое устройство ввода (рычаг или пластину) к обоим шлюзам и обоим мостам.

Каждый раз, когда вход переключается, соответствующая пластина будет активирована и останется активной, пока вода не прекратит течь, после чего отключится примерно через 100 тиков.

Эту же схему можно реализовать на водосберегающей логике (если обе нажимные пластины привязаны к одному и тому же объекту (?)). Вход привязывается к шлюзу и мосту, нажимные пластины работают на 0-5 и 6-7 соответственно.

X ^ ^

Ячейки памяти

На жидкостной логике можно реализовать относительно маленькие ячейки памяти, использующие совсем немного механизмов. Они обычно довольно примитивные, так что более продвинутые операции с памятью требуют дополнительных устройств, но если нужно просто хранить бит информации, то их трудно превзойти в компактности.

RS-триггер (S/R Latch)

^

Автор: Hussel [1]

RS-триггер (set/reset latch) активируется, когда получает сигнал Set — открытие двери , запускающий внутрь воду, активирующую нажимную пластину (она должна быть настроена на 5-7) — и остаётся активным, даже когда сигнал set исчезает. Он деактивируется только при получении сигнала Reset — открытии двери , позволяющим воде вытечь с пластины и деактивировать её. После этого триггер остаётся деактивированным, пока снова не получит сигнал Set.

Как и в реальной жизни, в этой схеме не следует подавать одновременно сигналы Set и Reset.

D-триггер (D-Latch)

^

У D-триггера (D-Latch) также есть два входа: Enable и Data . При включении входа Enable в ячейку будет записано значение Data: если Data включен, то вода затечёт в ячейку и нажмёт на пластину, если же Data выключен, то вода вытечет с пластины в освободившуюся ячейку, деактивировав пластину.

Пластину следует настроить на уровень жидкости 5-7.

Следует отметить, что ячейка включается уровнем сигнала входов (включается, если включены и Data, и Enable), но выключается по фронту сигнала (выключается, если Data был выключен в момент, когда включился Enable). Это слабое место этой ячейки, но она очень компактна, проста и дешёва (на неё нужно всего 4 механизма, включая входы и выходы), что компенсирует сложность использования в сложных схемах.

T-триггер (Toggle Flipflop)

^

Эта ячейка меняет своё состояние на противоположное каждый раз, когда сигнал Control переключается с выключенного на включенное состояние. Сигнал Control привязывается к двери ; кроме того, и дверь, и мост связаны с нажимной пластиной, настроенной на 5-7.

Принцип её работы не очевиден, так что рассмотрим его, начиная с ячейки в выключенном состоянии:

На пластине 4 или меньше воды, мост опущен. Когда Control включается, дверь открывается и вода натекает на пластину. Пластина посылает включающий сигнал на дверь и мост. Сигнал к двери игнорируется (дверь уже открыта), мост, через 100 тактов, поднимается. Ни поднятие моста, ни закрытие двери (когда выключается сигнал control) ничего не делают с пластиной, она остаётся включенной.

Вода на пластине находится на уровне 5 или больше, мост поднят. Когда Control включается, вода вытекает с пластины на тайл с открывшейся дверью, и пластина деактивируется. Через примерно 100 тактов пластина посылает сигнал выключения двери и мосту. Дверь немедленно закрывается, мост опускается через 100 тактов. Ячейка вернулась в исходное выключенное состояние и будет в нём пребывать, пока не будет подан сигнал Control.