diff --git a/.envrc2 b/.envrc2 new file mode 100644 index 0000000..8392d15 --- /dev/null +++ b/.envrc2 @@ -0,0 +1 @@ +use flake \ No newline at end of file diff --git a/.gitignore b/.gitignore index 870089d..d1a3d45 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ node_modules dist coverege -idea \ No newline at end of file +idea +.direnv diff --git a/docs/assets/SR.png b/docs/assets/SR.png deleted file mode 100644 index 0045225..0000000 Binary files a/docs/assets/SR.png and /dev/null differ diff --git a/docs/assets/buffer-unconnected.png b/docs/assets/buffer-unconnected.png new file mode 100644 index 0000000..aac02e7 Binary files /dev/null and b/docs/assets/buffer-unconnected.png differ diff --git a/docs/assets/components.png b/docs/assets/components.png new file mode 100644 index 0000000..8654edf Binary files /dev/null and b/docs/assets/components.png differ diff --git a/docs/assets/empty.png b/docs/assets/empty.png new file mode 100644 index 0000000..5dad0c6 Binary files /dev/null and b/docs/assets/empty.png differ diff --git a/docs/assets/files.png b/docs/assets/files.png deleted file mode 100644 index bf95761..0000000 Binary files a/docs/assets/files.png and /dev/null differ diff --git a/docs/assets/gates.png b/docs/assets/gates.png new file mode 100644 index 0000000..adc05af Binary files /dev/null and b/docs/assets/gates.png differ diff --git a/docs/assets/notification.png b/docs/assets/notification.png new file mode 100644 index 0000000..01b7839 Binary files /dev/null and b/docs/assets/notification.png differ diff --git a/docs/tutorials/basic-operations.md b/docs/tutorials/basic-operations.md new file mode 100644 index 0000000..68e1dec --- /dev/null +++ b/docs/tutorials/basic-operations.md @@ -0,0 +1,33 @@ +# Basic opeartions + +To demonstrate the basic usage of the simulator we will construct one of the simplest logic gates: the `buffer` gate. + +First of all we need to create something called an `integrated circuit`. You can think of integrated circuits like a box containing some components. You only put the components there once and can then reuse that box as many times as you want. + +To create an integrated circuit, click on `Create simulation`, then on `integrated circuit` and type in the name of the circuit - in this case `buffer`. + +You should see something like this: + +![empty IC](../assets/empty.png) + +Now we need to actually add some logic gates. To do that you need to: + +1. click on `Logic gates`, which should bring up a screen which looks similar to this: + + ![gates](../assets/gates.png) + +2. Click on the logic gates you want to add to your integrated circuit! In our case we need to add a `button` and a `light bulb` + + > After you add any logic gate you should get a confirmation message which looks something like this: ![notification](../assets/notification.png) + +3. To go back to the simulation view click the `Back to simulation` button. Now you should see something like this: + + ![components](../assets/components.png) + +4. As you probably noticed, the components are on top of eachother. You can use your right mouse button to drag them around! + + > Note 1: while your mouse is outside of gate you can start a selection. After you selected some gates you can use your mouse to drag all of them. + + > Note 2: this isn't limited to movement. In the future you'll learn about many actions you can perform which also work on multiple gates :D + + > Note 3: While we're on the topic of selection: You can use `ctrl + a` (or `command + a` on macs) to select everything diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..f8dbe8d --- /dev/null +++ b/flake.lock @@ -0,0 +1,326 @@ +{ + "nodes": { + "all-cabal-json": { + "flake": false, + "locked": { + "lastModified": 1665552503, + "narHash": "sha256-r14RmRSwzv5c+bWKUDaze6pXM7nOsiz1H8nvFHJvufc=", + "owner": "nix-community", + "repo": "all-cabal-json", + "rev": "d7c0434eebffb305071404edcf9d5cd99703878e", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "hackage", + "repo": "all-cabal-json", + "type": "github" + } + }, + "crane": { + "flake": false, + "locked": { + "lastModified": 1670900067, + "narHash": "sha256-VXVa+KBfukhmWizaiGiHRVX/fuk66P8dgSFfkVN4/MY=", + "owner": "ipetkov", + "repo": "crane", + "rev": "59b31b41a589c0a65e4a1f86b0e5eac68081468b", + "type": "github" + }, + "original": { + "owner": "ipetkov", + "repo": "crane", + "type": "github" + } + }, + "devshell": { + "flake": false, + "locked": { + "lastModified": 1663445644, + "narHash": "sha256-+xVlcK60x7VY1vRJbNUEAHi17ZuoQxAIH4S4iUFUGBA=", + "owner": "numtide", + "repo": "devshell", + "rev": "e3dc3e21594fe07bdb24bdf1c8657acaa4cb8f66", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "dream2nix": { + "inputs": { + "all-cabal-json": "all-cabal-json", + "crane": "crane", + "devshell": "devshell", + "drv-parts": "drv-parts", + "flake-compat": "flake-compat", + "flake-parts": "flake-parts", + "flake-utils-pre-commit": "flake-utils-pre-commit", + "ghc-utils": "ghc-utils", + "gomod2nix": "gomod2nix", + "mach-nix": "mach-nix", + "nix-pypi-fetcher": "nix-pypi-fetcher", + "nixpkgs": "nixpkgs", + "nixpkgsV1": "nixpkgsV1", + "poetry2nix": "poetry2nix", + "pre-commit-hooks": "pre-commit-hooks", + "pruned-racket-catalog": "pruned-racket-catalog" + }, + "locked": { + "lastModified": 1681981547, + "narHash": "sha256-HiDkvZ9FyRC14nsgZ9DQjDpQF7XaqtTSFVrxIk+8ASY=", + "owner": "nix-community", + "repo": "dream2nix", + "rev": "5982515961d9d9d39c15fb161770ba989bb90781", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "dream2nix", + "type": "github" + } + }, + "drv-parts": { + "inputs": { + "flake-compat": [ + "dream2nix", + "flake-compat" + ], + "flake-parts": [ + "dream2nix", + "flake-parts" + ], + "nixpkgs": [ + "dream2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1680698112, + "narHash": "sha256-FgnobN/DvCjEsc0UAZEAdPLkL4IZi2ZMnu2K2bUaElc=", + "owner": "davhau", + "repo": "drv-parts", + "rev": "e8c2ec1157dc1edb002989669a0dbd935f430201", + "type": "github" + }, + "original": { + "owner": "davhau", + "repo": "drv-parts", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "dream2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1675933616, + "narHash": "sha256-/rczJkJHtx16IFxMmAWu5nNYcSXNg1YYXTHoGjLrLUA=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "47478a4a003e745402acf63be7f9a092d51b83d7", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils-pre-commit": { + "locked": { + "lastModified": 1644229661, + "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "ghc-utils": { + "flake": false, + "locked": { + "lastModified": 1662774800, + "narHash": "sha256-1Rd2eohGUw/s1tfvkepeYpg8kCEXiIot0RijapUjAkE=", + "ref": "refs/heads/master", + "rev": "bb3a2d3dc52ff0253fb9c2812bd7aa2da03e0fea", + "revCount": 1072, + "type": "git", + "url": "https://gitlab.haskell.org/bgamari/ghc-utils" + }, + "original": { + "type": "git", + "url": "https://gitlab.haskell.org/bgamari/ghc-utils" + } + }, + "gomod2nix": { + "flake": false, + "locked": { + "lastModified": 1627572165, + "narHash": "sha256-MFpwnkvQpauj799b4QTBJQFEddbD02+Ln5k92QyHOSk=", + "owner": "tweag", + "repo": "gomod2nix", + "rev": "67f22dd738d092c6ba88e420350ada0ed4992ae8", + "type": "github" + }, + "original": { + "owner": "tweag", + "repo": "gomod2nix", + "type": "github" + } + }, + "mach-nix": { + "flake": false, + "locked": { + "lastModified": 1634711045, + "narHash": "sha256-m5A2Ty88NChLyFhXucECj6+AuiMZPHXNbw+9Kcs7F6Y=", + "owner": "DavHau", + "repo": "mach-nix", + "rev": "4433f74a97b94b596fa6cd9b9c0402104aceef5d", + "type": "github" + }, + "original": { + "id": "mach-nix", + "type": "indirect" + } + }, + "nix-pypi-fetcher": { + "flake": false, + "locked": { + "lastModified": 1669065297, + "narHash": "sha256-UStjXjNIuIm7SzMOWvuYWIHBkPUKQ8Id63BMJjnIDoA=", + "owner": "DavHau", + "repo": "nix-pypi-fetcher", + "rev": "a9885ac6a091576b5195d547ac743d45a2a615ac", + "type": "github" + }, + "original": { + "owner": "DavHau", + "repo": "nix-pypi-fetcher", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1665580254, + "narHash": "sha256-hO61XPkp1Hphl4HGNzj1VvDH5URt7LI6LaY/385Eul4=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f634d427b0224a5f531ea5aa10c3960ba6ec5f0f", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-unstable", + "type": "indirect" + } + }, + "nixpkgsV1": { + "locked": { + "lastModified": 1678500271, + "narHash": "sha256-tRBLElf6f02HJGG0ZR7znMNFv/Uf7b2fFInpTHiHaSE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "5eb98948b66de29f899c7fe27ae112a47964baf8", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixos-22.11", + "type": "indirect" + } + }, + "poetry2nix": { + "flake": false, + "locked": { + "lastModified": 1666918719, + "narHash": "sha256-BkK42fjAku+2WgCOv2/1NrPa754eQPV7gPBmoKQBWlc=", + "owner": "nix-community", + "repo": "poetry2nix", + "rev": "289efb187123656a116b915206e66852f038720e", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "1.36.0", + "repo": "poetry2nix", + "type": "github" + } + }, + "pre-commit-hooks": { + "inputs": { + "flake-utils": [ + "dream2nix", + "flake-utils-pre-commit" + ], + "nixpkgs": [ + "dream2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1646153636, + "narHash": "sha256-AlWHMzK+xJ1mG267FdT8dCq/HvLCA6jwmx2ZUy5O8tY=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "b6bc0b21e1617e2b07d8205e7fae7224036dfa4b", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "pruned-racket-catalog": { + "flake": false, + "locked": { + "lastModified": 1672537287, + "narHash": "sha256-SuOvXVcLfakw18oJB/PuRMyvGyGG1+CQD3R+TGHIv44=", + "owner": "nix-community", + "repo": "pruned-racket-catalog", + "rev": "c8b89557fb53b36efa2ee48a769c7364df0f6262", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "catalog", + "repo": "pruned-racket-catalog", + "type": "github" + } + }, + "root": { + "inputs": { + "dream2nix": "dream2nix" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..55fe19c --- /dev/null +++ b/flake.nix @@ -0,0 +1,10 @@ +{ + inputs.dream2nix.url = "github:nix-community/dream2nix"; + outputs = inp: + inp.dream2nix.lib.makeFlakeOutputs { + systems = [ "x86_64-linux" ]; + config.projectRoot = ./.; + source = ./.; + projects = ./projects.toml; + }; +} diff --git a/projects.toml b/projects.toml new file mode 100644 index 0000000..b4f847e --- /dev/null +++ b/projects.toml @@ -0,0 +1,18 @@ +# projects.toml file describing inputs for dream2nix +# +# To re-generate this file, run: +# nix run .#detect-projects $source +# ... where `$source` points to the source of your project. +# +# If the local flake is unavailable, alternatively execute the app from the +# upstream dream2nix flake: +# nix run github:nix-community/dream2nix#detect-projects $source + +[logic-gate-simulator] +name = "logic-gate-simulator" +relPath = "" +subsystem = "nodejs" +translator = "package-lock" +translators = [ "package-lock", "package-json",] + +[logic-gate-simulator.subsystemInfo]