Elemen logis
Selamat siang, saya memulai serangkaian artikel tentang menulis mesin virtual dalam bahasa Golang. Saya memilih bahasa ini karena mudah dibaca dan memiliki fungsi yang diperlukan di perpustakaan standar yang akan berguna nanti.
Artikel ini sama sekali tidak mengandung informasi baru bagi mereka yang dapat menyusun tabel kebenaran untuk gerbang logika sederhana. Jika Anda tahu caranya, maka jangan buang waktu dan lanjutkan ke bagian kedua.
Gerbang logika adalah perangkat dengan satu atau lebih input dan satu atau lebih output. Pada bagian ini kami hanya akan mempertimbangkan yang paling sederhana. Untuk gerbang pemodelan, kita hanya akan menggunakan sinyal 0 dan 1, tanpa menggunakan input, karakteristik keluaran gerbang nyata.
Karena kita akan bekerja dengan Golang, setiap elemen dapat direpresentasikan sebagai fungsi.
Di Go, fungsinya terlihat seperti ini:
func ( ) {
Buffer
Ini adalah elemen paling sederhana yang memiliki satu input dan satu output. Dalam praktiknya, ini digunakan untuk memperkuat sinyal atau membuat penundaan, kadang-kadang dapat digantikan oleh konduktor.
dalam kasus buffer, fungsi kita akan terlihat seperti ini:
func Buf(v bool) bool { return v }
Inverter
Buffer yang sama, hanya output yang membalik sinyal.
dalam kasus inverter, fungsinya akan terlihat seperti ini:
func Inv(v bool) bool { return !v }
ATAU
Elemen ini membutuhkan setidaknya satu sinyal sama dengan 1 untuk mendapatkan 1 pada output.
func Or(v, s bool) bool { return v || s }
Dan
Selalu mengembalikan 1, ketika 1 dipasok ke semua inputnya, dalam semua kasus lain ia mengembalikan 0.
func And(v, s bool) bool { return v && s }
Eksklusif ATAU
Untuk mendapatkan 1 pada output, perlu sinyal yang berbeda (0 dan 1) atau (1 dan 0) diterapkan pada input. Operasi ini bermanfaat karena memungkinkan Anda untuk menukar dua variabel tanpa menggunakan memori tambahan.
func Xor(v, s bool) bool {
Atau tidak
Ini bekerja sebagai elemen OR, hanya inverter yang terhubung ke outputnya, dari mana kita mendapatkan sinyal.
func Nor(v, s bool) bool { return !(v || s) }
DAN BUKAN
Elemen ini bekerja persis sama dengan elemen Dan, hanya sinyal yang dibalik pada output.
func Nand(v, s bool) bool { return !(v && s) }
Eksklusif ATAU dengan inversi
Elemen ini bekerja dengan cara yang sama dengan elemen OR, hanya sinyal yang dibalik pada output.
func Xnor(v, s bool) bool {
Sekarang setelah fungsi-fungsi tersebut ditulis, Anda dapat menggabungkannya ke dalam paket Gate, atas dasar itu kami akan mengimplementasikan hal-hal yang lebih kompleks. Hirarki paket kami akan mirip dengan hierarki abstraksi komputer nyata. Kode sumber dapat ditemukan di
sini .