Reso adalah bahasa dan simulator desain sirkuit tingkat rendah, terinspirasi oleh hal-hal seperti Redstone, Conway’s Game of Life, dan Wireworld.
Apa itu Reso?
- Reso adalah bahasa pemrograman grafis rangkaian logika digital!
- Reso adalah simulator rangkaian logika digital.
- Output program reso program Reso lainnya.
- Reso adalah bukan cellular automata, meskipun ada kesamaan.
- Reso tidak berguna atau belum, tapi saya harap Anda masih bisa bersenang-senang dengannya.
Program input adalah sirkuit yang dijelaskan oleh gambar (bitmap). Ketika program Reso dijalankan melalui simulator Reso, program tersebut mengeluarkan program Reso lain yang valid! Hal-hal menjadi menarik ketika Anda mengulangi proses ini.
Meskipun simulator bertindak seperti fungsi murni, untuk alasan kinerja, ia mempertahankan status di antara iterasi.
Karena gambar adalah sirkuit yang valid, Anda dapat menyalin dan menempelkan komponen yang lebih kecil untuk membangun sirkuit yang lebih kompleks menggunakan editor gambar favorit Anda!
Implementasi ini (1) lambat (dengan Python!) dan (2) tidak interaktif (Anda tidak dapat mengedit sirkuit secara langsung!) Saya harap Anda dapat bersenang-senang dengan ini meskipun keterbatasan tersebut. 🙂
Pemasangan
TODO -- Saya harus membuat daftar paket dan versi Python di sini!
Direkomendasikan untuk menjalankan
--kedalaman 1
karena contoh, slide, dll di repositori ini membuatnya agak berat.Penggunaan
Implementasi Reso ini mendukung penggunaan baris perintah. Input adalah gambar tunggal, dan output adalah iterasi dari simulasi Reso dari rangkaian yang dijelaskan pada gambar pertama.
Baris perintah
Berikut contohnya: Muat ~/helloworld.png, pengulangan (
-n
) 12 kali , dan simpan (-s
) hasilnya ke~/hello_00.png
,
~/hello_01.png
, ...
~/hello_04.png
, mencetak informasi secara verbal (-v
) sepanjang jalan:python3 reso.py ~/helloworld.png -n 12 -s hello_ -v
- Reso adalah simulator rangkaian logika digital.
Jika Anda hanya ingin menyimpan hasil akhirnya, tambahkan Bendera “-o”, seperti:
Dan inilah penggunaan baris perintah lengkap:
[–save SAVE] [–outputlast] [–verbose] argumen posisi: load_location Lokasi untuk memuat gambar dari argumen lain: –save SAVE, -s SAVE Awalan untuk menyimpan gambar. –numiter ITERATE, -n ITERATE ulangi papan reso n kali. Default ke 1. –outputlast, -o Hanya menyimpan iterasi terakhir dari papan. –verbose, -v Cetak informasi tambahan; berguna untuk debugging. “>
penggunaan: reso.py load_location [–save SAVE] [–outputlast] [–verbose] argumen posisi: load_location Lokasi untuk memuat gambar dari argumen lain: –save SAVE, -s SAVE Awalan untuk menyimpan gambar. –numiter ITERATE, -n ITERATE ulangi papan reso n kali. Default ke 1. –outputlast, -o Hanya menyimpan iterasi terakhir dari papan. –verbose, -v Cetak informasi tambahan; berguna untuk debugging.
Palette
Palette
Palet adalah bagian penting dari Reso! Anda dapat menentukan sirkuit menggunakan gambar. Setiap piksel dengan warna dalam palet delapan warna ini memiliki makna semantik, warna lain tidak.
Berarti | Kode Hex | |
---|---|---|
Oranye cerah | Kawat oranye (aktif) | #ff8000 |
Kawat safir (aktif) | #0080ff |
#80ff00
#408000
#8000ff
#40 0080
Untuk kompatibilitas mundur dengan fungsi baru, kami memesan total 48 warna. (Ini berdasarkan konvensi dan tidak ditegakkan oleh simulator Reso.)
Deskripsi singkat tentang bagaimana program berjalan: Kabel mendorong sinyal mereka melalui node input . Ada tiga warna kawat yang berbeda (oranye, safir, dan kapur). Node input meneruskan sinyal ini ke logika node dan output node. Node logika digunakan untuk menghitung ‘AND’ atau ‘XOR’ dari setiap sinyal input, dan mendorongnya ke output node
- . Node keluaran bertindak sebagai satu gerbang besar ATAU, mendorong sinyal baru keluar ke kabel.
Warna kabel yang berbeda tidak memiliki arti penting. Mereka ada untuk memudahkan penyambungan dalam ruang 2D, dan untuk memudahkan melacak kawat mana yang mana.
Inilah palet lengkapnya warna yang kami anggap “cadangan”. Warna lain adalah ‘spasi putih’, yaitu tidak akan memiliki signifikansi semantik.
Jenuh (1)
#ff0000
#800000
#ff8080
#804040
Kuning (Y)
#ffff00
#808000
#ffff80
#808040
Hijau (G)
#00ff00
#008000
#80ff80
#408040
Cyan (C)
#00ffff #008080
#80ffff
#408080
Biru (B)
#0000ff
#000080
#8080ff
#404080
Magenta (M)
#ff00ff
#ff8000
#804000
#ffc080
#408000
#c0ff80
#608040
#408060
Safir ( S)
#0080ff
#004080
#80c0ff
#406080
#8000ff
#400080
#c080ff
#604080
Violet (V)
#ff0080
#800040
#ff80c0
#804060
(Catatan: Jangan mengambil sampel langsung dari browser web Anda! Mereka tidak selalu membuat warna dengan andal.)
Contoh
Logo Reso sebenarnya adalah rangkaian lengkap dalam dirinya sendiri! Berikut adalah gif kecil yang menjelaskan apa yang terjadi, dianimasikan dengan kecepatan 1/4 (yaitu, satu pembaruan setiap 2000 md):
Hal-hal yang harus dilakukan:
Contoh
Logo Reso sebenarnya adalah rangkaian lengkap dalam dirinya sendiri! Berikut adalah gif kecil yang menjelaskan apa yang terjadi, dianimasikan dengan kecepatan 1/4 (yaitu, satu pembaruan setiap 2000 md):
Logo Reso sebenarnya adalah rangkaian lengkap dalam dirinya sendiri! Berikut adalah gif kecil yang menjelaskan apa yang terjadi, dianimasikan dengan kecepatan 1/4 (yaitu, satu pembaruan setiap 2000 md):
Terlepas dari semua tes dan dokumentasi, Reso adalah bukti konsep dan ada banyak yang harus dilakukan sebelum ini bahkan bisa sedikit berguna!
Berikut adalah beberapa ide yang rapi:
Tandai untuk memetakan ke warna terdekat:
- Saya mengalami masalah aneh dengan beberapa versi The GIMP, di mana warna disimpan atau dipilih secara tidak benar. Reso membutuhkan warna yang tepat (misalnya
#ff8000
adalah warna yang valid tetapi #ff8800
tidak.) Mungkin flag untuk mempertimbangkan hanya ~4 atau lebih bit paling signifikan per piksel, atau untuk memetakan warna dalam a rentang tertentu ke yang terdekat di palet, akan berguna?
Ekspor ke opsi GIF:
- Cukup jelas! Tidak perlu lagi mengutak-atik GIMP atau ffmpeg.
Grafik kompilasi yang dapat ditransfer: Reso sebenarnya adalah model komputasi graf dari rangkaian logika, dan gambar adalah cara untuk mendefinisikan graf tersebut. Saya ingin memisahkan model itu dengan lebih baik, dan menjadikan repositori ini sebagai implementasi referensi yang lebih baik.
Secara khusus, kami menganggap piksel untuk mewakili “resel” logis yang dapat juga direpresentasikan secara tekstual, dan wilayah resels mewakili elemen, yang direpresentasikan secara internal sebagai grafik yang diimplementasikan dengan kamus Python. Tetapi grafik ini bukan standar, jadi grafik yang dikompilasi tidak dapat ditransfer antar implementasi.
GUI dan interaktivitas:
- Beberapa jenis GUI juga akan bagus, daripada membutuhkan keahlian dalam beberapa aplikasi grafis eksternal. Halaman web Javascript yang interaktif akan membuat ini lebih mudah untuk dipusingkan, ya?
Kecepatan :
- Ini juga sangat lambat. Mungkin diterapkan kembali di Rust ketika saya mempelajarinya!
Port ke bahasa yang lebih cepat: Memindahkan ini ke bahasa yang lebih cepat akan sangat bagus. Saya pikir Rust akan menyenangkan (baik karena saya ingin mempelajarinya, dan karena ada beberapa hal “Web Assembly” yang membuat saya berpikir lebih mudah untuk menempatkan Rust di web daripada, katakanlah, C atau C++.)
Lihat juga
Berikut adalah daftar proyek serupa yang saya ketahui. Silakan buat masalah atau PR jika Anda memiliki hal lain untuk dibagikan!
- Beberapa videogame kotak pasir yang memiliki bahasa sirkuit lengkap turing yang memberdayakan pemain untuk mengotomatisasi dunia mereka:
- Minecraft’s Redstone adalah inspirasi utama untuk ini.
- Terraria (analog 2D Minecraft) memiliki mekanisme pengkabelan gerbang logika yang serupa.
- Hempuli adalah salah satu pengembang game favorit saya, dan melihat perkembangan mereka di Baba Is You membuat otak saya tetap di jalur yang benar untuk ini.
- Berbagai game sandbox open-world lainnya: Factorio, No Man’s Sky, Dwarf Fortress, dan lainnya !
- Conway’s Game of Life — Sebuah game zero-player-lengkap Turing. Sejauh ini automata seluler paling populer. Rest in Peace John Conway.
- Wireworld — Automata seluler lain yang mudah diimplementasikan sirkuit logika.
- Brian’s Brain — Sebuah otomat seluler mirip dengan yang sebelumnya.
- Bitmap Logic Simulator — Saya tidak yakin cara kerjanya, tapi lihatlah! Ini adalah ide yang serupa.
- Berbagai game sandbox open-world lainnya: Factorio, No Man’s Sky, Dwarf Fortress, dan lainnya !