https://github.com/lynnpepin/reso Skip to content Sign up * Why GitHub? + Features + Mobile + Actions + Codespaces + Packages + Security + Code review + Issues + Integrations + GitHub Sponsors + Customer stories * Team * Enterprise * Explore + Explore GitHub + Learn and contribute + Topics + Collections + Trending + Learning Lab + Open source guides + Connect with others + The ReadME Project + Events + Community forum + GitHub Education + GitHub Stars program * Marketplace * Pricing + Plans + Compare plans + Contact Sales + Education [ ] * # In this repository All GitHub | Jump to | * No suggested jump to results * # In this repository All GitHub | Jump to | * # In this user All GitHub | Jump to | * # In this repository All GitHub | Jump to | Sign in Sign up {{ message }} lynnpepin / reso Public * Notifications * Fork 0 * Star 90 * Reso: A visual circuits programming language using pixels. View license 90 stars 0 forks Star Notifications * Code * Issues 0 * Pull requests 0 * Actions * Projects 0 * Wiki * Security * Insights More * Code * Issues * Pull requests * Actions * Projects * Wiki * Security * Insights This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository. master Switch branches/tags [ ] Branches Tags Could not load branches Nothing to show {{ refName }} default View all branches Could not load tags Nothing to show {{ refName }} default View all tags 4 branches 0 tags Code Latest commit @lynnpepin lynnpepin Cleanup ... c1466d4 May 17, 2021 Cleanup c1466d4 Git stats * 74 commits Files Permalink Failed to load latest commit information. Type Name Latest commit message Commit time examples Cleanup May 17, 2021 logo Moved logos, added clocks Apr 28, 2021 slides Cleanup May 17, 2021 testing Tests now pass! Palettes are updated Apr 28, 2021 .gitignore Adding tests Jul 22, 2018 ARCHITECTURE.md Made separate ARCHITECTURE.md Apr 26, 2021 LICENSE Removed broken examples, updated logo, updated license Apr 28, 2021 README.md Updated README May 15, 2021 palette.py Tests now pass! Palettes are updated Apr 28, 2021 regionmapper.py Somehow replaced 'value' with 'a.reshape(-1)[0]'??? how? Apr 25, 2021 reso.py Fixed updated iter flag May 8, 2021 reso_logo.gif Cleanup May 17, 2021 resoboard.py Tests now pass! Palettes are updated Apr 28, 2021 tests.py Tests now pass! Palettes are updated Apr 28, 2021 tests_for_regionmapper.py Passed tests for regionmapper Apr 20, 2021 View code [ ] Reso Installation Usage Command line Palette Examples Things to be done: See Also README.md 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. About Reso: A visual circuits programming language using pixels. Resources Readme License View license Stars 90 stars Watchers 1 watching Forks 0 forks Releases No releases published Packages 0 No packages published Languages * Python 100.0% * (c) 2022 GitHub, Inc. * Terms * Privacy * Security * Status * Docs * Contact GitHub * Pricing * API * Training * Blog * About You can't perform that action at this time. You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.