[Из песочницы] Архитектура компьютерных систем 1 часть. Логические вентили
Логические элементы
Доброго времени суток, я начинаю серию статей по написанию виртуальной машины на языке Golang. Я выбрал этот язык так как он прост для чтения и имеет в стандартной библиотеке уже необходимые функции, которые пригодятся в дальнейшем.
Эта статья не несёт в себе абсолютно никакой новой информации для тех, кто умеет составлять таблицы истинности для простых логических вентилей. Если вы это умеете, то не тратьте время и переходите ко второй части.
Логический вентиль это устройство с одним или несколькими входами и одним или несколькими выходами. В этой части будем рассматривать только самые простые из них. Для моделирования вентилей мы будем использовать только сигналы 0 и 1, не используя входные, выходные характеристики реальных вентилей.
Так как мы будем работать с Golang, то каждый элемент можно представить в виде функции.
В Go функция выглядит так:
func имя(имя переменной тип переменной) тип возвращаемого значения {
    //код
    return имя возвращаемой переменной
}
Буфер
Это самый простой элемент имеющий один вход и один выход. На практике используется для усиления сигнала или создания задержки, иногда можно заменить проводником.
| a | BUF a |
| 0 | 0 |
| 1 | 1 |
в случае с буфером наша функция будет выглядеть так:
func buf(v bool) bool {
    return v
}
Инвертор
Тот же самый буфер, только на выходе инвертирует сигнал.
| a | NOT a |
| 0 | 1 |
| 1 | 0 |
в случае с инвертором функция будет выглядеть так:
func inv(v bool) bool {
    return !v
}
ИЛИ
Этому элементу необходим хотя бы один сигнал равный 1, чтобы на выходе получить 1.
| a | b | a OR b |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
func or(v, s bool) bool {
    return v || s
}
И
Всегда возвращает 1, когда на все его входы подаётся 1, во всех остальных случаях он возвращает 0.
| a | b | a AND b |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
func and(v, s bool) bool {
    return v && s
}
Исключающее ИЛИ
Для того, чтобы на выходе получить 1, нужно чтобы на вход подавались разные сигналы (0 и 1) или (1 и 0). Эта операция является полезной, так как позволяет поменять местами две переменные без использования дополнительной памяти.
| a | b | a XOR b |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
func xor(v, s bool) bool {
// написать (v ^ s) мы не можем потому, что для bool такой операции в языке нет, поэтому юзаем костыль
    return (v || s) && !(v && s)
}
ИЛИ-НЕ
Работает как элемент ИЛИ, только к его выходу подсоединён инвертор, с которого получаем сигнал.
| a | b | a NOR b |
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 0 |
func nor(v, s bool) bool {
    return !(v || s)
}
НЕ-И
Элемент работает точно так же, как элемент И, только на выходе инвертируется сигнал.
| a | b | a NAND b |
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
func nand(v, s bool) bool {
    return !(v && s)
}
Исключающее ИЛИ с инверсией
Элемент работает точно так же, как элемент ИЛИ, только на выходе инвертируется сигнал.
| a | b | a XNOR b |
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
func xnor(v, s bool) bool {
// и тут костыль
    return !(v || s) && !(v && s)
}
Теперь, когда функции написаны, можно их собрать в пакет Gate, на основе которого будем реализовывать более сложные вещи. Наша иерархия пакетов будет похожа иерархию абстракций реального компьютера. Исходный код можно найти здесь.
Продажи Huawei Mate 80 превысили 8,1 миллиона штук — это рекорд для бренда
Oppo A7 Pro Max получит 7-летнюю батарею на 10 000 мАч, камеры по 50 Мп и станет лучшим в серии A
Без паспорта: в России разрешили заселяться в отели через Max
Как гибли динозавры: от огненного шара после удара астероида к «ударной зиме»
Кибеratаки парализовали системы водоснабжения в семи американских штатах
На Землю надвигается магнитная буря: вероятность шторма составляет 75%
Google выпустила «посмертное» обновление для Pixel 4a, исправившее циклическую перезагрузку
Мозг предсказывает реальность с помощью электрических импульсов, работая как нейросеть