Tunjukkan HN: Saya membuat simulator sirkuit digital kecil yang beroperasi pada PNG

Tunjukkan HN: Saya membuat simulator sirkuit digital kecil yang beroperasi pada PNG

Reso logo

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

    git clone dengan bendera --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

Jika Anda hanya ingin menyimpan hasil akhirnya, tambahkan Bendera “-o”, seperti:

python3 reso.py ~/helloworld.png -n 12 -s hello_ -v -o

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

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.

Warna

Oren tua Kawat oranye (mati) #804000 Safir cerah

Berarti Kode Hex
Oranye cerah Kawat oranye (aktif) #ff8000This is Reso gif
Kawat safir (aktif) #0080ff
Safir gelap

Kawat safir (mati) #004080 Jeruk nipis This is Reso gifKabel kapur (on) #80ff00 Jeruk nipis This is Reso gif Kabel kapur (mati) #408000 Ungu cerah Output (simpul ke kabel) #8000ff Ungu tua Input (kabel ke node)

#40 0080This is Reso gif

Teal terang simpul logika XOR #00ff80 Teal gelap DAN simpul logika #008040

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.

Warna

Jenuh (1) Gelap (2) Ringan (3) Tak Jenuh (4) Merah (Kanan)

    #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 #800080 #ff80ff #804080 Oranye (O) #ff8000 #804000 #ffc080 #806040 Lime (L)

        #80ff00

        #408000

      #c0ff80 #608040 Teal (T)

      #00ff80 #008040 #80ffc0 #408060

      Safir ( S) #0080ff

      #004080

      #80c0ff #406080

      Ungu (P)

        #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):

        This is Reso gif

        Hal-hal yang harus dilakukan:

        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.

        Baca selengkapnya