Reso is a low-level circuit design language and simulator, inspired by things like Redstone, Conway's Game of Life, and Wireworld.

Related tags

Miscellaneousreso
Overview

Reso

Reso logo

Reso is a low-level circuit design language and simulator, inspired by things like Redstone, Conway's Game of Life, and Wireworld.

What is Reso?

  • Reso is a digital logic circuit graphical programming language!
  • Reso is a digital logic circuit simulator.
  • Reso program outputs other Reso programs.
  • Reso is not a cellular automata, despite similarities.
  • Reso is not useful or good yet, but I hope you can still have fun with it.

An input program is a circuit described by a (bitmap) image. When a Reso program is ran through the Reso simulator, it outputs another valid Reso program! Things get interesting when you iterate this process.

While the simulator acts like a pure function, for performance reasons, it maintains state between iterations.

Because images are valid circuits, you can copy-and-paste smaller components to build up more complex circuits using your favorite image editor!

This implementation is (1) slow (it's in Python!) and (2) not-interactive (you can't edit circuits live!) I hope you can have fun with this despite those limitations. :)

Installation

TODO -- I should list the packages and Python version here!

It is recommended to run git clone with flag --depth 1 since the examples, slides, etc. in this repository made it a bit heavy.

Usage

This implementation of Reso supports command line usage. Input is a single image, and outputs are iterations of the Reso simulation of the circuit described in the first image.

Command line

Here's an example: Load ~/helloworld.png, iterate (-n) 12 times, and save (-s) the results to ~/hello_00.png, ~/hello_01.png, ... ~/hello_04.png, printing information verbosely (-v) along the way:

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

If you only wanted to save the end result, add the "-o" flag, as such:

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

And here is the full command-line usage:

usage: reso.py load_location [--numiter NUMITER] [--save SAVE] [--outputlast] [--verbose]    

positional arguments:
  load_location         Location to load image from

other arguments:
  --save SAVE, -s SAVE  Prefix to save images to.
  --numiter ITERATE, -n ITERATE
                        iterate the reso board n times. Defaults to 1.
  --outputlast, -o      Only save the final iteration of the board.
  --verbose, -v         Print extra information; useful for debugging.

Palette

The palette is an important part of Reso! You can define a circuit using an image. Any pixel with a color in this palette of eight colors has semantic meaning, any other color doesn't.

Color Meaning Hex code
Bright orange Orange wire (on) #ff8000
Dark orange Orange wire (off) #804000
Bright sapphire Sapphire wire (on) #0080ff
Dark sapphire Sapphire wire (off) #004080
Bright lime Lime wire (on) #80ff00
Dark lime Lime wire (off) #408000
Bright purple Output (node to wire) #8000ff
Dark purple Input (wire to node) #400080
Bright teal XOR logic node #00ff80
Dark teal AND logic node #008040

For backwards compatibility with new functionality, we reserve a total of 48 colors. (This is by convention and is not enforced by the Reso simulator.)

A brief description of how programs run: Wires push their signals through input nodes. There are three different colors of wire (orange, sapphire, and lime). Input nodes pass these signals to logic nodes and output nodes. Logic nodes are used to calculate the 'AND' or 'XOR' of every input signal, and push these on to output nodes. The output nodes act as one big OR gate, pushing the new signals out to wires.

The colors of different wires don't have any significance. They exist to make it easier to wire in 2D space, and to make it easier to keep track of which wire is which.

Here's the full palette of colors that we consider "reserved". Other colors are 'whitespace', i.e. will not have any semantic significance.

Hue Saturated (1) Dark (2) Light (3) Unsaturated (4)
Red (R) #ff0000 #800000 #ff8080 #804040
Yellow (Y) #ffff00 #808000 #ffff80 #808040
Green (G) #00ff00 #008000 #80ff80 #408040
Cyan (C) #00ffff #008080 #80ffff #408080
Blue (B) #0000ff #000080 #8080ff #404080
Magenta (M) #ff00ff #800080 #ff80ff #804080
Orange (O) #ff8000 #804000 #ffc080 #806040
Lime (L) #80ff00 #408000 #c0ff80 #608040
Teal (T) #00ff80 #008040 #80ffc0 #408060
Sapphire (S) #0080ff #004080 #80c0ff #406080
Purple (P) #8000ff #400080 #c080ff #604080
Violet (V) #ff0080 #800040 #ff80c0 #804060

(Note: Don't sample directly from your web-browser! They don't always render colors reliably.)

Examples

The Reso logo is actually a complete circuit in-and-of itself! Here is a small gif that explains what's going on, animated at 1/4th the speed (that is, one update every 2000ms):

This is Reso gif

Things to be done:

Despite all the tests and documentation, Reso is a proof-of-concept and there's a lot to be done before this could even be a little useful!

Here are some neat ideas:

Flag to map to nearby colors: I've been having a weird issue with some versions of The GIMP, where colors are saved or picked incorrectly. Reso requires precise colors (e.g. #ff8000 is a valid color but #ff8800 is not.) Perhaps a flag to consider only the ~4 or so most-significant-bits per pixel, or to map colors within a certain range to their nearest one in the palette, would be useful?

Export to GIF option: Self explanatory! No more fiddling with GIMP or ffmpeg.

Transferrable compiled graphs: Reso is really a graph computation model of a logical circuit, and images are a way to define that graph. I want to better decouple that model, and make this a repository a better reference implementation.

Specifically, we consider pixels to represent logical "resels" which can also be represented textually, and regions of resels represent elements, which are represented internally as a graph implemented with Python dictionaries. But this graph isn't a standard, so a compiled graph can't be transferred between implementations.

GUI and interactivity: Some kind of GUI would be nifty too, rather than requiring expertise in some external graphical application. An interactive, Javascript webpage would make this a lot easier to mess around with, huh?

Speed: This is also really slow. Might reimplement in Rust when I get around to learning it!

Port to a faster language: Porting this to a faster language would be great. I think Rust would be fun (both because I want to learn it, and because there's some "Web Assembly" thing that makes me think it's easier to put Rust in the web than, say, C or C++.)

See Also

Here are a list of similar projects that I am aware of. Please make an issue or PR if you have something else to share!

  • Several sandbox videogames which have turing-complete circuit languages that empower the player to automate their world:
    • Minecraft's Redstone was the primary inspiration for this.
    • Terraria (Minecraft's 2D analogue) has a similar logic-gate wiring mechanism.
    • Hempuli is one of my favorite game devs, and seeing their development on Baba Is You kept my brain on the right track for this.
    • Various other open-world sandbox games: Factorio, No Man's Sky, Dwarf Fortress, and others!
  • Conway's Game of Life -- A Turing-complete zero-player-game. By far the most popular cellular automata. Rest in Peace John Conway.
  • Wireworld -- Another cellular automata in which it is easy to implement logic circuits.
  • Brian's Brain -- A cellular automaton similar to the previous.
  • Bitmap Logic Simulator -- I'm not sure how this works, but check it out! It's a similar idea.
Owner
Lynn
PhD student at UConn, they/them. I'm more active on GitLab: gitlab.com/lynnpepin
Lynn
Hook and simulate global keyboard events on Windows and Linux.

keyboard Take full control of your keyboard with this small Python library. Hook global events, register hotkeys, simulate key presses and much more.

BoppreH 3.2k Jan 01, 2023
Find your desired product in Digikala using this app.

Digikala Search Find your desired product in Digikala using this app. با این برنامه محصول مورد نظر خود را در دیجیکالا پیدا کنید. About me Full name: M

Matin Ardestani 17 Sep 15, 2022
Multi-Probe Attention for Semantic Indexing

Multi-Probe Attention for Semantic Indexing About This project is developed for the topic of COVID-19 semantic indexing. Directories & files A. The di

Jinghang Gu 1 Dec 18, 2022
Automatically load and dump your dataclasses 📂🙋

file dataclasses Installation By default, filedataclasses comes with support for JSON files only. To support other formats like YAML and TOML, filedat

Alon 1 Dec 30, 2021
Python script which synchronizes the replica-directoty with the original-one.

directories_synchronizer Python script which synchronizes the replica-directoty with the original-one. Automatically detects all changes when script i

0 Feb 13, 2022
Let's make a lot of random function from Scracth...

Pseudo-Random On a whim I asked myself the question about how randomness is integrated into an algorithm? So I started the adventure by trying to code

Yacine 2 Jan 19, 2022
Discord's own Dumbass made for shits n' Gigs!

FWB3 Discord's own Dumbass made for shits n' Gigs! Please note: This bot is made to be stupid and funny, If you want to get into bot development you'r

1 Dec 06, 2021
Mute your mic while you're typing. An app for Ubuntu.

Hushboard Mute your microphone while typing, for Ubuntu. Install from kryogenix.org/code/hushboard/. Installation We recommend you install Hushboard t

Stuart Langridge 142 Jan 05, 2023
Mangá downloader (para leitura offline) voltado para sites e scans brasileiros.

yonde! yonde! (読んで!) é um mangá downloader (para leitura offline) voltado para sites e scans brasileiros. Também permite que você converta os capítulo

Yonde 8 Nov 28, 2021
Easy, clean, reliable Python 2/3 compatibility

Overview: Easy, clean, reliable Python 2/3 compatibility python-future is the missing compatibility layer between Python 2 and Python 3. It allows you

Python Charmers 1.2k Jan 08, 2023
RELATE is an Environment for Learning And TEaching

RELATE Relate is an Environment for Learning And TEaching RELATE is a web-based courseware package. It is set apart by the following features: Focus o

Andreas Klöckner 311 Dec 25, 2022
Discover and load entry points from installed packages

Entry points are a way for Python packages to advertise objects with some common interface. The most common examples are console_scripts entry points,

Thomas Kluyver 69 Jul 05, 2022
pydock - Docker-based environment manager for Python

pydock - Docker-based environment manager for Python ⚠️ pydock is still in beta mode, and very unstable. It is not recommended for anything serious. p

Alejandro Piad 16 Sep 18, 2021
automate some stuff so I can be more noob

dota automate some stuff so I can be more noob This is a simple project, but one that I've wanted forever! I use pyautogui, time, smtplib and datetime

Aaron Allen 17 Oct 18, 2022
Сервис служит прокси между cервисом регистрации ошибок платформы и системой сбора ошибок Sentry

Sentry Reg Service Сервис служит прокси между Cервисом регистрации ошибок платформы и системой сбора ошибок Sentry. Как развернуть Sentry onpremise. С

Ingvar Vilkman 13 May 24, 2022
A hackers attempt at an MVP anki plugin

my anki plugin if you have found this by accident, you should probably run away this is nothing more than a hackers attempt at an MVP anki plugin I re

Chris Hall 1 Nov 02, 2021
An application for automation of the mining function in the game Alienworlds.IO

alienautomation A Python script made to automate the tidious job of mining on AlienWorlds This script: Automatically opens the browser Automatically l

anonieXdev 42 Dec 03, 2022
Tools for collecting social media data around focal events

Social Media Focal Events The focalevents codebase provides tools for organizing data collected around focal events on social media. It is often diffi

Ryan Gallagher 80 Nov 28, 2022
Advanced Developing of Python Apps Final Exercise

Advanced-Developing-of-Python-Apps-Final-Exercise This is an exercise that I did for a python advanced learning course. The exercise is divided into t

Alejandro Méndez Fernández 1 Dec 04, 2021
Little tool in python to watch anime from the terminal (the better way to watch anime)

anipy-cli Little tool in python to watch anime from the terminal (the better way to watch anime) Has a resume playback function when picking from Hist

sdao 97 Dec 29, 2022