diff --git a/.gitignore b/.gitignore index c337f09ab..ae4e10023 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,5 @@ cache node_modules bower_components -**/locale/**/*.json +app/resources/collection +app/resources/locale/**/*.json diff --git a/app/.jshintrc b/.jshintrc similarity index 100% rename from app/.jshintrc rename to .jshintrc diff --git a/.travis.yml b/.travis.yml index b3097cbbe..312dbe21d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,6 +26,7 @@ deploy: - dist/*.zip - dist/*.dmg - dist/*.exe + - dist/*.AppImage file_glob: true skip_cleanup: true on: diff --git a/README.md b/README.md index a2a0ca3e4..657564239 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,22 @@ +[![Build Status](https://travis-ci.org/FPGAwars/icestudio.svg?branch=0.3.0-rc)](https://travis-ci.org/FPGAwars/icestudio) +[![Version](https://img.shields.io/badge/version-v0.3.0--rc-orange.svg)](https://github.com/FPGAwars/icestudio/releases) [![License](http://img.shields.io/:license-gpl-blue.svg)](http://opensource.org/licenses/GPL-2.0) [![Documentation Status](https://readthedocs.org/projects/icestudio/badge/?version=latest)](http://icestudio.readthedocs.io/en/latest) -[![Documentation Status](https://readthedocs.org/projects/icestudio/badge/?version=stable)](http://icestudio.readthedocs.io/en/stable) - -**Experimental** graphic editor for open FPGAs. Built on top of the [icestorm project](http://www.clifford.at/icestorm/). +**Experimental** graphic editor for open FPGAs. Built on top of the [Icestorm project](http://www.clifford.at/icestorm/). GUI -> JSON -> Verilog, PCF Supported boards: * [IceZUM Alhambra](https://github.com/FPGAwars/icezum) +* [Kéfir I iCE40-HX4K](http://fpgalibre.sourceforge.net/Kefir/) * [Nandland Go board](https://www.nandland.com/goboard/introduction.html) -* [iCEstick](http://www.pighixxx.com/test/portfolio-items/icestick/) -* [iCE40-HX8K](http://www.latticesemi.com/Products/DevelopmentBoardsAndKits/iCE40HX8KBreakoutBoard.aspx) +* [iCE40-HX8K Breakout Board](http://www.latticesemi.com/Products/DevelopmentBoardsAndKits/iCE40HX8KBreakoutBoard.aspx) +* [iCEstick Evaluation Kit](http://www.pighixxx.com/test/portfolio-items/icestick/) * [icoBOARD 1.0](http://icoboard.org/about-icoboard.html) -* [Kéfir I](http://fpgalibre.sourceforge.net/Kefir/) Supported operating systems: @@ -24,40 +24,35 @@ Supported operating systems: * Windows * Mac OS X -## Version 0.3.0-beta3 (latest) - -Documentation: http://icestudio.readthedocs.io/en/latest - -### Installation +## Installation * **GNU/Linux** - 1. Install [Python 2.7](https://www.python.org) - 2. Download the [zipped release](https://github.com/FPGAwars/icestudio/releases/tag/0.3.0-beta3), unzip and execute **icestudio** - - -NOTE: GNU/Linux users must have **xclip** installed to enable Copy/Paste. + 1. Install [Python 2.7](https://www.python.org) and **xclip** + 2. Download and execute the [AppImage](https://github.com/FPGAwars/icestudio/releases) * **Windows** - 1. Download and execute the [Windows installer](https://github.com/FPGAwars/icestudio/releases/tag/0.3.0-beta3) + 1. Download and execute the [Windows installer](https://github.com/FPGAwars/icestudio/releases) * **Mac OS X** 1. Install [Python 2.7](https://www.python.org) - 2. Download and execute the [DMG package](https://github.com/FPGAwars/icestudio/releases/tag/0.3.0-beta3) + 2. Download and execute the [DMG package](https://github.com/FPGAwars/icestudio/releases) + + - +Check the [Documentation](http://icestudio.readthedocs.io/en/latest) for more information. ## Development Install [Python 2.7](https://www.python.org/downloads/release/python-2711/) and [nodejs](https://github.com/nodejs/node). -Using [Atom](https://atom.io/) editor with [linter-jshint](https://atom.io/packages/linter-jshint). +[Atom](https://atom.io/) editor with [linter-jshint](https://atom.io/packages/linter-jshint) is recommended. -NOTE: if you want to add blocks or examples, please contribute to [icestudio-blocks](https://github.com/FPGAwars/icestudio-blocks) or [icestudio-examples](https://github.com/FPGAwars/icestudio-examples). +If you want to add blocks or examples, please contribute to [icestudio-blocks](https://github.com/FPGAwars/icestudio-blocks), [icestudio-examples](https://github.com/FPGAwars/icestudio-examples) or [collection-default](https://github.com/FPGAwars/collection-default). ##### Ubuntu @@ -92,9 +87,12 @@ npm start npm run dist ``` -Output -* *GNU/Linux*: linux32.zip, linux64.zip, win32.zip, win64.zip, win32.exe, win64.exe. -* *Mac OS X*: osx32.zip, osx64.zip, osx64.dmg. +| OS | Development OS | Output files | +|:---:|:-------------:|:-----------------:| +| GNU/Linux | GNU/Linux | (linux32,linux64).zip, (linux32,linux64).AppImage | +| Windows | GNU/Linux | (win32,win64).zip, (win32,win64).exe | +| Mac OS X | Mac OS X | (osx32,osx64).zip, osx64.dmg | + ## Languages @@ -102,15 +100,16 @@ Output |:----------:|:------------------------------------------:| | English | ![Progress](http://progressed.io/bar/100) | | Spanish | ![Progress](http://progressed.io/bar/100) | -| Basque | ![Progress](http://progressed.io/bar/87) | -| French | ![Progress](http://progressed.io/bar/61) | -| Galician | ![Progress](http://progressed.io/bar/35) | +| Galician | ![Progress](http://progressed.io/bar/95) | +| Basque | ![Progress](http://progressed.io/bar/95) | +| Catalan | ![Progress](http://progressed.io/bar/95) | +| French | ![Progress](http://progressed.io/bar/95) | -**Contribute**: add or update the [translations](https://github.com/FPGAwars/icestudio/tree/develop/app/resources/locale) by following the [next instructions](https://angular-gettext.rocketeer.be/dev-guide/translate/#poedit). +**Contribute!** -```bash -npm run gettext -``` +Add or update the [app translations](https://github.com/FPGAwars/icestudio/tree/develop/app/resources/locale) using **[Poedit](https://poedit.net/)**. + +*Developer note*: use `npm run gettext` to extract the labels from the code. ## Troubleshooting @@ -128,22 +127,6 @@ There is a [Wishlist](https://github.com/FPGAwars/icestudio/wiki/Wishlist:-propo We use the GitHub issues to schedule our new features and improvements. -## Version 0.2.3 (stable) - -### Installation - -1. Install [Python 2.7](https://www.python.org) - -2. Download the [release](https://github.com/FPGAwars/icestudio/releases/tag/0.2.3), unzip and execute **icestudio** - -Documentation: http://icestudio.readthedocs.io/en/stable - - - -## Version 0.1 - -![][icestudio-0.1-demo] - ## Videos ### Version 0.2 @@ -154,13 +137,6 @@ Documentation: http://icestudio.readthedocs.io/en/stable [![Icestudio: block factory](http://img.youtube.com/vi/mAIKb47z2Do/0.jpg)](http://www.youtube.com/watch?v=mAIKb47z2Do "Icestudio: block factory") - -### Version 0.1 - -[![Icestudio: GUI for open FPGAs](http://img.youtube.com/vi/Okl4Rr_i6Qk/0.jpg)](http://www.youtube.com/watch?v=Okl4Rr_i6Qk "Icestudio: GUI for open FPGAs") - -[![Icestudio: code generation](http://img.youtube.com/vi/pG1DsF9MIj0/0.jpg)](http://www.youtube.com/watch?v=pG1DsF9MIj0 "Icestudio: code generation") - ## Authors * [Jesús Arroyo Torrens](https://github.com/Jesus89) @@ -168,32 +144,33 @@ Documentation: http://icestudio.readthedocs.io/en/stable ## Contributors * v0.3 - * [Martoni](https://github.com/Martoni) - * [Carlos Díaz](https://github.com/C47D) - * [Lorea-Aldabaldetreku](https://github.com/Lorea-Aldabaldetreku) - + * [Lorea-Aldabaldetreku](https://github.com/Lorea-Aldabaldetreku) + * [Carlos Díaz](https://github.com/C47D) + * [Martoni](https://github.com/Martoni) + * [Xoan Sampaiño](https://github.com/xoan) + * [Unai](https://github.com/1138-4EB) + * [Francisco Sayas](https://github.com/fsayas) + * [Pascal Cotret](https://github.com/pcotret) * v0.2 - * [Tomás Calvo](https://github.com/tocalvo) - * [Juan González (Obijuan)](https://github.com/Obijuan) - * [Carlos Díaz](https://github.com/C47D) - * [Xoan Sampaiño](https://github.com/xoan) - * [Salvador E. Tropea](https://github.com/set-soft) - * [Democrito](https://github.com/Democrito) - * [Martoni](https://github.com/Martoni) - * [Pascal Cotret](https://github.com/pcotret) + * [Tomás Calvo](https://github.com/tocalvo) + * [Juan González (Obijuan)](https://github.com/Obijuan) + * [Carlos Díaz](https://github.com/C47D) + * [Xoan Sampaiño](https://github.com/xoan) + * [Salvador E. Tropea](https://github.com/set-soft) + * [Democrito](https://github.com/Democrito) + * [Martoni](https://github.com/Martoni) + * [Pascal Cotret](https://github.com/pcotret) * v0.1 - * [Miguel Sánchez de León Peque](https://github.com/Peque) + * [Miguel Sánchez de León Peque](https://github.com/Peque) ## Credits * v0.3, v0.2: using [JointJS](https://github.com/clientIO/joint) and [AlertifyJS](https://github.com/MohammadYounes/AlertifyJS) * v0.1: using [AngularJS-Flowchart](https://github.com/codecapers/AngularJS-FlowChart) -* Sponsored by [BQ](https://www.bq.com) +* [BQ](https://www.bq.com) sponsored this project from 02-2016 to 02-2017. Thanks ![](https://github.com/FPGAwars/icezum/raw/master/wiki/bq-logo.png) ## License -Licensed under [GPLv2](http://opensource.org/licenses/GPL-2.0) and [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/) - -[icestudio-0.1-demo]: doc/images/icestudio-demo.gif +Licensed under [GPL 2.0](http://opensource.org/licenses/GPL-2.0) and [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/). diff --git a/app/bower.json b/app/bower.json index 5d85acf9e..77b283fd0 100644 --- a/app/bower.json +++ b/app/bower.json @@ -35,6 +35,6 @@ "svg-pan-zoom": "^3.2.9", "alertify-js": "^1.8.0", "jquery-resize": "*", - "angular-gettext": "^2.3.8" + "angular-gettext": "https://github.com/Jesus89/angular-gettext.git#master" } } diff --git a/app/index.html b/app/index.html index 708b75811..de50ef82a 100644 --- a/app/index.html +++ b/app/index.html @@ -14,9 +14,9 @@ + - @@ -65,10 +65,11 @@ + - + diff --git a/app/package.json b/app/package.json index a10cbf17a..362232782 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "name": "icestudio", - "version": "0.3.0-beta3", + "version": "0.3.0-rc", "description": "Experimental graphic editor for open FPGAs", "author": "Jesús Arroyo Torrens ", "repository": "https://github.com/FPGAwars/icestudio", @@ -18,8 +18,8 @@ "icon": "resources/images/icestudio-logo.png" }, "apio": { - "min": "0.2.1.2", - "max": "0.2.2" + "min": "0.2.2", + "max": "0.2.3" }, "engines": { "node": ">= 0.10.0" @@ -29,6 +29,7 @@ "angular-gettext-tools": "~2.3.3", "copy-paste": "^1.3.0", "fs-extra": "^1.0.0", + "getos": "^2.8.4", "glob": "^7.1.1", "is-online": "^5.2.0", "jquery": "^3.1.1", @@ -40,7 +41,7 @@ "sha1": "^1.1.1", "ssh-exec": "^2.0.0", "sudo-prompt": "^6.2.0", - "svgo": "^0.7.1", + "svgo": "~0.7.1", "tarball-extract": "0.0.3" }, "readme": "../README.md", diff --git a/app/resources/boards/go-board/info.json b/app/resources/boards/go-board/info.json index 0994fea2c..db4ce4cf4 100644 --- a/app/resources/boards/go-board/info.json +++ b/app/resources/boards/go-board/info.json @@ -1,4 +1,4 @@ { - "label": "Go board", + "label": "Nandland Go board", "datasheet": "https://www.nandland.com/goboard/introduction.html" } diff --git a/app/resources/boards/iCE40-HX8K/info.json b/app/resources/boards/iCE40-HX8K/info.json index 02bb735a0..a7fbb23de 100644 --- a/app/resources/boards/iCE40-HX8K/info.json +++ b/app/resources/boards/iCE40-HX8K/info.json @@ -1,4 +1,4 @@ { - "label": "iCE40-HX8K", + "label": "iCE40-HX8K Breakout Board", "datasheet": "http://www.latticesemi.com/view_document?document_id=50373" } diff --git a/app/resources/boards/iCE40-HX8K/pinout.json b/app/resources/boards/iCE40-HX8K/pinout.json index 916be13b9..e6d1cdc27 100644 --- a/app/resources/boards/iCE40-HX8K/pinout.json +++ b/app/resources/boards/iCE40-HX8K/pinout.json @@ -1 +1 @@ -[{"type": "output", "name": "LED0", "value": "B5"}, {"type": "output", "name": "LED1", "value": "B4"}, {"type": "output", "name": "LED2", "value": "A2"}, {"type": "output", "name": "LED3", "value": "A1"}, {"type": "output", "name": "LED4", "value": "C5"}, {"type": "output", "name": "LED5", "value": "C4"}, {"type": "output", "name": "LED6", "value": "B3"}, {"type": "output", "name": "LED7", "value": "C3"}, {"type": "input", "name": "CLK", "value": "J3"}, {"type": "input", "name": "MISO", "value": "P12"}, {"type": "output", "name": "MOSI", "value": "P11"}, {"type": "output", "name": "SCK", "value": "R11"}, {"type": "output", "name": "SS", "value": "R12"}, {"type": "output", "name": "RTS", "value": "B13"}, {"type": "input", "name": "RESET", "value": "N11"}, {"type": "output", "name": "DONE", "value": "M10"}, {"type": "output", "name": "TX", "value": "B12"}, {"type": "input", "name": "RX", "value": "B10"}, {"type": "output", "name": "DCD", "value": "B15"}, {"type": "output", "name": "DSR", "value": "B14"}, {"type": "input", "name": "DTR", "value": "A16"}, {"type": "output", "name": "CTS", "value": "A15"}, {"type": "inout", "name": "A16", "value": "A16"}, {"type": "inout", "name": "A15", "value": "A15"}, {"type": "inout", "name": "B15", "value": "B15"}, {"type": "inout", "name": "B13", "value": "B13"}, {"type": "inout", "name": "B14", "value": "B14"}, {"type": "inout", "name": "B12", "value": "B12"}, {"type": "inout", "name": "B11", "value": "B11"}, {"type": "inout", "name": "A11", "value": "A11"}, {"type": "inout", "name": "B10", "value": "B10"}, {"type": "inout", "name": "A10", "value": "A10"}, {"type": "inout", "name": "C9", "value": "C9"}, {"type": "inout", "name": "A9", "value": "A9"}, {"type": "inout", "name": "B9", "value": "B9"}, {"type": "inout", "name": "B8", "value": "B8"}, {"type": "inout", "name": "A7", "value": "A7"}, {"type": "inout", "name": "B7", "value": "B7"}, {"type": "inout", "name": "C7", "value": "C7"}, {"type": "inout", "name": "A6", "value": "A6"}, {"type": "inout", "name": "C6", "value": "C6"}, {"type": "inout", "name": "B6", "value": "B6"}, {"type": "inout", "name": "C5", "value": "C5"}, {"type": "inout", "name": "A5", "value": "A5"}, {"type": "inout", "name": "C4", "value": "C4"}, {"type": "inout", "name": "B5", "value": "B5"}, {"type": "inout", "name": "C3", "value": "C3"}, {"type": "inout", "name": "B4", "value": "B4"}, {"type": "inout", "name": "B3", "value": "B3"}, {"type": "inout", "name": "A2", "value": "A2"}, {"type": "inout", "name": "A1", "value": "A1"}, {"type": "inout", "name": "R15", "value": "R15"}, {"type": "inout", "name": "P16", "value": "P16"}, {"type": "inout", "name": "P15", "value": "P15"}, {"type": "inout", "name": "N16", "value": "N16"}, {"type": "inout", "name": "M15", "value": "M15"}, {"type": "inout", "name": "M16", "value": "M16"}, {"type": "inout", "name": "L16", "value": "L16"}, {"type": "inout", "name": "K15", "value": "K15"}, {"type": "inout", "name": "K16", "value": "K16"}, {"type": "inout", "name": "K14", "value": "K14"}, {"type": "inout", "name": "J14", "value": "J14"}, {"type": "inout", "name": "G14", "value": "G14"}, {"type": "inout", "name": "F14", "value": "F14"}, {"type": "inout", "name": "J15", "value": "J15"}, {"type": "inout", "name": "H14", "value": "H14"}, {"type": "inout", "name": "H16", "value": "H16"}, {"type": "inout", "name": "G15", "value": "G15"}, {"type": "inout", "name": "G16", "value": "G16"}, {"type": "inout", "name": "F15", "value": "F15"}, {"type": "inout", "name": "F16", "value": "F16"}, {"type": "inout", "name": "E14", "value": "E14"}, {"type": "inout", "name": "E16", "value": "E16"}, {"type": "inout", "name": "D15", "value": "D15"}, {"type": "inout", "name": "D16", "value": "D16"}, {"type": "inout", "name": "D14", "value": "D14"}, {"type": "inout", "name": "C16", "value": "C16"}, {"type": "inout", "name": "B16", "value": "B16"}, {"type": "inout", "name": "R16", "value": "R16"}, {"type": "inout", "name": "T15", "value": "T15"}, {"type": "inout", "name": "T16", "value": "T16"}, {"type": "inout", "name": "T13", "value": "T13"}, {"type": "inout", "name": "T14", "value": "T14"}, {"type": "inout", "name": "N12", "value": "N12"}, {"type": "inout", "name": "P13", "value": "P13"}, {"type": "inout", "name": "N10", "value": "N10"}, {"type": "inout", "name": "M11", "value": "M11"}, {"type": "inout", "name": "T11", "value": "T11"}, {"type": "inout", "name": "P10", "value": "P10"}, {"type": "inout", "name": "T10", "value": "T10"}, {"type": "inout", "name": "R10", "value": "R10"}, {"type": "inout", "name": "P8", "value": "P8"}, {"type": "inout", "name": "P9", "value": "P9"}, {"type": "inout", "name": "T9", "value": "T9"}, {"type": "inout", "name": "R9", "value": "R9"}, {"type": "inout", "name": "T7", "value": "T7"}, {"type": "inout", "name": "T8", "value": "T8"}, {"type": "inout", "name": "T6", "value": "T6"}, {"type": "inout", "name": "R6", "value": "R6"}, {"type": "inout", "name": "T5", "value": "T5"}, {"type": "inout", "name": "R5", "value": "R5"}, {"type": "inout", "name": "R3", "value": "R3"}, {"type": "inout", "name": "R4", "value": "R4"}, {"type": "inout", "name": "R2", "value": "R2"}, {"type": "inout", "name": "T3", "value": "T3"}, {"type": "inout", "name": "T1", "value": "T1"}, {"type": "inout", "name": "T2", "value": "T2"}, {"type": "inout", "name": "R1", "value": "R1"}, {"type": "inout", "name": "P1", "value": "P1"}, {"type": "inout", "name": "P2", "value": "P2"}, {"type": "inout", "name": "N3", "value": "N3"}, {"type": "inout", "name": "N2", "value": "N2"}, {"type": "inout", "name": "M2", "value": "M2"}, {"type": "inout", "name": "M1", "value": "M1"}, {"type": "inout", "name": "L3", "value": "L3"}, {"type": "inout", "name": "L1", "value": "L1"}, {"type": "inout", "name": "K3", "value": "K3"}, {"type": "inout", "name": "K1", "value": "K1"}, {"type": "inout", "name": "J2", "value": "J2"}, {"type": "inout", "name": "J1", "value": "J1"}, {"type": "inout", "name": "H2", "value": "H2"}, {"type": "inout", "name": "J3", "value": "J3"}, {"type": "inout", "name": "G2", "value": "G2"}, {"type": "inout", "name": "H1", "value": "H1"}, {"type": "inout", "name": "F2", "value": "F2"}, {"type": "inout", "name": "G1", "value": "G1"}, {"type": "inout", "name": "E2", "value": "E2"}, {"type": "inout", "name": "F1", "value": "F1"}, {"type": "inout", "name": "D1", "value": "D1"}, {"type": "inout", "name": "D2", "value": "D2"}, {"type": "inout", "name": "C1", "value": "C1"}, {"type": "inout", "name": "C2", "value": "C2"}, {"type": "inout", "name": "B1", "value": "B1"}, {"type": "inout", "name": "B2", "value": "B2"}] \ No newline at end of file +[{"type": "output", "name": "LED0", "value": "B5"}, {"type": "output", "name": "LED1", "value": "B4"}, {"type": "output", "name": "LED2", "value": "A2"}, {"type": "output", "name": "LED3", "value": "A1"}, {"type": "output", "name": "LED4", "value": "C5"}, {"type": "output", "name": "LED5", "value": "C4"}, {"type": "output", "name": "LED6", "value": "B3"}, {"type": "output", "name": "LED7", "value": "C3"}, {"type": "input", "name": "CLK", "value": "J3"}, {"type": "input", "name": "MISO", "value": "P12"}, {"type": "output", "name": "MOSI", "value": "P11"}, {"type": "output", "name": "SCK", "value": "R11"}, {"type": "output", "name": "SS", "value": "R12"}, {"type": "input", "name": "RTS", "value": "B13"}, {"type": "input", "name": "RESET", "value": "N11"}, {"type": "output", "name": "DONE", "value": "M10"}, {"type": "output", "name": "TX", "value": "B12"}, {"type": "input", "name": "RX", "value": "B10"}, {"type": "output", "name": "DCD", "value": "B15"}, {"type": "output", "name": "DSR", "value": "B14"}, {"type": "input", "name": "DTR", "value": "A16"}, {"type": "output", "name": "CTS", "value": "A15"}, {"type": "inout", "name": "A16", "value": "A16"}, {"type": "inout", "name": "A15", "value": "A15"}, {"type": "inout", "name": "B15", "value": "B15"}, {"type": "inout", "name": "B13", "value": "B13"}, {"type": "inout", "name": "B14", "value": "B14"}, {"type": "inout", "name": "B12", "value": "B12"}, {"type": "inout", "name": "B11", "value": "B11"}, {"type": "inout", "name": "A11", "value": "A11"}, {"type": "inout", "name": "B10", "value": "B10"}, {"type": "inout", "name": "A10", "value": "A10"}, {"type": "inout", "name": "C9", "value": "C9"}, {"type": "inout", "name": "A9", "value": "A9"}, {"type": "inout", "name": "B9", "value": "B9"}, {"type": "inout", "name": "B8", "value": "B8"}, {"type": "inout", "name": "A7", "value": "A7"}, {"type": "inout", "name": "B7", "value": "B7"}, {"type": "inout", "name": "C7", "value": "C7"}, {"type": "inout", "name": "A6", "value": "A6"}, {"type": "inout", "name": "C6", "value": "C6"}, {"type": "inout", "name": "B6", "value": "B6"}, {"type": "inout", "name": "C5", "value": "C5"}, {"type": "inout", "name": "A5", "value": "A5"}, {"type": "inout", "name": "C4", "value": "C4"}, {"type": "inout", "name": "B5", "value": "B5"}, {"type": "inout", "name": "C3", "value": "C3"}, {"type": "inout", "name": "B4", "value": "B4"}, {"type": "inout", "name": "B3", "value": "B3"}, {"type": "inout", "name": "A2", "value": "A2"}, {"type": "inout", "name": "A1", "value": "A1"}, {"type": "inout", "name": "R15", "value": "R15"}, {"type": "inout", "name": "P16", "value": "P16"}, {"type": "inout", "name": "P15", "value": "P15"}, {"type": "inout", "name": "N16", "value": "N16"}, {"type": "inout", "name": "M15", "value": "M15"}, {"type": "inout", "name": "M16", "value": "M16"}, {"type": "inout", "name": "L16", "value": "L16"}, {"type": "inout", "name": "K15", "value": "K15"}, {"type": "inout", "name": "K16", "value": "K16"}, {"type": "inout", "name": "K14", "value": "K14"}, {"type": "inout", "name": "J14", "value": "J14"}, {"type": "inout", "name": "G14", "value": "G14"}, {"type": "inout", "name": "F14", "value": "F14"}, {"type": "inout", "name": "J15", "value": "J15"}, {"type": "inout", "name": "H14", "value": "H14"}, {"type": "inout", "name": "H16", "value": "H16"}, {"type": "inout", "name": "G15", "value": "G15"}, {"type": "inout", "name": "G16", "value": "G16"}, {"type": "inout", "name": "F15", "value": "F15"}, {"type": "inout", "name": "F16", "value": "F16"}, {"type": "inout", "name": "E14", "value": "E14"}, {"type": "inout", "name": "E16", "value": "E16"}, {"type": "inout", "name": "D15", "value": "D15"}, {"type": "inout", "name": "D16", "value": "D16"}, {"type": "inout", "name": "D14", "value": "D14"}, {"type": "inout", "name": "C16", "value": "C16"}, {"type": "inout", "name": "B16", "value": "B16"}, {"type": "inout", "name": "R16", "value": "R16"}, {"type": "inout", "name": "T15", "value": "T15"}, {"type": "inout", "name": "T16", "value": "T16"}, {"type": "inout", "name": "T13", "value": "T13"}, {"type": "inout", "name": "T14", "value": "T14"}, {"type": "inout", "name": "N12", "value": "N12"}, {"type": "inout", "name": "P13", "value": "P13"}, {"type": "inout", "name": "N10", "value": "N10"}, {"type": "inout", "name": "M11", "value": "M11"}, {"type": "inout", "name": "T11", "value": "T11"}, {"type": "inout", "name": "P10", "value": "P10"}, {"type": "inout", "name": "T10", "value": "T10"}, {"type": "inout", "name": "R10", "value": "R10"}, {"type": "inout", "name": "P8", "value": "P8"}, {"type": "inout", "name": "P9", "value": "P9"}, {"type": "inout", "name": "T9", "value": "T9"}, {"type": "inout", "name": "R9", "value": "R9"}, {"type": "inout", "name": "T7", "value": "T7"}, {"type": "inout", "name": "T8", "value": "T8"}, {"type": "inout", "name": "T6", "value": "T6"}, {"type": "inout", "name": "R6", "value": "R6"}, {"type": "inout", "name": "T5", "value": "T5"}, {"type": "inout", "name": "R5", "value": "R5"}, {"type": "inout", "name": "R3", "value": "R3"}, {"type": "inout", "name": "R4", "value": "R4"}, {"type": "inout", "name": "R2", "value": "R2"}, {"type": "inout", "name": "T3", "value": "T3"}, {"type": "inout", "name": "T1", "value": "T1"}, {"type": "inout", "name": "T2", "value": "T2"}, {"type": "inout", "name": "R1", "value": "R1"}, {"type": "inout", "name": "P1", "value": "P1"}, {"type": "inout", "name": "P2", "value": "P2"}, {"type": "inout", "name": "N3", "value": "N3"}, {"type": "inout", "name": "N2", "value": "N2"}, {"type": "inout", "name": "M2", "value": "M2"}, {"type": "inout", "name": "M1", "value": "M1"}, {"type": "inout", "name": "L3", "value": "L3"}, {"type": "inout", "name": "L1", "value": "L1"}, {"type": "inout", "name": "K3", "value": "K3"}, {"type": "inout", "name": "K1", "value": "K1"}, {"type": "inout", "name": "J2", "value": "J2"}, {"type": "inout", "name": "J1", "value": "J1"}, {"type": "inout", "name": "H2", "value": "H2"}, {"type": "inout", "name": "J3", "value": "J3"}, {"type": "inout", "name": "G2", "value": "G2"}, {"type": "inout", "name": "H1", "value": "H1"}, {"type": "inout", "name": "F2", "value": "F2"}, {"type": "inout", "name": "G1", "value": "G1"}, {"type": "inout", "name": "E2", "value": "E2"}, {"type": "inout", "name": "F1", "value": "F1"}, {"type": "inout", "name": "D1", "value": "D1"}, {"type": "inout", "name": "D2", "value": "D2"}, {"type": "inout", "name": "C1", "value": "C1"}, {"type": "inout", "name": "C2", "value": "C2"}, {"type": "inout", "name": "B1", "value": "B1"}, {"type": "inout", "name": "B2", "value": "B2"}] \ No newline at end of file diff --git a/app/resources/boards/iCE40-HX8K/pinout.pcf b/app/resources/boards/iCE40-HX8K/pinout.pcf index d4b51d6e8..b3a92e13c 100644 --- a/app/resources/boards/iCE40-HX8K/pinout.pcf +++ b/app/resources/boards/iCE40-HX8K/pinout.pcf @@ -26,7 +26,7 @@ set_io --warn-no-port MISO P12 # input set_io --warn-no-port MOSI P11 # output set_io --warn-no-port SCK R11 # output set_io --warn-no-port SS R12 # output #J7.1 -set_io --warn-no-port RTS B13 # output +set_io --warn-no-port RTS B13 # input set_io --warn-no-port RESET N11 # input set_io --warn-no-port DONE M10 # output diff --git a/app/resources/boards/icestick/info.json b/app/resources/boards/icestick/info.json index 90c9ee5a0..740dc73a6 100644 --- a/app/resources/boards/icestick/info.json +++ b/app/resources/boards/icestick/info.json @@ -1,4 +1,4 @@ { - "label": "iCEstick", + "label": "iCEstick Evaluation Kit", "datasheet": "http://www.latticesemi.com/icestick" } diff --git a/app/resources/boards/icestick/pinout.json b/app/resources/boards/icestick/pinout.json index 88b22d63a..f3d685ce3 100644 --- a/app/resources/boards/icestick/pinout.json +++ b/app/resources/boards/icestick/pinout.json @@ -1 +1 @@ -[{"type": "output", "name": "D1", "value": "99"}, {"type": "output", "name": "D2", "value": "98"}, {"type": "output", "name": "D3", "value": "97"}, {"type": "output", "name": "D4", "value": "96"}, {"type": "output", "name": "D5", "value": "95"}, {"type": "output", "name": "IrDA_TX", "value": "105"}, {"type": "input", "name": "IrDA_RX", "value": "106"}, {"type": "inout", "name": "SD", "value": "107"}, {"type": "inout", "name": "PMOD1", "value": "78"}, {"type": "inout", "name": "PMOD2", "value": "79"}, {"type": "inout", "name": "PMOD3", "value": "80"}, {"type": "inout", "name": "PMOD4", "value": "81"}, {"type": "inout", "name": "PMOD7", "value": "87"}, {"type": "inout", "name": "PMOD8", "value": "88"}, {"type": "inout", "name": "PMOD9", "value": "90"}, {"type": "inout", "name": "PMOD10", "value": "91"}, {"type": "inout", "name": "TR3", "value": "112"}, {"type": "inout", "name": "TR4", "value": "113"}, {"type": "inout", "name": "TR5", "value": "114"}, {"type": "inout", "name": "TR6", "value": "115"}, {"type": "inout", "name": "TR7", "value": "116"}, {"type": "inout", "name": "TR8", "value": "117"}, {"type": "inout", "name": "TR9", "value": "118"}, {"type": "inout", "name": "TR10", "value": "119"}, {"type": "inout", "name": "BR3", "value": "62"}, {"type": "inout", "name": "BR4", "value": "61"}, {"type": "inout", "name": "BR5", "value": "60"}, {"type": "inout", "name": "BR6", "value": "56"}, {"type": "inout", "name": "BR7", "value": "48"}, {"type": "inout", "name": "BR8", "value": "47"}, {"type": "inout", "name": "BR9", "value": "45"}, {"type": "inout", "name": "BR10", "value": "44"}, {"type": "input", "name": "CLK", "value": "21"}, {"type": "input", "name": "RES", "value": "66"}, {"type": "output", "name": "DONE", "value": "65"}, {"type": "output", "name": "SS", "value": "71"}, {"type": "input", "name": "MISO", "value": "67"}, {"type": "output", "name": "MOSI", "value": "68"}, {"type": "output", "name": "SCK", "value": "70"}, {"type": "output", "name": "DCD", "value": "1"}, {"type": "output", "name": "DSR", "value": "2"}, {"type": "input", "name": "DTR", "value": "3"}, {"type": "output", "name": "CTS", "value": "4"}, {"type": "output", "name": "RTS", "value": "7"}, {"type": "output", "name": "TX", "value": "8"}, {"type": "input", "name": "RX", "value": "9"}] \ No newline at end of file +[{"type": "output", "name": "D1", "value": "99"}, {"type": "output", "name": "D2", "value": "98"}, {"type": "output", "name": "D3", "value": "97"}, {"type": "output", "name": "D4", "value": "96"}, {"type": "output", "name": "D5", "value": "95"}, {"type": "output", "name": "IrDA_TX", "value": "105"}, {"type": "input", "name": "IrDA_RX", "value": "106"}, {"type": "inout", "name": "SD", "value": "107"}, {"type": "inout", "name": "PMOD1", "value": "78"}, {"type": "inout", "name": "PMOD2", "value": "79"}, {"type": "inout", "name": "PMOD3", "value": "80"}, {"type": "inout", "name": "PMOD4", "value": "81"}, {"type": "inout", "name": "PMOD7", "value": "87"}, {"type": "inout", "name": "PMOD8", "value": "88"}, {"type": "inout", "name": "PMOD9", "value": "90"}, {"type": "inout", "name": "PMOD10", "value": "91"}, {"type": "inout", "name": "TR3", "value": "112"}, {"type": "inout", "name": "TR4", "value": "113"}, {"type": "inout", "name": "TR5", "value": "114"}, {"type": "inout", "name": "TR6", "value": "115"}, {"type": "inout", "name": "TR7", "value": "116"}, {"type": "inout", "name": "TR8", "value": "117"}, {"type": "inout", "name": "TR9", "value": "118"}, {"type": "inout", "name": "TR10", "value": "119"}, {"type": "inout", "name": "BR3", "value": "62"}, {"type": "inout", "name": "BR4", "value": "61"}, {"type": "inout", "name": "BR5", "value": "60"}, {"type": "inout", "name": "BR6", "value": "56"}, {"type": "inout", "name": "BR7", "value": "48"}, {"type": "inout", "name": "BR8", "value": "47"}, {"type": "inout", "name": "BR9", "value": "45"}, {"type": "inout", "name": "BR10", "value": "44"}, {"type": "input", "name": "CLK", "value": "21"}, {"type": "input", "name": "RES", "value": "66"}, {"type": "output", "name": "DONE", "value": "65"}, {"type": "output", "name": "SS", "value": "71"}, {"type": "input", "name": "MISO", "value": "67"}, {"type": "output", "name": "MOSI", "value": "68"}, {"type": "output", "name": "SCK", "value": "70"}, {"type": "output", "name": "DCD", "value": "1"}, {"type": "output", "name": "DSR", "value": "2"}, {"type": "input", "name": "DTR", "value": "3"}, {"type": "output", "name": "CTS", "value": "4"}, {"type": "input", "name": "RTS", "value": "7"}, {"type": "output", "name": "TX", "value": "8"}, {"type": "input", "name": "RX", "value": "9"}] \ No newline at end of file diff --git a/app/resources/boards/icestick/pinout.pcf b/app/resources/boards/icestick/pinout.pcf index 91bd8ad66..2b5eb6ea7 100644 --- a/app/resources/boards/icestick/pinout.pcf +++ b/app/resources/boards/icestick/pinout.pcf @@ -137,6 +137,6 @@ set_io --warn-no-port DCD 1 # output set_io --warn-no-port DSR 2 # output set_io --warn-no-port DTR 3 # input set_io --warn-no-port CTS 4 # output -set_io --warn-no-port RTS 7 # output +set_io --warn-no-port RTS 7 # input set_io --warn-no-port TX 8 # output set_io --warn-no-port RX 9 # input diff --git a/app/resources/boards/icezum/pinout.json b/app/resources/boards/icezum/pinout.json index d8d9f691a..128f17211 100644 --- a/app/resources/boards/icezum/pinout.json +++ b/app/resources/boards/icezum/pinout.json @@ -1 +1 @@ -[{"type": "output", "name": "LED0", "value": "95"}, {"type": "output", "name": "LED1", "value": "96"}, {"type": "output", "name": "LED2", "value": "97"}, {"type": "output", "name": "LED3", "value": "98"}, {"type": "output", "name": "LED4", "value": "99"}, {"type": "output", "name": "LED5", "value": "101"}, {"type": "output", "name": "LED6", "value": "102"}, {"type": "output", "name": "LED7", "value": "104"}, {"type": "input", "name": "SW1", "value": "10"}, {"type": "input", "name": "SW2", "value": "11"}, {"type": "inout", "name": "D13", "value": "144"}, {"type": "inout", "name": "D12", "value": "143"}, {"type": "inout", "name": "D11", "value": "142"}, {"type": "inout", "name": "D10", "value": "141"}, {"type": "inout", "name": "D9", "value": "139"}, {"type": "inout", "name": "D8", "value": "138"}, {"type": "inout", "name": "D7", "value": "112"}, {"type": "inout", "name": "D6", "value": "113"}, {"type": "inout", "name": "D5", "value": "114"}, {"type": "inout", "name": "D4", "value": "115"}, {"type": "inout", "name": "D3", "value": "116"}, {"type": "inout", "name": "D2", "value": "117"}, {"type": "inout", "name": "D1", "value": "118"}, {"type": "inout", "name": "D0", "value": "119"}, {"type": "inout", "name": "DD0", "value": "78"}, {"type": "inout", "name": "DD1", "value": "79"}, {"type": "inout", "name": "DD2", "value": "80"}, {"type": "inout", "name": "DD3", "value": "81"}, {"type": "inout", "name": "DD4", "value": "88"}, {"type": "inout", "name": "DD5", "value": "87"}, {"type": "inout", "name": "GP0", "value": "37"}, {"type": "inout", "name": "GP1", "value": "38"}, {"type": "inout", "name": "GP2", "value": "39"}, {"type": "inout", "name": "GP3", "value": "41"}, {"type": "inout", "name": "GP4", "value": "42"}, {"type": "inout", "name": "GP5", "value": "43"}, {"type": "inout", "name": "GP6", "value": "49"}, {"type": "inout", "name": "GP7", "value": "50"}, {"type": "output", "name": "ADC_SCL", "value": "91"}, {"type": "inout", "name": "ADC_SDA", "value": "90"}, {"type": "input", "name": "ADC_INT", "value": "93"}, {"type": "input", "name": "CLK", "value": "21"}, {"type": "input", "name": "RES", "value": "66"}, {"type": "output", "name": "DONE", "value": "65"}, {"type": "output", "name": "SS", "value": "71"}, {"type": "input", "name": "MISO", "value": "67"}, {"type": "output", "name": "MOSI", "value": "68"}, {"type": "output", "name": "SCK", "value": "70"}, {"type": "output", "name": "DCD", "value": "1"}, {"type": "output", "name": "DSR", "value": "2"}, {"type": "input", "name": "DTR", "value": "3"}, {"type": "output", "name": "CTS", "value": "4"}, {"type": "output", "name": "RTS", "value": "7"}, {"type": "output", "name": "TX", "value": "8"}, {"type": "input", "name": "RX", "value": "9"}] \ No newline at end of file +[{"type": "output", "name": "LED0", "value": "95"}, {"type": "output", "name": "LED1", "value": "96"}, {"type": "output", "name": "LED2", "value": "97"}, {"type": "output", "name": "LED3", "value": "98"}, {"type": "output", "name": "LED4", "value": "99"}, {"type": "output", "name": "LED5", "value": "101"}, {"type": "output", "name": "LED6", "value": "102"}, {"type": "output", "name": "LED7", "value": "104"}, {"type": "input", "name": "SW1", "value": "10"}, {"type": "input", "name": "SW2", "value": "11"}, {"type": "inout", "name": "D13", "value": "144"}, {"type": "inout", "name": "D12", "value": "143"}, {"type": "inout", "name": "D11", "value": "142"}, {"type": "inout", "name": "D10", "value": "141"}, {"type": "inout", "name": "D9", "value": "139"}, {"type": "inout", "name": "D8", "value": "138"}, {"type": "inout", "name": "D7", "value": "112"}, {"type": "inout", "name": "D6", "value": "113"}, {"type": "inout", "name": "D5", "value": "114"}, {"type": "inout", "name": "D4", "value": "115"}, {"type": "inout", "name": "D3", "value": "116"}, {"type": "inout", "name": "D2", "value": "117"}, {"type": "inout", "name": "D1", "value": "118"}, {"type": "inout", "name": "D0", "value": "119"}, {"type": "inout", "name": "DD0", "value": "78"}, {"type": "inout", "name": "DD1", "value": "79"}, {"type": "inout", "name": "DD2", "value": "80"}, {"type": "inout", "name": "DD3", "value": "81"}, {"type": "inout", "name": "DD4", "value": "88"}, {"type": "inout", "name": "DD5", "value": "87"}, {"type": "inout", "name": "GP0", "value": "37"}, {"type": "inout", "name": "GP1", "value": "38"}, {"type": "inout", "name": "GP2", "value": "39"}, {"type": "inout", "name": "GP3", "value": "41"}, {"type": "inout", "name": "GP4", "value": "42"}, {"type": "inout", "name": "GP5", "value": "43"}, {"type": "inout", "name": "GP6", "value": "49"}, {"type": "inout", "name": "GP7", "value": "50"}, {"type": "output", "name": "ADC_SCL", "value": "91"}, {"type": "inout", "name": "ADC_SDA", "value": "90"}, {"type": "input", "name": "ADC_INT", "value": "93"}, {"type": "input", "name": "CLK", "value": "21"}, {"type": "input", "name": "RES", "value": "66"}, {"type": "output", "name": "DONE", "value": "65"}, {"type": "output", "name": "SS", "value": "71"}, {"type": "input", "name": "MISO", "value": "67"}, {"type": "output", "name": "MOSI", "value": "68"}, {"type": "output", "name": "SCK", "value": "70"}, {"type": "output", "name": "DCD", "value": "1"}, {"type": "output", "name": "DSR", "value": "2"}, {"type": "input", "name": "DTR", "value": "3"}, {"type": "output", "name": "CTS", "value": "4"}, {"type": "input", "name": "RTS", "value": "7"}, {"type": "output", "name": "TX", "value": "8"}, {"type": "input", "name": "RX", "value": "9"}] \ No newline at end of file diff --git a/app/resources/boards/icezum/pinout.pcf b/app/resources/boards/icezum/pinout.pcf index a18a06d8d..d33f32193 100644 --- a/app/resources/boards/icezum/pinout.pcf +++ b/app/resources/boards/icezum/pinout.pcf @@ -106,6 +106,6 @@ set_io --warn-no-port DCD 1 # output set_io --warn-no-port DSR 2 # output set_io --warn-no-port DTR 3 # input set_io --warn-no-port CTS 4 # output -set_io --warn-no-port RTS 7 # output +set_io --warn-no-port RTS 7 # input set_io --warn-no-port TX 8 # output set_io --warn-no-port RX 9 # input diff --git a/app/resources/boards/kefir/info.json b/app/resources/boards/kefir/info.json index 93c16bcc9..0e521f54f 100644 --- a/app/resources/boards/kefir/info.json +++ b/app/resources/boards/kefir/info.json @@ -1,4 +1,4 @@ { - "label": "Kéfir I", + "label": "Kéfir I iCE40-HX4K", "datasheet": "http://fpgalibre.sourceforge.net/Kefir/" } diff --git a/app/resources/collection/blocks/bit/0.ice b/app/resources/collection/blocks/bit/0.ice deleted file mode 100644 index e8fa3794f..000000000 --- a/app/resources/collection/blocks/bit/0.ice +++ /dev/null @@ -1,76 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "Bit 0", - "version": "1.0.0", - "description": "Assign 0 to the output wire", - "author": "Jesús Arroyo", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%2247.303%22%20height=%2227.648%22%20viewBox=%220%200%2044.346456%2025.919999%22%3E%3Ctext%20style=%22line-height:125%25%22%20x=%22325.37%22%20y=%22315.373%22%20font-weight=%22400%22%20font-size=%2212.669%22%20font-family=%22sans-serif%22%20letter-spacing=%220%22%20word-spacing=%220%22%20transform=%22translate(-307.01%20-298.51)%22%3E%3Ctspan%20x=%22325.37%22%20y=%22315.373%22%20style=%22-inkscape-font-specification:'Courier%2010%20Pitch'%22%20font-family=%22Courier%2010%20Pitch%22%3E0%3C/tspan%3E%3C/text%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "b959fb96-ac67-4aea-90b3-ed35a4c17bf5", - "type": "basic.code", - "data": { - "code": "// Bit 0\n\nassign v = 1'b0;", - "params": [], - "ports": { - "in": [], - "out": [ - { - "name": "v" - } - ] - } - }, - "position": { - "x": 96, - "y": 96 - } - }, - { - "id": "19c8f68d-5022-487f-9ab0-f0a3cd58bead", - "type": "basic.output", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 608, - "y": 192 - } - } - ], - "wires": [ - { - "source": { - "block": "b959fb96-ac67-4aea-90b3-ed35a4c17bf5", - "port": "v" - }, - "target": { - "block": "19c8f68d-5022-487f-9ab0-f0a3cd58bead", - "port": "in" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": {} -} \ No newline at end of file diff --git a/app/resources/collection/blocks/bit/1.ice b/app/resources/collection/blocks/bit/1.ice deleted file mode 100644 index 91ec7a7da..000000000 --- a/app/resources/collection/blocks/bit/1.ice +++ /dev/null @@ -1,76 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "Bit 1", - "version": "1.0.0", - "description": "Assign 1 to the output wire", - "author": "Jesús Arroyo", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%2247.303%22%20height=%2227.648%22%20viewBox=%220%200%2044.346456%2025.919999%22%3E%3Ctext%20style=%22line-height:125%25%22%20x=%22325.218%22%20y=%22315.455%22%20font-weight=%22400%22%20font-size=%2212.669%22%20font-family=%22sans-serif%22%20letter-spacing=%220%22%20word-spacing=%220%22%20transform=%22translate(-307.01%20-298.51)%22%3E%3Ctspan%20x=%22325.218%22%20y=%22315.455%22%20style=%22-inkscape-font-specification:'Courier%2010%20Pitch'%22%20font-family=%22Courier%2010%20Pitch%22%3E1%3C/tspan%3E%3C/text%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "b959fb96-ac67-4aea-90b3-ed35a4c17bf5", - "type": "basic.code", - "data": { - "code": "// Bit 1\n\nassign v = 1'b1;", - "params": [], - "ports": { - "in": [], - "out": [ - { - "name": "v" - } - ] - } - }, - "position": { - "x": 96, - "y": 96 - } - }, - { - "id": "19c8f68d-5022-487f-9ab0-f0a3cd58bead", - "type": "basic.output", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 608, - "y": 192 - } - } - ], - "wires": [ - { - "source": { - "block": "b959fb96-ac67-4aea-90b3-ed35a4c17bf5", - "port": "v" - }, - "target": { - "block": "19c8f68d-5022-487f-9ab0-f0a3cd58bead", - "port": "in" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": {} -} \ No newline at end of file diff --git a/app/resources/collection/blocks/config/pull_up.ice b/app/resources/collection/blocks/config/pull_up.ice deleted file mode 100644 index 9a9ce030f..000000000 --- a/app/resources/collection/blocks/config/pull_up.ice +++ /dev/null @@ -1,111 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "Pull up", - "version": "1.0.0", - "description": "FPGA internal pull up configuration on the connected input port", - "author": "Juan González", - "image": "%3Csvg%20id=%22svg2%22%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%22-265%20401.5%2063.5%2038.4%22%3E%3Cstyle%3E.st0%7Bdisplay:none%7D.st1%7Bfill:none;stroke:#000;stroke-width:.75;stroke-linejoin:round;stroke-miterlimit:10%7D.st2%7Bfill:#010002%7D%3C/style%3E%3Cpath%20class=%22st0%22%20d=%22M-242.5%20411.8v11.8h-5.4v-11.8h5.4m1-1h-7.4v13.8h7.4v-13.8z%22/%3E%3Cpath%20d=%22M-212%20425.6l-15.4-8.7v8.5h-17.4v-2.7c0-.2-.1-.4-.3-.4l-2.3-1.2%205.6-2.9c.2-.1.3-.3.3-.5s-.1-.4-.3-.4l-5.7-2.7%202.4-1.6c.1-.1.2-.2.2-.4v-2.7h3.1l-3.5-6.1-3.5%206.1h3v2.5l-2.9%202c-.1.1-.2.3-.2.5s.1.3.3.4l5.6%202.6-5.6%202.9c-.2.1-.3.3-.3.4s.1.4.3.4l2.9%201.5V425.5H-265v1.2h37.6v8.5l15.4-8.7h10.5v-.8H-212zm-33.3-20.4l2.2%203.9h-4.5l2.3-3.9zm19.2%2027.7v-13.8l12.3%206.9-12.3%206.9z%22/%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "config": "true", - "pullup": "true", - "graph": { - "blocks": [ - { - "id": "2b245a71-2d80-466b-955f-e3d61839fe25", - "type": "basic.code", - "data": { - "code": "// Pull up\n\nwire din, dout, outen;\n\nassign o = din;\n\nSB_IO #(\n .PIN_TYPE(6'b 1010_01),\n .PULLUP(1'b 1)\n) io_pin (\n .PACKAGE_PIN(i),\n .OUTPUT_ENABLE(outen),\n .D_OUT_0(dout),\n .D_IN_0(din)\n);", - "params": [], - "ports": { - "in": [ - { - "name": "i" - } - ], - "out": [ - { - "name": "o" - } - ] - } - }, - "position": { - "x": 256, - "y": 104 - } - }, - { - "id": "bb4a1ca9-1b30-471e-92ca-ca7ff2fc1150", - "type": "basic.input", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 64, - "y": 200 - } - }, - { - "id": "a139fa0d-9b45-4480-a251-f4a66b49aa23", - "type": "basic.output", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 760, - "y": 200 - } - } - ], - "wires": [ - { - "source": { - "block": "bb4a1ca9-1b30-471e-92ca-ca7ff2fc1150", - "port": "out" - }, - "target": { - "block": "2b245a71-2d80-466b-955f-e3d61839fe25", - "port": "i" - } - }, - { - "source": { - "block": "2b245a71-2d80-466b-955f-e3d61839fe25", - "port": "o" - }, - "target": { - "block": "a139fa0d-9b45-4480-a251-f4a66b49aa23", - "port": "in" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": {} -} diff --git a/app/resources/collection/blocks/config/pull_up_inv.ice b/app/resources/collection/blocks/config/pull_up_inv.ice deleted file mode 100644 index 1871d6862..000000000 --- a/app/resources/collection/blocks/config/pull_up_inv.ice +++ /dev/null @@ -1,111 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "Pull up inv", - "version": "1.0.0", - "description": "FPGA internal pull up configuration on the connected input port plus a logic inverter", - "author": "Juan González", - "image": "%3Csvg%20id=%22svg2%22%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%22-265%20401.5%2063.5%2038.4%22%3E%3Cstyle%3E.st0%7Bdisplay:none%7D.st1%7Bfill:none;stroke:#000;stroke-width:.75;stroke-linejoin:round;stroke-miterlimit:10%7D.st2%7Bfill:#010002%7D%3C/style%3E%3Cpath%20class=%22st0%22%20d=%22M-242.5%20411.8v11.8h-5.4v-11.8h5.4m1-1h-7.4v13.8h7.4v-13.8z%22/%3E%3Cpath%20d=%22M-207.6%20425.4c-.3-.9-1.1-1.6-2.1-1.6-1.1%200-2%20.8-2.2%201.8l-15.4-8.7v8.5h-17.4v-2.7c0-.2-.1-.4-.3-.4l-2.3-1.2%205.6-2.9c.2-.1.3-.3.3-.5s-.1-.4-.3-.4l-5.7-2.7%202.4-1.6c.1-.1.2-.2.2-.4v-2.7h3.1l-3.5-6.1-3.5%206.1h3v2.5l-2.9%202c-.1.1-.2.3-.2.5s.1.3.3.4l5.6%202.6-5.6%202.9c-.2.1-.3.3-.3.4s.1.4.3.4l2.9%201.5V425.5H-265v1.2h37.6v8.5l15.4-8.7c.2%201%201.1%201.8%202.2%201.8%201%200%201.9-.7%202.1-1.6h6.1v-1.2h-6zm-37.7-20.2l2.2%203.9h-4.5l2.3-3.9zm19.2%2027.7v-13.8l12.3%206.9-12.3%206.9zm16.3-5.5c-.8%200-1.4-.6-1.4-1.4%200-.8.6-1.4%201.4-1.4s1.4.6%201.4%201.4c0%20.8-.6%201.4-1.4%201.4z%22/%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "config": "true", - "pullup": "true", - "graph": { - "blocks": [ - { - "id": "2b245a71-2d80-466b-955f-e3d61839fe25", - "type": "basic.code", - "data": { - "code": "// Pull up inv\n\nwire din, dout, outen;\n\nassign o = ~din;\n\nSB_IO #(\n .PIN_TYPE(6'b 1010_01),\n .PULLUP(1'b 1)\n) io_pin (\n .PACKAGE_PIN(i),\n .OUTPUT_ENABLE(outen),\n .D_OUT_0(dout),\n .D_IN_0(din)\n);", - "params": [], - "ports": { - "in": [ - { - "name": "i" - } - ], - "out": [ - { - "name": "o" - } - ] - } - }, - "position": { - "x": 256, - "y": 104 - } - }, - { - "id": "bb4a1ca9-1b30-471e-92ca-ca7ff2fc1150", - "type": "basic.input", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 64, - "y": 200 - } - }, - { - "id": "a139fa0d-9b45-4480-a251-f4a66b49aa23", - "type": "basic.output", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 760, - "y": 200 - } - } - ], - "wires": [ - { - "source": { - "block": "bb4a1ca9-1b30-471e-92ca-ca7ff2fc1150", - "port": "out" - }, - "target": { - "block": "2b245a71-2d80-466b-955f-e3d61839fe25", - "port": "i" - } - }, - { - "source": { - "block": "2b245a71-2d80-466b-955f-e3d61839fe25", - "port": "o" - }, - "target": { - "block": "a139fa0d-9b45-4480-a251-f4a66b49aa23", - "port": "in" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": {} -} diff --git a/app/resources/collection/blocks/config/tri_state.ice b/app/resources/collection/blocks/config/tri_state.ice deleted file mode 100644 index 337e9381e..000000000 --- a/app/resources/collection/blocks/config/tri_state.ice +++ /dev/null @@ -1,174 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "Tri state", - "version": "1.0.0", - "description": "Tri-state logic block", - "author": "Salvador E. Tropea", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%22-265%20401.5%2063.5%2038.4%22%20id=%22svg2%22%3E%3Cstyle%20id=%22style3%22/%3E%3Cpath%20d=%22M-9.78%203.538l-4.214%2024.984-19.53-16.141z%22%20transform=%22matrix(.62422%20-.11476%20.1058%20.67701%20-219.33%20413.046)%22%20id=%22path3008%22%20fill=%22none%22%20stroke=%22#0b0b0b%22%20stroke-width=%221.885%22/%3E%3Cpath%20d=%22M-9.78%203.538l-4.214%2024.984-19.53-16.141z%22%20transform=%22matrix(-.62422%20-.11476%20-.1058%20.67701%20-244.991%20400.53)%22%20id=%22path3008-6%22%20fill=%22none%22%20stroke=%22#0b0b0b%22%20stroke-width=%221.885%22/%3E%3Cpath%20d=%22M40.154%2011.247H63.74%22%20transform=%22translate(-265%20401.5)%22%20id=%22path3800%22%20fill=%22none%22%20stroke=%22#000%22/%3E%3Cpath%20d=%22M25.945%2023.73l-7.364.058V11.305h7.076%22%20transform=%22translate(-265%20401.5)%22%20id=%22path3802%22%20fill=%22none%22%20stroke=%22#000%22/%3E%3Cpath%20d=%22M-265.029%20412.747l18.582.058%22%20id=%22path3804%22%20fill=%22none%22%20stroke=%22#000%22/%3E%3Cpath%20d=%22M.081%2023.919h12.936v7.566h19.037V27.58%22%20transform=%22translate(-265%20401.5)%22%20id=%22path3806%22%20fill=%22none%22%20stroke=%22#000%22/%3E%3Cpath%20d=%22M0%2035.96h49.302V24.162h-9.356%22%20transform=%22translate(-265%20401.5)%22%20id=%22path3812%22%20fill=%22none%22%20stroke=%22#000%22/%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "config": "true", - "graph": { - "blocks": [ - { - "id": "5c8e9a35-33e7-46ef-a0cc-cc27edcc99c0", - "type": "basic.code", - "data": { - "code": " SB_IO #(\n .PIN_TYPE(6'b1010_01),\n .PULLUP(1'b0)\n ) triState (\n .PACKAGE_PIN(pin),\n .OUTPUT_ENABLE(oe),\n .D_OUT_0(din),\n .D_IN_0(dout)\n );", - "params": [], - "ports": { - "in": [ - { - "name": "pin" - }, - { - "name": "oe" - }, - { - "name": "din" - } - ], - "out": [ - { - "name": "dout" - } - ] - } - }, - "position": { - "x": 248, - "y": 32 - } - }, - { - "id": "076fd025-aa42-4f23-ae97-b65aec2298ce", - "type": "basic.input", - "data": { - "name": "pin", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 32, - "y": 40 - } - }, - { - "id": "f96a1baf-fc8b-4c25-b132-12552605743f", - "type": "basic.input", - "data": { - "name": "oe", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 32, - "y": 128 - } - }, - { - "id": "0b2a85b3-b6ac-4e8a-8b16-dd5a195fb058", - "type": "basic.output", - "data": { - "name": "dout", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 760, - "y": 128 - } - }, - { - "id": "04fdb7a7-2740-4ff1-ad26-56407ef5b958", - "type": "basic.input", - "data": { - "name": "din", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 32, - "y": 216 - } - } - ], - "wires": [ - { - "source": { - "block": "076fd025-aa42-4f23-ae97-b65aec2298ce", - "port": "out" - }, - "target": { - "block": "5c8e9a35-33e7-46ef-a0cc-cc27edcc99c0", - "port": "pin" - } - }, - { - "source": { - "block": "f96a1baf-fc8b-4c25-b132-12552605743f", - "port": "out" - }, - "target": { - "block": "5c8e9a35-33e7-46ef-a0cc-cc27edcc99c0", - "port": "oe" - } - }, - { - "source": { - "block": "04fdb7a7-2740-4ff1-ad26-56407ef5b958", - "port": "out" - }, - "target": { - "block": "5c8e9a35-33e7-46ef-a0cc-cc27edcc99c0", - "port": "din" - } - }, - { - "source": { - "block": "5c8e9a35-33e7-46ef-a0cc-cc27edcc99c0", - "port": "dout" - }, - "target": { - "block": "0b2a85b3-b6ac-4e8a-8b16-dd5a195fb058", - "port": "in" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": {} -} diff --git a/app/resources/collection/blocks/logic/combinational/demux_1_2.ice b/app/resources/collection/blocks/logic/combinational/demux_1_2.ice deleted file mode 100644 index bf21af960..000000000 --- a/app/resources/collection/blocks/logic/combinational/demux_1_2.ice +++ /dev/null @@ -1,173 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "Demux 1:2", - "version": "1.0.0", - "description": "Demultiplexer 1:2", - "author": "Carlos Diaz", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%22-252%20400.9%2090%2040%22%3E%3Cpath%20d=%22M-252%20421.9h24v7.3l41%2011.7v-9h25v-2h-25v-18h25v-2h-25v-9l-41%2011.8v7.2h-24v2zm26%205.7v-13.5l37-10.8v35l-37-10.7z%22/%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "c8fdb023-d458-4657-899c-5749a256be09", - "type": "basic.code", - "data": { - "code": "assign {out1,out0} = in0 << sel0;", - "params": [], - "ports": { - "in": [ - { - "name": "in0" - }, - { - "name": "sel0" - } - ], - "out": [ - { - "name": "out0" - }, - { - "name": "out1" - } - ] - } - }, - "position": { - "x": 248, - "y": 88 - } - }, - { - "id": "5fc9a8e9-d463-4c1f-b6a3-185d5cabb406", - "type": "basic.input", - "data": { - "name": "i", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 40, - "y": 120 - } - }, - { - "id": "91e2ff2d-2430-41e5-9d21-bc9ec4082aaa", - "type": "basic.output", - "data": { - "name": "o0", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 760, - "y": 120 - } - }, - { - "id": "75cafe5a-1968-49ed-9e05-70d1bc3fbd0f", - "type": "basic.input", - "data": { - "name": "sel", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 40, - "y": 248 - } - }, - { - "id": "c6dc7002-dfc0-45fd-88e2-b5e5a75231f2", - "type": "basic.output", - "data": { - "name": "o1", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 760, - "y": 248 - } - } - ], - "wires": [ - { - "source": { - "block": "c8fdb023-d458-4657-899c-5749a256be09", - "port": "out1" - }, - "target": { - "block": "c6dc7002-dfc0-45fd-88e2-b5e5a75231f2", - "port": "in" - } - }, - { - "source": { - "block": "c8fdb023-d458-4657-899c-5749a256be09", - "port": "out0" - }, - "target": { - "block": "91e2ff2d-2430-41e5-9d21-bc9ec4082aaa", - "port": "in" - } - }, - { - "source": { - "block": "5fc9a8e9-d463-4c1f-b6a3-185d5cabb406", - "port": "out" - }, - "target": { - "block": "c8fdb023-d458-4657-899c-5749a256be09", - "port": "in0" - } - }, - { - "source": { - "block": "75cafe5a-1968-49ed-9e05-70d1bc3fbd0f", - "port": "out" - }, - "target": { - "block": "c8fdb023-d458-4657-899c-5749a256be09", - "port": "sel0" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": {} -} \ No newline at end of file diff --git a/app/resources/collection/blocks/logic/combinational/demux_1_4.ice b/app/resources/collection/blocks/logic/combinational/demux_1_4.ice deleted file mode 100644 index 48ced9775..000000000 --- a/app/resources/collection/blocks/logic/combinational/demux_1_4.ice +++ /dev/null @@ -1,269 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "Demux 1:4", - "version": "1.0.0", - "description": "Demultiplexer 1:4", - "author": "Carlos Diaz", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%22-252%20400.9%2090%2040%22%3E%3Cpath%20d=%22M-252%20421.9h24v7.3l41%2011.7v-9h25v-2h-25v-18h25v-2h-25v-9l-41%2011.8v7.2h-24v2zm26%205.7v-13.5l37-10.8v35l-37-10.7z%22/%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "91e2ff2d-2430-41e5-9d21-bc9ec4082aaa", - "type": "basic.output", - "data": { - "name": "o0", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 800, - "y": 64 - } - }, - { - "id": "8a50b4e9-884d-49bb-98c3-3cd1e6cb3f4f", - "type": "basic.code", - "data": { - "code": "assign {out3,out2,out1,out0} = in0 << {sel1,sel0};", - "params": [], - "ports": { - "in": [ - { - "name": "in0" - }, - { - "name": "sel0" - }, - { - "name": "sel1" - } - ], - "out": [ - { - "name": "out0" - }, - { - "name": "out1" - }, - { - "name": "out2" - }, - { - "name": "out3" - } - ] - } - }, - "position": { - "x": 248, - "y": 88 - } - }, - { - "id": "5fc9a8e9-d463-4c1f-b6a3-185d5cabb406", - "type": "basic.input", - "data": { - "name": "i", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 56, - "y": 96 - } - }, - { - "id": "c6dc7002-dfc0-45fd-88e2-b5e5a75231f2", - "type": "basic.output", - "data": { - "name": "o1", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 800, - "y": 144 - } - }, - { - "id": "75cafe5a-1968-49ed-9e05-70d1bc3fbd0f", - "type": "basic.input", - "data": { - "name": "sel0", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 56, - "y": 184 - } - }, - { - "id": "5e246f93-51ad-4d6f-83f1-4fcce69c5ae3", - "type": "basic.output", - "data": { - "name": "o2", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 800, - "y": 224 - } - }, - { - "id": "657dab9e-6580-4f02-b54f-66477863f26a", - "type": "basic.input", - "data": { - "name": "sel1", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 56, - "y": 272 - } - }, - { - "id": "b9d764ea-538a-420f-a8d3-45af7a8e30a2", - "type": "basic.output", - "data": { - "name": "o3", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 800, - "y": 304 - } - } - ], - "wires": [ - { - "source": { - "block": "8a50b4e9-884d-49bb-98c3-3cd1e6cb3f4f", - "port": "out0" - }, - "target": { - "block": "91e2ff2d-2430-41e5-9d21-bc9ec4082aaa", - "port": "in" - } - }, - { - "source": { - "block": "8a50b4e9-884d-49bb-98c3-3cd1e6cb3f4f", - "port": "out1" - }, - "target": { - "block": "c6dc7002-dfc0-45fd-88e2-b5e5a75231f2", - "port": "in" - } - }, - { - "source": { - "block": "8a50b4e9-884d-49bb-98c3-3cd1e6cb3f4f", - "port": "out2" - }, - "target": { - "block": "5e246f93-51ad-4d6f-83f1-4fcce69c5ae3", - "port": "in" - } - }, - { - "source": { - "block": "8a50b4e9-884d-49bb-98c3-3cd1e6cb3f4f", - "port": "out3" - }, - "target": { - "block": "b9d764ea-538a-420f-a8d3-45af7a8e30a2", - "port": "in" - } - }, - { - "source": { - "block": "5fc9a8e9-d463-4c1f-b6a3-185d5cabb406", - "port": "out" - }, - "target": { - "block": "8a50b4e9-884d-49bb-98c3-3cd1e6cb3f4f", - "port": "in0" - } - }, - { - "source": { - "block": "75cafe5a-1968-49ed-9e05-70d1bc3fbd0f", - "port": "out" - }, - "target": { - "block": "8a50b4e9-884d-49bb-98c3-3cd1e6cb3f4f", - "port": "sel0" - } - }, - { - "source": { - "block": "657dab9e-6580-4f02-b54f-66477863f26a", - "port": "out" - }, - "target": { - "block": "8a50b4e9-884d-49bb-98c3-3cd1e6cb3f4f", - "port": "sel1" - } - } - ] - }, - "state": { - "pan": { - "x": 11.1761, - "y": 3.2151 - }, - "zoom": 0.9235 - } - }, - "dependencies": {} -} \ No newline at end of file diff --git a/app/resources/collection/blocks/logic/combinational/demux_1_8.ice b/app/resources/collection/blocks/logic/combinational/demux_1_8.ice deleted file mode 100644 index f281e1dc6..000000000 --- a/app/resources/collection/blocks/logic/combinational/demux_1_8.ice +++ /dev/null @@ -1,483 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "Demux 1:8", - "version": "1.0.0", - "description": "Demultiplexer 1:8", - "author": "Carlos Diaz", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%22-252%20400.9%2090%2040%22%3E%3Cpath%20d=%22M-252%20421.9h24v7.3l41%2011.7v-9h25v-2h-25v-18h25v-2h-25v-9l-41%2011.8v7.2h-24v2zm26%205.7v-13.5l37-10.8v35l-37-10.7z%22/%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "91e2ff2d-2430-41e5-9d21-bc9ec4082aaa", - "type": "basic.output", - "data": { - "name": "o0", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 760, - "y": -120 - } - }, - { - "id": "c6dc7002-dfc0-45fd-88e2-b5e5a75231f2", - "type": "basic.output", - "data": { - "name": "o1", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 760, - "y": -40 - } - }, - { - "id": "5e246f93-51ad-4d6f-83f1-4fcce69c5ae3", - "type": "basic.output", - "data": { - "name": "o2", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 760, - "y": 40 - } - }, - { - "id": "5fc9a8e9-d463-4c1f-b6a3-185d5cabb406", - "type": "basic.input", - "data": { - "name": "i", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": -8, - "y": 48 - } - }, - { - "id": "1ea41d18-7010-42c0-932f-99d135efdb73", - "type": "basic.code", - "data": { - "code": "assign {out7,out6,out5,out4,out3,out2,out1,out0} = in0 << {sel2,sel1,sel0};", - "params": [], - "ports": { - "in": [ - { - "name": "in0" - }, - { - "name": "sel0" - }, - { - "name": "sel1" - }, - { - "name": "sel2" - } - ], - "out": [ - { - "name": "out0" - }, - { - "name": "out1" - }, - { - "name": "out2" - }, - { - "name": "out3" - }, - { - "name": "out4" - }, - { - "name": "out5" - }, - { - "name": "out6" - }, - { - "name": "out7" - } - ] - } - }, - "position": { - "x": 184, - "y": 72 - } - }, - { - "id": "b9d764ea-538a-420f-a8d3-45af7a8e30a2", - "type": "basic.output", - "data": { - "name": "o3", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 760, - "y": 120 - } - }, - { - "id": "75cafe5a-1968-49ed-9e05-70d1bc3fbd0f", - "type": "basic.input", - "data": { - "name": "sel0", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": -8, - "y": 128 - } - }, - { - "id": "657dab9e-6580-4f02-b54f-66477863f26a", - "type": "basic.input", - "data": { - "name": "sel1", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": -8, - "y": 208 - } - }, - { - "id": "1b8510ac-d723-4226-bf28-c7329d0f73fb", - "type": "basic.output", - "data": { - "name": "o4", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 760, - "y": 216 - } - }, - { - "id": "e1a156c8-5813-46f6-a4d4-c672857f3396", - "type": "basic.input", - "data": { - "name": "sel2", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": -8, - "y": 288 - } - }, - { - "id": "65f31fca-d607-4d5c-82cc-878a93b8e580", - "type": "basic.output", - "data": { - "name": "o5", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 760, - "y": 312 - } - }, - { - "id": "c8fadd68-77e1-47be-a262-b076e878e6fd", - "type": "basic.output", - "data": { - "name": "o6", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 760, - "y": 392 - } - }, - { - "id": "99ca2a23-7e0d-4c34-9ab1-988c6bf69633", - "type": "basic.output", - "data": { - "name": "o7", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 760, - "y": 472 - } - } - ], - "wires": [ - { - "source": { - "block": "5fc9a8e9-d463-4c1f-b6a3-185d5cabb406", - "port": "out" - }, - "target": { - "block": "1ea41d18-7010-42c0-932f-99d135efdb73", - "port": "in0" - } - }, - { - "source": { - "block": "75cafe5a-1968-49ed-9e05-70d1bc3fbd0f", - "port": "out" - }, - "target": { - "block": "1ea41d18-7010-42c0-932f-99d135efdb73", - "port": "sel0" - } - }, - { - "source": { - "block": "657dab9e-6580-4f02-b54f-66477863f26a", - "port": "out" - }, - "target": { - "block": "1ea41d18-7010-42c0-932f-99d135efdb73", - "port": "sel1" - } - }, - { - "source": { - "block": "e1a156c8-5813-46f6-a4d4-c672857f3396", - "port": "out" - }, - "target": { - "block": "1ea41d18-7010-42c0-932f-99d135efdb73", - "port": "sel2" - } - }, - { - "source": { - "block": "1ea41d18-7010-42c0-932f-99d135efdb73", - "port": "out0" - }, - "target": { - "block": "91e2ff2d-2430-41e5-9d21-bc9ec4082aaa", - "port": "in" - }, - "vertices": [ - { - "x": 640, - "y": -16 - } - ] - }, - { - "source": { - "block": "1ea41d18-7010-42c0-932f-99d135efdb73", - "port": "out7" - }, - "target": { - "block": "99ca2a23-7e0d-4c34-9ab1-988c6bf69633", - "port": "in" - }, - "vertices": [ - { - "x": 640, - "y": 424 - } - ] - }, - { - "source": { - "block": "1ea41d18-7010-42c0-932f-99d135efdb73", - "port": "out1" - }, - "target": { - "block": "c6dc7002-dfc0-45fd-88e2-b5e5a75231f2", - "port": "in" - }, - "vertices": [ - { - "x": 656, - "y": 40 - } - ] - }, - { - "source": { - "block": "1ea41d18-7010-42c0-932f-99d135efdb73", - "port": "out2" - }, - "target": { - "block": "5e246f93-51ad-4d6f-83f1-4fcce69c5ae3", - "port": "in" - }, - "vertices": [ - { - "x": 672, - "y": 120 - } - ] - }, - { - "source": { - "block": "1ea41d18-7010-42c0-932f-99d135efdb73", - "port": "out3" - }, - "target": { - "block": "b9d764ea-538a-420f-a8d3-45af7a8e30a2", - "port": "in" - }, - "vertices": [ - { - "x": 688, - "y": 184 - } - ] - }, - { - "source": { - "block": "1ea41d18-7010-42c0-932f-99d135efdb73", - "port": "out4" - }, - "target": { - "block": "1b8510ac-d723-4226-bf28-c7329d0f73fb", - "port": "in" - } - }, - { - "source": { - "block": "1ea41d18-7010-42c0-932f-99d135efdb73", - "port": "out5" - }, - "target": { - "block": "65f31fca-d607-4d5c-82cc-878a93b8e580", - "port": "in" - }, - "vertices": [ - { - "x": 672, - "y": 296 - } - ] - }, - { - "source": { - "block": "1ea41d18-7010-42c0-932f-99d135efdb73", - "port": "out6" - }, - "target": { - "block": "c8fadd68-77e1-47be-a262-b076e878e6fd", - "port": "in" - }, - "vertices": [ - { - "x": 656, - "y": 328 - }, - { - "x": 656, - "y": 368 - }, - { - "x": 656, - "y": 384 - }, - { - "x": 664, - "y": 424 - } - ] - } - ] - }, - "state": { - "pan": { - "x": 143.764, - "y": 110.7556 - }, - "zoom": 0.7272 - } - }, - "dependencies": {} -} \ No newline at end of file diff --git a/app/resources/collection/blocks/logic/combinational/hex_7seg_ca.ice b/app/resources/collection/blocks/logic/combinational/hex_7seg_ca.ice deleted file mode 100644 index 7576429a8..000000000 --- a/app/resources/collection/blocks/logic/combinational/hex_7seg_ca.ice +++ /dev/null @@ -1,427 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "Hex 7seg CA", - "version": "1.0.0", - "description": "Display de 7 segmentos. Ánodo común", - "author": "Carlos Diaz", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20id=%22Capa_1%22%20viewBox=%220%200%2035.530029%2051.500018%22%20width=%2235.53%22%20height=%2251.5%22%3E%3Cstyle%20id=%22style4204%22%3E.st0%7Bfill:red%7D.st1%7Bfont-family:'FranklinGothic-DemiCond'%7D.st2%7Bfont-size:9.5149px%7D%3C/style%3E%3Cg%20id=%22g4206%22%20transform=%22matrix(.67676%200%200%20.67676%20-11.031%20-3.52)%22%3E%3Cpath%20class=%22st0%22%20id=%22polygon4208%22%20fill=%22red%22%20d=%22M27.7%2020v.1h25.7V20l3-3.2-2.5-2.4H28.2v.1-.1l-3.1%203.3%202.6%202.3z%22/%3E%3Cpath%20class=%22st0%22%20id=%22polygon4210%22%20fill=%22red%22%20d=%22M25.1%2050.4v.1h25.7v-.1l3-3.2-2.6-2.3v-.1H25.5v.1-.1l-3%203.3%202.5%202.3z%22/%3E%3Cpath%20class=%22st0%22%20id=%22polygon4212%22%20fill=%22red%22%20d=%22M48.9%2080.8v.1H23.2v-.1l-3-3.2%202.5-2.3v-.1h25.7v.1l3.1%203.2-2.6%202.4z%22/%3E%3Cpath%20class=%22st0%22%20id=%22polygon4214%22%20fill=%22red%22%20d=%22M19%2044.6l2.3%202.3%203.1-3.2%202-22.8-2.3-2.3-3.3%203.1z%22/%3E%3Cpath%20class=%22st0%22%20id=%22polygon4216%22%20fill=%22red%22%20d=%22M52.7%2043.9l2.3%202.4%203.1-3.2%202-22.8-2.3-2.3-3.3%203.1z%22/%3E%3Cpath%20class=%22st0%22%20id=%22polygon4218%22%20fill=%22red%22%20d=%22M16.3%2075.2l2.2%202.4%203.2-3.2%202-22.8-2.3-2.3-3.3%203.1z%22/%3E%3Cpath%20class=%22st0%22%20id=%22polygon4220%22%20fill=%22red%22%20d=%22M49.9%2074.6l2.3%202.4%203.2-3.2%202-22.8-2.3-2.3-3.4%203.1z%22/%3E%3Ccircle%20class=%22st0%22%20cx=%2265.1%22%20cy=%2277.6%22%20r=%223.7%22%20id=%22circle4222%22%20fill=%22red%22/%3E%3C/g%3E%3Ctext%20class=%22st0%20st1%20st2%22%20id=%22text4224%22%20x=%223.502%22%20y=%223.377%22%20font-size=%223.642%22%20font-family=%22FranklinGothic-DemiCond%22%20fill=%22red%22%3E%3Ctspan%20style=%22-inkscape-font-specification:sans-serif%22%20id=%22tspan4204%22%20font-family=%22sans-serif%22%20font-weight=%22400%22%20font-size=%223.75%22%3EANODO%20COM%C3%9AN%3C/tspan%3E%3C/text%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "8b73e273-3603-443a-b952-0ab9ad826a96", - "type": "basic.output", - "data": { - "name": "a", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 1016, - "y": 368 - } - }, - { - "id": "f2fce5fa-be07-46fe-bee1-bb2a497fe747", - "type": "basic.output", - "data": { - "name": "b", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 1016, - "y": 448 - } - }, - { - "id": "16e44a6a-853a-4264-9e9d-2269827ed136", - "type": "basic.input", - "data": { - "name": "h0", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 312, - "y": 488 - } - }, - { - "id": "1d9b0829-1b10-4495-ae33-08792225f68e", - "type": "basic.code", - "data": { - "code": "// Ánodo común\n// gfe_dcba\nlocalparam BCD_0 = 7'b011_1111,\n BCD_1 = 7'b000_0110,\n BCD_2 = 7'b101_1011,\n BCD_3 = 7'b100_1111,\n BCD_4 = 7'b110_0110,\n BCD_5 = 7'b110_1101,\n BCD_6 = 7'b111_1101,\n BCD_7 = 7'b000_0111,\n BCD_8 = 7'b111_1111,\n BCD_9 = 7'b110_1111,\n BCD_A = 7'b111_0111,\n BCD_B = 7'b111_1100,\n BCD_C = 7'b011_1001,\n BCD_D = 7'b101_1110,\n BCD_E = 7'b111_1001,\n BCD_F = 7'b111_0001;\n\nreg [6:0] _o;\n\nalways @(*)\nbegin\n\n case({h3, h2, h1, h0})\n 4'h0: _o <= BCD_0;\n 4'h1: _o <= BCD_1;\n 4'h2: _o <= BCD_2;\n 4'h3: _o <= BCD_3;\n 4'h4: _o <= BCD_4;\n 4'h5: _o <= BCD_5;\n 4'h6: _o <= BCD_6;\n 4'h7: _o <= BCD_7;\n 4'h8: _o <= BCD_8;\n 4'h9: _o <= BCD_9;\n 4'hA: _o <= BCD_A;\n 4'hB: _o <= BCD_B;\n 4'hC: _o <= BCD_C;\n 4'hD: _o <= BCD_D;\n 4'hE: _o <= BCD_E;\n 4'hF: _o <= BCD_F;\n default: _o <= 0;\n endcase\nend\n\nassign {g, f, e, d, c, b, a} = ~_o;", - "params": [], - "ports": { - "in": [ - { - "name": "h0" - }, - { - "name": "h1" - }, - { - "name": "h2" - }, - { - "name": "h3" - } - ], - "out": [ - { - "name": "a" - }, - { - "name": "b" - }, - { - "name": "c" - }, - { - "name": "d" - }, - { - "name": "e" - }, - { - "name": "f" - }, - { - "name": "g" - } - ] - } - }, - "position": { - "x": 496, - "y": 512 - } - }, - { - "id": "bf0ea22e-3ac2-4756-87d5-020a6ea6a1a8", - "type": "basic.output", - "data": { - "name": "c", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 1016, - "y": 528 - } - }, - { - "id": "9cdbdf9f-f086-4427-9719-e13470658d97", - "type": "basic.input", - "data": { - "name": "h1", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 312, - "y": 568 - } - }, - { - "id": "4687e984-3f19-44d7-baee-ca89513f8f1a", - "type": "basic.output", - "data": { - "name": "d", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 1016, - "y": 608 - } - }, - { - "id": "f40ab7a8-10e5-4e7f-94f9-cefd697d5d40", - "type": "basic.input", - "data": { - "name": "h2", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 312, - "y": 648 - } - }, - { - "id": "1691b072-9102-4986-a900-fefd1a5a7b9e", - "type": "basic.output", - "data": { - "name": "e", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 1016, - "y": 688 - } - }, - { - "id": "2d774807-3ec8-492c-98e2-f1c9da8d68ff", - "type": "basic.input", - "data": { - "name": "h3", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 312, - "y": 728 - } - }, - { - "id": "7c14afe7-1ac0-4394-b38e-fa8a00ffa21c", - "type": "basic.output", - "data": { - "name": "f", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 1016, - "y": 768 - } - }, - { - "id": "2565c42b-00b0-4b1d-92a4-66c715834b33", - "type": "basic.output", - "data": { - "name": "g", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 1016, - "y": 840 - } - } - ], - "wires": [ - { - "source": { - "block": "16e44a6a-853a-4264-9e9d-2269827ed136", - "port": "out" - }, - "target": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "h0" - } - }, - { - "source": { - "block": "9cdbdf9f-f086-4427-9719-e13470658d97", - "port": "out" - }, - "target": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "h1" - } - }, - { - "source": { - "block": "f40ab7a8-10e5-4e7f-94f9-cefd697d5d40", - "port": "out" - }, - "target": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "h2" - } - }, - { - "source": { - "block": "2d774807-3ec8-492c-98e2-f1c9da8d68ff", - "port": "out" - }, - "target": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "h3" - } - }, - { - "source": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "d" - }, - "target": { - "block": "4687e984-3f19-44d7-baee-ca89513f8f1a", - "port": "in" - } - }, - { - "source": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "c" - }, - "target": { - "block": "bf0ea22e-3ac2-4756-87d5-020a6ea6a1a8", - "port": "in" - } - }, - { - "source": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "b" - }, - "target": { - "block": "f2fce5fa-be07-46fe-bee1-bb2a497fe747", - "port": "in" - }, - "vertices": [ - { - "x": 952, - "y": 504 - } - ] - }, - { - "source": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "a" - }, - "target": { - "block": "8b73e273-3603-443a-b952-0ab9ad826a96", - "port": "in" - }, - "vertices": [ - { - "x": 928, - "y": 440 - } - ] - }, - { - "source": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "e" - }, - "target": { - "block": "1691b072-9102-4986-a900-fefd1a5a7b9e", - "port": "in" - }, - "vertices": [ - { - "x": 976, - "y": 704 - } - ] - }, - { - "source": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "f" - }, - "target": { - "block": "7c14afe7-1ac0-4394-b38e-fa8a00ffa21c", - "port": "in" - }, - "vertices": [ - { - "x": 952, - "y": 752 - } - ] - }, - { - "source": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "g" - }, - "target": { - "block": "2565c42b-00b0-4b1d-92a4-66c715834b33", - "port": "in" - }, - "vertices": [ - { - "x": 928, - "y": 824 - } - ] - } - ] - }, - "state": { - "pan": { - "x": -152.0732, - "y": -209.2108 - }, - "zoom": 0.7374 - } - }, - "dependencies": {} -} \ No newline at end of file diff --git a/app/resources/collection/blocks/logic/combinational/hex_7seg_cc.ice b/app/resources/collection/blocks/logic/combinational/hex_7seg_cc.ice deleted file mode 100644 index fb9b3d09f..000000000 --- a/app/resources/collection/blocks/logic/combinational/hex_7seg_cc.ice +++ /dev/null @@ -1,421 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "Hex 7seg CC", - "version": "1.0.0", - "description": "Display de 7 segmentos. Cátodo común", - "author": "Carlos Diaz", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20id=%22Capa_1%22%20viewBox=%220%200%2035.530029%2051.500018%22%20width=%2235.53%22%20height=%2251.5%22%3E%3Cstyle%20id=%22style4204%22%3E.st0%7Bfill:red%7D.st1%7Bfont-family:'FranklinGothic-DemiCond'%7D.st2%7Bfont-size:9.5149px%7D%3C/style%3E%3Cg%20id=%22g4206%22%20transform=%22matrix(.67676%200%200%20.67676%20-11.031%20-3.52)%22%3E%3Cpath%20class=%22st0%22%20id=%22polygon4208%22%20fill=%22red%22%20d=%22M27.7%2020v.1h25.7V20l3-3.2-2.5-2.4H28.2v.1-.1l-3.1%203.3%202.6%202.3z%22/%3E%3Cpath%20class=%22st0%22%20id=%22polygon4210%22%20fill=%22red%22%20d=%22M25.1%2050.4v.1h25.7v-.1l3-3.2-2.6-2.3v-.1H25.5v.1-.1l-3%203.3%202.5%202.3z%22/%3E%3Cpath%20class=%22st0%22%20id=%22polygon4212%22%20fill=%22red%22%20d=%22M48.9%2080.8v.1H23.2v-.1l-3-3.2%202.5-2.3v-.1h25.7v.1l3.1%203.2-2.6%202.4z%22/%3E%3Cpath%20class=%22st0%22%20id=%22polygon4214%22%20fill=%22red%22%20d=%22M19%2044.6l2.3%202.3%203.1-3.2%202-22.8-2.3-2.3-3.3%203.1z%22/%3E%3Cpath%20class=%22st0%22%20id=%22polygon4216%22%20fill=%22red%22%20d=%22M52.7%2043.9l2.3%202.4%203.1-3.2%202-22.8-2.3-2.3-3.3%203.1z%22/%3E%3Cpath%20class=%22st0%22%20id=%22polygon4218%22%20fill=%22red%22%20d=%22M16.3%2075.2l2.2%202.4%203.2-3.2%202-22.8-2.3-2.3-3.3%203.1z%22/%3E%3Cpath%20class=%22st0%22%20id=%22polygon4220%22%20fill=%22red%22%20d=%22M49.9%2074.6l2.3%202.4%203.2-3.2%202-22.8-2.3-2.3-3.4%203.1z%22/%3E%3Ccircle%20class=%22st0%22%20cx=%2265.1%22%20cy=%2277.6%22%20r=%223.7%22%20id=%22circle4222%22%20fill=%22red%22/%3E%3C/g%3E%3Ctext%20class=%22st0%20st1%20st2%22%20id=%22text4224%22%20x=%222.532%22%20y=%223.377%22%20style=%22-inkscape-font-specification:sans-serif%22%20font-size=%223.642%22%20font-family=%22sans-serif%22%20fill=%22red%22%20font-weight=%22400%22%3E%3Ctspan%20id=%22tspan4814%22%20font-size=%223.75%22%3ECATODO%20COM%C3%9AN%3C/tspan%3E%3C/text%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "8b73e273-3603-443a-b952-0ab9ad826a96", - "type": "basic.output", - "data": { - "name": "a", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 1016, - "y": 368 - } - }, - { - "id": "f2fce5fa-be07-46fe-bee1-bb2a497fe747", - "type": "basic.output", - "data": { - "name": "b", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 1016, - "y": 448 - } - }, - { - "id": "16e44a6a-853a-4264-9e9d-2269827ed136", - "type": "basic.input", - "data": { - "name": "h0", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 312, - "y": 488 - } - }, - { - "id": "1d9b0829-1b10-4495-ae33-08792225f68e", - "type": "basic.code", - "data": { - "code": "// Catodo común\n// gfe_dcba\nlocalparam BCD_0 = 7'b011_1111,\n BCD_1 = 7'b000_0110,\n BCD_2 = 7'b101_1011,\n BCD_3 = 7'b100_1111,\n BCD_4 = 7'b110_0110,\n BCD_5 = 7'b110_1101,\n BCD_6 = 7'b111_1101,\n BCD_7 = 7'b000_0111,\n BCD_8 = 7'b111_1111,\n BCD_9 = 7'b110_1111,\n BCD_A = 7'b111_0111,\n BCD_B = 7'b111_1100,\n BCD_C = 7'b011_1001,\n BCD_D = 7'b101_1110,\n BCD_E = 7'b111_1001,\n BCD_F = 7'b111_0001;\n\nreg [6:0] _o;\n\nalways @(*)\nbegin\n\n case({h3, h2, h1, h0})\n 4'h0: _o <= BCD_0;\n 4'h1: _o <= BCD_1;\n 4'h2: _o <= BCD_2;\n 4'h3: _o <= BCD_3;\n 4'h4: _o <= BCD_4;\n 4'h5: _o <= BCD_5;\n 4'h6: _o <= BCD_6;\n 4'h7: _o <= BCD_7;\n 4'h8: _o <= BCD_8;\n 4'h9: _o <= BCD_9;\n 4'hA: _o <= BCD_A;\n 4'hB: _o <= BCD_B;\n 4'hC: _o <= BCD_C;\n 4'hD: _o <= BCD_D;\n 4'hE: _o <= BCD_E;\n 4'hF: _o <= BCD_F;\n default: _o <= 0;\n endcase\nend\n\nassign {g, f, e, d, c, b, a} = _o;", - "params": [], - "ports": { - "in": [ - { - "name": "h0" - }, - { - "name": "h1" - }, - { - "name": "h2" - }, - { - "name": "h3" - } - ], - "out": [ - { - "name": "a" - }, - { - "name": "b" - }, - { - "name": "c" - }, - { - "name": "d" - }, - { - "name": "e" - }, - { - "name": "f" - }, - { - "name": "g" - } - ] - } - }, - "position": { - "x": 496, - "y": 512 - } - }, - { - "id": "bf0ea22e-3ac2-4756-87d5-020a6ea6a1a8", - "type": "basic.output", - "data": { - "name": "c", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 1016, - "y": 528 - } - }, - { - "id": "9cdbdf9f-f086-4427-9719-e13470658d97", - "type": "basic.input", - "data": { - "name": "h1", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 312, - "y": 568 - } - }, - { - "id": "4687e984-3f19-44d7-baee-ca89513f8f1a", - "type": "basic.output", - "data": { - "name": "d", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 1016, - "y": 608 - } - }, - { - "id": "f40ab7a8-10e5-4e7f-94f9-cefd697d5d40", - "type": "basic.input", - "data": { - "name": "h2", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 312, - "y": 648 - } - }, - { - "id": "1691b072-9102-4986-a900-fefd1a5a7b9e", - "type": "basic.output", - "data": { - "name": "e", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 1016, - "y": 688 - } - }, - { - "id": "2d774807-3ec8-492c-98e2-f1c9da8d68ff", - "type": "basic.input", - "data": { - "name": "h3", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 312, - "y": 728 - } - }, - { - "id": "7c14afe7-1ac0-4394-b38e-fa8a00ffa21c", - "type": "basic.output", - "data": { - "name": "f", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 1016, - "y": 768 - } - }, - { - "id": "2565c42b-00b0-4b1d-92a4-66c715834b33", - "type": "basic.output", - "data": { - "name": "g", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 1016, - "y": 840 - } - } - ], - "wires": [ - { - "source": { - "block": "16e44a6a-853a-4264-9e9d-2269827ed136", - "port": "out" - }, - "target": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "h0" - } - }, - { - "source": { - "block": "9cdbdf9f-f086-4427-9719-e13470658d97", - "port": "out" - }, - "target": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "h1" - } - }, - { - "source": { - "block": "f40ab7a8-10e5-4e7f-94f9-cefd697d5d40", - "port": "out" - }, - "target": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "h2" - } - }, - { - "source": { - "block": "2d774807-3ec8-492c-98e2-f1c9da8d68ff", - "port": "out" - }, - "target": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "h3" - } - }, - { - "source": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "d" - }, - "target": { - "block": "4687e984-3f19-44d7-baee-ca89513f8f1a", - "port": "in" - } - }, - { - "source": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "c" - }, - "target": { - "block": "bf0ea22e-3ac2-4756-87d5-020a6ea6a1a8", - "port": "in" - } - }, - { - "source": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "b" - }, - "target": { - "block": "f2fce5fa-be07-46fe-bee1-bb2a497fe747", - "port": "in" - }, - "vertices": [ - { - "x": 952, - "y": 528 - } - ] - }, - { - "source": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "a" - }, - "target": { - "block": "8b73e273-3603-443a-b952-0ab9ad826a96", - "port": "in" - }, - "vertices": [ - { - "x": 928, - "y": 448 - } - ] - }, - { - "source": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "e" - }, - "target": { - "block": "1691b072-9102-4986-a900-fefd1a5a7b9e", - "port": "in" - } - }, - { - "source": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "f" - }, - "target": { - "block": "7c14afe7-1ac0-4394-b38e-fa8a00ffa21c", - "port": "in" - }, - "vertices": [ - { - "x": 952, - "y": 776 - } - ] - }, - { - "source": { - "block": "1d9b0829-1b10-4495-ae33-08792225f68e", - "port": "g" - }, - "target": { - "block": "2565c42b-00b0-4b1d-92a4-66c715834b33", - "port": "in" - }, - "vertices": [ - { - "x": 928, - "y": 824 - } - ] - } - ] - }, - "state": { - "pan": { - "x": -152.0732, - "y": -209.2108 - }, - "zoom": 0.7374 - } - }, - "dependencies": {} -} \ No newline at end of file diff --git a/app/resources/collection/blocks/logic/combinational/mux_2_1.ice b/app/resources/collection/blocks/logic/combinational/mux_2_1.ice deleted file mode 100644 index aa5bc7ae2..000000000 --- a/app/resources/collection/blocks/logic/combinational/mux_2_1.ice +++ /dev/null @@ -1,173 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "Mux 2:1", - "version": "1.0.0", - "description": "Multiplexer 2:1", - "author": "Carlos Diaz", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%22-252%20400.9%2090%2040%22%3E%3Cpath%20d=%22M-162%20419.9h-24v-7.2l-41-11.8v9h-25v2h25v18h-25v2h25v9l41-11.7v-7.4h24v-1.9zm-63%2018.5v-35l37%2010.8v13.5l-37%2010.7z%22/%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "ba573190-2ead-411a-a323-1b15a22d46db", - "type": "basic.code", - "data": { - "code": "reg _o;\n\nalways @(*) begin\n case(sel0)\n 0: _o = in0;\n 1: _o = in1;\n default: _o = in0;\n endcase\nend\n\nassign o = _o;", - "params": [], - "ports": { - "in": [ - { - "name": "in0" - }, - { - "name": "in1" - }, - { - "name": "sel0" - } - ], - "out": [ - { - "name": "o" - } - ] - } - }, - "position": { - "x": 312, - "y": 112 - } - }, - { - "id": "c3f73f68-1074-4355-b69f-6a20f7bea3e7", - "type": "basic.input", - "data": { - "name": "i0", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 80, - "y": 120 - } - }, - { - "id": "5fb29465-2ee7-45bb-afa4-9a3de895c774", - "type": "basic.input", - "data": { - "name": "i1", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 80, - "y": 208 - } - }, - { - "id": "061aa997-2f30-4591-8841-fb6abf5c3b2e", - "type": "basic.output", - "data": { - "name": "o", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 792, - "y": 208 - } - }, - { - "id": "67ed5e09-486d-4f97-929f-aefea9c43951", - "type": "basic.input", - "data": { - "name": "sel", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 80, - "y": 296 - } - } - ], - "wires": [ - { - "source": { - "block": "ba573190-2ead-411a-a323-1b15a22d46db", - "port": "o" - }, - "target": { - "block": "061aa997-2f30-4591-8841-fb6abf5c3b2e", - "port": "in" - } - }, - { - "source": { - "block": "c3f73f68-1074-4355-b69f-6a20f7bea3e7", - "port": "out" - }, - "target": { - "block": "ba573190-2ead-411a-a323-1b15a22d46db", - "port": "in0" - } - }, - { - "source": { - "block": "5fb29465-2ee7-45bb-afa4-9a3de895c774", - "port": "out" - }, - "target": { - "block": "ba573190-2ead-411a-a323-1b15a22d46db", - "port": "in1" - } - }, - { - "source": { - "block": "67ed5e09-486d-4f97-929f-aefea9c43951", - "port": "out" - }, - "target": { - "block": "ba573190-2ead-411a-a323-1b15a22d46db", - "port": "sel0" - } - } - ] - }, - "state": { - "pan": { - "x": -21.0375, - "y": 29.4792 - }, - "zoom": 1 - } - }, - "dependencies": {} -} \ No newline at end of file diff --git a/app/resources/collection/blocks/logic/combinational/mux_4_1.ice b/app/resources/collection/blocks/logic/combinational/mux_4_1.ice deleted file mode 100644 index 6b9b53ad6..000000000 --- a/app/resources/collection/blocks/logic/combinational/mux_4_1.ice +++ /dev/null @@ -1,281 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "Mux 4:1", - "version": "1.0.0", - "description": "Multiplexer 4:1", - "author": "Carlos Diaz", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%22-252%20400.9%2090%2040%22%3E%3Cpath%20d=%22M-162%20419.9h-24v-7.2l-41-11.8v9h-25v2h25v18h-25v2h25v9l41-11.7v-7.4h24v-1.9zm-63%2018.5v-35l37%2010.8v13.5l-37%2010.7z%22/%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "c3f73f68-1074-4355-b69f-6a20f7bea3e7", - "type": "basic.input", - "data": { - "name": "i0", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 40, - "y": 32 - } - }, - { - "id": "5fb29465-2ee7-45bb-afa4-9a3de895c774", - "type": "basic.input", - "data": { - "name": "i1", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 40, - "y": 104 - } - }, - { - "id": "e4eb896c-1039-4d73-aeb0-ce34b933f4c3", - "type": "basic.code", - "data": { - "code": "reg _o;\nwire [1:0] _sel;\n\nassign _sel = {sel1, sel0};\n\nalways @(*) begin\n case(_sel)\n 0: _o = in0;\n 1: _o = in1;\n 2: _o = in2;\n 3: _o = in3;\n default: _o = in0;\n endcase\nend\n\nassign o = _o;", - "params": [], - "ports": { - "in": [ - { - "name": "in0" - }, - { - "name": "in1" - }, - { - "name": "in2" - }, - { - "name": "in3" - }, - { - "name": "sel0" - }, - { - "name": "sel1" - } - ], - "out": [ - { - "name": "o" - } - ] - } - }, - "position": { - "x": 296, - "y": 152 - } - }, - { - "id": "67ed5e09-486d-4f97-929f-aefea9c43951", - "type": "basic.input", - "data": { - "name": "i2", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 40, - "y": 184 - } - }, - { - "id": "061aa997-2f30-4591-8841-fb6abf5c3b2e", - "type": "basic.output", - "data": { - "name": "o", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 776, - "y": 248 - } - }, - { - "id": "8be9cded-6d06-4b23-b73c-94c7ff311dbc", - "type": "basic.input", - "data": { - "name": "i3", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 40, - "y": 256 - } - }, - { - "id": "1b7db016-c89a-4f65-b6f0-0f87c851c077", - "type": "basic.input", - "data": { - "name": "sel0", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 40, - "y": 328 - } - }, - { - "id": "a014971e-5470-490b-9058-b4b00f2dd125", - "type": "basic.input", - "data": { - "name": "sel1", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 40, - "y": 400 - } - } - ], - "wires": [ - { - "source": { - "block": "e4eb896c-1039-4d73-aeb0-ce34b933f4c3", - "port": "o" - }, - "target": { - "block": "061aa997-2f30-4591-8841-fb6abf5c3b2e", - "port": "in" - } - }, - { - "source": { - "block": "a014971e-5470-490b-9058-b4b00f2dd125", - "port": "out" - }, - "target": { - "block": "e4eb896c-1039-4d73-aeb0-ce34b933f4c3", - "port": "sel1" - } - }, - { - "source": { - "block": "1b7db016-c89a-4f65-b6f0-0f87c851c077", - "port": "out" - }, - "target": { - "block": "e4eb896c-1039-4d73-aeb0-ce34b933f4c3", - "port": "sel0" - } - }, - { - "source": { - "block": "8be9cded-6d06-4b23-b73c-94c7ff311dbc", - "port": "out" - }, - "target": { - "block": "e4eb896c-1039-4d73-aeb0-ce34b933f4c3", - "port": "in3" - } - }, - { - "source": { - "block": "67ed5e09-486d-4f97-929f-aefea9c43951", - "port": "out" - }, - "target": { - "block": "e4eb896c-1039-4d73-aeb0-ce34b933f4c3", - "port": "in2" - }, - "vertices": [ - { - "x": 192, - "y": 248 - } - ] - }, - { - "source": { - "block": "5fb29465-2ee7-45bb-afa4-9a3de895c774", - "port": "out" - }, - "target": { - "block": "e4eb896c-1039-4d73-aeb0-ce34b933f4c3", - "port": "in1" - }, - "vertices": [ - { - "x": 224, - "y": 168 - } - ] - }, - { - "source": { - "block": "c3f73f68-1074-4355-b69f-6a20f7bea3e7", - "port": "out" - }, - "target": { - "block": "e4eb896c-1039-4d73-aeb0-ce34b933f4c3", - "port": "in0" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": {} -} \ No newline at end of file diff --git a/app/resources/collection/blocks/logic/gate/and.ice b/app/resources/collection/blocks/logic/gate/and.ice deleted file mode 100644 index ebb235e4f..000000000 --- a/app/resources/collection/blocks/logic/gate/and.ice +++ /dev/null @@ -1,141 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "AND", - "version": "1.0.0", - "description": "AND logic gate", - "author": "Jesús Arroyo", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%22-252%20400.9%2090%2040%22%3E%3Cpath%20d=%22M-252%20409.9h26v2h-26zM-252%20429.9h27v2h-27z%22/%3E%3Cpath%20d=%22M-227%20400.9v39.9h20.4c11.3%200%2020-9%2020-20s-8.7-20-20-20H-227zm2.9%202.8h17.6c9.8%200%2016.7%207.6%2016.7%2017.1%200%209.5-7.4%2017.1-17.1%2017.1H-224c-.1.1-.1-34.2-.1-34.2z%22/%3E%3Cpath%20d=%22M-187.911%20419.9H-162v2h-25.911z%22/%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "type": "basic.code", - "data": { - "code": "// AND logic gate\n\nassign c = a & b;", - "params": [], - "ports": { - "in": [ - { - "name": "a" - }, - { - "name": "b" - } - ], - "out": [ - { - "name": "c" - } - ] - } - }, - "position": { - "x": 256, - "y": 48 - } - }, - { - "id": "18c2ebc7-5152-439c-9b3f-851c59bac834", - "type": "basic.input", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 64, - "y": 80 - } - }, - { - "id": "664caf9e-5f40-4df4-800a-b626af702e62", - "type": "basic.output", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 752, - "y": 144 - } - }, - { - "id": "97b51945-d716-4b6c-9db9-970d08541249", - "type": "basic.input", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 64, - "y": 208 - } - } - ], - "wires": [ - { - "source": { - "block": "18c2ebc7-5152-439c-9b3f-851c59bac834", - "port": "out" - }, - "target": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "a" - } - }, - { - "source": { - "block": "97b51945-d716-4b6c-9db9-970d08541249", - "port": "out" - }, - "target": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "b" - } - }, - { - "source": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "c" - }, - "target": { - "block": "664caf9e-5f40-4df4-800a-b626af702e62", - "port": "in" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": {} -} \ No newline at end of file diff --git a/app/resources/collection/blocks/logic/gate/nand.ice b/app/resources/collection/blocks/logic/gate/nand.ice deleted file mode 100644 index 3db99ebb5..000000000 --- a/app/resources/collection/blocks/logic/gate/nand.ice +++ /dev/null @@ -1,141 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "NAND", - "version": "1.0.0", - "description": "NAND logic gate", - "author": "Carlos Diaz", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%22-252%20400.9%2090%2040%22%3E%3Cpath%20d=%22M-252%20409.9h26v2h-26zM-252%20429.9h27v2h-27z%22/%3E%3Cpath%20d=%22M-227%20400.9v39.9h20.4c11.3%200%2020-9%2020-20s-8.7-20-20-20H-227zm2.9%202.8h17.6c9.8%200%2016.7%207.6%2016.7%2017.1%200%209.5-7.4%2017.1-17.1%2017.1H-224c-.1.1-.1-34.2-.1-34.2zM-177.3%20419.9h15.3v2h-15.3z%22/%3E%3Cpath%20d=%22M-181.4%20426.3c-2.9%200-5.3-2.4-5.3-5.3s2.4-5.3%205.3-5.3%205.3%202.4%205.3%205.3-2.4%205.3-5.3%205.3zm0-8.6c-1.8%200-3.3%201.5-3.3%203.3%200%201.8%201.5%203.3%203.3%203.3s3.3-1.5%203.3-3.3c0-1.8-1.5-3.3-3.3-3.3z%22/%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "type": "basic.code", - "data": { - "code": "// NAND logic gate\n\nassign c = ~(a & b);", - "params": [], - "ports": { - "in": [ - { - "name": "a" - }, - { - "name": "b" - } - ], - "out": [ - { - "name": "c" - } - ] - } - }, - "position": { - "x": 256, - "y": 48 - } - }, - { - "id": "18c2ebc7-5152-439c-9b3f-851c59bac834", - "type": "basic.input", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 64, - "y": 80 - } - }, - { - "id": "664caf9e-5f40-4df4-800a-b626af702e62", - "type": "basic.output", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 752, - "y": 144 - } - }, - { - "id": "97b51945-d716-4b6c-9db9-970d08541249", - "type": "basic.input", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 64, - "y": 208 - } - } - ], - "wires": [ - { - "source": { - "block": "18c2ebc7-5152-439c-9b3f-851c59bac834", - "port": "out" - }, - "target": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "a" - } - }, - { - "source": { - "block": "97b51945-d716-4b6c-9db9-970d08541249", - "port": "out" - }, - "target": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "b" - } - }, - { - "source": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "c" - }, - "target": { - "block": "664caf9e-5f40-4df4-800a-b626af702e62", - "port": "in" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": {} -} \ No newline at end of file diff --git a/app/resources/collection/blocks/logic/gate/nor.ice b/app/resources/collection/blocks/logic/gate/nor.ice deleted file mode 100644 index 93768b7ca..000000000 --- a/app/resources/collection/blocks/logic/gate/nor.ice +++ /dev/null @@ -1,141 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "NOR", - "version": "1.0.0", - "description": "NOR logic gate", - "author": "Carlos Diaz", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%22-252%20400.9%2090%2040%22%3E%3Cpath%20d=%22M-252%20409.9h26v2h-26zM-252%20429.9h27v2h-27zM-177.3%20419.9h15.3v2h-15.3z%22/%3E%3Cpath%20d=%22M-181.4%20426.2c-2.9%200-5.3-2.4-5.3-5.3s2.4-5.3%205.3-5.3%205.3%202.4%205.3%205.3-2.4%205.3-5.3%205.3zm0-8.6c-1.8%200-3.3%201.5-3.3%203.3%200%201.8%201.5%203.3%203.3%203.3s3.3-1.5%203.3-3.3c0-1.8-1.5-3.3-3.3-3.3z%22/%3E%3Cpath%20d=%22M-185.3%20422.6l-.3-2.1.4-1.6c-10.3-17.8-26-18-30.6-18H-233l2%202.4s5.7%207%205.7%2017.6c0%2010.6-5.7%2017.6-5.7%2017.6l-2%202.4h17.2c2.4%200%207.7%200%2013.6-2.4%205.7-2.3%2012-6.9%2017-15.7l-.1-.2zm-18.2%2013.1c-5.4%202.2-9.8%202.2-12.3%202.2H-227c1.9-3.1%204.8-9%204.8-17s-2.9-13.9-4.8-17h11.3c4.7%200%2018.3-.1%2028%2017-4.8%208.4-10.6%2012.7-15.8%2014.8z%22/%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "type": "basic.code", - "data": { - "code": "// NOR logic gate\n\nassign c = ~(a | b);", - "params": [], - "ports": { - "in": [ - { - "name": "a" - }, - { - "name": "b" - } - ], - "out": [ - { - "name": "c" - } - ] - } - }, - "position": { - "x": 256, - "y": 48 - } - }, - { - "id": "18c2ebc7-5152-439c-9b3f-851c59bac834", - "type": "basic.input", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 64, - "y": 80 - } - }, - { - "id": "664caf9e-5f40-4df4-800a-b626af702e62", - "type": "basic.output", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 752, - "y": 144 - } - }, - { - "id": "97b51945-d716-4b6c-9db9-970d08541249", - "type": "basic.input", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 64, - "y": 208 - } - } - ], - "wires": [ - { - "source": { - "block": "18c2ebc7-5152-439c-9b3f-851c59bac834", - "port": "out" - }, - "target": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "a" - } - }, - { - "source": { - "block": "97b51945-d716-4b6c-9db9-970d08541249", - "port": "out" - }, - "target": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "b" - } - }, - { - "source": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "c" - }, - "target": { - "block": "664caf9e-5f40-4df4-800a-b626af702e62", - "port": "in" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": {} -} \ No newline at end of file diff --git a/app/resources/collection/blocks/logic/gate/not.ice b/app/resources/collection/blocks/logic/gate/not.ice deleted file mode 100644 index e81bd15da..000000000 --- a/app/resources/collection/blocks/logic/gate/not.ice +++ /dev/null @@ -1,109 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "NOT", - "version": "1.0.0", - "description": "NOT logic gate", - "author": "Jesús Arroyo", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%2291.33%22%20height=%2245.752%22%20version=%221%22%3E%3Cpath%20d=%22M0%2020.446h27v2H0zM70.322%2020.447h15.3v2h-15.3z%22/%3E%3Cpath%20d=%22M66.05%2026.746c-2.9%200-5.3-2.4-5.3-5.3s2.4-5.3%205.3-5.3%205.3%202.4%205.3%205.3-2.4%205.3-5.3%205.3zm0-8.6c-1.8%200-3.3%201.5-3.3%203.3%200%201.8%201.5%203.3%203.3%203.3%201.8%200%203.3-1.5%203.3-3.3%200-1.8-1.5-3.3-3.3-3.3z%22/%3E%3Cpath%20d=%22M25.962%202.563l33.624%2018.883L25.962%2040.33V2.563z%22%20fill=%22none%22%20stroke=%22#000%22%20stroke-width=%223%22/%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "5365ed8c-e5db-4445-938f-8d689830ea5c", - "type": "basic.code", - "data": { - "code": "// NOT logic gate\n\nassign c = ~ a;", - "params": [], - "ports": { - "in": [ - { - "name": "a" - } - ], - "out": [ - { - "name": "c" - } - ] - } - }, - "position": { - "x": 256, - "y": 48 - } - }, - { - "id": "18c2ebc7-5152-439c-9b3f-851c59bac834", - "type": "basic.input", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 64, - "y": 144 - } - }, - { - "id": "664caf9e-5f40-4df4-800a-b626af702e62", - "type": "basic.output", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 752, - "y": 144 - } - } - ], - "wires": [ - { - "source": { - "block": "18c2ebc7-5152-439c-9b3f-851c59bac834", - "port": "out" - }, - "target": { - "block": "5365ed8c-e5db-4445-938f-8d689830ea5c", - "port": "a" - } - }, - { - "source": { - "block": "5365ed8c-e5db-4445-938f-8d689830ea5c", - "port": "c" - }, - "target": { - "block": "664caf9e-5f40-4df4-800a-b626af702e62", - "port": "in" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": {} -} \ No newline at end of file diff --git a/app/resources/collection/blocks/logic/gate/or.ice b/app/resources/collection/blocks/logic/gate/or.ice deleted file mode 100644 index 2daface97..000000000 --- a/app/resources/collection/blocks/logic/gate/or.ice +++ /dev/null @@ -1,141 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "OR", - "version": "1.0.0", - "description": "OR logic gate", - "author": "Jesús Arroyo", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%2290%22%20height=%2240%22%20version=%221%22%3E%3Cpath%20d=%22M65%2020h25M26%2010H0M27%2030H0%22%20fill=%22none%22%20stroke=%22#000%22%20stroke-width=%222%22/%3E%3Cpath%20d=%22M19.094%200l2%202.438s5.656%207%205.656%2017.562c0%2010.562-5.656%2017.563-5.656%2017.563l-2%202.437H36.25c2.408%200%207.69.025%2013.625-2.406s12.537-7.344%2017.688-16.875L66.25%2020l1.313-.719C57.258.216%2041.007%200%2036.25%200H19.094zm5.875%203H36.25c4.684%200%2018.287-.13%2027.969%2017-4.767%208.43-10.522%2012.684-15.719%2014.813C43.14%2037.008%2038.658%2037%2036.25%2037H25c1.874-3.108%204.75-9.05%204.75-17%200-7.973-2.909-13.9-4.781-17z%22%20fill-rule=%22evenodd%22/%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "type": "basic.code", - "data": { - "code": "// OR logic gate\n\nassign c = a | b;", - "params": [], - "ports": { - "in": [ - { - "name": "a" - }, - { - "name": "b" - } - ], - "out": [ - { - "name": "c" - } - ] - } - }, - "position": { - "x": 256, - "y": 48 - } - }, - { - "id": "18c2ebc7-5152-439c-9b3f-851c59bac834", - "type": "basic.input", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 64, - "y": 80 - } - }, - { - "id": "664caf9e-5f40-4df4-800a-b626af702e62", - "type": "basic.output", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 752, - "y": 144 - } - }, - { - "id": "97b51945-d716-4b6c-9db9-970d08541249", - "type": "basic.input", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 64, - "y": 208 - } - } - ], - "wires": [ - { - "source": { - "block": "18c2ebc7-5152-439c-9b3f-851c59bac834", - "port": "out" - }, - "target": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "a" - } - }, - { - "source": { - "block": "97b51945-d716-4b6c-9db9-970d08541249", - "port": "out" - }, - "target": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "b" - } - }, - { - "source": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "c" - }, - "target": { - "block": "664caf9e-5f40-4df4-800a-b626af702e62", - "port": "in" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": {} -} \ No newline at end of file diff --git a/app/resources/collection/blocks/logic/gate/xnor.ice b/app/resources/collection/blocks/logic/gate/xnor.ice deleted file mode 100644 index c1bf5bce5..000000000 --- a/app/resources/collection/blocks/logic/gate/xnor.ice +++ /dev/null @@ -1,141 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "XNOR", - "version": "1.0.0", - "description": "XNOR logic gate", - "author": "Carlos Diaz", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%22-252%20400.9%2090%2040%22%3E%3Cpath%20d=%22M-252%20409.9h26v2h-26zM-252%20429.9h27v2h-27zM-177.3%20419.9h15.3v2h-15.3z%22/%3E%3Cpath%20d=%22M-181.4%20426.2c-2.9%200-5.3-2.4-5.3-5.3s2.4-5.3%205.3-5.3%205.3%202.4%205.3%205.3-2.4%205.3-5.3%205.3zm0-8.6c-1.8%200-3.3%201.5-3.3%203.3%200%201.8%201.5%203.3%203.3%203.3s3.3-1.5%203.3-3.3c0-1.8-1.5-3.3-3.3-3.3z%22/%3E%3Cpath%20d=%22M-185.3%20422.6l-.3-2.1.4-1.6c-10.3-17.8-26-18-30.6-18H-233l2%202.4s5.7%207%205.7%2017.6c0%2010.6-5.7%2017.6-5.7%2017.6l-2%202.4h17.2c2.4%200%207.7%200%2013.6-2.4%205.7-2.3%2012-6.9%2017-15.7l-.1-.2zm-18.2%2013.1c-5.4%202.2-9.8%202.2-12.3%202.2H-227c1.9-3.1%204.8-9%204.8-17s-2.9-13.9-4.8-17h11.3c4.7%200%2018.3-.1%2028%2017-4.8%208.4-10.6%2012.7-15.8%2014.8z%22/%3E%3Cpath%20d=%22M-238.3%20440.9h3.6c2.3-3.7%206.5-11.6%206.5-19.8%200-8.5-4.4-16.5-6.8-20.2h-3.6c1.4%202%207.4%2011%207.4%2020.2%200%208.9-5.7%2017.7-7.1%2019.8z%22/%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "type": "basic.code", - "data": { - "code": "// XNOR logic gate\n\nassign c = ~(a ^ b);", - "params": [], - "ports": { - "in": [ - { - "name": "a" - }, - { - "name": "b" - } - ], - "out": [ - { - "name": "c" - } - ] - } - }, - "position": { - "x": 256, - "y": 48 - } - }, - { - "id": "18c2ebc7-5152-439c-9b3f-851c59bac834", - "type": "basic.input", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 64, - "y": 80 - } - }, - { - "id": "664caf9e-5f40-4df4-800a-b626af702e62", - "type": "basic.output", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 752, - "y": 144 - } - }, - { - "id": "97b51945-d716-4b6c-9db9-970d08541249", - "type": "basic.input", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 64, - "y": 208 - } - } - ], - "wires": [ - { - "source": { - "block": "18c2ebc7-5152-439c-9b3f-851c59bac834", - "port": "out" - }, - "target": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "a" - } - }, - { - "source": { - "block": "97b51945-d716-4b6c-9db9-970d08541249", - "port": "out" - }, - "target": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "b" - } - }, - { - "source": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "c" - }, - "target": { - "block": "664caf9e-5f40-4df4-800a-b626af702e62", - "port": "in" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": {} -} \ No newline at end of file diff --git a/app/resources/collection/blocks/logic/gate/xor.ice b/app/resources/collection/blocks/logic/gate/xor.ice deleted file mode 100644 index 30a46a1cd..000000000 --- a/app/resources/collection/blocks/logic/gate/xor.ice +++ /dev/null @@ -1,141 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "XOR", - "version": "1.0.0", - "description": "XOR logic gate", - "author": "Carlos Diaz", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%22-252%20400.9%2090%2040%22%3E%3Cpath%20d=%22M-252%20409.9h26v2h-26zM-252%20429.9h27v2h-27zM-186.5%20419.9h24.5v2h-24.5z%22/%3E%3Cpath%20d=%22M-184.6%20420.9c0-1-.6-2-.6-2-10.3-17.8-26-18-30.6-18H-233l2%202.4s5.7%207%205.7%2017.6c0%2010.6-5.7%2017.6-5.7%2017.6l-2%202.4h17.2c2.4%200%207.7%200%2013.6-2.4%205.7-2.3%2012-6.9%2017-15.7.1%200%20.6-1%20.6-1.9zm-18.9%2014.8c-5.4%202.2-9.8%202.2-12.3%202.2H-227c1.9-3.1%204.8-9%204.8-17s-2.9-13.9-4.8-17h11.3c4.7%200%2018.3-.1%2028%2017-4.8%208.4-10.6%2012.7-15.8%2014.8z%22/%3E%3Cpath%20d=%22M-238.3%20440.9h3.6c2.3-3.7%206.5-11.6%206.5-19.8%200-8.5-4.4-16.5-6.8-20.2h-3.6c1.4%202%207.4%2011%207.4%2020.2%200%208.9-5.7%2017.7-7.1%2019.8z%22/%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "type": "basic.code", - "data": { - "code": "// XOR logic gate\n\nassign c = a ^ b;", - "params": [], - "ports": { - "in": [ - { - "name": "a" - }, - { - "name": "b" - } - ], - "out": [ - { - "name": "c" - } - ] - } - }, - "position": { - "x": 256, - "y": 48 - } - }, - { - "id": "18c2ebc7-5152-439c-9b3f-851c59bac834", - "type": "basic.input", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 64, - "y": 80 - } - }, - { - "id": "664caf9e-5f40-4df4-800a-b626af702e62", - "type": "basic.output", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 752, - "y": 144 - } - }, - { - "id": "97b51945-d716-4b6c-9db9-970d08541249", - "type": "basic.input", - "data": { - "name": "", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 64, - "y": 208 - } - } - ], - "wires": [ - { - "source": { - "block": "18c2ebc7-5152-439c-9b3f-851c59bac834", - "port": "out" - }, - "target": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "a" - } - }, - { - "source": { - "block": "97b51945-d716-4b6c-9db9-970d08541249", - "port": "out" - }, - "target": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "b" - } - }, - { - "source": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "c" - }, - "target": { - "block": "664caf9e-5f40-4df4-800a-b626af702e62", - "port": "in" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": {} -} \ No newline at end of file diff --git a/app/resources/collection/blocks/logic/sequential/debouncer.ice b/app/resources/collection/blocks/logic/sequential/debouncer.ice deleted file mode 100644 index f9c78407d..000000000 --- a/app/resources/collection/blocks/logic/sequential/debouncer.ice +++ /dev/null @@ -1,141 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "Debouncer", - "version": "1.0.0", - "description": "Remove the rebound on a mechanical switch", - "author": "Juan González", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%22-252%20400.9%2090%2040%22%3E%3Cpath%20d=%22M-251.547%20436.672h22.802v-30.353h5.862v30.353h5.259v-30.353h3.447v30.353h2.984v-30.353h3.506v30.523h6.406V405.77h38.868%22%20fill=%22none%22%20stroke=%22#000%22%20stroke-width=%221.4%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M-232.57%20403.877l26.946%2032.391M-205.624%20403.877l-26.946%2032.391%22%20fill=%22none%22%20stroke=%22red%22%20stroke-width=%223%22%20stroke-linecap=%22round%22/%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "92490e7e-c3ba-4e9c-a917-2a771d99f1ef", - "type": "basic.code", - "data": { - "code": "//-- Debouncer Circuit\n//-- It produces a stable output when the\n//-- input signal is bouncing\n\nreg btn_prev = 0;\nreg btn_out_r = 0;\n\nreg [16:0] counter = 0;\n\n\nalways @(posedge clk) begin\n\n //-- If btn_prev and btn_in are differents\n if (btn_prev ^ in == 1'b1) begin\n \n //-- Reset the counter\n counter <= 0;\n \n //-- Capture the button status\n btn_prev <= in;\n end\n \n //-- If no timeout, increase the counter\n else if (counter[16] == 1'b0)\n counter <= counter + 1;\n \n else\n //-- Set the output to the stable value\n btn_out_r <= btn_prev;\n\nend\n\nassign out = btn_out_r;\n", - "params": [], - "ports": { - "in": [ - { - "name": "clk" - }, - { - "name": "in" - } - ], - "out": [ - { - "name": "out" - } - ] - } - }, - "position": { - "x": 264, - "y": 112 - } - }, - { - "id": "4bf41c17-a2da-4140-95f7-2a80d51b1e1a", - "type": "basic.input", - "data": { - "name": "clk", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 48, - "y": 144 - } - }, - { - "id": "22ff3fa1-943b-4d1a-bd89-36e1c054d077", - "type": "basic.output", - "data": { - "name": "out", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 768, - "y": 208 - } - }, - { - "id": "c9e1af2a-6f09-4cf6-a5b3-fdf7ec2c6530", - "type": "basic.input", - "data": { - "name": "in", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 48, - "y": 272 - } - } - ], - "wires": [ - { - "source": { - "block": "92490e7e-c3ba-4e9c-a917-2a771d99f1ef", - "port": "out" - }, - "target": { - "block": "22ff3fa1-943b-4d1a-bd89-36e1c054d077", - "port": "in" - } - }, - { - "source": { - "block": "4bf41c17-a2da-4140-95f7-2a80d51b1e1a", - "port": "out" - }, - "target": { - "block": "92490e7e-c3ba-4e9c-a917-2a771d99f1ef", - "port": "clk" - } - }, - { - "source": { - "block": "c9e1af2a-6f09-4cf6-a5b3-fdf7ec2c6530", - "port": "out" - }, - "target": { - "block": "92490e7e-c3ba-4e9c-a917-2a771d99f1ef", - "port": "in" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": {} -} \ No newline at end of file diff --git a/app/resources/collection/blocks/logic/sequential/dff_ar.ice b/app/resources/collection/blocks/logic/sequential/dff_ar.ice deleted file mode 100644 index 50c524dd9..000000000 --- a/app/resources/collection/blocks/logic/sequential/dff_ar.ice +++ /dev/null @@ -1,237 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "DFF async", - "version": "1.0.0", - "description": "Delay flip-flop with asynchronous reset", - "author": "Carlos Diaz", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%22-252%20400.9%2090%2040%22%3E%3Cg%20font-weight=%22400%22%20font-size=%2224.601%22%20font-family=%22sans-serif%22%20letter-spacing=%220%22%20word-spacing=%220%22%3E%3Ctext%20y=%22421.867%22%20x=%22-231.121%22%20style=%22line-height:125%25%22%20transform=%22translate(0%20-1.964)%22%3E%3Ctspan%20y=%22421.867%22%20x=%22-231.121%22%3EDFF%3C/tspan%3E%3C/text%3E%3Ctext%20y=%22438.935%22%20x=%22-227.001%22%20style=%22line-height:125%25%22%20transform=%22translate(0%20-1.964)%22%3E%3Ctspan%20y=%22438.935%22%20x=%22-227.001%22%20font-size=%2213.75%22%3Easync%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "b32a6101-5bd1-4bcf-ae5f-e569b958a6a2", - "type": "basic.input", - "data": { - "name": "D", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 168, - "y": 112 - } - }, - { - "id": "cfacb99e-850b-4ddc-a25b-fda4c93f1c5a", - "type": "basic.code", - "data": { - "code": "// D flip-flop with asynchronous reset\n\nreg _q = 1'b0;\n\nalways @(posedge clk or negedge rst_n)\nbegin\n if(rst_n == 0)\n _q = 1'b0;\n else if(en)\n _q <= d;\nend\n\nassign {q, q_n} = {_q, ~_q};\n", - "params": [], - "ports": { - "in": [ - { - "name": "d" - }, - { - "name": "en" - }, - { - "name": "rst_n" - }, - { - "name": "clk" - } - ], - "out": [ - { - "name": "q" - }, - { - "name": "q_n" - } - ] - } - }, - "position": { - "x": 344, - "y": 120 - } - }, - { - "id": "ffdd9aa2-aea3-4aa9-8431-80e799226774", - "type": "basic.output", - "data": { - "name": "Q", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 824, - "y": 152 - } - }, - { - "id": "50d69ac2-949d-476e-a711-420ba9f510cd", - "type": "basic.input", - "data": { - "name": "en", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 168, - "y": 184 - } - }, - { - "id": "07105e68-401b-49e9-b85f-2cddbfee9fbe", - "type": "basic.input", - "data": { - "name": "rst_n", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 168, - "y": 256 - } - }, - { - "id": "4a261f0b-523c-4fe0-ae1c-de05b8eb7e8a", - "type": "basic.output", - "data": { - "name": "Q_n", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 824, - "y": 280 - } - }, - { - "id": "6855f64f-fa1c-4371-b2e1-a98970674a96", - "type": "basic.input", - "data": { - "name": "clk", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 168, - "y": 328 - } - } - ], - "wires": [ - { - "source": { - "block": "cfacb99e-850b-4ddc-a25b-fda4c93f1c5a", - "port": "q" - }, - "target": { - "block": "ffdd9aa2-aea3-4aa9-8431-80e799226774", - "port": "in" - } - }, - { - "source": { - "block": "cfacb99e-850b-4ddc-a25b-fda4c93f1c5a", - "port": "q_n" - }, - "target": { - "block": "4a261f0b-523c-4fe0-ae1c-de05b8eb7e8a", - "port": "in" - } - }, - { - "source": { - "block": "6855f64f-fa1c-4371-b2e1-a98970674a96", - "port": "out" - }, - "target": { - "block": "cfacb99e-850b-4ddc-a25b-fda4c93f1c5a", - "port": "clk" - } - }, - { - "source": { - "block": "b32a6101-5bd1-4bcf-ae5f-e569b958a6a2", - "port": "out" - }, - "target": { - "block": "cfacb99e-850b-4ddc-a25b-fda4c93f1c5a", - "port": "d" - } - }, - { - "source": { - "block": "50d69ac2-949d-476e-a711-420ba9f510cd", - "port": "out" - }, - "target": { - "block": "cfacb99e-850b-4ddc-a25b-fda4c93f1c5a", - "port": "en" - } - }, - { - "source": { - "block": "07105e68-401b-49e9-b85f-2cddbfee9fbe", - "port": "out" - }, - "target": { - "block": "cfacb99e-850b-4ddc-a25b-fda4c93f1c5a", - "port": "rst_n" - } - } - ] - }, - "state": { - "pan": { - "x": -100, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": {} -} diff --git a/app/resources/collection/blocks/logic/sequential/dff_sr.ice b/app/resources/collection/blocks/logic/sequential/dff_sr.ice deleted file mode 100644 index e61d5f64a..000000000 --- a/app/resources/collection/blocks/logic/sequential/dff_sr.ice +++ /dev/null @@ -1,237 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "DFF", - "version": "1.0.0", - "description": "Delay flip-flop with synchronous reset", - "author": "Carlos Diaz", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%22-252%20400.9%2090%2040%22%3E%3Ctext%20style=%22line-height:125%25%22%20x=%22-231.121%22%20y=%22429.867%22%20font-weight=%22400%22%20font-size=%2224.601%22%20font-family=%22sans-serif%22%20letter-spacing=%220%22%20word-spacing=%220%22%3E%3Ctspan%20x=%22-231.121%22%20y=%22429.867%22%3EDFF%3C/tspan%3E%3C/text%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "b32a6101-5bd1-4bcf-ae5f-e569b958a6a2", - "type": "basic.input", - "data": { - "name": "D", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 168, - "y": 104 - } - }, - { - "id": "17c79db9-4b5b-4a7c-9f13-c4c9f9e5a4e5", - "type": "basic.code", - "data": { - "code": "// D flip-flop with synchronous reset\n\nreg _q = 1'b0;\n\nalways @(posedge clk)\nbegin\n if(rst_n == 0)\n _q = 1'b0;\n else if(en)\n _q <= d;\nend\n\nassign {q, q_n} = {_q, ~_q};\n", - "params": [], - "ports": { - "in": [ - { - "name": "d" - }, - { - "name": "en" - }, - { - "name": "rst_n" - }, - { - "name": "clk" - } - ], - "out": [ - { - "name": "q" - }, - { - "name": "q_n" - } - ] - } - }, - "position": { - "x": 344, - "y": 120 - } - }, - { - "id": "ffdd9aa2-aea3-4aa9-8431-80e799226774", - "type": "basic.output", - "data": { - "name": "Q", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 824, - "y": 152 - } - }, - { - "id": "50d69ac2-949d-476e-a711-420ba9f510cd", - "type": "basic.input", - "data": { - "name": "en", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 168, - "y": 176 - } - }, - { - "id": "07105e68-401b-49e9-b85f-2cddbfee9fbe", - "type": "basic.input", - "data": { - "name": "rst_n", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 168, - "y": 256 - } - }, - { - "id": "4a261f0b-523c-4fe0-ae1c-de05b8eb7e8a", - "type": "basic.output", - "data": { - "name": "Q_n", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 824, - "y": 280 - } - }, - { - "id": "6855f64f-fa1c-4371-b2e1-a98970674a96", - "type": "basic.input", - "data": { - "name": "clk", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 168, - "y": 328 - } - } - ], - "wires": [ - { - "source": { - "block": "17c79db9-4b5b-4a7c-9f13-c4c9f9e5a4e5", - "port": "q" - }, - "target": { - "block": "ffdd9aa2-aea3-4aa9-8431-80e799226774", - "port": "in" - } - }, - { - "source": { - "block": "17c79db9-4b5b-4a7c-9f13-c4c9f9e5a4e5", - "port": "q_n" - }, - "target": { - "block": "4a261f0b-523c-4fe0-ae1c-de05b8eb7e8a", - "port": "in" - } - }, - { - "source": { - "block": "b32a6101-5bd1-4bcf-ae5f-e569b958a6a2", - "port": "out" - }, - "target": { - "block": "17c79db9-4b5b-4a7c-9f13-c4c9f9e5a4e5", - "port": "d" - } - }, - { - "source": { - "block": "50d69ac2-949d-476e-a711-420ba9f510cd", - "port": "out" - }, - "target": { - "block": "17c79db9-4b5b-4a7c-9f13-c4c9f9e5a4e5", - "port": "en" - } - }, - { - "source": { - "block": "07105e68-401b-49e9-b85f-2cddbfee9fbe", - "port": "out" - }, - "target": { - "block": "17c79db9-4b5b-4a7c-9f13-c4c9f9e5a4e5", - "port": "rst_n" - } - }, - { - "source": { - "block": "6855f64f-fa1c-4371-b2e1-a98970674a96", - "port": "out" - }, - "target": { - "block": "17c79db9-4b5b-4a7c-9f13-c4c9f9e5a4e5", - "port": "clk" - } - } - ] - }, - "state": { - "pan": { - "x": -100, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": {} -} diff --git a/app/resources/collection/blocks/logic/sequential/tff_ar.ice b/app/resources/collection/blocks/logic/sequential/tff_ar.ice deleted file mode 100644 index 14fc69586..000000000 --- a/app/resources/collection/blocks/logic/sequential/tff_ar.ice +++ /dev/null @@ -1,237 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "TFF async", - "version": "1.0.0", - "description": "Toggle flip-flop with asynchronous reset", - "author": "Carlos Diaz", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%22-252%20400.9%2090%2040%22%3E%3Cg%20font-weight=%22400%22%20font-size=%2224.601%22%20font-family=%22sans-serif%22%20letter-spacing=%220%22%20word-spacing=%220%22%3E%3Ctext%20style=%22line-height:125%25%22%20x=%22-227.932%22%20y=%22421.867%22%20transform=%22translate(0%20-1.964)%22%3E%3Ctspan%20x=%22-227.932%22%20y=%22421.867%22%3ETFF%3C/tspan%3E%3C/text%3E%3Ctext%20style=%22line-height:125%25%22%20x=%22-227.001%22%20y=%22438.935%22%20transform=%22translate(0%20-1.964)%22%3E%3Ctspan%20x=%22-227.001%22%20y=%22438.935%22%20font-size=%2213.75%22%3Easync%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "b32a6101-5bd1-4bcf-ae5f-e569b958a6a2", - "type": "basic.input", - "data": { - "name": "T", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 168, - "y": 112 - } - }, - { - "id": "075956ce-9af4-49ea-9123-91786feaba4d", - "type": "basic.code", - "data": { - "code": "// T flip-flop with asynchronous reset\n\nreg _q = 1'b0;\n\nalways @(posedge clk or negedge rst_n)\nbegin\n if(rst_n == 0)\n _q <= 1'b0;\n else\n if(en & t)\n _q = ~_q;\nend\n\nassign {q, q_n} = {_q, ~_q};", - "params": [], - "ports": { - "in": [ - { - "name": "t" - }, - { - "name": "en" - }, - { - "name": "rst_n" - }, - { - "name": "clk" - } - ], - "out": [ - { - "name": "q" - }, - { - "name": "q_n" - } - ] - } - }, - "position": { - "x": 344, - "y": 120 - } - }, - { - "id": "ffdd9aa2-aea3-4aa9-8431-80e799226774", - "type": "basic.output", - "data": { - "name": "Q", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 824, - "y": 152 - } - }, - { - "id": "50d69ac2-949d-476e-a711-420ba9f510cd", - "type": "basic.input", - "data": { - "name": "en", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 168, - "y": 184 - } - }, - { - "id": "8fa94192-fba9-4c2a-be61-b8ca88389423", - "type": "basic.input", - "data": { - "name": "rst_n", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 168, - "y": 256 - } - }, - { - "id": "4a261f0b-523c-4fe0-ae1c-de05b8eb7e8a", - "type": "basic.output", - "data": { - "name": "Q_n", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 824, - "y": 280 - } - }, - { - "id": "6855f64f-fa1c-4371-b2e1-a98970674a96", - "type": "basic.input", - "data": { - "name": "clk", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 168, - "y": 328 - } - } - ], - "wires": [ - { - "source": { - "block": "075956ce-9af4-49ea-9123-91786feaba4d", - "port": "q" - }, - "target": { - "block": "ffdd9aa2-aea3-4aa9-8431-80e799226774", - "port": "in" - } - }, - { - "source": { - "block": "075956ce-9af4-49ea-9123-91786feaba4d", - "port": "q_n" - }, - "target": { - "block": "4a261f0b-523c-4fe0-ae1c-de05b8eb7e8a", - "port": "in" - } - }, - { - "source": { - "block": "6855f64f-fa1c-4371-b2e1-a98970674a96", - "port": "out" - }, - "target": { - "block": "075956ce-9af4-49ea-9123-91786feaba4d", - "port": "clk" - } - }, - { - "source": { - "block": "b32a6101-5bd1-4bcf-ae5f-e569b958a6a2", - "port": "out" - }, - "target": { - "block": "075956ce-9af4-49ea-9123-91786feaba4d", - "port": "t" - } - }, - { - "source": { - "block": "50d69ac2-949d-476e-a711-420ba9f510cd", - "port": "out" - }, - "target": { - "block": "075956ce-9af4-49ea-9123-91786feaba4d", - "port": "en" - } - }, - { - "source": { - "block": "8fa94192-fba9-4c2a-be61-b8ca88389423", - "port": "out" - }, - "target": { - "block": "075956ce-9af4-49ea-9123-91786feaba4d", - "port": "rst_n" - } - } - ] - }, - "state": { - "pan": { - "x": -100, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": {} -} diff --git a/app/resources/collection/blocks/logic/sequential/tff_sr.ice b/app/resources/collection/blocks/logic/sequential/tff_sr.ice deleted file mode 100644 index 002d98cb7..000000000 --- a/app/resources/collection/blocks/logic/sequential/tff_sr.ice +++ /dev/null @@ -1,237 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "TFF", - "version": "1.0.0", - "description": "Toggle flip-flop with synchronous reset", - "author": "Carlos Diaz", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%22-252%20400.9%2090%2040%22%3E%3Ctext%20style=%22line-height:125%25%22%20x=%22-227.932%22%20y=%22429.867%22%20font-weight=%22400%22%20font-size=%2224.601%22%20font-family=%22sans-serif%22%20letter-spacing=%220%22%20word-spacing=%220%22%3E%3Ctspan%20x=%22-227.932%22%20y=%22429.867%22%3ETFF%3C/tspan%3E%3C/text%3E%3C/svg%3E" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "b32a6101-5bd1-4bcf-ae5f-e569b958a6a2", - "type": "basic.input", - "data": { - "name": "T", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 168, - "y": 104 - } - }, - { - "id": "163997db-34b5-4c61-a06c-5ab94207674a", - "type": "basic.code", - "data": { - "code": "// T flip-flop with synchronous reset\n\nreg _q = 1'b0;\n\nalways @(posedge clk)\nbegin\n if(rst_n == 0)\n _q <= 1'b0;\n else\n if(en & t)\n _q = ~_q;\nend\n\nassign {q, q_n} = {_q, ~_q};", - "params": [], - "ports": { - "in": [ - { - "name": "t" - }, - { - "name": "en" - }, - { - "name": "rst_n" - }, - { - "name": "clk" - } - ], - "out": [ - { - "name": "q" - }, - { - "name": "q_n" - } - ] - } - }, - "position": { - "x": 344, - "y": 120 - } - }, - { - "id": "ffdd9aa2-aea3-4aa9-8431-80e799226774", - "type": "basic.output", - "data": { - "name": "Q", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 824, - "y": 152 - } - }, - { - "id": "50d69ac2-949d-476e-a711-420ba9f510cd", - "type": "basic.input", - "data": { - "name": "en", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 168, - "y": 176 - } - }, - { - "id": "8fa94192-fba9-4c2a-be61-b8ca88389423", - "type": "basic.input", - "data": { - "name": "rst_n", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 168, - "y": 256 - } - }, - { - "id": "4a261f0b-523c-4fe0-ae1c-de05b8eb7e8a", - "type": "basic.output", - "data": { - "name": "Q_n", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 824, - "y": 280 - } - }, - { - "id": "6855f64f-fa1c-4371-b2e1-a98970674a96", - "type": "basic.input", - "data": { - "name": "clk", - "pins": [ - { - "index": "0", - "name": "", - "value": "0" - } - ], - "virtual": true - }, - "position": { - "x": 168, - "y": 328 - } - } - ], - "wires": [ - { - "source": { - "block": "163997db-34b5-4c61-a06c-5ab94207674a", - "port": "q" - }, - "target": { - "block": "ffdd9aa2-aea3-4aa9-8431-80e799226774", - "port": "in" - } - }, - { - "source": { - "block": "163997db-34b5-4c61-a06c-5ab94207674a", - "port": "q_n" - }, - "target": { - "block": "4a261f0b-523c-4fe0-ae1c-de05b8eb7e8a", - "port": "in" - } - }, - { - "source": { - "block": "50d69ac2-949d-476e-a711-420ba9f510cd", - "port": "out" - }, - "target": { - "block": "163997db-34b5-4c61-a06c-5ab94207674a", - "port": "en" - } - }, - { - "source": { - "block": "8fa94192-fba9-4c2a-be61-b8ca88389423", - "port": "out" - }, - "target": { - "block": "163997db-34b5-4c61-a06c-5ab94207674a", - "port": "rst_n" - } - }, - { - "source": { - "block": "b32a6101-5bd1-4bcf-ae5f-e569b958a6a2", - "port": "out" - }, - "target": { - "block": "163997db-34b5-4c61-a06c-5ab94207674a", - "port": "t" - } - }, - { - "source": { - "block": "6855f64f-fa1c-4371-b2e1-a98970674a96", - "port": "out" - }, - "target": { - "block": "163997db-34b5-4c61-a06c-5ab94207674a", - "port": "clk" - } - } - ] - }, - "state": { - "pan": { - "x": -100, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": {} -} diff --git a/app/resources/collection/examples/1_basic/1_led_on.ice b/app/resources/collection/examples/1_basic/1_led_on.ice deleted file mode 100644 index 44c798809..000000000 --- a/app/resources/collection/examples/1_basic/1_led_on.ice +++ /dev/null @@ -1,152 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "Led on", - "version": "1.0.0", - "description": "", - "author": "", - "image": "" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "eaf792b5-de98-4e2f-b78a-4023eb9a7f2b", - "type": "3e6c249e205080168c1bf4ee8dbc33b50653d5f4", - "position": { - "x": 80, - "y": 64 - } - }, - { - "id": "949075cb-26c0-49da-ba76-2496ea9aa7cc", - "type": "basic.output", - "data": { - "name": "led", - "pins": [ - { - "index": "0", - "name": "LED0", - "value": "95" - } - ], - "virtual": false - }, - "position": { - "x": 352, - "y": 64 - } - }, - { - "id": "a538a5b4-d5d5-4ace-a593-efb1fa9b930c", - "type": "basic.info", - "data": { - "info": "LED-ON Hello world circuit example!\n\nThe simplest digital circuit that turns a \nled on\n\nA bit set to 1 is wired directly to the\noutput FPGA pin, where the led is connected\n\nThe blue box is the bit (set to 1)\nIt is inside the FPGA\n\nThe yellow box is the output FPGA pin. Using\nthe bottom menu the pin can be changed\n\nEXERCISE 1: Upload this circuit into your \nFPGA board and watch the led. \nIt should be turned on\n\nEXERCISE 2: Change the pin number to turn\nanother led on and upload it again" - }, - "position": { - "x": 40, - "y": 208 - } - }, - { - "id": "0d05784e-8e32-4c80-b85d-cde4e892dbf3", - "type": "basic.info", - "data": { - "info": "Ejemplo de circuito Hola mundo: LED-ON\n\nEs el circuito digital más sencillo que\nenciende un led\n\nUn bit a 1 se cablea directamente a una\nsalida de la FPGA, donde está conectado\nel LED\n\nLa caja azul es el bit a 1\nEstá dentro de la FPGA\n\nLa caja amarilla es el pin de salida de\nla FPGA. Por medio del menú desplegable\ninferior se puede cambiar el pin\n\nEJERCICIO 1: Carga este circuito en la FPGA\ny observa el LED0. Debe estar encendido\n\nEJERCICIO 2: Cambia el pin de salida para\nencender otro led (por ejemplo el LED1)\ny cárgalo en la FPGA de nuevo" - }, - "position": { - "x": 464, - "y": 208 - } - } - ], - "wires": [ - { - "source": { - "block": "eaf792b5-de98-4e2f-b78a-4023eb9a7f2b", - "port": "19c8f68d-5022-487f-9ab0-f0a3cd58bead" - }, - "target": { - "block": "949075cb-26c0-49da-ba76-2496ea9aa7cc", - "port": "in" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": { - "3e6c249e205080168c1bf4ee8dbc33b50653d5f4": { - "package": { - "name": "Bit 1", - "version": "1.0.0", - "description": "Assign 1 to the output wire", - "author": "Jesús Arroyo", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%2247.303%22%20height=%2227.648%22%20viewBox=%220%200%2044.346456%2025.919999%22%3E%3Ctext%20style=%22line-height:125%25%22%20x=%22325.218%22%20y=%22315.455%22%20font-weight=%22400%22%20font-size=%2212.669%22%20font-family=%22sans-serif%22%20letter-spacing=%220%22%20word-spacing=%220%22%20transform=%22translate(-307.01%20-298.51)%22%3E%3Ctspan%20x=%22325.218%22%20y=%22315.455%22%20style=%22-inkscape-font-specification:'Courier%2010%20Pitch'%22%20font-family=%22Courier%2010%20Pitch%22%3E1%3C/tspan%3E%3C/text%3E%3C/svg%3E" - }, - "design": { - "graph": { - "blocks": [ - { - "id": "b959fb96-ac67-4aea-90b3-ed35a4c17bf5", - "type": "basic.code", - "data": { - "code": "// Bit 1\n\nassign v = 1'b1;", - "params": [], - "ports": { - "in": [], - "out": [ - { - "name": "v" - } - ] - } - }, - "position": { - "x": 96, - "y": 96 - } - }, - { - "id": "19c8f68d-5022-487f-9ab0-f0a3cd58bead", - "type": "basic.output", - "data": { - "name": "" - }, - "position": { - "x": 608, - "y": 192 - } - } - ], - "wires": [ - { - "source": { - "block": "b959fb96-ac67-4aea-90b3-ed35a4c17bf5", - "port": "v" - }, - "target": { - "block": "19c8f68d-5022-487f-9ab0-f0a3cd58bead", - "port": "in" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - } - } - } -} \ No newline at end of file diff --git a/app/resources/collection/examples/1_basic/2_switch_led.ice b/app/resources/collection/examples/1_basic/2_switch_led.ice deleted file mode 100644 index b7fa32b04..000000000 --- a/app/resources/collection/examples/1_basic/2_switch_led.ice +++ /dev/null @@ -1,108 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "Switch led", - "version": "1.0.0", - "description": "", - "author": "", - "image": "" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "aac1b394-533e-4410-9f35-ba80af8abd63", - "type": "basic.input", - "data": { - "name": "button", - "pins": [ - { - "index": "0", - "name": "SW1", - "value": "10" - } - ], - "virtual": false - }, - "position": { - "x": 48, - "y": 80 - } - }, - { - "id": "30a83e46-176d-40a8-ac0e-f19a131ea9d9", - "type": "basic.output", - "data": { - "name": "led", - "pins": [ - { - "index": "0", - "name": "LED0", - "value": "95" - } - ], - "virtual": false - }, - "position": { - "x": 320, - "y": 80 - } - }, - { - "id": "9e124703-5a80-4d0d-8c31-945447862085", - "type": "basic.info", - "data": { - "info": "Switch-led basic example\n\nA simple circuit that connects the input pin,\nwhere there is a button switch, with the\noutpun pin, where there is a led\n\nWhen the button is pressed (1), the led is\nturned on. When the button is released (0), the\nled is turned off\n\nNotice the blue box with a gear. It is a\nconfiguration block for activating the \nFPGA internal pull-up resistor in the SW1 pin" - }, - "position": { - "x": 32, - "y": 224 - } - }, - { - "id": "f76f55d3-ba32-42d8-8c16-9f4cbbd9d27c", - "type": "basic.info", - "data": { - "info": "Ejemplo básico switch-led\n\nSencillo circuito que conecta directamente\nun pin de entrada de la FPGA, donde hay\nun pulsador, con el pin de salida, donde está\nel led\n\nCuando se aprieta el pulsador (1), se enciende\nel led. Cuando se suelta (0) se apaga\n\nFíjate en la caja azul con el engranaje. Es un\nbloque de configuración que permite activar la\nresistencia de pull-up interna del pin de la \nFPGA" - }, - "position": { - "x": 448, - "y": 224 - } - }, - { - "id": "d556c4f6-736a-41a9-9f64-badf2b790010", - "type": "basic.info", - "data": { - "info": "EXERCISE 1: Upload the circuit into your FPGA\nboard and test it!\n\nEXERCISE 2: Change the button to SW2 and test\nit again\n\n---------------------------------------------\nEjercicio 1: Carga el circuito en la FPGA y\n¡pruébalo!\n\nEJERCICIO 2: Cambia el pulsador al SW2 y\npruébalo de nuevo" - }, - "position": { - "x": 864, - "y": 224 - } - } - ], - "wires": [ - { - "source": { - "block": "aac1b394-533e-4410-9f35-ba80af8abd63", - "port": "out" - }, - "target": { - "block": "30a83e46-176d-40a8-ac0e-f19a131ea9d9", - "port": "in" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": {} -} \ No newline at end of file diff --git a/app/resources/collection/examples/1_basic/3_switch_and_gate.ice b/app/resources/collection/examples/1_basic/3_switch_and_gate.ice deleted file mode 100644 index 8a01e713e..000000000 --- a/app/resources/collection/examples/1_basic/3_switch_and_gate.ice +++ /dev/null @@ -1,259 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "", - "version": "", - "description": "", - "author": "", - "image": "" - }, - "design": { - "board": "icezum", - "graph": { - "blocks": [ - { - "id": "aa8bab8b-61e4-4e28-b444-0e68d9484ea1", - "type": "basic.input", - "data": { - "name": "button1", - "pins": [ - { - "index": "0", - "name": "SW1", - "value": "10" - } - ], - "virtual": false - }, - "position": { - "x": 40, - "y": 32 - } - }, - { - "id": "840e71b2-bf5a-4e20-8413-d386500c87fa", - "type": "11a6f454705778e2f00adba4e5b28dcd9411bc8f", - "position": { - "x": 256, - "y": 80 - } - }, - { - "id": "3cad6e72-e7d3-4273-be1c-ce5f9b4c020a", - "type": "basic.output", - "data": { - "name": "led", - "pins": [ - { - "index": "0", - "name": "LED7", - "value": "104" - } - ], - "virtual": false - }, - "position": { - "x": 440, - "y": 80 - } - }, - { - "id": "5d1b4f33-ae65-4154-b4f4-ff1403437600", - "type": "basic.input", - "data": { - "name": "button2", - "pins": [ - { - "index": "0", - "name": "SW2", - "value": "11" - } - ], - "virtual": false - }, - "position": { - "x": 40, - "y": 128 - } - }, - { - "id": "cce8504a-dc1f-4deb-9ee3-5f215ac88408", - "type": "basic.info", - "data": { - "info": "Basic AND gate circuit\n\nA 2-inputs AND logic gate is used to turn on\nthe LED7 only when the 2 input buttons\nare pressed\n\nThis example shows the basic behaviour of\nthe AND gate\n\nEXERCISE: Upload this circuit into the FPGA\nboard and play with it" - }, - "position": { - "x": 40, - "y": 232 - } - }, - { - "id": "edf3b438-4271-45f7-bb14-2a6d040880dd", - "type": "basic.info", - "data": { - "info": "Circuito básico con puerta AND\n\nUna puerta lógica AND de 2 entradas se usa\npara encender un led solo cuando los dos\npulsadores de entrada están apretados\n\nEste ejemplo muestra el comportamiento básico\nde una puerta AND\n\nEJERCICIO: Carga este circuito en la FPGA y \njuega con él" - }, - "position": { - "x": 464, - "y": 232 - } - } - ], - "wires": [ - { - "source": { - "block": "840e71b2-bf5a-4e20-8413-d386500c87fa", - "port": "664caf9e-5f40-4df4-800a-b626af702e62" - }, - "target": { - "block": "3cad6e72-e7d3-4273-be1c-ce5f9b4c020a", - "port": "in" - } - }, - { - "source": { - "block": "aa8bab8b-61e4-4e28-b444-0e68d9484ea1", - "port": "out" - }, - "target": { - "block": "840e71b2-bf5a-4e20-8413-d386500c87fa", - "port": "18c2ebc7-5152-439c-9b3f-851c59bac834" - } - }, - { - "source": { - "block": "5d1b4f33-ae65-4154-b4f4-ff1403437600", - "port": "out" - }, - "target": { - "block": "840e71b2-bf5a-4e20-8413-d386500c87fa", - "port": "97b51945-d716-4b6c-9db9-970d08541249" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": { - "11a6f454705778e2f00adba4e5b28dcd9411bc8f": { - "package": { - "name": "AND", - "version": "1.0.0", - "description": "AND logic gate", - "author": "Jesús Arroyo", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%22-252%20400.9%2090%2040%22%3E%3Cpath%20d=%22M-252%20409.9h26v2h-26zM-252%20429.9h27v2h-27z%22/%3E%3Cpath%20d=%22M-227%20400.9v39.9h20.4c11.3%200%2020-9%2020-20s-8.7-20-20-20H-227zm2.9%202.8h17.6c9.8%200%2016.7%207.6%2016.7%2017.1%200%209.5-7.4%2017.1-17.1%2017.1H-224c-.1.1-.1-34.2-.1-34.2z%22/%3E%3Cpath%20d=%22M-187.911%20419.9H-162v2h-25.911z%22/%3E%3C/svg%3E" - }, - "design": { - "graph": { - "blocks": [ - { - "id": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "type": "basic.code", - "data": { - "code": "// AND logic gate\n\nassign c = a & b;", - "params": [], - "ports": { - "in": [ - { - "name": "a" - }, - { - "name": "b" - } - ], - "out": [ - { - "name": "c" - } - ] - } - }, - "position": { - "x": 256, - "y": 48 - } - }, - { - "id": "18c2ebc7-5152-439c-9b3f-851c59bac834", - "type": "basic.input", - "data": { - "name": "" - }, - "position": { - "x": 64, - "y": 80 - } - }, - { - "id": "664caf9e-5f40-4df4-800a-b626af702e62", - "type": "basic.output", - "data": { - "name": "" - }, - "position": { - "x": 752, - "y": 144 - } - }, - { - "id": "97b51945-d716-4b6c-9db9-970d08541249", - "type": "basic.input", - "data": { - "name": "" - }, - "position": { - "x": 64, - "y": 208 - } - } - ], - "wires": [ - { - "source": { - "block": "18c2ebc7-5152-439c-9b3f-851c59bac834", - "port": "out" - }, - "target": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "a" - } - }, - { - "source": { - "block": "97b51945-d716-4b6c-9db9-970d08541249", - "port": "out" - }, - "target": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "b" - } - }, - { - "source": { - "block": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "port": "c" - }, - "target": { - "block": "664caf9e-5f40-4df4-800a-b626af702e62", - "port": "in" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - } - } - } -} \ No newline at end of file diff --git a/app/resources/collection/examples/2_counter/contadorAsc.ice b/app/resources/collection/examples/2_counter/contadorAsc.ice deleted file mode 100644 index f3021c6f9..000000000 --- a/app/resources/collection/examples/2_counter/contadorAsc.ice +++ /dev/null @@ -1,377 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "contadorAsc", - "version": "0.1", - "description": "Contador ascendente de 4bits", - "author": "Carlos Diaz", - "image": "" - }, - "design": { - "board": "icestick", - "graph": { - "blocks": [ - { - "id": "579cff99-2d27-41d4-a20b-262ca8a93ca9", - "type": "basic.constant", - "data": { - "name": "INIT_CNT", - "value": "4'h2", - "local": false - }, - "position": { - "x": 312, - "y": 48 - } - }, - { - "id": "c299b4e2-ec25-4472-a58c-5dc46056c414", - "type": "basic.constant", - "data": { - "name": "FIN_CNT", - "value": "4'h5", - "local": false - }, - "position": { - "x": 504, - "y": 48 - } - }, - { - "id": "c1e3529f-d1eb-4ae5-8345-a43512f21577", - "type": "basic.output", - "data": { - "name": "out0", - "pins": [ - { - "index": "0", - "name": "D1", - "value": "99" - } - ], - "virtual": false - }, - "position": { - "x": 744, - "y": 144 - } - }, - { - "id": "86492073-e297-4c25-9678-30ab6dd1fa10", - "type": "basic.code", - "data": { - "code": "// INIT_CNT: Valor inicial de la cuenta\n// FIN_CNT: Valor final de la cuenta\n\n// El registro interno inicia su\n// cuenta a partir del valor del\n// parametro INIT_CNT\nreg [3:0] _o = INIT_CNT;\n\nalways @(posedge clk) begin\n if (en) begin\n _o <= _o + 1;\n // cuando _o vale igual que\n // el parametro FIN_CNT\n // se \"reinicia\" la cuenta\n // a partir de INIT_CNT\n if (_o == FIN_CNT || _o == 4'hFF) begin\n _o <= INIT_CNT;\n end\n end\nend\n\nassign {o3, o2, o1, o0} = _o;\n\n// (tc) terminal count, un clk de ancho a\n// la salida cuando termina _o vale FIN_CNT o 0\nwire tc = ((_o == FIN_CNT || _o == 4'hFF) ? 1 : 0);", - "params": [ - { - "name": "INIT_CNT" - }, - { - "name": "FIN_CNT" - } - ], - "ports": { - "in": [ - { - "name": "en" - }, - { - "name": "clk" - } - ], - "out": [ - { - "name": "o0" - }, - { - "name": "o1" - }, - { - "name": "o2" - }, - { - "name": "o3" - }, - { - "name": "tc" - } - ] - } - }, - "position": { - "x": 264, - "y": 192 - } - }, - { - "id": "1e21f6ca-9956-475d-a933-5bb01829f464", - "type": "basic.output", - "data": { - "name": "out1", - "pins": [ - { - "index": "0", - "name": "D2", - "value": "98" - } - ], - "virtual": false - }, - "position": { - "x": 744, - "y": 216 - } - }, - { - "id": "aa65e0fd-fea6-4cde-bcea-5b09f97848ff", - "type": "3e6c249e205080168c1bf4ee8dbc33b50653d5f4", - "position": { - "x": 72, - "y": 224 - } - }, - { - "id": "e83e3ae9-0616-4a17-a145-f14954f3f6e0", - "type": "basic.output", - "data": { - "name": "out2", - "pins": [ - { - "index": "0", - "name": "D3", - "value": "97" - } - ], - "virtual": false - }, - "position": { - "x": 744, - "y": 288 - } - }, - { - "id": "8d6dece9-e3b8-42d4-b8eb-386c90440923", - "type": "basic.input", - "data": { - "name": "clk", - "pins": [ - { - "index": "0", - "name": "CLK", - "value": "21" - } - ], - "virtual": false - }, - "position": { - "x": 72, - "y": 352 - } - }, - { - "id": "1f036705-53b5-4833-83ed-adf0a7bf3b98", - "type": "basic.output", - "data": { - "name": "out3", - "pins": [ - { - "index": "0", - "name": "TR8", - "value": "117" - } - ], - "virtual": false - }, - "position": { - "x": 744, - "y": 360 - } - }, - { - "id": "a9409df4-b096-4ad0-a1c6-c6eb9bfa1d89", - "type": "basic.output", - "data": { - "name": "tc", - "pins": [ - { - "index": "0", - "name": "D4", - "value": "96" - } - ], - "virtual": false - }, - "position": { - "x": 744, - "y": 432 - } - } - ], - "wires": [ - { - "source": { - "block": "86492073-e297-4c25-9678-30ab6dd1fa10", - "port": "o0" - }, - "target": { - "block": "c1e3529f-d1eb-4ae5-8345-a43512f21577", - "port": "in" - } - }, - { - "source": { - "block": "86492073-e297-4c25-9678-30ab6dd1fa10", - "port": "o1" - }, - "target": { - "block": "1e21f6ca-9956-475d-a933-5bb01829f464", - "port": "in" - } - }, - { - "source": { - "block": "86492073-e297-4c25-9678-30ab6dd1fa10", - "port": "o2" - }, - "target": { - "block": "e83e3ae9-0616-4a17-a145-f14954f3f6e0", - "port": "in" - } - }, - { - "source": { - "block": "86492073-e297-4c25-9678-30ab6dd1fa10", - "port": "o3" - }, - "target": { - "block": "1f036705-53b5-4833-83ed-adf0a7bf3b98", - "port": "in" - } - }, - { - "source": { - "block": "86492073-e297-4c25-9678-30ab6dd1fa10", - "port": "tc" - }, - "target": { - "block": "a9409df4-b096-4ad0-a1c6-c6eb9bfa1d89", - "port": "in" - } - }, - { - "source": { - "block": "579cff99-2d27-41d4-a20b-262ca8a93ca9", - "port": "constant-out" - }, - "target": { - "block": "86492073-e297-4c25-9678-30ab6dd1fa10", - "port": "INIT_CNT" - } - }, - { - "source": { - "block": "c299b4e2-ec25-4472-a58c-5dc46056c414", - "port": "constant-out" - }, - "target": { - "block": "86492073-e297-4c25-9678-30ab6dd1fa10", - "port": "FIN_CNT" - } - }, - { - "source": { - "block": "8d6dece9-e3b8-42d4-b8eb-386c90440923", - "port": "out" - }, - "target": { - "block": "86492073-e297-4c25-9678-30ab6dd1fa10", - "port": "clk" - } - }, - { - "source": { - "block": "aa65e0fd-fea6-4cde-bcea-5b09f97848ff", - "port": "19c8f68d-5022-487f-9ab0-f0a3cd58bead" - }, - "target": { - "block": "86492073-e297-4c25-9678-30ab6dd1fa10", - "port": "en" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": { - "3e6c249e205080168c1bf4ee8dbc33b50653d5f4": { - "package": { - "name": "Bit 1", - "version": "1.0.0", - "description": "Assign 1 to the output wire", - "author": "Jesús Arroyo", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%2247.303%22%20height=%2227.648%22%20viewBox=%220%200%2044.346456%2025.919999%22%3E%3Ctext%20style=%22line-height:125%25%22%20x=%22325.218%22%20y=%22315.455%22%20font-weight=%22400%22%20font-size=%2212.669%22%20font-family=%22sans-serif%22%20letter-spacing=%220%22%20word-spacing=%220%22%20transform=%22translate(-307.01%20-298.51)%22%3E%3Ctspan%20x=%22325.218%22%20y=%22315.455%22%20style=%22-inkscape-font-specification:'Courier%2010%20Pitch'%22%20font-family=%22Courier%2010%20Pitch%22%3E1%3C/tspan%3E%3C/text%3E%3C/svg%3E" - }, - "design": { - "graph": { - "blocks": [ - { - "id": "b959fb96-ac67-4aea-90b3-ed35a4c17bf5", - "type": "basic.code", - "data": { - "code": "// Bit 1\n\nassign v = 1'b1;", - "params": [], - "ports": { - "in": [], - "out": [ - { - "name": "v" - } - ] - } - }, - "position": { - "x": 96, - "y": 96 - } - }, - { - "id": "19c8f68d-5022-487f-9ab0-f0a3cd58bead", - "type": "basic.output", - "data": { - "name": "" - }, - "position": { - "x": 608, - "y": 192 - } - } - ], - "wires": [ - { - "source": { - "block": "b959fb96-ac67-4aea-90b3-ed35a4c17bf5", - "port": "v" - }, - "target": { - "block": "19c8f68d-5022-487f-9ab0-f0a3cd58bead", - "port": "in" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - } - } - } -} \ No newline at end of file diff --git a/app/resources/collection/examples/2_counter/contadorDes.ice b/app/resources/collection/examples/2_counter/contadorDes.ice deleted file mode 100644 index 6a81de53a..000000000 --- a/app/resources/collection/examples/2_counter/contadorDes.ice +++ /dev/null @@ -1,377 +0,0 @@ -{ - "version": "1.1", - "package": { - "name": "contadorDes", - "version": "0.1", - "description": "Contador descendente de 4bits", - "author": "Carlos Diaz", - "image": "" - }, - "design": { - "board": "icestick", - "graph": { - "blocks": [ - { - "id": "579cff99-2d27-41d4-a20b-262ca8a93ca9", - "type": "basic.constant", - "data": { - "name": "INIT_CNT", - "value": "4'h6", - "local": false - }, - "position": { - "x": 296, - "y": 48 - } - }, - { - "id": "587cbcbb-9779-4bd4-a6da-501087ccf9d5", - "type": "basic.constant", - "data": { - "name": "FIN_CNT", - "value": "4'h0", - "local": false - }, - "position": { - "x": 488, - "y": 48 - } - }, - { - "id": "c1e3529f-d1eb-4ae5-8345-a43512f21577", - "type": "basic.output", - "data": { - "name": "out0", - "pins": [ - { - "index": "0", - "name": "D1", - "value": "99" - } - ], - "virtual": false - }, - "position": { - "x": 728, - "y": 144 - } - }, - { - "id": "75566233-6418-463a-a42b-1e975f6caf7c", - "type": "basic.code", - "data": { - "code": "// INIT_CNT: Valor inicial de la cuenta\n// FIN_CNT: Valor final de la cuenta\n\n// El registro interno inicia su\n// cuenta a partir del valor del\n// parametro INIT_CNT\nreg [3:0] _o = INIT_CNT;\n\nalways @(posedge clk) begin\n if (en) begin\n _o <= _o - 1;\n // si _o es igual a 0 o al valor\n // de FIN_CNT se reinicia\n // la cuenta\n if (_o == FIN_CNT || _o == 0) begin\n _o <= INIT_CNT;\n end\n end\nend\n\nassign {o3, o2, o1, o0} = _o;\n\n// (tc) terminal count, un clk de ancho a\n// la salida cuando termina _o vale FIN_CNT o 0\nwire tc = ((_o == FIN_CNT || _o == 0) ? 1 : 0);", - "params": [ - { - "name": "INIT_CNT" - }, - { - "name": "FIN_CNT" - } - ], - "ports": { - "in": [ - { - "name": "en" - }, - { - "name": "clk" - } - ], - "out": [ - { - "name": "o0" - }, - { - "name": "o1" - }, - { - "name": "o2" - }, - { - "name": "o3" - }, - { - "name": "tc" - } - ] - } - }, - "position": { - "x": 248, - "y": 192 - } - }, - { - "id": "1e21f6ca-9956-475d-a933-5bb01829f464", - "type": "basic.output", - "data": { - "name": "out1", - "pins": [ - { - "index": "0", - "name": "D2", - "value": "98" - } - ], - "virtual": false - }, - "position": { - "x": 728, - "y": 216 - } - }, - { - "id": "dc5dc1c3-0471-4669-9760-2b2ee9d7d467", - "type": "3e6c249e205080168c1bf4ee8dbc33b50653d5f4", - "position": { - "x": 56, - "y": 224 - } - }, - { - "id": "e83e3ae9-0616-4a17-a145-f14954f3f6e0", - "type": "basic.output", - "data": { - "name": "out2", - "pins": [ - { - "index": "0", - "name": "D3", - "value": "97" - } - ], - "virtual": false - }, - "position": { - "x": 728, - "y": 288 - } - }, - { - "id": "8d6dece9-e3b8-42d4-b8eb-386c90440923", - "type": "basic.input", - "data": { - "name": "clk", - "pins": [ - { - "index": "0", - "name": "CLK", - "value": "21" - } - ], - "virtual": false - }, - "position": { - "x": 56, - "y": 352 - } - }, - { - "id": "1f036705-53b5-4833-83ed-adf0a7bf3b98", - "type": "basic.output", - "data": { - "name": "out3", - "pins": [ - { - "index": "0", - "name": "TR8", - "value": "117" - } - ], - "virtual": false - }, - "position": { - "x": 728, - "y": 360 - } - }, - { - "id": "a9409df4-b096-4ad0-a1c6-c6eb9bfa1d89", - "type": "basic.output", - "data": { - "name": "tc", - "pins": [ - { - "index": "0", - "name": "D4", - "value": "96" - } - ], - "virtual": false - }, - "position": { - "x": 728, - "y": 432 - } - } - ], - "wires": [ - { - "source": { - "block": "587cbcbb-9779-4bd4-a6da-501087ccf9d5", - "port": "constant-out" - }, - "target": { - "block": "75566233-6418-463a-a42b-1e975f6caf7c", - "port": "FIN_CNT" - } - }, - { - "source": { - "block": "579cff99-2d27-41d4-a20b-262ca8a93ca9", - "port": "constant-out" - }, - "target": { - "block": "75566233-6418-463a-a42b-1e975f6caf7c", - "port": "INIT_CNT" - } - }, - { - "source": { - "block": "75566233-6418-463a-a42b-1e975f6caf7c", - "port": "o0" - }, - "target": { - "block": "c1e3529f-d1eb-4ae5-8345-a43512f21577", - "port": "in" - } - }, - { - "source": { - "block": "75566233-6418-463a-a42b-1e975f6caf7c", - "port": "o1" - }, - "target": { - "block": "1e21f6ca-9956-475d-a933-5bb01829f464", - "port": "in" - } - }, - { - "source": { - "block": "75566233-6418-463a-a42b-1e975f6caf7c", - "port": "o2" - }, - "target": { - "block": "e83e3ae9-0616-4a17-a145-f14954f3f6e0", - "port": "in" - } - }, - { - "source": { - "block": "75566233-6418-463a-a42b-1e975f6caf7c", - "port": "o3" - }, - "target": { - "block": "1f036705-53b5-4833-83ed-adf0a7bf3b98", - "port": "in" - } - }, - { - "source": { - "block": "75566233-6418-463a-a42b-1e975f6caf7c", - "port": "tc" - }, - "target": { - "block": "a9409df4-b096-4ad0-a1c6-c6eb9bfa1d89", - "port": "in" - } - }, - { - "source": { - "block": "8d6dece9-e3b8-42d4-b8eb-386c90440923", - "port": "out" - }, - "target": { - "block": "75566233-6418-463a-a42b-1e975f6caf7c", - "port": "clk" - } - }, - { - "source": { - "block": "dc5dc1c3-0471-4669-9760-2b2ee9d7d467", - "port": "19c8f68d-5022-487f-9ab0-f0a3cd58bead" - }, - "target": { - "block": "75566233-6418-463a-a42b-1e975f6caf7c", - "port": "en" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - }, - "dependencies": { - "3e6c249e205080168c1bf4ee8dbc33b50653d5f4": { - "package": { - "name": "Bit 1", - "version": "1.0.0", - "description": "Assign 1 to the output wire", - "author": "Jesús Arroyo", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%2247.303%22%20height=%2227.648%22%20viewBox=%220%200%2044.346456%2025.919999%22%3E%3Ctext%20style=%22line-height:125%25%22%20x=%22325.218%22%20y=%22315.455%22%20font-weight=%22400%22%20font-size=%2212.669%22%20font-family=%22sans-serif%22%20letter-spacing=%220%22%20word-spacing=%220%22%20transform=%22translate(-307.01%20-298.51)%22%3E%3Ctspan%20x=%22325.218%22%20y=%22315.455%22%20style=%22-inkscape-font-specification:'Courier%2010%20Pitch'%22%20font-family=%22Courier%2010%20Pitch%22%3E1%3C/tspan%3E%3C/text%3E%3C/svg%3E" - }, - "design": { - "graph": { - "blocks": [ - { - "id": "b959fb96-ac67-4aea-90b3-ed35a4c17bf5", - "type": "basic.code", - "data": { - "code": "// Bit 1\n\nassign v = 1'b1;", - "params": [], - "ports": { - "in": [], - "out": [ - { - "name": "v" - } - ] - } - }, - "position": { - "x": 96, - "y": 96 - } - }, - { - "id": "19c8f68d-5022-487f-9ab0-f0a3cd58bead", - "type": "basic.output", - "data": { - "name": "" - }, - "position": { - "x": 608, - "y": 192 - } - } - ], - "wires": [ - { - "source": { - "block": "b959fb96-ac67-4aea-90b3-ed35a4c17bf5", - "port": "v" - }, - "target": { - "block": "19c8f68d-5022-487f-9ab0-f0a3cd58bead", - "port": "in" - } - } - ] - }, - "state": { - "pan": { - "x": 0, - "y": 0 - }, - "zoom": 1 - } - } - } - } -} \ No newline at end of file diff --git a/app/resources/collection/locale/en/en.po b/app/resources/collection/locale/en/en.po deleted file mode 100644 index f4992c297..000000000 --- a/app/resources/collection/locale/en/en.po +++ /dev/null @@ -1,195 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: 2017-02-11 18:14+0100\n" -"PO-Revision-Date: 2017-02-11 18:14+0100\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: en\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.7.1\n" -"X-Poedit-Basepath: ..\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Poedit-KeywordsList: gettext\n" -"X-Poedit-SearchPath-0: translation.js\n" - -#. / Bit -#: translation.js:14 -msgid "bit" -msgstr "Bit" - -#: translation.js:15 -msgid "Assign 0 to the output wire" -msgstr "Assign 0 to the output wire" - -#. / Config -#: translation.js:17 -msgid "config" -msgstr "Config" - -#. / Pull up -#: translation.js:19 -msgid "pull_up" -msgstr "Pull up" - -#. / Pull up inv -#: translation.js:21 -msgid "pull_up_inv" -msgstr "Pull up inv" - -#. / Tri-state -#: translation.js:23 -msgid "tri_state" -msgstr "Tri-state" - -#. / Logic -#: translation.js:25 -msgid "logic" -msgstr "Logic" - -#. / Combinational -#: translation.js:27 -msgid "combinational" -msgstr "Combinational" - -#. / Demux 1:2 -#: translation.js:29 -msgid "demux_1_2" -msgstr "Demux 1:2" - -#. / Demux 1:4 -#: translation.js:31 -msgid "demux_1_4" -msgstr "Demux 1:4" - -#. / Demux 1:8 -#: translation.js:33 -msgid "demux_1_8" -msgstr "Demux 1:8" - -#. / Hex 7 Segment CC -#: translation.js:35 -msgid "hex_7seg_cc" -msgstr "Hex 7 Segment CC" - -#. / Hex 7 Segment CA -#: translation.js:37 -msgid "hex_7seg_ca" -msgstr "Hex 7 Segment CA" - -#. / Mux 2:1 -#: translation.js:39 -msgid "mux_2_1" -msgstr "Mux 2:1" - -#. / Mux 4:1 -#: translation.js:41 -msgid "mux_4_1" -msgstr "Mux 4:1" - -#. / Gate -#: translation.js:43 -msgid "gate" -msgstr "Gate" - -#. / And -#: translation.js:45 -msgid "and" -msgstr "And" - -#. / Nand -#: translation.js:47 -msgid "nand" -msgstr "Nand" - -#. / Nor -#: translation.js:49 -msgid "nor" -msgstr "Nor" - -#. / Not -#: translation.js:51 -msgid "not" -msgstr "Not" - -#. / Or -#: translation.js:53 -msgid "or" -msgstr "Or" - -#. / Xnor -#: translation.js:55 -msgid "xnor" -msgstr "Xnor" - -#. / Xor -#: translation.js:57 -msgid "xor" -msgstr "Xor" - -#. / Sequential -#: translation.js:59 -msgid "sequential" -msgstr "Sequential" - -#. / D flip-flop async -#: translation.js:61 -msgid "dff_ar" -msgstr "D flip-flop async" - -#. / D flip-flop -#: translation.js:63 -msgid "dff_sr" -msgstr "D flip-flop" - -#. / T flip-flop async -#: translation.js:65 -msgid "tff_ar" -msgstr "T flip-flop async" - -#. / T flip-flop -#: translation.js:67 -msgid "tff_sr" -msgstr "T flip-flop" - -#. / Debouncer -#: translation.js:69 -msgid "debouncer" -msgstr "Debouncer" - -#. / 1. Basic -#: translation.js:71 -msgid "1_basic" -msgstr "1. Basic" - -#. / 2. Counter -#: translation.js:73 -msgid "2_counter" -msgstr "2. Counter" - -#. / 1. Led on -#: translation.js:75 -msgid "1_led_on" -msgstr "1. Led on" - -#. / 2. Switch led -#: translation.js:77 -msgid "2_switch_led" -msgstr "2. Switch led" - -#. / 3. Switch and gate -#: translation.js:79 -msgid "3_switch_and_gate" -msgstr "3. Switch and gate" - -#. / contadorAsc -#: translation.js:81 -msgid "contadorAsc" -msgstr "contadorAsc" - -#. / contadorDes -#: translation.js:83 -msgid "contadorDes" -msgstr "contadorDes" diff --git a/app/resources/collection/locale/es_ES/es_ES.po b/app/resources/collection/locale/es_ES/es_ES.po deleted file mode 100644 index 5e7a80c78..000000000 --- a/app/resources/collection/locale/es_ES/es_ES.po +++ /dev/null @@ -1,194 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: 2017-02-11 18:14+0100\n" -"PO-Revision-Date: \n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: es_ES\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.7.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Poedit-Basepath: ..\n" -"X-Poedit-SearchPath-0: translation.js\n" - -#. / Bit -#: translation.js:14 -msgid "bit" -msgstr "Bit" - -#: translation.js:15 -msgid "Assign 0 to the output wire" -msgstr "Asignar 0 al cable de salida" - -#. / Config -#: translation.js:17 -msgid "config" -msgstr "Config" - -#. / Pull up -#: translation.js:19 -msgid "pull_up" -msgstr "Pull up" - -#. / Pull up inv -#: translation.js:21 -msgid "pull_up_inv" -msgstr "Pull up inv" - -#. / Tri-state -#: translation.js:23 -msgid "tri_state" -msgstr "Tri-estado" - -#. / Logic -#: translation.js:25 -msgid "logic" -msgstr "Lógica" - -#. / Combinational -#: translation.js:27 -msgid "combinational" -msgstr "Combinacional" - -#. / Demux 1:2 -#: translation.js:29 -msgid "demux_1_2" -msgstr "Demux 1:2" - -#. / Demux 1:4 -#: translation.js:31 -msgid "demux_1_4" -msgstr "Demux 1:4" - -#. / Demux 1:8 -#: translation.js:33 -msgid "demux_1_8" -msgstr "Demux 1:8" - -#. / Hex 7 Segment CC -#: translation.js:35 -msgid "hex_7seg_cc" -msgstr "Hex 7 Segment CC" - -#. / Hex 7 Segment CA -#: translation.js:37 -msgid "hex_7seg_ca" -msgstr "Hex 7 Segment AC" - -#. / Mux 2:1 -#: translation.js:39 -msgid "mux_2_1" -msgstr "Mux 2:1" - -#. / Mux 4:1 -#: translation.js:41 -msgid "mux_4_1" -msgstr "Mux 4:1" - -#. / Gate -#: translation.js:43 -msgid "gate" -msgstr "Puerta" - -#. / And -#: translation.js:45 -msgid "and" -msgstr "And" - -#. / Nand -#: translation.js:47 -msgid "nand" -msgstr "Nand" - -#. / Nor -#: translation.js:49 -msgid "nor" -msgstr "Nor" - -#. / Not -#: translation.js:51 -msgid "not" -msgstr "Not" - -#. / Or -#: translation.js:53 -msgid "or" -msgstr "Or" - -#. / Xnor -#: translation.js:55 -msgid "xnor" -msgstr "Xnor" - -#. / Xor -#: translation.js:57 -msgid "xor" -msgstr "Xor" - -#. / Sequential -#: translation.js:59 -msgid "sequential" -msgstr "Secuencial" - -#. / D flip-flop async -#: translation.js:61 -msgid "dff_ar" -msgstr "Biestable D asinc" - -#. / D flip-flop -#: translation.js:63 -msgid "dff_sr" -msgstr "Biestable D" - -#. / T flip-flop async -#: translation.js:65 -msgid "tff_ar" -msgstr "Biestable T asinc" - -#. / T flip-flop -#: translation.js:67 -msgid "tff_sr" -msgstr "Biestable T" - -#. / Debouncer -#: translation.js:69 -msgid "debouncer" -msgstr "Antirrebotes" - -#. / 1. Basic -#: translation.js:71 -msgid "1_basic" -msgstr "1. Básico" - -#. / 2. Counter -#: translation.js:73 -msgid "2_counter" -msgstr "2. Counter" - -#. / 1. Led on -#: translation.js:75 -msgid "1_led_on" -msgstr "1. Encender led" - -#. / 2. Switch led -#: translation.js:77 -msgid "2_switch_led" -msgstr "2. Interruptor con led" - -#. / 3. Switch and gate -#: translation.js:79 -msgid "3_switch_and_gate" -msgstr "3. Interruptor con puerta and" - -#. / contadorAsc -#: translation.js:81 -msgid "contadorAsc" -msgstr "Contador ascendente" - -#. / contadorDes -#: translation.js:83 -msgid "contadorDes" -msgstr "Contador descendente" diff --git a/app/resources/collection/locale/eu_ES/eu_ES.po b/app/resources/collection/locale/eu_ES/eu_ES.po deleted file mode 100644 index ed5531314..000000000 --- a/app/resources/collection/locale/eu_ES/eu_ES.po +++ /dev/null @@ -1,190 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: 2017-02-08 18:07+0100\n" -"PO-Revision-Date: \n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: eu_ES\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.7.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Poedit-Basepath: ..\n" -"X-Poedit-SearchPath-0: translation.js\n" - -#. / Bit -#: translation.js:14 -msgid "bit" -msgstr "Bit" - -#. / Config -#: translation.js:16 -msgid "config" -msgstr "Config" - -#. / Pull up -#: translation.js:18 -msgid "pull_up" -msgstr "Pull up" - -#. / Pull up inv -#: translation.js:20 -msgid "pull_up_inv" -msgstr "Pull up inv" - -#. / Tri-state -#: translation.js:22 -msgid "tri_state" -msgstr "Tri-state" - -#. / Logic -#: translation.js:24 -msgid "logic" -msgstr "Logika" - -#. / Combinational -#: translation.js:26 -msgid "combinational" -msgstr "Konbinazionala" - -#. / Demux 1:2 -#: translation.js:28 -msgid "demux_1_2" -msgstr "Demux 1:2" - -#. / Demux 1:4 -#: translation.js:30 -msgid "demux_1_4" -msgstr "Demux 1:4" - -#. / Demux 1:8 -#: translation.js:32 -msgid "demux_1_8" -msgstr "Demux 1:8" - -#. / Hex 7 Segment CC -#: translation.js:34 -msgid "hex_7seg_cc" -msgstr "Hex 7 Segment CC" - -#. / Hex 7 Segment CA -#: translation.js:36 -msgid "hex_7seg_ca" -msgstr "Hex 7 Segment CA" - -#. / Mux 2:1 -#: translation.js:38 -msgid "mux_2_1" -msgstr "Mux 2:1" - -#. / Mux 4:1 -#: translation.js:40 -msgid "mux_4_1" -msgstr "Mux 4:1" - -#. / Gate -#: translation.js:42 -msgid "gate" -msgstr "Atea" - -#. / And -#: translation.js:44 -msgid "and" -msgstr "And" - -#. / Nand -#: translation.js:46 -msgid "nand" -msgstr "Nand" - -#. / Nor -#: translation.js:48 -msgid "nor" -msgstr "Nor" - -#. / Not -#: translation.js:50 -msgid "not" -msgstr "Not" - -#. / Or -#: translation.js:52 -msgid "or" -msgstr "Or" - -#. / Xnor -#: translation.js:54 -msgid "xnor" -msgstr "Xnor" - -#. / Xor -#: translation.js:56 -msgid "xor" -msgstr "Xor" - -#. / Sequential -#: translation.js:58 -msgid "sequential" -msgstr "Sekuentziala" - -#. / D flip-flop async -#: translation.js:60 -msgid "dff_ar" -msgstr "D biegonkor asink" - -#. / D flip-flop -#: translation.js:62 -msgid "dff_sr" -msgstr "D biegonkorra" - -#. / T flip-flop async -#: translation.js:64 -msgid "tff_ar" -msgstr "T biegonkor asink" - -#. / T flip-flop -#: translation.js:66 -msgid "tff_sr" -msgstr "T biegonkorra" - -#. / Debouncer -#: translation.js:68 -msgid "debouncer" -msgstr "Erreboteen aurkakoa" - -#. / 1. Basic -#: translation.js:70 -msgid "1_basic" -msgstr "1. Oinarrizkoa" - -#. / 2. Counter -#: translation.js:72 -msgid "2_counter" -msgstr "" - -#. / 1. Led on -#: translation.js:74 -msgid "1_led_on" -msgstr "1. Leda piztu" - -#. / 2. Switch led -#: translation.js:76 -msgid "2_switch_led" -msgstr "2. Pultsadorea leda" - -#. / 3. Switch and gate -#: translation.js:78 -msgid "3_switch_and_gate" -msgstr "3. Pultsadorea eta AND atea" - -#. / contadorAsc -#: translation.js:80 -msgid "contadorAsc" -msgstr "Goranzko zenbatzailea" - -#. / contadorDes -#: translation.js:82 -msgid "contadorDes" -msgstr "Beheranzko zenbatzailea" diff --git a/app/resources/collection/locale/fr_FR/fr_FR.po b/app/resources/collection/locale/fr_FR/fr_FR.po deleted file mode 100644 index b27e50a30..000000000 --- a/app/resources/collection/locale/fr_FR/fr_FR.po +++ /dev/null @@ -1,190 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: 2017-02-08 18:08+0100\n" -"PO-Revision-Date: \n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: fr_FR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.7.1\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Poedit-Basepath: ..\n" -"X-Poedit-SearchPath-0: translation.js\n" - -#. / Bit -#: translation.js:14 -msgid "bit" -msgstr "Bit" - -#. / Config -#: translation.js:16 -msgid "config" -msgstr "Configuration" - -#. / Pull up -#: translation.js:18 -msgid "pull_up" -msgstr "Pull up" - -#. / Pull up inv -#: translation.js:20 -msgid "pull_up_inv" -msgstr "Pull up inv" - -#. / Tri-state -#: translation.js:22 -msgid "tri_state" -msgstr "Tri-state" - -#. / Logic -#: translation.js:24 -msgid "logic" -msgstr "Logique" - -#. / Combinational -#: translation.js:26 -msgid "combinational" -msgstr "Combinatoire" - -#. / Demux 1:2 -#: translation.js:28 -msgid "demux_1_2" -msgstr "Démultiplexeur 1:2" - -#. / Demux 1:4 -#: translation.js:30 -msgid "demux_1_4" -msgstr "Démultiplexeur 1:4" - -#. / Demux 1:8 -#: translation.js:32 -msgid "demux_1_8" -msgstr "Démultiplexeur 1:8" - -#. / Hex 7 Segment CC -#: translation.js:34 -msgid "hex_7seg_cc" -msgstr "Hex 7 Segment CC" - -#. / Hex 7 Segment CA -#: translation.js:36 -msgid "hex_7seg_ca" -msgstr "Hex 7 Segment CA" - -#. / Mux 2:1 -#: translation.js:38 -msgid "mux_2_1" -msgstr "Multiplexeur 2:1" - -#. / Mux 4:1 -#: translation.js:40 -msgid "mux_4_1" -msgstr "Multiplexeur 4:1" - -#. / Gate -#: translation.js:42 -msgid "gate" -msgstr "Porte" - -#. / And -#: translation.js:44 -msgid "and" -msgstr "Et" - -#. / Nand -#: translation.js:46 -msgid "nand" -msgstr "Non Et" - -#. / Nor -#: translation.js:48 -msgid "nor" -msgstr "Non Ou" - -#. / Not -#: translation.js:50 -msgid "not" -msgstr "Non" - -#. / Or -#: translation.js:52 -msgid "or" -msgstr "Ou" - -#. / Xnor -#: translation.js:54 -msgid "xnor" -msgstr "Xnor" - -#. / Xor -#: translation.js:56 -msgid "xor" -msgstr "Xor" - -#. / Sequential -#: translation.js:58 -msgid "sequential" -msgstr "Séquentiel" - -#. / D flip-flop async -#: translation.js:60 -msgid "dff_ar" -msgstr "D flip-flop async" - -#. / D flip-flop -#: translation.js:62 -msgid "dff_sr" -msgstr "D flip-flop" - -#. / T flip-flop async -#: translation.js:64 -msgid "tff_ar" -msgstr "T flip-flop async" - -#. / T flip-flop -#: translation.js:66 -msgid "tff_sr" -msgstr "T flip-flop" - -#. / Debouncer -#: translation.js:68 -msgid "debouncer" -msgstr "" - -#. / 1. Basic -#: translation.js:70 -msgid "1_basic" -msgstr "1. Basique" - -#. / 2. Counter -#: translation.js:72 -msgid "2_counter" -msgstr "" - -#. / 1. Led on -#: translation.js:74 -msgid "1_led_on" -msgstr "1. Led on" - -#. / 2. Switch led -#: translation.js:76 -msgid "2_switch_led" -msgstr "2. Switch led" - -#. / 3. Switch and gate -#: translation.js:78 -msgid "3_switch_and_gate" -msgstr "3. Switch and gate" - -#. / contadorAsc -#: translation.js:80 -msgid "contadorAsc" -msgstr "" - -#. / contadorDes -#: translation.js:82 -msgid "contadorDes" -msgstr "" diff --git a/app/resources/collection/locale/gl_ES/gl_ES.po b/app/resources/collection/locale/gl_ES/gl_ES.po deleted file mode 100644 index c85d7487e..000000000 --- a/app/resources/collection/locale/gl_ES/gl_ES.po +++ /dev/null @@ -1,190 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: 2017-02-08 18:08+0100\n" -"PO-Revision-Date: \n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: gl_ES\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.7.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Poedit-Basepath: ..\n" -"X-Poedit-SearchPath-0: translation.js\n" - -#. / Bit -#: translation.js:14 -msgid "bit" -msgstr "Bit" - -#. / Config -#: translation.js:16 -msgid "config" -msgstr "Config" - -#. / Pull up -#: translation.js:18 -msgid "pull_up" -msgstr "Pull up" - -#. / Pull up inv -#: translation.js:20 -msgid "pull_up_inv" -msgstr "Pull up inv" - -#. / Tri-state -#: translation.js:22 -msgid "tri_state" -msgstr "Tri-state" - -#. / Logic -#: translation.js:24 -msgid "logic" -msgstr "Lóxica" - -#. / Combinational -#: translation.js:26 -msgid "combinational" -msgstr "" - -#. / Demux 1:2 -#: translation.js:28 -msgid "demux_1_2" -msgstr "Demux 1:2" - -#. / Demux 1:4 -#: translation.js:30 -msgid "demux_1_4" -msgstr "Demux 1:4" - -#. / Demux 1:8 -#: translation.js:32 -msgid "demux_1_8" -msgstr "Demux 1:8" - -#. / Hex 7 Segment CC -#: translation.js:34 -msgid "hex_7seg_cc" -msgstr "Hex 7 Segment CC" - -#. / Hex 7 Segment CA -#: translation.js:36 -msgid "hex_7seg_ca" -msgstr "Hex 7 Segment CA" - -#. / Mux 2:1 -#: translation.js:38 -msgid "mux_2_1" -msgstr "Mux 2:1" - -#. / Mux 4:1 -#: translation.js:40 -msgid "mux_4_1" -msgstr "Mux 4:1" - -#. / Gate -#: translation.js:42 -msgid "gate" -msgstr "Gate" - -#. / And -#: translation.js:44 -msgid "and" -msgstr "And" - -#. / Nand -#: translation.js:46 -msgid "nand" -msgstr "Nand" - -#. / Nor -#: translation.js:48 -msgid "nor" -msgstr "Nor" - -#. / Not -#: translation.js:50 -msgid "not" -msgstr "Not" - -#. / Or -#: translation.js:52 -msgid "or" -msgstr "Or" - -#. / Xnor -#: translation.js:54 -msgid "xnor" -msgstr "Xnor" - -#. / Xor -#: translation.js:56 -msgid "xor" -msgstr "Xor" - -#. / Sequential -#: translation.js:58 -msgid "sequential" -msgstr "" - -#. / D flip-flop async -#: translation.js:60 -msgid "dff_ar" -msgstr "Bistable D asinc" - -#. / D flip-flop -#: translation.js:62 -msgid "dff_sr" -msgstr "Bistable D" - -#. / T flip-flop async -#: translation.js:64 -msgid "tff_ar" -msgstr "Bistable T asinc" - -#. / T flip-flop -#: translation.js:66 -msgid "tff_sr" -msgstr "Bistable T" - -#. / Debouncer -#: translation.js:68 -msgid "debouncer" -msgstr "" - -#. / 1. Basic -#: translation.js:70 -msgid "1_basic" -msgstr "1. Básico" - -#. / 2. Counter -#: translation.js:72 -msgid "2_counter" -msgstr "" - -#. / 1. Led on -#: translation.js:74 -msgid "1_led_on" -msgstr "1. Acender led" - -#. / 2. Switch led -#: translation.js:76 -msgid "2_switch_led" -msgstr "2. Interruptor con led" - -#. / 3. Switch and gate -#: translation.js:78 -msgid "3_switch_and_gate" -msgstr "3. Interruptor con porta and" - -#. / contadorAsc -#: translation.js:80 -msgid "contadorAsc" -msgstr "" - -#. / contadorDes -#: translation.js:82 -msgid "contadorDes" -msgstr "" diff --git a/app/resources/collection/locale/translation.js b/app/resources/collection/locale/translation.js deleted file mode 100644 index 4edecf710..000000000 --- a/app/resources/collection/locale/translation.js +++ /dev/null @@ -1,83 +0,0 @@ -// Translation document for the Default collection -// =============================================== -// This file contains the labels and comments annotated for translation -// -// IMPORTANT: Configure Poedit: -// 1. Go to Edit > Preferences > Extractors -// 2. Select "JavaScript" and press "Edit" -// 3. Change the "Command to extract translations:" field: -// - Replace the text "TRANSLATORS:" by a slash -// 4. Press "OK" and "Close" - - -/// Bit -gettext('bit'); -gettext('Assign 0 to the output wire'); -/// Config -gettext('config'); -/// Pull up -gettext('pull_up'); -/// Pull up inv -gettext('pull_up_inv'); -/// Tri-state -gettext('tri_state'); -/// Logic -gettext('logic'); -/// Combinational -gettext('combinational'); -/// Demux 1:2 -gettext('demux_1_2'); -/// Demux 1:4 -gettext('demux_1_4'); -/// Demux 1:8 -gettext('demux_1_8'); -/// Hex 7 Segment CC -gettext('hex_7seg_cc'); -/// Hex 7 Segment CA -gettext('hex_7seg_ca'); -/// Mux 2:1 -gettext('mux_2_1'); -/// Mux 4:1 -gettext('mux_4_1'); -/// Gate -gettext('gate'); -/// And -gettext('and'); -/// Nand -gettext('nand'); -/// Nor -gettext('nor'); -/// Not -gettext('not'); -/// Or -gettext('or'); -/// Xnor -gettext('xnor'); -/// Xor -gettext('xor'); -/// Sequential -gettext('sequential'); -/// D flip-flop async -gettext('dff_ar'); -/// D flip-flop -gettext('dff_sr'); -/// T flip-flop async -gettext('tff_ar'); -/// T flip-flop -gettext('tff_sr'); -/// Debouncer -gettext('debouncer'); -/// 1. Basic -gettext('1_basic'); -/// 2. Counter -gettext('2_counter'); -/// 1. Led on -gettext('1_led_on'); -/// 2. Switch led -gettext('2_switch_led'); -/// 3. Switch and gate -gettext('3_switch_and_gate'); -/// contadorAsc -gettext('contadorAsc'); -/// contadorDes -gettext('contadorDes'); diff --git a/app/resources/collection/package.json b/app/resources/collection/package.json deleted file mode 100644 index 0c75aa0ab..000000000 --- a/app/resources/collection/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "Default", - "version": "0.0.1", - "description": "Default collection", - "keywords": "default, collection", - "license": "GPL-2.0", - "authors" : [ - { - "name": "Jesús Arroyo", - "email": "", - "url": "" - }, - { - "name": "Juan González", - "email": "", - "url": "" - }, - { - "name": "Carlos Díaz", - "email": "", - "url": "" - }, - { - "name": "Salvador E. Tropea", - "email": "", - "url": "" - } - ], - "repository": { - "type": "git", - "url": "https://github.com/FPGAwars/icestudio" - } -} diff --git a/app/resources/locale/ca_ES/ca_ES.po b/app/resources/locale/ca_ES/ca_ES.po new file mode 100644 index 000000000..c3f2567dd --- /dev/null +++ b/app/resources/locale/ca_ES/ca_ES.po @@ -0,0 +1,818 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: Francisco Sayas \n" +"Language-Team: \n" +"Language: ca_ES\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7.1\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: app/scripts/services/drivers.js:200 app/scripts/services/drivers.js:81 +msgid "Unplug and reconnect the board" +msgstr "Desconnecta i connecta la placa" + +#: app/scripts/services/drivers.js:189 +msgid "" +"

FTDI driver installation instructions

  1. Connect the FPGA " +"board
  2. Replace the (Interface 0) driver of the board by " +"libusbK
  3. Unplug and reconnect the board
" +msgstr "" +"

Instruccions d'instal·lació del driver FTDI

  1. Connecta la " +"placa FPGA
  2. Reemplaça el driver de la (Interface 0) de la " +"placa por libusbK
  3. Desconnecta i connecta la placa
" + +#: app/scripts/services/drivers.js:207 +msgid "" +"

FTDI driver uninstallation instructions

  1. Find the FPGA USB " +"Device
  2. Select the board interface and uninstall the driver
" +msgstr "" +"

Instruccions de desinstal·lació del driver FTDI

  1. Troba el " +"dispositiu USB de la FPGA
  2. Selecciona la interfície de la placa i " +"desinstal·la el driver
" + +#: app/views/menu.html:309 +msgid "About Icestudio" +msgstr "Quant a Icestudio" + +#: app/views/menu.html:263 +msgid "Add" +msgstr "Afegir" + +#: app/scripts/controllers/menu.js:516 +msgid "Add a block to start" +msgstr "Afegeix un bloc per a iniciar" + +#: app/views/menu.html:43 +msgid "Add as block" +msgstr "Afegeix com a bloc" + +#: app/scripts/services/tools.js:895 +msgid "All collections removed" +msgstr "Col·leccions eliminades" + +#: app/scripts/controllers/menu.js:538 +msgid "All stored collections will be lost. Do you want to continue?" +msgstr "Totes les col·leccions emmagatzemades es perdran. Vols continuar?" + +#: app/scripts/services/utils.js:530 +msgid "Author" +msgstr "Autor" + +#: app/views/menu.html:320 +msgid "Basic" +msgstr "Bàsic" + +#: app/views/languages.html:22 +msgid "Basque" +msgstr "Basc" + +#: app/scripts/services/blocks.js:755 app/scripts/services/blocks.js:776 +#: app/scripts/services/blocks.js:831 app/scripts/services/blocks.js:850 +#: app/scripts/services/blocks.js:885 app/scripts/services/blocks.js:926 +#: app/scripts/services/blocks.js:960 +msgid "Block updated" +msgstr "Bloc actualitzat" + +#: app/scripts/services/project.js:413 +msgid "Block {{name}} imported" +msgstr "Bloc {{name}} importat" + +#: app/views/menu.html:35 +msgid "Blocks" +msgstr "Blocs" + +#: app/views/menu.html:174 +msgid "Board" +msgstr "Placa" + +#: app/views/menu.html:115 app/views/menu.html:162 +msgid "Board rules" +msgstr "Regles de la placa" + +#: app/scripts/controllers/menu.js:341 +msgid "Board rules disabled" +msgstr "Regles de la placa inhabilitades" + +#: app/scripts/controllers/menu.js:336 +msgid "Board rules enabled" +msgstr "Regles de la placa habilitades" + +#: app/scripts/services/tools.js:254 +msgid "Board {{name}} not detected" +msgstr "Placa {{name}} no detectada" + +#: app/scripts/controllers/menu.js:477 +msgid "Board {{name}} selected" +msgstr "Placa {{name}} seleccionada" + +#: app/views/menu.html:209 +msgid "Build" +msgstr "Sintetitza" + +#: app/scripts/controllers/main.js:16 +msgid "Cancel" +msgstr "Cancel·la" + +#: app/views/languages.html:34 +msgid "Catalan" +msgstr "Català" + +#: app/scripts/services/tools.js:605 +msgid "Check Internet connection..." +msgstr "Comprovant connexió a Internet..." + +#: app/scripts/services/tools.js:613 +msgid "Check Python..." +msgstr "Comprovant Python" + +#: app/scripts/services/drivers.js:104 +msgid "Click here to install it" +msgstr "" + +#: app/views/menu.html:334 +msgid "Code" +msgstr "Codi" + +#: app/views/menu.html:185 +msgid "Collection" +msgstr "Col·lecció" + +#: app/views/menu.html:165 +msgid "Collection info" +msgstr "" + +#: app/scripts/controllers/menu.js:436 +msgid "Collection {{collection}} info not defined" +msgstr "" + +#: app/scripts/services/tools.js:773 +msgid "Collection {{name}} added" +msgstr "Col·lecció {{name}} afegida" + +#: app/scripts/services/tools.js:767 +msgid "Collection {{name}} not replaced" +msgstr "Col·lecció {{name}} no reemplaçada" + +#: app/scripts/services/tools.js:889 +msgid "Collection {{name}} removed" +msgstr "Col·lecció {{name}} eliminada" + +#: app/scripts/services/tools.js:763 +msgid "Collection {{name}} replaced" +msgstr "Col·lecció {{name}} reemplaçada" + +#: app/scripts/controllers/menu.js:444 +msgid "Collection {{name}} selected" +msgstr "Col·lecció {{name}} seleccionada" + +#: app/views/menu.html:259 +msgid "Collections" +msgstr "Col·leccions" + +#: app/views/menu.html:305 +msgid "Community forum" +msgstr "Fòrum de la comunitat" + +#: app/views/menu.html:331 +msgid "Constant" +msgstr "Constant" + +#: app/views/menu.html:91 +msgid "Copy" +msgstr "Copia" + +#: app/views/menu.html:88 +msgid "Cut" +msgstr "Retalla" + +#: app/views/menu.html:159 +msgid "Datasheet" +msgstr "Full de dades" + +#: app/views/menu.html:189 +msgid "Default" +msgstr "Per defecte" + +#: app/scripts/services/tools.js:481 +msgid "" +"Default toolchain not found. Toolchain will be downloaded. This operation " +"requires Internet connection. Do you want to continue?" +msgstr "" +"La toolchain per defecte no es troba, per la qual cosa serà descarregada. " +"Aquesta operació requereix connexió a Internet. Vols continuar?" + +#: app/scripts/services/utils.js:529 +msgid "Description" +msgstr "Descripció" + +#: app/views/menu.html:126 app/views/menu.html:252 +msgid "Disable" +msgstr "Inhabilita" + +#: app/scripts/controllers/menu.js:241 +msgid "Do you want to close the application?" +msgstr "Vols tancar l'aplicació?" + +#: app/scripts/services/project.js:106 +msgid "Do you want to convert it?" +msgstr "Vols convertir-lo?" + +#: app/scripts/controllers/menu.js:528 +msgid "Do you want to remove the {{name}} collection?" +msgstr "Vols eliminar la col·lecció {{name}}?" + +#: app/scripts/services/tools.js:759 +msgid "Do you want to replace it?" +msgstr "Vols reemplaçar-la?" + +#: app/views/menu.html:298 +msgid "Documentation" +msgstr "Documentació" + +#: app/views/menu.html:243 +msgid "Drivers" +msgstr "Drivers" + +#: app/scripts/services/drivers.js:128 app/scripts/services/drivers.js:78 +msgid "Drivers disabled" +msgstr "Drivers inhabilitats" + +#: app/scripts/services/drivers.js:120 app/scripts/services/drivers.js:75 +msgid "Drivers enabled" +msgstr "Drivers habilitats" + +#: app/scripts/services/tools.js:265 +msgid "Duplicated FPGA I/O ports" +msgstr "Ports d'E/S de la FPGA duplicats" + +#: app/scripts/services/blocks.js:376 +msgid "Duplicated block attributes" +msgstr "Atributs de bloc duplicats" + +#: app/views/menu.html:78 +msgid "Edit" +msgstr "Edita" + +#: app/scripts/services/tools.js:748 +msgid "Edit the collection name" +msgstr "" + +#: app/views/menu.html:121 app/views/menu.html:247 +msgid "Enable" +msgstr "Habilita" + +#: app/views/languages.html:4 +msgid "English" +msgstr "Anglés" + +#: app/scripts/services/blocks.js:185 +msgid "Enter the constant blocks" +msgstr "Introdueix els blocs constant" + +#: app/scripts/services/blocks.js:52 +msgid "Enter the input blocks" +msgstr "Introdueix els blocs d'entrada" + +#: app/scripts/services/blocks.js:275 +msgid "Enter the input ports" +msgstr "Introdueix els ports d'entrada" + +#: app/scripts/services/blocks.js:114 +msgid "Enter the output blocks" +msgstr "Introdueix els blocs de sortida" + +#: app/scripts/services/blocks.js:276 +msgid "Enter the output ports" +msgstr "Introdueix els ports de sortida" + +#: app/scripts/services/blocks.js:277 +msgid "Enter the parameters" +msgstr "Introdueix els paràmetres" + +#: app/scripts/controllers/menu.js:328 +msgid "Enter the remote hostname user@host (experimental)" +msgstr "Introdueix el nom del host remot usuari@host" + +#: app/scripts/services/tools.js:504 +msgid "Error: default toolchain not found in '{{dir}}'" +msgstr "Error: toolchain per defecte no trobada en '{{dir}}'" + +#: app/scripts/services/utils.js:670 +msgid "Error: {{error}}" +msgstr "Error: {{error}}" + +#: app/scripts/services/tools.js:336 +msgid "Errors detected in the code" +msgstr "" + +#: app/views/menu.html:39 +msgid "Examples" +msgstr "Exemples" + +#: app/scripts/services/tools.js:206 +msgid "Execute remote {{label}} ..." +msgstr "Executa {{label}} remot..." + +#: app/views/menu.html:54 +msgid "Export" +msgstr "Exporta" + +#: app/scripts/services/tools.js:637 +msgid "Extract default apio files..." +msgstr "Extreu fitxers de apio..." + +#: app/scripts/services/tools.js:647 +msgid "Extract default apio packages..." +msgstr "Extreu paquets de apio..." + +#: app/scripts/services/tools.js:625 +msgid "Extract virtual env files..." +msgstr "Extreu fitxers de l'entorn virtual" + +#: app/scripts/services/tools.js:262 +msgid "FPGA I/O ports not defined" +msgstr "Ports d'E/S de la FPGA no definits" + +#: app/scripts/services/blocks.js:115 app/scripts/services/blocks.js:53 +#: app/scripts/services/blocks.js:711 app/scripts/services/blocks.js:791 +msgid "FPGA pin" +msgstr "FPGA pin" + +#: app/views/menu.html:26 +msgid "File" +msgstr "Fitxer" + +#: app/scripts/services/project.js:425 +msgid "" +"File {{file}} already exists in the project path. Do you want to replace it?" +msgstr "" +"El fitxer {{file}} ja existeix en el directori del projecte. Vols reemplaçar-" +"lo?" + +#: app/scripts/services/tools.js:182 +msgid "File {{file}} does not exist" +msgstr "El fitxer {{file}} no existeix" + +#: app/scripts/services/project.js:459 +msgid "File {{file}} imported" +msgstr "Fitxer {{file}} importat" + +#: app/views/menu.html:104 +msgid "Fit content" +msgstr "Ajustar contingut" + +#: app/views/languages.html:28 +msgid "French" +msgstr "Francès" + +#: app/scripts/controllers/menu.js:220 +msgid "GTKWave exported" +msgstr "GTKWave exportat" + +#: app/views/languages.html:16 +msgid "Galician" +msgstr "Gallec" + +#: app/views/menu.html:288 +msgid "Help" +msgstr "Ajuda" + +#: app/scripts/services/utils.js:543 +msgid "Image" +msgstr "Imatge" + +#: app/scripts/controllers/menu.js:688 +msgid "Image {{name}} saved" +msgstr "Imatge {{name}} desada" + +#: app/views/menu.html:337 +msgid "Information" +msgstr "Informació" + +#: app/views/menu.html:325 +msgid "Input" +msgstr "Entrada" + +#: app/views/menu.html:220 +msgid "Install" +msgstr "Instal·lar" + +#: app/scripts/services/tools.js:642 +msgid "Install default apio..." +msgstr "Instal·lar apio" + +#: app/scripts/services/tools.js:691 +msgid "Installation completed" +msgstr "Instal·lació completada" + +#: app/scripts/services/tools.js:534 app/scripts/services/tools.js:571 +msgid "Installing toolchain" +msgstr "Instal·lant la toolchain" + +#: app/scripts/services/drivers.js:112 app/scripts/services/tools.js:607 +msgid "Internet connection required" +msgstr "És necessari connexió a Internet" + +#: app/scripts/services/graph.js:179 +msgid "Invalid Pull up connection:
block already connected" +msgstr "Connexió de Pull up no vàlida: bloc ja connectat" + +#: app/scripts/services/graph.js:193 +msgid "Invalid Pull up connection:
only Input blocks allowed" +msgstr "" +"Connexió Pull up no vàlida:
nomes blocs Entrada són " +"permitits" + +#: app/scripts/services/graph.js:185 +msgid "Invalid block connection:
Pull up already connected" +msgstr "Connexió de blocs no vàlida:
Pull up connectada" + +#: app/scripts/services/tools.js:779 +msgid "Invalid collection {{name}}" +msgstr "Col·lecció {{name}} invàlida" + +#: app/scripts/services/graph.js:143 app/scripts/services/graph.js:150 +#: app/scripts/services/graph.js:157 +msgid "Invalid connection" +msgstr "Connexió no vàlida" + +#: app/scripts/services/graph.js:212 +msgid "Invalid connection: {{a}} → {{b}}" +msgstr "Connexió no vàlida: {{a}} → {{b}}" + +#: app/scripts/services/graph.js:173 +msgid "Invalid multiple input connections" +msgstr "Connexions d'entrada múltiple no vàlides" + +#: app/scripts/services/drivers.js:190 +msgid "It is recommended to use USB 2.0 ports" +msgstr "" + +#: app/views/menu.html:134 +msgid "Language" +msgstr "Idioma" + +#: app/scripts/services/blocks.js:186 app/scripts/services/blocks.js:864 +msgid "Local parameter" +msgstr "Paràmetre local" + +#: app/scripts/services/tools.js:630 +msgid "Make virtual env..." +msgstr "Crear entorn virtual" + +#: app/scripts/services/utils.js:527 +msgid "Name" +msgstr "Nom" + +#: app/views/menu.html:29 +msgid "New" +msgstr "Nou" + +#: app/scripts/services/project.js:81 +msgid "New project {{name}} created" +msgstr "Nou projecte {{name}} creat" + +#: app/scripts/controllers/menu.js:546 +msgid "No collections stored" +msgstr "Cap col·lecció emmagatzemada" + +#: app/scripts/controllers/main.js:15 +msgid "OK" +msgstr "D'acord" + +#: app/scripts/services/project.js:364 app/scripts/services/project.js:99 +msgid "Old project format {{version}}" +msgstr "Format de projecte antic {{version}}" + +#: app/views/menu.html:32 +msgid "Open" +msgstr "Obre" + +#: app/scripts/services/utils.js:550 +msgid "Open SVG" +msgstr "Obre SVG" + +#: app/scripts/services/project.js:462 +msgid "Original file {{file}} does not exist" +msgstr "El fitxer original {{file}} no existeix" + +#: app/views/menu.html:328 +msgid "Output" +msgstr "Eixida" + +#: app/scripts/controllers/menu.js:202 +msgid "PCF file exported" +msgstr "Fitxer PCF exportat" + +#: app/views/menu.html:94 +msgid "Paste" +msgstr "Enganxa" + +#: app/scripts/services/utils.js:872 +msgid "Please run: {{cmd}}" +msgstr "" + +#: app/views/menu.html:108 +msgid "Preferences" +msgstr "Preferències" + +#: app/views/menu.html:111 +msgid "Project information" +msgstr "Informació del projecte" + +#: app/scripts/services/project.js:125 +msgid "Project {{name}} loaded" +msgstr "Projecte {{name}} carregat" + +#: app/scripts/services/project.js:334 +msgid "Project {{name}} saved" +msgstr "Projecte {{name}} desat" + +#: app/scripts/services/tools.js:618 +msgid "Python 2.7 is required" +msgstr "És necessari Python 2.7" + +#: app/views/menu.html:72 +msgid "Quit" +msgstr "Tanca" + +#: app/scripts/services/blocks.js:946 app/views/design.html:5 +msgid "Read only" +msgstr "Només lectura" + +#: app/views/menu.html:84 +msgid "Redo" +msgstr "Refés" + +#: app/scripts/services/tools.js:368 +msgid "Remote host {{name}} not connected" +msgstr "Host remot {{name}} no connectat" + +#: app/views/menu.html:140 +msgid "Remote hostname" +msgstr "Nom del host remot" + +#: app/views/menu.html:228 app/views/menu.html:267 +msgid "Remove" +msgstr "Suprimir" + +#: app/views/menu.html:279 +msgid "Remove all" +msgstr "Suprimir tot" + +#: app/scripts/services/utils.js:552 +msgid "Reset SVG" +msgstr "Reseteja SVG" + +#: app/views/menu.html:233 +msgid "Reset default" +msgstr "Resetejar els valors per defecte" + +#: app/views/menu.html:101 +msgid "Reset view" +msgstr "Resetejar vista" + +#: app/views/menu.html:47 +msgid "Save" +msgstr "Desa" + +#: app/scripts/services/utils.js:551 +msgid "Save SVG" +msgstr "Desa SVG" + +#: app/views/menu.html:50 +msgid "Save as" +msgstr "Anomena i desa" + +#: app/views/menu.html:171 +msgid "Select" +msgstr "Selecciona" + +#: app/views/menu.html:97 +msgid "Select all" +msgstr "Selecciona tot" + +#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:712 +msgid "Show clock" +msgstr "Mostra rellotge" + +#: app/views/menu.html:301 +msgid "Source code" +msgstr "Codi font" + +#: app/views/languages.html:10 +msgid "Spanish" +msgstr "Espanyol" + +#: app/scripts/services/tools.js:195 +msgid "Synchronize remote files ..." +msgstr "Sincronitza fitxers remots" + +#: app/views/menu.html:63 +msgid "Testbench" +msgstr "Testbench" + +#: app/scripts/controllers/menu.js:211 +msgid "Testbench exported" +msgstr "Testbench exportat" + +#: app/scripts/services/tools.js:758 +msgid "The collection {{name}} already exists." +msgstr "La col·leccio {{name}} ja existeix" + +#: app/scripts/controllers/menu.js:465 +msgid "" +"The current FPGA I/O configuration will be lost. Do you want to change to " +"{{name}} board?" +msgstr "" +"La configuració actual d'E/S de la FPGA es perdrà. Vols canviar a la placa " +"{{name}}?" + +#: app/scripts/services/tools.js:509 +msgid "The toolchain will be removed. Do you want to continue?" +msgstr "La toolchain serà eliminada. Vols continuar?" + +#: app/scripts/services/tools.js:497 +msgid "The toolchain will be restored to default. Do you want to continue?" +msgstr "La toolchain serà restaurada als valors per defecte. Vols continuar?" + +#: app/scripts/services/tools.js:489 +msgid "" +"The toolchain will be updated. This operation requires Internet connection. " +"Do you want to continue?" +msgstr "" +"La toolchain serà actualitzada. Aquesta operació requereix connexió a " +"Internet. Vols continuar?" + +#: app/scripts/services/project.js:387 +msgid "" +"This import operation requires a project path. You need to save the current " +"project. Do you want to continue?" +msgstr "" +"Aquesta operació d'importació requereix un directori de projecte. Has de " +"desar el projecte actual. Vols continuar?" + +#: app/scripts/services/project.js:105 +msgid "This project is designed for the {{name}} board." +msgstr "Aquest projecte està dissenyat per a la placa {{name}}" + +#: app/views/menu.html:216 +msgid "Toolchain" +msgstr "Toolchain" + +#: app/scripts/services/tools.js:692 +msgid "Toolchain installed" +msgstr "Toolchain instal·lada" + +#: app/scripts/services/tools.js:695 +msgid "Toolchain not installed" +msgstr "La toolchain no està instal·lada" + +#: app/scripts/services/drivers.js:197 app/scripts/services/drivers.js:213 +#: app/scripts/services/tools.js:94 +msgid "Toolchain not installed. Please, install the toolchain" +msgstr "Toolchain no instal·lada. Per favor, instal·la la toolchain" + +#: app/scripts/services/tools.js:514 +msgid "Toolchain removed" +msgstr "Toolchain eliminada" + +#: app/views/menu.html:203 +msgid "Tools" +msgstr "Eines" + +#: app/views/menu.html:81 +msgid "Undo" +msgstr "Desfés" + +#: app/scripts/services/tools.js:257 +msgid "Unknown board" +msgstr "Placa desconeguda" + +#: app/scripts/app.js:37 +msgid "Untitled" +msgstr "Sense títol" + +#: app/views/menu.html:223 +msgid "Update" +msgstr "Actualitzar" + +#: app/scripts/services/blocks.js:710 app/scripts/services/blocks.js:790 +#: app/scripts/services/blocks.js:863 +msgid "Update the block name" +msgstr "Actualitza el nom del bloc" + +#: app/views/menu.html:212 +msgid "Upload" +msgstr "Carrega" + +#: app/views/menu.html:206 +msgid "Verify" +msgstr "Verifica" + +#: app/scripts/controllers/menu.js:193 +msgid "Verilog code exported" +msgstr "Codi Verilog exportat" + +#: app/scripts/services/utils.js:528 app/views/menu.html:294 +msgid "Version" +msgstr "Versió" + +#: app/views/menu.html:150 +msgid "View" +msgstr "Visualitza" + +#: app/views/menu.html:291 +msgid "View license" +msgstr "Visualitzar llicència" + +#: app/scripts/services/blocks.js:410 +msgid "Wrong block format: {{type}}" +msgstr "Format de bloc incorrecte: {{type}}" + +#: app/scripts/services/blocks.js:134 app/scripts/services/blocks.js:205 +#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:781 +#: app/scripts/services/blocks.js:855 app/scripts/services/blocks.js:890 +msgid "Wrong block name {{name}}" +msgstr "Nom de bloc incorrecte" + +#: app/scripts/services/blocks.js:325 +msgid "Wrong parameter name {{name}}" +msgstr "Nom del paràmetre incorrecte" + +#: app/scripts/services/blocks.js:295 app/scripts/services/blocks.js:310 +msgid "Wrong port name {{name}}" +msgstr "Nom del port incorrecte" + +#: app/scripts/services/project.js:133 +msgid "Wrong project format: {{name}}" +msgstr "Format de projecte incorrecte: {{name}}" + +#: app/scripts/services/tools.js:365 +msgid "Wrong remote hostname {{name}}" +msgstr "Nom del host remot incorrecte {{name}}" + +#: app/scripts/controllers/menu.js:242 +msgid "Your changes will be lost if you don’t save them" +msgstr "Els teus canvis es perdran si no els deses" + +#: app/views/design.html:6 +msgid "back" +msgstr "enrere" + +#. Build done +#: app/scripts/services/tools.js:380 +msgid "done_build" +msgstr "Sintetitzat realitzat" + +#. Upload done +#: app/scripts/services/tools.js:382 +msgid "done_upload" +msgstr "Càrrega realitzada" + +#. Verification done +#: app/scripts/services/tools.js:378 +msgid "done_verify" +msgstr "Verificació realitzada" + +#. Start building ... +#: app/scripts/services/tools.js:61 +msgid "start_build" +msgstr "Iniciar sintetitzat ..." + +#. Start uploading ... +#: app/scripts/services/tools.js:63 +msgid "start_upload" +msgstr "Iniciar càrrega ..." + +#. Start verification ... +#: app/scripts/services/tools.js:59 +msgid "start_verify" +msgstr "Iniciar verificació ..." + +#: app/scripts/services/drivers.js:103 app/scripts/services/utils.js:847 +msgid "{{app}} is required." +msgstr "" + +#: app/scripts/controllers/menu.js:398 +msgid "{{board}} datasheet not defined" +msgstr "Full de dades de {{board}} no definit" + +#: app/scripts/controllers/menu.js:388 +msgid "{{board}} pinout not defined" +msgstr "{{board}} pinout no definit" + +#: app/scripts/controllers/menu.js:417 +msgid "{{board}} rules not defined" +msgstr "Regles de {{board}} no definides" + +#~ msgid "Homebrew is required" +#~ msgstr "És necessari Homebrew" + +#~ msgid "Load {{name}} ..." +#~ msgstr "Carregar {{name}} ..." diff --git a/app/resources/locale/en/en.po b/app/resources/locale/en/en.po index 91b53736d..e96b4a7a5 100644 --- a/app/resources/locale/en/en.po +++ b/app/resources/locale/en/en.po @@ -12,11 +12,11 @@ msgstr "" "X-Generator: Poedit 1.8.7.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: app/scripts/services/utils.js:456 app/scripts/services/utils.js:536 +#: app/scripts/services/drivers.js:200 app/scripts/services/drivers.js:81 msgid "Unplug and reconnect the board" msgstr "Unplug and reconnect the board" -#: app/scripts/services/utils.js:527 +#: app/scripts/services/drivers.js:189 msgid "" "

FTDI driver installation instructions

  1. Connect the FPGA " "board
  2. Replace the (Interface 0) driver of the board by " @@ -26,7 +26,7 @@ msgstr "" "board
  3. Replace the (Interface 0) driver of the board by " "libusbK
  4. Unplug and reconnect the board
" -#: app/scripts/services/utils.js:543 +#: app/scripts/services/drivers.js:207 msgid "" "

FTDI driver uninstallation instructions

  1. Find the FPGA USB " "Device
  2. Select the board interface and uninstall the driver
" @@ -34,15 +34,15 @@ msgstr "" "

FTDI driver uninstallation instructions

  1. Find the FPGA USB " "Device
  2. Select the board interface and uninstall the driver
" -#: app/views/menu.html:336 +#: app/views/menu.html:309 msgid "About Icestudio" msgstr "About Icestudio" -#: app/views/menu.html:290 +#: app/views/menu.html:263 msgid "Add" msgstr "Add" -#: app/scripts/controllers/menu.js:471 +#: app/scripts/controllers/menu.js:516 msgid "Add a block to start" msgstr "Add a block to start" @@ -50,33 +50,34 @@ msgstr "Add a block to start" msgid "Add as block" msgstr "Add as block" -#: app/scripts/services/tools.js:682 +#: app/scripts/services/tools.js:895 msgid "All collections removed" msgstr "All collections removed" -#: app/scripts/controllers/menu.js:495 +#: app/scripts/controllers/menu.js:538 msgid "All stored collections will be lost. Do you want to continue?" msgstr "All stored collections will be lost. Do you want to continue?" -#: app/scripts/services/utils.js:723 +#: app/scripts/services/utils.js:530 msgid "Author" msgstr "Author" -#: app/views/menu.html:347 +#: app/views/menu.html:320 msgid "Basic" msgstr "Basic" -#: app/views/menu.html:155 +#: app/views/languages.html:22 msgid "Basque" msgstr "Basque" -#: app/scripts/services/blocks.js:742 app/scripts/services/blocks.js:763 -#: app/scripts/services/blocks.js:818 app/scripts/services/blocks.js:837 -#: app/scripts/services/blocks.js:872 app/scripts/services/blocks.js:911 +#: app/scripts/services/blocks.js:755 app/scripts/services/blocks.js:776 +#: app/scripts/services/blocks.js:831 app/scripts/services/blocks.js:850 +#: app/scripts/services/blocks.js:885 app/scripts/services/blocks.js:926 +#: app/scripts/services/blocks.js:960 msgid "Block updated" msgstr "Block updated" -#: app/scripts/services/project.js:418 +#: app/scripts/services/project.js:413 msgid "Block {{name}} imported" msgstr "Block {{name}} imported" @@ -84,31 +85,31 @@ msgstr "Block {{name}} imported" msgid "Blocks" msgstr "Blocks" -#: app/views/menu.html:201 +#: app/views/menu.html:174 msgid "Board" msgstr "Board" -#: app/views/menu.html:115 app/views/menu.html:192 +#: app/views/menu.html:115 app/views/menu.html:162 msgid "Board rules" msgstr "Board rules" -#: app/scripts/controllers/menu.js:334 +#: app/scripts/controllers/menu.js:341 msgid "Board rules disabled" msgstr "Board rules disabled" -#: app/scripts/controllers/menu.js:329 +#: app/scripts/controllers/menu.js:336 msgid "Board rules enabled" msgstr "Board rules enabled" -#: app/scripts/services/tools.js:234 +#: app/scripts/services/tools.js:254 msgid "Board {{name}} not detected" msgstr "Board {{name}} not detected" -#: app/scripts/controllers/menu.js:435 +#: app/scripts/controllers/menu.js:477 msgid "Board {{name}} selected" msgstr "Board {{name}} selected" -#: app/views/menu.html:236 +#: app/views/menu.html:209 msgid "Build" msgstr "Build" @@ -116,51 +117,67 @@ msgstr "Build" msgid "Cancel" msgstr "Cancel" -#: app/scripts/services/tools.js:446 +#: app/views/languages.html:34 +msgid "Catalan" +msgstr "Catalan" + +#: app/scripts/services/tools.js:605 msgid "Check Internet connection..." msgstr "Check Internet connection..." -#: app/scripts/services/tools.js:454 +#: app/scripts/services/tools.js:613 msgid "Check Python..." msgstr "Check Python..." -#: app/views/menu.html:361 +#: app/scripts/services/drivers.js:104 +msgid "Click here to install it" +msgstr "Click here to install it" + +#: app/views/menu.html:334 msgid "Code" msgstr "Code" -#: app/views/menu.html:212 +#: app/views/menu.html:185 msgid "Collection" msgstr "Collection" -#: app/scripts/services/tools.js:631 +#: app/views/menu.html:165 +msgid "Collection info" +msgstr "Collection info" + +#: app/scripts/controllers/menu.js:436 +msgid "Collection {{collection}} info not defined" +msgstr "Collection {{collection}} info not defined" + +#: app/scripts/services/tools.js:773 msgid "Collection {{name}} added" msgstr "Collection {{name}} added" -#: app/scripts/services/tools.js:625 +#: app/scripts/services/tools.js:767 msgid "Collection {{name}} not replaced" msgstr "Collection {{name}} not replaced" -#: app/scripts/services/tools.js:676 +#: app/scripts/services/tools.js:889 msgid "Collection {{name}} removed" msgstr "Collection {{name}} removed" -#: app/scripts/services/tools.js:621 +#: app/scripts/services/tools.js:763 msgid "Collection {{name}} replaced" msgstr "Collection {{name}} replaced" -#: app/scripts/controllers/menu.js:410 +#: app/scripts/controllers/menu.js:444 msgid "Collection {{name}} selected" msgstr "Collection {{name}} selected" -#: app/views/menu.html:286 +#: app/views/menu.html:259 msgid "Collections" msgstr "Collections" -#: app/views/menu.html:332 +#: app/views/menu.html:305 msgid "Community forum" msgstr "Community forum" -#: app/views/menu.html:358 +#: app/views/menu.html:331 msgid "Constant" msgstr "Constant" @@ -172,15 +189,15 @@ msgstr "Copy" msgid "Cut" msgstr "Cut" -#: app/views/menu.html:189 +#: app/views/menu.html:159 msgid "Datasheet" msgstr "Datasheet" -#: app/views/menu.html:216 +#: app/views/menu.html:189 msgid "Default" msgstr "Default" -#: app/scripts/services/tools.js:322 +#: app/scripts/services/tools.js:481 msgid "" "Default toolchain not found. Toolchain will be downloaded. This operation " "requires Internet connection. Do you want to continue?" @@ -188,51 +205,51 @@ msgstr "" "Default toolchain not found. Toolchain will be downloaded. This operation " "requires Internet connection. Do you want to continue?" -#: app/scripts/services/utils.js:722 +#: app/scripts/services/utils.js:529 msgid "Description" msgstr "Description" -#: app/views/menu.html:126 app/views/menu.html:279 +#: app/views/menu.html:126 app/views/menu.html:252 msgid "Disable" msgstr "Disable" -#: app/scripts/controllers/menu.js:234 +#: app/scripts/controllers/menu.js:241 msgid "Do you want to close the application?" msgstr "Do you want to close the application?" -#: app/scripts/services/project.js:104 +#: app/scripts/services/project.js:106 msgid "Do you want to convert it?" msgstr "Do you want to convert it?" -#: app/scripts/controllers/menu.js:485 +#: app/scripts/controllers/menu.js:528 msgid "Do you want to remove the {{name}} collection?" msgstr "Do you want to remove the {{name}} collection?" -#: app/scripts/services/tools.js:617 +#: app/scripts/services/tools.js:759 msgid "Do you want to replace it?" msgstr "Do you want to replace it?" -#: app/views/menu.html:325 +#: app/views/menu.html:298 msgid "Documentation" msgstr "Documentation" -#: app/views/menu.html:270 +#: app/views/menu.html:243 msgid "Drivers" msgstr "Drivers" -#: app/scripts/services/utils.js:453 app/scripts/services/utils.js:521 +#: app/scripts/services/drivers.js:128 app/scripts/services/drivers.js:78 msgid "Drivers disabled" msgstr "Drivers disabled" -#: app/scripts/services/utils.js:450 app/scripts/services/utils.js:502 +#: app/scripts/services/drivers.js:120 app/scripts/services/drivers.js:75 msgid "Drivers enabled" msgstr "Drivers enabled" -#: app/scripts/services/tools.js:246 +#: app/scripts/services/tools.js:265 msgid "Duplicated FPGA I/O ports" msgstr "Duplicated FPGA I/O ports" -#: app/scripts/services/blocks.js:370 +#: app/scripts/services/blocks.js:376 msgid "Duplicated block attributes" msgstr "Duplicated block attributes" @@ -240,15 +257,19 @@ msgstr "Duplicated block attributes" msgid "Edit" msgstr "Edit" -#: app/views/menu.html:121 app/views/menu.html:274 +#: app/scripts/services/tools.js:748 +msgid "Edit the collection name" +msgstr "Edit the collection name" + +#: app/views/menu.html:121 app/views/menu.html:247 msgid "Enable" msgstr "Enable" -#: app/views/menu.html:137 +#: app/views/languages.html:4 msgid "English" msgstr "English" -#: app/scripts/services/blocks.js:181 +#: app/scripts/services/blocks.js:185 msgid "Enter the constant blocks" msgstr "Enter the constant blocks" @@ -256,39 +277,43 @@ msgstr "Enter the constant blocks" msgid "Enter the input blocks" msgstr "Enter the input blocks" -#: app/scripts/services/blocks.js:269 +#: app/scripts/services/blocks.js:275 msgid "Enter the input ports" msgstr "Enter the input ports" -#: app/scripts/services/blocks.js:112 +#: app/scripts/services/blocks.js:114 msgid "Enter the output blocks" msgstr "Enter the output blocks" -#: app/scripts/services/blocks.js:270 +#: app/scripts/services/blocks.js:276 msgid "Enter the output ports" msgstr "Enter the output ports" -#: app/scripts/services/blocks.js:271 +#: app/scripts/services/blocks.js:277 msgid "Enter the parameters" msgstr "Enter the parameters" -#: app/scripts/controllers/menu.js:321 +#: app/scripts/controllers/menu.js:328 msgid "Enter the remote hostname user@host (experimental)" msgstr "Enter the remote hostname user@host (experimental)" -#: app/scripts/services/tools.js:345 +#: app/scripts/services/tools.js:504 msgid "Error: default toolchain not found in '{{dir}}'" msgstr "Error: default toolchain not found in '{{dir}}'" -#: app/scripts/services/utils.js:855 +#: app/scripts/services/utils.js:670 msgid "Error: {{error}}" msgstr "Error: {{error}}" +#: app/scripts/services/tools.js:336 +msgid "Errors detected in the code" +msgstr "Errors detected in the code" + #: app/views/menu.html:39 msgid "Examples" msgstr "Examples" -#: app/scripts/services/tools.js:204 +#: app/scripts/services/tools.js:206 msgid "Execute remote {{label}} ..." msgstr "Execute remote {{label}} ..." @@ -296,24 +321,24 @@ msgstr "Execute remote {{label}} ..." msgid "Export" msgstr "Export" -#: app/scripts/services/tools.js:478 +#: app/scripts/services/tools.js:637 msgid "Extract default apio files..." msgstr "Extract default apio files..." -#: app/scripts/services/tools.js:488 +#: app/scripts/services/tools.js:647 msgid "Extract default apio packages..." msgstr "Extract default apio packages..." -#: app/scripts/services/tools.js:466 +#: app/scripts/services/tools.js:625 msgid "Extract virtual env files..." msgstr "Extract virtual env files..." -#: app/scripts/services/tools.js:240 app/scripts/services/tools.js:243 +#: app/scripts/services/tools.js:262 msgid "FPGA I/O ports not defined" msgstr "FPGA I/O ports not defined" -#: app/scripts/services/blocks.js:113 app/scripts/services/blocks.js:53 -#: app/scripts/services/blocks.js:698 app/scripts/services/blocks.js:778 +#: app/scripts/services/blocks.js:115 app/scripts/services/blocks.js:53 +#: app/scripts/services/blocks.js:711 app/scripts/services/blocks.js:791 msgid "FPGA pin" msgstr "FPGA pin" @@ -321,17 +346,17 @@ msgstr "FPGA pin" msgid "File" msgstr "File" -#: app/scripts/services/project.js:376 +#: app/scripts/services/project.js:425 msgid "" "File {{file}} already exists in the project path. Do you want to replace it?" msgstr "" "File {{file}} already exists in the project path. Do you want to replace it?" -#: app/scripts/services/tools.js:180 +#: app/scripts/services/tools.js:182 msgid "File {{file}} does not exist" msgstr "File {{file}} does not exist" -#: app/scripts/services/project.js:408 +#: app/scripts/services/project.js:459 msgid "File {{file}} imported" msgstr "File {{file}} imported" @@ -339,108 +364,104 @@ msgstr "File {{file}} imported" msgid "Fit content" msgstr "Fit content" -#: app/views/menu.html:161 +#: app/views/languages.html:28 msgid "French" msgstr "French" -#: app/scripts/controllers/menu.js:213 +#: app/scripts/controllers/menu.js:220 msgid "GTKWave exported" msgstr "GTKWave exported" -#: app/views/menu.html:149 +#: app/views/languages.html:16 msgid "Galician" msgstr "Galician" -#: app/views/menu.html:315 +#: app/views/menu.html:288 msgid "Help" msgstr "Help" -#: app/scripts/services/utils.js:491 -msgid "Homebrew is required" -msgstr "Homebrew is required" - -#: app/scripts/services/utils.js:736 +#: app/scripts/services/utils.js:543 msgid "Image" msgstr "Image" -#: app/scripts/controllers/menu.js:642 +#: app/scripts/controllers/menu.js:688 msgid "Image {{name}} saved" msgstr "Image {{name}} saved" -#: app/views/menu.html:364 +#: app/views/menu.html:337 msgid "Information" msgstr "Information" -#: app/views/menu.html:352 +#: app/views/menu.html:325 msgid "Input" msgstr "Input" -#: app/views/menu.html:247 +#: app/views/menu.html:220 msgid "Install" msgstr "Install" -#: app/scripts/services/tools.js:483 +#: app/scripts/services/tools.js:642 msgid "Install default apio..." msgstr "Install default apio..." -#: app/scripts/services/tools.js:532 +#: app/scripts/services/tools.js:691 msgid "Installation completed" msgstr "Installation completed" -#: app/scripts/services/tools.js:375 app/scripts/services/tools.js:412 +#: app/scripts/services/tools.js:534 app/scripts/services/tools.js:571 msgid "Installing toolchain" msgstr "Installing toolchain" -#: app/scripts/services/tools.js:448 app/scripts/services/utils.js:495 +#: app/scripts/services/drivers.js:112 app/scripts/services/tools.js:607 msgid "Internet connection required" msgstr "Internet connection required" -#: app/scripts/services/graph.js:175 +#: app/scripts/services/graph.js:179 msgid "Invalid Pull up connection:
block already connected" msgstr "Invalid Pull up connection:
block already connected" -#: app/scripts/services/graph.js:189 +#: app/scripts/services/graph.js:193 msgid "Invalid Pull up connection:
only Input blocks allowed" msgstr "Invalid Pull up connection:
only Input blocks allowed" -#: app/scripts/services/graph.js:181 +#: app/scripts/services/graph.js:185 msgid "Invalid block connection:
Pull up already connected" msgstr "Invalid block connection:
Pull up already connected" -#: app/scripts/services/tools.js:636 +#: app/scripts/services/tools.js:779 msgid "Invalid collection {{name}}" msgstr "Invalid collection {{name}}" -#: app/scripts/services/graph.js:140 app/scripts/services/graph.js:147 -#: app/scripts/services/graph.js:154 +#: app/scripts/services/graph.js:143 app/scripts/services/graph.js:150 +#: app/scripts/services/graph.js:157 msgid "Invalid connection" msgstr "Invalid connection" -#: app/scripts/services/graph.js:208 +#: app/scripts/services/graph.js:212 msgid "Invalid connection: {{a}} → {{b}}" msgstr "Invalid connection: {{a}} → {{b}}" -#: app/scripts/services/graph.js:169 +#: app/scripts/services/graph.js:173 msgid "Invalid multiple input connections" msgstr "Invalid multiple input connections" -#: app/views/menu.html:133 +#: app/scripts/services/drivers.js:190 +msgid "It is recommended to use USB 2.0 ports" +msgstr "It is recommended to use USB 2.0 ports" + +#: app/views/menu.html:134 msgid "Language" msgstr "Language" -#: app/scripts/services/tools.js:579 -msgid "Load {{name}} ..." -msgstr "Load {{name}} ..." - -#: app/scripts/services/blocks.js:182 app/scripts/services/blocks.js:851 +#: app/scripts/services/blocks.js:186 app/scripts/services/blocks.js:864 msgid "Local parameter" msgstr "Local parameter" -#: app/scripts/services/tools.js:471 +#: app/scripts/services/tools.js:630 msgid "Make virtual env..." msgstr "Make virtual env..." -#: app/scripts/services/utils.js:720 +#: app/scripts/services/utils.js:527 msgid "Name" msgstr "Name" @@ -448,11 +469,11 @@ msgstr "Name" msgid "New" msgstr "New" -#: app/scripts/services/project.js:80 +#: app/scripts/services/project.js:81 msgid "New project {{name}} created" msgstr "New project {{name}} created" -#: app/scripts/controllers/menu.js:503 +#: app/scripts/controllers/menu.js:546 msgid "No collections stored" msgstr "No collections stored" @@ -460,7 +481,7 @@ msgstr "No collections stored" msgid "OK" msgstr "OK" -#: app/scripts/services/project.js:323 app/scripts/services/project.js:97 +#: app/scripts/services/project.js:364 app/scripts/services/project.js:99 msgid "Old project format {{version}}" msgstr "Old project format {{version}}" @@ -468,19 +489,19 @@ msgstr "Old project format {{version}}" msgid "Open" msgstr "Open" -#: app/scripts/services/utils.js:743 +#: app/scripts/services/utils.js:550 msgid "Open SVG" msgstr "Open SVG" -#: app/scripts/services/project.js:411 +#: app/scripts/services/project.js:462 msgid "Original file {{file}} does not exist" msgstr "Original file {{file}} does not exist" -#: app/views/menu.html:355 +#: app/views/menu.html:328 msgid "Output" msgstr "Output" -#: app/scripts/controllers/menu.js:195 +#: app/scripts/controllers/menu.js:202 msgid "PCF file exported" msgstr "PCF file exported" @@ -488,6 +509,10 @@ msgstr "PCF file exported" msgid "Paste" msgstr "Paste" +#: app/scripts/services/utils.js:872 +msgid "Please run: {{cmd}}" +msgstr "Please run: {{cmd}}" + #: app/views/menu.html:108 msgid "Preferences" msgstr "Preferences" @@ -496,15 +521,15 @@ msgstr "Preferences" msgid "Project information" msgstr "Project information" -#: app/scripts/services/project.js:122 +#: app/scripts/services/project.js:125 msgid "Project {{name}} loaded" msgstr "Project {{name}} loaded" -#: app/scripts/services/project.js:295 +#: app/scripts/services/project.js:334 msgid "Project {{name}} saved" msgstr "Project {{name}} saved" -#: app/scripts/services/tools.js:459 +#: app/scripts/services/tools.js:618 msgid "Python 2.7 is required" msgstr "Python 2.7 is required" @@ -512,7 +537,7 @@ msgstr "Python 2.7 is required" msgid "Quit" msgstr "Quit" -#: app/views/design.html:5 +#: app/scripts/services/blocks.js:946 app/views/design.html:5 msgid "Read only" msgstr "Read only" @@ -520,27 +545,27 @@ msgstr "Read only" msgid "Redo" msgstr "Redo" -#: app/scripts/services/tools.js:271 +#: app/scripts/services/tools.js:368 msgid "Remote host {{name}} not connected" msgstr "Remote host {{name}} not connected" -#: app/views/menu.html:170 +#: app/views/menu.html:140 msgid "Remote hostname" msgstr "Remote hostname" -#: app/views/menu.html:255 app/views/menu.html:294 +#: app/views/menu.html:228 app/views/menu.html:267 msgid "Remove" msgstr "Remove" -#: app/views/menu.html:306 +#: app/views/menu.html:279 msgid "Remove all" msgstr "Remove all" -#: app/scripts/services/utils.js:745 +#: app/scripts/services/utils.js:552 msgid "Reset SVG" msgstr "Reset SVG" -#: app/views/menu.html:260 +#: app/views/menu.html:233 msgid "Reset default" msgstr "Reset default" @@ -552,7 +577,7 @@ msgstr "Reset view" msgid "Save" msgstr "Save" -#: app/scripts/services/utils.js:744 +#: app/scripts/services/utils.js:551 msgid "Save SVG" msgstr "Save SVG" @@ -560,7 +585,7 @@ msgstr "Save SVG" msgid "Save as" msgstr "Save as" -#: app/views/menu.html:198 +#: app/views/menu.html:171 msgid "Select" msgstr "Select" @@ -568,19 +593,19 @@ msgstr "Select" msgid "Select all" msgstr "Select all" -#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:699 +#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:712 msgid "Show clock" msgstr "Show clock" -#: app/views/menu.html:328 +#: app/views/menu.html:301 msgid "Source code" msgstr "Source code" -#: app/views/menu.html:143 +#: app/views/languages.html:10 msgid "Spanish" msgstr "Spanish" -#: app/scripts/services/tools.js:193 +#: app/scripts/services/tools.js:195 msgid "Synchronize remote files ..." msgstr "Synchronize remote files ..." @@ -588,15 +613,15 @@ msgstr "Synchronize remote files ..." msgid "Testbench" msgstr "Testbench" -#: app/scripts/controllers/menu.js:204 +#: app/scripts/controllers/menu.js:211 msgid "Testbench exported" msgstr "Testbench exported" -#: app/scripts/services/tools.js:616 +#: app/scripts/services/tools.js:758 msgid "The collection {{name}} already exists." msgstr "The collection {{name}} already exists." -#: app/scripts/controllers/menu.js:424 +#: app/scripts/controllers/menu.js:465 msgid "" "The current FPGA I/O configuration will be lost. Do you want to change to " "{{name}} board?" @@ -604,15 +629,15 @@ msgstr "" "The current FPGA I/O configuration will be lost. Do you want to change to " "{{name}} board?" -#: app/scripts/services/tools.js:350 +#: app/scripts/services/tools.js:509 msgid "The toolchain will be removed. Do you want to continue?" msgstr "The toolchain will be removed. Do you want to continue?" -#: app/scripts/services/tools.js:338 +#: app/scripts/services/tools.js:497 msgid "The toolchain will be restored to default. Do you want to continue?" msgstr "The toolchain will be restored to default. Do you want to continue?" -#: app/scripts/services/tools.js:330 +#: app/scripts/services/tools.js:489 msgid "" "The toolchain will be updated. This operation requires Internet connection. " "Do you want to continue?" @@ -620,7 +645,7 @@ msgstr "" "The toolchain will be updated. This operation requires Internet connection. " "Do you want to continue?" -#: app/scripts/services/project.js:345 +#: app/scripts/services/project.js:387 msgid "" "This import operation requires a project path. You need to save the current " "project. Do you want to continue?" @@ -628,32 +653,32 @@ msgstr "" "This import operation requires a project path. You need to save the current " "project. Do you want to continue?" -#: app/scripts/services/project.js:103 +#: app/scripts/services/project.js:105 msgid "This project is designed for the {{name}} board." msgstr "This project is designed for the {{name}} board." -#: app/views/menu.html:243 +#: app/views/menu.html:216 msgid "Toolchain" msgstr "Toolchain" -#: app/scripts/services/tools.js:533 +#: app/scripts/services/tools.js:692 msgid "Toolchain installed" msgstr "Toolchain installed" -#: app/scripts/services/tools.js:536 +#: app/scripts/services/tools.js:695 msgid "Toolchain not installed" msgstr "Toolchain not installed" -#: app/scripts/services/tools.js:92 app/scripts/services/utils.js:533 -#: app/scripts/services/utils.js:549 +#: app/scripts/services/drivers.js:197 app/scripts/services/drivers.js:213 +#: app/scripts/services/tools.js:94 msgid "Toolchain not installed. Please, install the toolchain" msgstr "Toolchain not installed. Please, install the toolchain" -#: app/scripts/services/tools.js:355 +#: app/scripts/services/tools.js:514 msgid "Toolchain removed" msgstr "Toolchain removed" -#: app/views/menu.html:230 +#: app/views/menu.html:203 msgid "Tools" msgstr "Tools" @@ -661,74 +686,74 @@ msgstr "Tools" msgid "Undo" msgstr "Undo" -#: app/scripts/services/tools.js:237 +#: app/scripts/services/tools.js:257 msgid "Unknown board" msgstr "Unknown board" -#: app/scripts/app.js:43 +#: app/scripts/app.js:37 msgid "Untitled" msgstr "Untitled" -#: app/views/menu.html:250 +#: app/views/menu.html:223 msgid "Update" msgstr "Update" -#: app/scripts/services/blocks.js:697 app/scripts/services/blocks.js:777 -#: app/scripts/services/blocks.js:850 +#: app/scripts/services/blocks.js:710 app/scripts/services/blocks.js:790 +#: app/scripts/services/blocks.js:863 msgid "Update the block name" msgstr "Update the block name" -#: app/views/menu.html:239 +#: app/views/menu.html:212 msgid "Upload" msgstr "Upload" -#: app/views/menu.html:233 +#: app/views/menu.html:206 msgid "Verify" msgstr "Verify" -#: app/scripts/controllers/menu.js:186 +#: app/scripts/controllers/menu.js:193 msgid "Verilog code exported" msgstr "Verilog code exported" -#: app/scripts/services/utils.js:721 app/views/menu.html:321 +#: app/scripts/services/utils.js:528 app/views/menu.html:294 msgid "Version" msgstr "Version" -#: app/views/menu.html:180 +#: app/views/menu.html:150 msgid "View" msgstr "View" -#: app/views/menu.html:318 +#: app/views/menu.html:291 msgid "View license" msgstr "View license" -#: app/scripts/services/blocks.js:404 +#: app/scripts/services/blocks.js:410 msgid "Wrong block format: {{type}}" msgstr "Wrong block format: {{type}}" -#: app/scripts/services/blocks.js:132 app/scripts/services/blocks.js:201 -#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:768 -#: app/scripts/services/blocks.js:842 app/scripts/services/blocks.js:877 +#: app/scripts/services/blocks.js:134 app/scripts/services/blocks.js:205 +#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:781 +#: app/scripts/services/blocks.js:855 app/scripts/services/blocks.js:890 msgid "Wrong block name {{name}}" msgstr "Wrong block name {{name}}" -#: app/scripts/services/blocks.js:319 +#: app/scripts/services/blocks.js:325 msgid "Wrong parameter name {{name}}" msgstr "Wrong parameter name {{name}}" -#: app/scripts/services/blocks.js:289 app/scripts/services/blocks.js:304 +#: app/scripts/services/blocks.js:295 app/scripts/services/blocks.js:310 msgid "Wrong port name {{name}}" msgstr "Wrong port name {{name}}" -#: app/scripts/services/project.js:130 +#: app/scripts/services/project.js:133 msgid "Wrong project format: {{name}}" msgstr "Wrong project format: {{name}}" -#: app/scripts/services/tools.js:268 +#: app/scripts/services/tools.js:365 msgid "Wrong remote hostname {{name}}" msgstr "Wrong remote hostname {{name}}" -#: app/scripts/controllers/menu.js:235 +#: app/scripts/controllers/menu.js:242 msgid "Your changes will be lost if you don’t save them" msgstr "Your changes will be lost if you don’t save them" @@ -737,47 +762,60 @@ msgid "back" msgstr "back" #. Build done -#: app/scripts/services/tools.js:283 +#: app/scripts/services/tools.js:380 msgid "done_build" msgstr "Build done" #. Upload done -#: app/scripts/services/tools.js:285 +#: app/scripts/services/tools.js:382 msgid "done_upload" msgstr "Upload done" #. Verification done -#: app/scripts/services/tools.js:281 +#: app/scripts/services/tools.js:378 msgid "done_verify" msgstr "Verification done" #. Start building ... -#: app/scripts/services/tools.js:60 +#: app/scripts/services/tools.js:61 msgid "start_build" msgstr "Start building ..." #. Start uploading ... -#: app/scripts/services/tools.js:62 +#: app/scripts/services/tools.js:63 msgid "start_upload" msgstr "Start uploading ..." #. Start verification ... -#: app/scripts/services/tools.js:58 +#: app/scripts/services/tools.js:59 msgid "start_verify" msgstr "Start verification ..." -#: app/scripts/controllers/menu.js:383 +#: app/scripts/services/drivers.js:103 app/scripts/services/utils.js:847 +msgid "{{app}} is required." +msgstr "{{app}} is required." + +#: app/scripts/controllers/menu.js:398 msgid "{{board}} datasheet not defined" msgstr "{{board}} datasheet not defined" -#: app/scripts/controllers/menu.js:373 +#: app/scripts/controllers/menu.js:388 msgid "{{board}} pinout not defined" msgstr "{{board}} pinout not defined" -#: app/scripts/controllers/menu.js:402 +#: app/scripts/controllers/menu.js:417 msgid "{{board}} rules not defined" msgstr "{{board}} rules not defined" +#~ msgid "Collection {{collection}} data not defined" +#~ msgstr "Collection {{collection}} data not defined" + +#~ msgid "Homebrew is required" +#~ msgstr "Homebrew is required" + +#~ msgid "Load {{name}} ..." +#~ msgstr "Load {{name}} ..." + #~ msgid "1_basic" #~ msgstr "1. Basic" diff --git a/app/resources/locale/es_ES/es_ES.po b/app/resources/locale/es_ES/es_ES.po index 8ed771f38..279616321 100644 --- a/app/resources/locale/es_ES/es_ES.po +++ b/app/resources/locale/es_ES/es_ES.po @@ -12,11 +12,11 @@ msgstr "" "X-Generator: Poedit 1.8.7.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: app/scripts/services/utils.js:456 app/scripts/services/utils.js:536 +#: app/scripts/services/drivers.js:200 app/scripts/services/drivers.js:81 msgid "Unplug and reconnect the board" msgstr "Desconecta y conecta la placa" -#: app/scripts/services/utils.js:527 +#: app/scripts/services/drivers.js:189 msgid "" "

FTDI driver installation instructions

  1. Connect the FPGA " "board
  2. Replace the (Interface 0) driver of the board by " @@ -26,7 +26,7 @@ msgstr "" "placa FPGA
  3. Reemplaza el driver de la (Interface 0) de la " "placa por libusbK
  4. Desconecta y conecta la placa
" -#: app/scripts/services/utils.js:543 +#: app/scripts/services/drivers.js:207 msgid "" "

FTDI driver uninstallation instructions

  1. Find the FPGA USB " "Device
  2. Select the board interface and uninstall the driver
" @@ -35,15 +35,15 @@ msgstr "" "dispositivo USB FPGA
  • Selecciona la interfaz de la placa y desinstala " "el driver
  • " -#: app/views/menu.html:336 +#: app/views/menu.html:309 msgid "About Icestudio" msgstr "Sobre Icestudio" -#: app/views/menu.html:290 +#: app/views/menu.html:263 msgid "Add" msgstr "Añadir" -#: app/scripts/controllers/menu.js:471 +#: app/scripts/controllers/menu.js:516 msgid "Add a block to start" msgstr "Añade un bloque para comenzar" @@ -51,33 +51,34 @@ msgstr "Añade un bloque para comenzar" msgid "Add as block" msgstr "Añadir como bloque" -#: app/scripts/services/tools.js:682 +#: app/scripts/services/tools.js:895 msgid "All collections removed" msgstr "Colecciones eliminadas" -#: app/scripts/controllers/menu.js:495 +#: app/scripts/controllers/menu.js:538 msgid "All stored collections will be lost. Do you want to continue?" msgstr "Todas las colecciones almacenadas se perderán. ¿Deseas continuar?" -#: app/scripts/services/utils.js:723 +#: app/scripts/services/utils.js:530 msgid "Author" msgstr "Autor" -#: app/views/menu.html:347 +#: app/views/menu.html:320 msgid "Basic" msgstr "Básico" -#: app/views/menu.html:155 +#: app/views/languages.html:22 msgid "Basque" msgstr "Euskera" -#: app/scripts/services/blocks.js:742 app/scripts/services/blocks.js:763 -#: app/scripts/services/blocks.js:818 app/scripts/services/blocks.js:837 -#: app/scripts/services/blocks.js:872 app/scripts/services/blocks.js:911 +#: app/scripts/services/blocks.js:755 app/scripts/services/blocks.js:776 +#: app/scripts/services/blocks.js:831 app/scripts/services/blocks.js:850 +#: app/scripts/services/blocks.js:885 app/scripts/services/blocks.js:926 +#: app/scripts/services/blocks.js:960 msgid "Block updated" msgstr "Bloque actualizado" -#: app/scripts/services/project.js:418 +#: app/scripts/services/project.js:413 msgid "Block {{name}} imported" msgstr "Bloque {{name}} importado" @@ -85,31 +86,31 @@ msgstr "Bloque {{name}} importado" msgid "Blocks" msgstr "Bloques" -#: app/views/menu.html:201 +#: app/views/menu.html:174 msgid "Board" msgstr "Placa" -#: app/views/menu.html:115 app/views/menu.html:192 +#: app/views/menu.html:115 app/views/menu.html:162 msgid "Board rules" msgstr "Reglas de la placa" -#: app/scripts/controllers/menu.js:334 +#: app/scripts/controllers/menu.js:341 msgid "Board rules disabled" msgstr "Reglas de la placa deshabilitadas" -#: app/scripts/controllers/menu.js:329 +#: app/scripts/controllers/menu.js:336 msgid "Board rules enabled" msgstr "Reglas de la placa habilitadas" -#: app/scripts/services/tools.js:234 +#: app/scripts/services/tools.js:254 msgid "Board {{name}} not detected" msgstr "Placa {{name}} no detectada" -#: app/scripts/controllers/menu.js:435 +#: app/scripts/controllers/menu.js:477 msgid "Board {{name}} selected" msgstr "Placa {{name}} seleccionada" -#: app/views/menu.html:236 +#: app/views/menu.html:209 msgid "Build" msgstr "Sintetizar" @@ -117,51 +118,67 @@ msgstr "Sintetizar" msgid "Cancel" msgstr "Cancelar" -#: app/scripts/services/tools.js:446 +#: app/views/languages.html:34 +msgid "Catalan" +msgstr "Catalán" + +#: app/scripts/services/tools.js:605 msgid "Check Internet connection..." msgstr "Comprobando conexión a Internet..." -#: app/scripts/services/tools.js:454 +#: app/scripts/services/tools.js:613 msgid "Check Python..." msgstr "Comprobando Python..." -#: app/views/menu.html:361 +#: app/scripts/services/drivers.js:104 +msgid "Click here to install it" +msgstr "Haga clic aquí para instalarlo" + +#: app/views/menu.html:334 msgid "Code" msgstr "Código" -#: app/views/menu.html:212 +#: app/views/menu.html:185 msgid "Collection" msgstr "Colección" -#: app/scripts/services/tools.js:631 +#: app/views/menu.html:165 +msgid "Collection info" +msgstr "Información de la colección" + +#: app/scripts/controllers/menu.js:436 +msgid "Collection {{collection}} info not defined" +msgstr "Información de la colección {{collection}} no definida" + +#: app/scripts/services/tools.js:773 msgid "Collection {{name}} added" msgstr "Colección {{name}} añadida" -#: app/scripts/services/tools.js:625 +#: app/scripts/services/tools.js:767 msgid "Collection {{name}} not replaced" msgstr "Colección {{name}} no reemplazada" -#: app/scripts/services/tools.js:676 +#: app/scripts/services/tools.js:889 msgid "Collection {{name}} removed" msgstr "Colección {{name}} eliminada" -#: app/scripts/services/tools.js:621 +#: app/scripts/services/tools.js:763 msgid "Collection {{name}} replaced" msgstr "Colección {{name}} reemplazada" -#: app/scripts/controllers/menu.js:410 +#: app/scripts/controllers/menu.js:444 msgid "Collection {{name}} selected" msgstr "Colección {{name}} seleccionada" -#: app/views/menu.html:286 +#: app/views/menu.html:259 msgid "Collections" msgstr "Colecciones" -#: app/views/menu.html:332 +#: app/views/menu.html:305 msgid "Community forum" msgstr "Foro de la comunidad" -#: app/views/menu.html:358 +#: app/views/menu.html:331 msgid "Constant" msgstr "Constante" @@ -173,15 +190,15 @@ msgstr "Copiar" msgid "Cut" msgstr "Cortar" -#: app/views/menu.html:189 +#: app/views/menu.html:159 msgid "Datasheet" msgstr "Datasheet" -#: app/views/menu.html:216 +#: app/views/menu.html:189 msgid "Default" msgstr "Por defecto" -#: app/scripts/services/tools.js:322 +#: app/scripts/services/tools.js:481 msgid "" "Default toolchain not found. Toolchain will be downloaded. This operation " "requires Internet connection. Do you want to continue?" @@ -189,51 +206,51 @@ msgstr "" "No se encuentra la toolchain por defecto, por lo que será descargada. Esta " "operación requiere conexión a Internet. ¿Deseas continuar?" -#: app/scripts/services/utils.js:722 +#: app/scripts/services/utils.js:529 msgid "Description" msgstr "Descripción" -#: app/views/menu.html:126 app/views/menu.html:279 +#: app/views/menu.html:126 app/views/menu.html:252 msgid "Disable" msgstr "Deshabilitar" -#: app/scripts/controllers/menu.js:234 +#: app/scripts/controllers/menu.js:241 msgid "Do you want to close the application?" msgstr "¿Deseas cerrar la aplicación?" -#: app/scripts/services/project.js:104 +#: app/scripts/services/project.js:106 msgid "Do you want to convert it?" msgstr "¿Deseas convertirlo?" -#: app/scripts/controllers/menu.js:485 +#: app/scripts/controllers/menu.js:528 msgid "Do you want to remove the {{name}} collection?" msgstr "¿Deseas eliminar la colección {{name}}?" -#: app/scripts/services/tools.js:617 +#: app/scripts/services/tools.js:759 msgid "Do you want to replace it?" msgstr "¿Deseas reemplazarla?" -#: app/views/menu.html:325 +#: app/views/menu.html:298 msgid "Documentation" msgstr "Documentación" -#: app/views/menu.html:270 +#: app/views/menu.html:243 msgid "Drivers" msgstr "Drivers" -#: app/scripts/services/utils.js:453 app/scripts/services/utils.js:521 +#: app/scripts/services/drivers.js:128 app/scripts/services/drivers.js:78 msgid "Drivers disabled" msgstr "Drivers deshabilitados" -#: app/scripts/services/utils.js:450 app/scripts/services/utils.js:502 +#: app/scripts/services/drivers.js:120 app/scripts/services/drivers.js:75 msgid "Drivers enabled" msgstr "Drivers habilitados" -#: app/scripts/services/tools.js:246 +#: app/scripts/services/tools.js:265 msgid "Duplicated FPGA I/O ports" msgstr "Puertos E/S de la FPGA duplicados" -#: app/scripts/services/blocks.js:370 +#: app/scripts/services/blocks.js:376 msgid "Duplicated block attributes" msgstr "Atributos del bloque duplicados" @@ -241,15 +258,19 @@ msgstr "Atributos del bloque duplicados" msgid "Edit" msgstr "Editar" -#: app/views/menu.html:121 app/views/menu.html:274 +#: app/scripts/services/tools.js:748 +msgid "Edit the collection name" +msgstr "Edita el nombre de la colección" + +#: app/views/menu.html:121 app/views/menu.html:247 msgid "Enable" msgstr "Habilitar" -#: app/views/menu.html:137 +#: app/views/languages.html:4 msgid "English" msgstr "Inglés" -#: app/scripts/services/blocks.js:181 +#: app/scripts/services/blocks.js:185 msgid "Enter the constant blocks" msgstr "Introduce los bloques constante" @@ -257,39 +278,43 @@ msgstr "Introduce los bloques constante" msgid "Enter the input blocks" msgstr "Introduce los bloques de entrada" -#: app/scripts/services/blocks.js:269 +#: app/scripts/services/blocks.js:275 msgid "Enter the input ports" msgstr "Introduce los puertos de entrada" -#: app/scripts/services/blocks.js:112 +#: app/scripts/services/blocks.js:114 msgid "Enter the output blocks" msgstr "Introduce los bloques de salida" -#: app/scripts/services/blocks.js:270 +#: app/scripts/services/blocks.js:276 msgid "Enter the output ports" msgstr "Introduce los puertos de salida" -#: app/scripts/services/blocks.js:271 +#: app/scripts/services/blocks.js:277 msgid "Enter the parameters" msgstr "Introduce los parámetros" -#: app/scripts/controllers/menu.js:321 +#: app/scripts/controllers/menu.js:328 msgid "Enter the remote hostname user@host (experimental)" msgstr "Introduce el nombre del host remoto usuario@host (experimental)" -#: app/scripts/services/tools.js:345 +#: app/scripts/services/tools.js:504 msgid "Error: default toolchain not found in '{{dir}}'" msgstr "Error: toolchain por defecto no encontrada en '{{dir}}'" -#: app/scripts/services/utils.js:855 +#: app/scripts/services/utils.js:670 msgid "Error: {{error}}" msgstr "Error: {{error}}" +#: app/scripts/services/tools.js:336 +msgid "Errors detected in the code" +msgstr "Errores detectados en el código" + #: app/views/menu.html:39 msgid "Examples" msgstr "Ejemplos" -#: app/scripts/services/tools.js:204 +#: app/scripts/services/tools.js:206 msgid "Execute remote {{label}} ..." msgstr "Ejecutar {{label}} remoto ..." @@ -297,24 +322,24 @@ msgstr "Ejecutar {{label}} remoto ..." msgid "Export" msgstr "Exportar" -#: app/scripts/services/tools.js:478 +#: app/scripts/services/tools.js:637 msgid "Extract default apio files..." msgstr "Extraer ficheros de apio..." -#: app/scripts/services/tools.js:488 +#: app/scripts/services/tools.js:647 msgid "Extract default apio packages..." msgstr "Extraer paquetes de apio..." -#: app/scripts/services/tools.js:466 +#: app/scripts/services/tools.js:625 msgid "Extract virtual env files..." msgstr "Extraer ficheros del virtual env" -#: app/scripts/services/tools.js:240 app/scripts/services/tools.js:243 +#: app/scripts/services/tools.js:262 msgid "FPGA I/O ports not defined" msgstr "Puertos E/S de la FPGA no definidos" -#: app/scripts/services/blocks.js:113 app/scripts/services/blocks.js:53 -#: app/scripts/services/blocks.js:698 app/scripts/services/blocks.js:778 +#: app/scripts/services/blocks.js:115 app/scripts/services/blocks.js:53 +#: app/scripts/services/blocks.js:711 app/scripts/services/blocks.js:791 msgid "FPGA pin" msgstr "FPGA pin" @@ -322,18 +347,18 @@ msgstr "FPGA pin" msgid "File" msgstr "Archivo" -#: app/scripts/services/project.js:376 +#: app/scripts/services/project.js:425 msgid "" "File {{file}} already exists in the project path. Do you want to replace it?" msgstr "" "El archivo {{file}} ya existe en el directorio del proyecto. ¿Deseas " "reemplazarlo?" -#: app/scripts/services/tools.js:180 +#: app/scripts/services/tools.js:182 msgid "File {{file}} does not exist" msgstr "El archivo {{file}} no existe" -#: app/scripts/services/project.js:408 +#: app/scripts/services/project.js:459 msgid "File {{file}} imported" msgstr "Archivo {{file}} importado" @@ -341,110 +366,106 @@ msgstr "Archivo {{file}} importado" msgid "Fit content" msgstr "Ajustar contenido" -#: app/views/menu.html:161 +#: app/views/languages.html:28 msgid "French" msgstr "Francés" -#: app/scripts/controllers/menu.js:213 +#: app/scripts/controllers/menu.js:220 msgid "GTKWave exported" msgstr "GTKWave exportado" -#: app/views/menu.html:149 +#: app/views/languages.html:16 msgid "Galician" msgstr "Gallego" -#: app/views/menu.html:315 +#: app/views/menu.html:288 msgid "Help" msgstr "Ayuda" -#: app/scripts/services/utils.js:491 -msgid "Homebrew is required" -msgstr "Es necesario Homebrew" - -#: app/scripts/services/utils.js:736 +#: app/scripts/services/utils.js:543 msgid "Image" msgstr "Imagen" -#: app/scripts/controllers/menu.js:642 +#: app/scripts/controllers/menu.js:688 msgid "Image {{name}} saved" msgstr "Imagen {{name}} guardada" -#: app/views/menu.html:364 +#: app/views/menu.html:337 msgid "Information" msgstr "Información" -#: app/views/menu.html:352 +#: app/views/menu.html:325 msgid "Input" msgstr "Entrada" -#: app/views/menu.html:247 +#: app/views/menu.html:220 msgid "Install" msgstr "Instalar" -#: app/scripts/services/tools.js:483 +#: app/scripts/services/tools.js:642 msgid "Install default apio..." msgstr "Instalar apio..." -#: app/scripts/services/tools.js:532 +#: app/scripts/services/tools.js:691 msgid "Installation completed" msgstr "Instalación completada" -#: app/scripts/services/tools.js:375 app/scripts/services/tools.js:412 +#: app/scripts/services/tools.js:534 app/scripts/services/tools.js:571 msgid "Installing toolchain" msgstr "Instalando la toolchain" -#: app/scripts/services/tools.js:448 app/scripts/services/utils.js:495 +#: app/scripts/services/drivers.js:112 app/scripts/services/tools.js:607 msgid "Internet connection required" msgstr "Es necesario conexión a Internet" -#: app/scripts/services/graph.js:175 +#: app/scripts/services/graph.js:179 msgid "Invalid Pull up connection:
    block already connected" msgstr "Conexión de Pull up no válida:
    hay un bloque conectado" -#: app/scripts/services/graph.js:189 +#: app/scripts/services/graph.js:193 msgid "Invalid Pull up connection:
    only Input blocks allowed" msgstr "" "Conexión de Pull up no válida:
    sólo se permiten bloques " "Entrada" -#: app/scripts/services/graph.js:181 +#: app/scripts/services/graph.js:185 msgid "Invalid block connection:
    Pull up already connected" msgstr "Conexión de bloque no válida:
    hay un Pull up conectado" -#: app/scripts/services/tools.js:636 +#: app/scripts/services/tools.js:779 msgid "Invalid collection {{name}}" -msgstr "Colección {{name}} inválida" +msgstr "Colección {{name}} no válida" -#: app/scripts/services/graph.js:140 app/scripts/services/graph.js:147 -#: app/scripts/services/graph.js:154 +#: app/scripts/services/graph.js:143 app/scripts/services/graph.js:150 +#: app/scripts/services/graph.js:157 msgid "Invalid connection" msgstr "Conexión no válida" -#: app/scripts/services/graph.js:208 +#: app/scripts/services/graph.js:212 msgid "Invalid connection: {{a}} → {{b}}" msgstr "Conexión no válida: {{a}} → {{b}}" -#: app/scripts/services/graph.js:169 +#: app/scripts/services/graph.js:173 msgid "Invalid multiple input connections" msgstr "Conexiones de entrada múltiple no válidas" -#: app/views/menu.html:133 +#: app/scripts/services/drivers.js:190 +msgid "It is recommended to use USB 2.0 ports" +msgstr "Se recomienda utilizar puertos USB 2.0" + +#: app/views/menu.html:134 msgid "Language" msgstr "Idioma" -#: app/scripts/services/tools.js:579 -msgid "Load {{name}} ..." -msgstr "Cargar {{name}} ..." - -#: app/scripts/services/blocks.js:182 app/scripts/services/blocks.js:851 +#: app/scripts/services/blocks.js:186 app/scripts/services/blocks.js:864 msgid "Local parameter" msgstr "Parámetro local" -#: app/scripts/services/tools.js:471 +#: app/scripts/services/tools.js:630 msgid "Make virtual env..." msgstr "Crear virtual env..." -#: app/scripts/services/utils.js:720 +#: app/scripts/services/utils.js:527 msgid "Name" msgstr "Nombre" @@ -452,11 +473,11 @@ msgstr "Nombre" msgid "New" msgstr "Nuevo" -#: app/scripts/services/project.js:80 +#: app/scripts/services/project.js:81 msgid "New project {{name}} created" msgstr "Nuevo proyecto {{name}} creado" -#: app/scripts/controllers/menu.js:503 +#: app/scripts/controllers/menu.js:546 msgid "No collections stored" msgstr "Ninguna colección almacenada" @@ -464,7 +485,7 @@ msgstr "Ninguna colección almacenada" msgid "OK" msgstr "OK" -#: app/scripts/services/project.js:323 app/scripts/services/project.js:97 +#: app/scripts/services/project.js:364 app/scripts/services/project.js:99 msgid "Old project format {{version}}" msgstr "Formato de proyecto antiguo {{version}}" @@ -472,19 +493,19 @@ msgstr "Formato de proyecto antiguo {{version}}" msgid "Open" msgstr "Abrir" -#: app/scripts/services/utils.js:743 +#: app/scripts/services/utils.js:550 msgid "Open SVG" msgstr "Abrir SVG" -#: app/scripts/services/project.js:411 +#: app/scripts/services/project.js:462 msgid "Original file {{file}} does not exist" msgstr "El archivo original {{file}} no existe" -#: app/views/menu.html:355 +#: app/views/menu.html:328 msgid "Output" msgstr "Salida" -#: app/scripts/controllers/menu.js:195 +#: app/scripts/controllers/menu.js:202 msgid "PCF file exported" msgstr "Fichero PCF exportado" @@ -492,6 +513,10 @@ msgstr "Fichero PCF exportado" msgid "Paste" msgstr "Pegar" +#: app/scripts/services/utils.js:872 +msgid "Please run: {{cmd}}" +msgstr "Por favor ejecuta: {{cmd}}" + #: app/views/menu.html:108 msgid "Preferences" msgstr "Preferencias" @@ -500,15 +525,15 @@ msgstr "Preferencias" msgid "Project information" msgstr "Información del proyecto" -#: app/scripts/services/project.js:122 +#: app/scripts/services/project.js:125 msgid "Project {{name}} loaded" msgstr "Proyecto {{name}} cargado" -#: app/scripts/services/project.js:295 +#: app/scripts/services/project.js:334 msgid "Project {{name}} saved" msgstr "Proyecto {{name}} guardado" -#: app/scripts/services/tools.js:459 +#: app/scripts/services/tools.js:618 msgid "Python 2.7 is required" msgstr "Es necesario Python 2.7" @@ -516,7 +541,7 @@ msgstr "Es necesario Python 2.7" msgid "Quit" msgstr "Salir" -#: app/views/design.html:5 +#: app/scripts/services/blocks.js:946 app/views/design.html:5 msgid "Read only" msgstr "Solo lectura" @@ -524,27 +549,27 @@ msgstr "Solo lectura" msgid "Redo" msgstr "Rehacer" -#: app/scripts/services/tools.js:271 +#: app/scripts/services/tools.js:368 msgid "Remote host {{name}} not connected" msgstr "Host remoto {{name}} no conectado" -#: app/views/menu.html:170 +#: app/views/menu.html:140 msgid "Remote hostname" msgstr "Nombre del host remoto" -#: app/views/menu.html:255 app/views/menu.html:294 +#: app/views/menu.html:228 app/views/menu.html:267 msgid "Remove" msgstr "Eliminar" -#: app/views/menu.html:306 +#: app/views/menu.html:279 msgid "Remove all" msgstr "Eliminar todo" -#: app/scripts/services/utils.js:745 +#: app/scripts/services/utils.js:552 msgid "Reset SVG" msgstr "Resetear SVG" -#: app/views/menu.html:260 +#: app/views/menu.html:233 msgid "Reset default" msgstr "Reset default" @@ -556,7 +581,7 @@ msgstr "Resetear vista" msgid "Save" msgstr "Guardar" -#: app/scripts/services/utils.js:744 +#: app/scripts/services/utils.js:551 msgid "Save SVG" msgstr "Guardar SVG" @@ -564,7 +589,7 @@ msgstr "Guardar SVG" msgid "Save as" msgstr "Guardar como" -#: app/views/menu.html:198 +#: app/views/menu.html:171 msgid "Select" msgstr "Seleccionar" @@ -572,19 +597,19 @@ msgstr "Seleccionar" msgid "Select all" msgstr "Seleccionar todo" -#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:699 +#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:712 msgid "Show clock" msgstr "Mostrar reloj" -#: app/views/menu.html:328 +#: app/views/menu.html:301 msgid "Source code" msgstr "Código fuente" -#: app/views/menu.html:143 +#: app/views/languages.html:10 msgid "Spanish" msgstr "Español" -#: app/scripts/services/tools.js:193 +#: app/scripts/services/tools.js:195 msgid "Synchronize remote files ..." msgstr "Sincronizando ficheros remotos ..." @@ -592,15 +617,15 @@ msgstr "Sincronizando ficheros remotos ..." msgid "Testbench" msgstr "Testbench" -#: app/scripts/controllers/menu.js:204 +#: app/scripts/controllers/menu.js:211 msgid "Testbench exported" msgstr "Testbench exportado" -#: app/scripts/services/tools.js:616 +#: app/scripts/services/tools.js:758 msgid "The collection {{name}} already exists." msgstr "La colección {{name}} ya existe." -#: app/scripts/controllers/menu.js:424 +#: app/scripts/controllers/menu.js:465 msgid "" "The current FPGA I/O configuration will be lost. Do you want to change to " "{{name}} board?" @@ -608,16 +633,16 @@ msgstr "" "La configuración actual de E/S de la FPGA se perderá. ¿Deseas cambiar a la " "placa {{name}}?" -#: app/scripts/services/tools.js:350 +#: app/scripts/services/tools.js:509 msgid "The toolchain will be removed. Do you want to continue?" msgstr "La toolchain será eliminada. ¿Deseas continuar?" -#: app/scripts/services/tools.js:338 +#: app/scripts/services/tools.js:497 msgid "The toolchain will be restored to default. Do you want to continue?" msgstr "" "La toolchain será restaurada a los valores por defecto: ¿Deseas continuar?" -#: app/scripts/services/tools.js:330 +#: app/scripts/services/tools.js:489 msgid "" "The toolchain will be updated. This operation requires Internet connection. " "Do you want to continue?" @@ -625,7 +650,7 @@ msgstr "" "La toolchain será actualizada. Esta operación requiere conexión a Internet. " "¿Deseas continuar?" -#: app/scripts/services/project.js:345 +#: app/scripts/services/project.js:387 msgid "" "This import operation requires a project path. You need to save the current " "project. Do you want to continue?" @@ -633,32 +658,32 @@ msgstr "" "Esta operación de importación requiere una ruta del proyecto. Debes guardar " "el proyecto actual. ¿Deseas continuar?" -#: app/scripts/services/project.js:103 +#: app/scripts/services/project.js:105 msgid "This project is designed for the {{name}} board." msgstr "Este proyecto está diseñado para la placa {{name}}." -#: app/views/menu.html:243 +#: app/views/menu.html:216 msgid "Toolchain" msgstr "Toolchain" -#: app/scripts/services/tools.js:533 +#: app/scripts/services/tools.js:692 msgid "Toolchain installed" msgstr "Toolchain instalada" -#: app/scripts/services/tools.js:536 +#: app/scripts/services/tools.js:695 msgid "Toolchain not installed" msgstr "La toolchain no está instalada" -#: app/scripts/services/tools.js:92 app/scripts/services/utils.js:533 -#: app/scripts/services/utils.js:549 +#: app/scripts/services/drivers.js:197 app/scripts/services/drivers.js:213 +#: app/scripts/services/tools.js:94 msgid "Toolchain not installed. Please, install the toolchain" msgstr "La toolchain no está instalada. Por favor, instala la toolchain" -#: app/scripts/services/tools.js:355 +#: app/scripts/services/tools.js:514 msgid "Toolchain removed" msgstr "Toolchain eliminada" -#: app/views/menu.html:230 +#: app/views/menu.html:203 msgid "Tools" msgstr "Herramientas" @@ -666,74 +691,74 @@ msgstr "Herramientas" msgid "Undo" msgstr "Deshacer" -#: app/scripts/services/tools.js:237 +#: app/scripts/services/tools.js:257 msgid "Unknown board" msgstr "Placa desconocida" -#: app/scripts/app.js:43 +#: app/scripts/app.js:37 msgid "Untitled" msgstr "Sin título" -#: app/views/menu.html:250 +#: app/views/menu.html:223 msgid "Update" msgstr "Actualizar" -#: app/scripts/services/blocks.js:697 app/scripts/services/blocks.js:777 -#: app/scripts/services/blocks.js:850 +#: app/scripts/services/blocks.js:710 app/scripts/services/blocks.js:790 +#: app/scripts/services/blocks.js:863 msgid "Update the block name" msgstr "Actualiza el nombre del bloque" -#: app/views/menu.html:239 +#: app/views/menu.html:212 msgid "Upload" msgstr "Cargar" -#: app/views/menu.html:233 +#: app/views/menu.html:206 msgid "Verify" msgstr "Verificar" -#: app/scripts/controllers/menu.js:186 +#: app/scripts/controllers/menu.js:193 msgid "Verilog code exported" msgstr "Código Verilog exportado" -#: app/scripts/services/utils.js:721 app/views/menu.html:321 +#: app/scripts/services/utils.js:528 app/views/menu.html:294 msgid "Version" msgstr "Versión" -#: app/views/menu.html:180 +#: app/views/menu.html:150 msgid "View" msgstr "Ver" -#: app/views/menu.html:318 +#: app/views/menu.html:291 msgid "View license" msgstr "Ver licencia" -#: app/scripts/services/blocks.js:404 +#: app/scripts/services/blocks.js:410 msgid "Wrong block format: {{type}}" msgstr "Formato de bloque incorrecto: {{type}}" -#: app/scripts/services/blocks.js:132 app/scripts/services/blocks.js:201 -#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:768 -#: app/scripts/services/blocks.js:842 app/scripts/services/blocks.js:877 +#: app/scripts/services/blocks.js:134 app/scripts/services/blocks.js:205 +#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:781 +#: app/scripts/services/blocks.js:855 app/scripts/services/blocks.js:890 msgid "Wrong block name {{name}}" msgstr "Nombre del bloque {{name}} incorrecto" -#: app/scripts/services/blocks.js:319 +#: app/scripts/services/blocks.js:325 msgid "Wrong parameter name {{name}}" msgstr "Nombre del parámetro {{name}} incorrecto" -#: app/scripts/services/blocks.js:289 app/scripts/services/blocks.js:304 +#: app/scripts/services/blocks.js:295 app/scripts/services/blocks.js:310 msgid "Wrong port name {{name}}" msgstr "Nombre del puerto {{name}} incorrecto" -#: app/scripts/services/project.js:130 +#: app/scripts/services/project.js:133 msgid "Wrong project format: {{name}}" msgstr "Formato de proyecto incorrecto: {{name}}" -#: app/scripts/services/tools.js:268 +#: app/scripts/services/tools.js:365 msgid "Wrong remote hostname {{name}}" msgstr "Nombre del host remoto incorrecto {{name}}" -#: app/scripts/controllers/menu.js:235 +#: app/scripts/controllers/menu.js:242 msgid "Your changes will be lost if you don’t save them" msgstr "Tus cambios se perderán si no los guardas" @@ -742,47 +767,57 @@ msgid "back" msgstr "volver" #. Build done -#: app/scripts/services/tools.js:283 +#: app/scripts/services/tools.js:380 msgid "done_build" msgstr "Sintetizado realizado" #. Upload done -#: app/scripts/services/tools.js:285 +#: app/scripts/services/tools.js:382 msgid "done_upload" msgstr "Carga realizada" #. Verification done -#: app/scripts/services/tools.js:281 +#: app/scripts/services/tools.js:378 msgid "done_verify" msgstr "Verificación realizada" #. Start building ... -#: app/scripts/services/tools.js:60 +#: app/scripts/services/tools.js:61 msgid "start_build" msgstr "Comenzar sintetizado ..." #. Start uploading ... -#: app/scripts/services/tools.js:62 +#: app/scripts/services/tools.js:63 msgid "start_upload" msgstr "Comenzar carga ..." #. Start verification ... -#: app/scripts/services/tools.js:58 +#: app/scripts/services/tools.js:59 msgid "start_verify" msgstr "Comenzar verificación ..." -#: app/scripts/controllers/menu.js:383 +#: app/scripts/services/drivers.js:103 app/scripts/services/utils.js:847 +msgid "{{app}} is required." +msgstr "Es necesario {{app}}." + +#: app/scripts/controllers/menu.js:398 msgid "{{board}} datasheet not defined" msgstr "{{board}} datasheet no definido" -#: app/scripts/controllers/menu.js:373 +#: app/scripts/controllers/menu.js:388 msgid "{{board}} pinout not defined" msgstr "{{board}} pinout no definido" -#: app/scripts/controllers/menu.js:402 +#: app/scripts/controllers/menu.js:417 msgid "{{board}} rules not defined" msgstr "Reglas de {{board}} no definidas" +#~ msgid "Homebrew is required" +#~ msgstr "Es necesario Homebrew" + +#~ msgid "Load {{name}} ..." +#~ msgstr "Cargar {{name}} ..." + #~ msgid "1_basic" #~ msgstr "1. Básico" diff --git a/app/resources/locale/eu_ES/eu_ES.po b/app/resources/locale/eu_ES/eu_ES.po index 0d503d7b8..becd02cdb 100644 --- a/app/resources/locale/eu_ES/eu_ES.po +++ b/app/resources/locale/eu_ES/eu_ES.po @@ -12,39 +12,39 @@ msgstr "" "X-Generator: Poedit 1.8.7.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: app/scripts/services/utils.js:456 app/scripts/services/utils.js:536 +#: app/scripts/services/drivers.js:200 app/scripts/services/drivers.js:81 msgid "Unplug and reconnect the board" -msgstr "Plaka deskonektatu eta konekta ezazu berriro" +msgstr "Txartela deskonektatu eta konekta ezazu berriro" -#: app/scripts/services/utils.js:527 +#: app/scripts/services/drivers.js:189 msgid "" "

    FTDI driver installation instructions

    1. Connect the FPGA " "board
    2. Replace the (Interface 0) driver of the board by " "libusbK
    3. Unplug and reconnect the board
    " msgstr "" -"

    FTDI driver-a instalatzeko instrukzioak

    1. FPGA plaka konekta " -"ezazu
    2. Plakaren (Interface 0) driver-a aldatu eta jar ezazu " -"honakoa: libusbK
    3. Plaka deskonektatu eta konekta ezazu " -"berriro
    " +"

    FTDI driver-a instalatzeko instrukzioak

    1. FPGA txartela " +"konekta ezazu
    2. Txartelaren (Interface 0) driver-a aldatu eta " +"jar ezazu honakoa: libusbK
    3. Txartela deskonektatu eta konekta " +"ezazu berriro
    " -#: app/scripts/services/utils.js:543 +#: app/scripts/services/drivers.js:207 msgid "" "

    FTDI driver uninstallation instructions

    1. Find the FPGA USB " "Device
    2. Select the board interface and uninstall the driver
    " msgstr "" "

    FTDI driver-a desinstalatzeko instrukzioak

    1. FPGAren USB " -"gailua bila ezazu
    2. Plakaren interfazea hauta ezazu eta driver-a " +"gailua bila ezazu
    3. Txartelaren interfazea hauta ezazu eta driver-a " "desinstalatu
    " -#: app/views/menu.html:336 +#: app/views/menu.html:309 msgid "About Icestudio" msgstr "Icestudio-ri buruz..." -#: app/views/menu.html:290 +#: app/views/menu.html:263 msgid "Add" msgstr "Gehitu" -#: app/scripts/controllers/menu.js:471 +#: app/scripts/controllers/menu.js:516 msgid "Add a block to start" msgstr "Gehi ezazu bloke bat hasteko" @@ -52,65 +52,66 @@ msgstr "Gehi ezazu bloke bat hasteko" msgid "Add as block" msgstr "Blokea sortu" -#: app/scripts/services/tools.js:682 +#: app/scripts/services/tools.js:895 msgid "All collections removed" msgstr "Bildumak ezabatu dira" -#: app/scripts/controllers/menu.js:495 +#: app/scripts/controllers/menu.js:538 msgid "All stored collections will be lost. Do you want to continue?" msgstr "Gordetako bildumak galduko dira. Jarraitu nahi al duzu?" -#: app/scripts/services/utils.js:723 +#: app/scripts/services/utils.js:530 msgid "Author" msgstr "Egilea" -#: app/views/menu.html:347 +#: app/views/menu.html:320 msgid "Basic" msgstr "Oinarrizkoa" -#: app/views/menu.html:155 +#: app/views/languages.html:22 msgid "Basque" msgstr "Euskara" -#: app/scripts/services/blocks.js:742 app/scripts/services/blocks.js:763 -#: app/scripts/services/blocks.js:818 app/scripts/services/blocks.js:837 -#: app/scripts/services/blocks.js:872 app/scripts/services/blocks.js:911 +#: app/scripts/services/blocks.js:755 app/scripts/services/blocks.js:776 +#: app/scripts/services/blocks.js:831 app/scripts/services/blocks.js:850 +#: app/scripts/services/blocks.js:885 app/scripts/services/blocks.js:926 +#: app/scripts/services/blocks.js:960 msgid "Block updated" msgstr "Etiketa freskatua dago" -#: app/scripts/services/project.js:418 +#: app/scripts/services/project.js:413 msgid "Block {{name}} imported" msgstr "{{name}} blokea inportatu duzu" #: app/views/menu.html:35 msgid "Blocks" -msgstr "" +msgstr "Blokeak" -#: app/views/menu.html:201 +#: app/views/menu.html:174 msgid "Board" -msgstr "" +msgstr "Txartela" -#: app/views/menu.html:115 app/views/menu.html:192 +#: app/views/menu.html:115 app/views/menu.html:162 msgid "Board rules" -msgstr "" +msgstr "Txartelaren arauak" -#: app/scripts/controllers/menu.js:334 +#: app/scripts/controllers/menu.js:341 msgid "Board rules disabled" -msgstr "" +msgstr "Txartelaren arauak desgaituta" -#: app/scripts/controllers/menu.js:329 +#: app/scripts/controllers/menu.js:336 msgid "Board rules enabled" -msgstr "" +msgstr "Txartelaren arauak gaituta" -#: app/scripts/services/tools.js:234 +#: app/scripts/services/tools.js:254 msgid "Board {{name}} not detected" -msgstr "{{name}} plaka ez da aurkitu" +msgstr "{{name}} txartela ez da aurkitu" -#: app/scripts/controllers/menu.js:435 +#: app/scripts/controllers/menu.js:477 msgid "Board {{name}} selected" -msgstr "{{name}} plaka hautatu duzu" +msgstr "{{name}} txartela hautatu duzu" -#: app/views/menu.html:236 +#: app/views/menu.html:209 msgid "Build" msgstr "Sintetizatu" @@ -118,51 +119,67 @@ msgstr "Sintetizatu" msgid "Cancel" msgstr "Utzi" -#: app/scripts/services/tools.js:446 +#: app/views/languages.html:34 +msgid "Catalan" +msgstr "Katalan" + +#: app/scripts/services/tools.js:605 msgid "Check Internet connection..." msgstr "Interneteko sarbidea egiaztatu..." -#: app/scripts/services/tools.js:454 +#: app/scripts/services/tools.js:613 msgid "Check Python..." msgstr "Python egiaztatu..." -#: app/views/menu.html:361 +#: app/scripts/services/drivers.js:104 +msgid "Click here to install it" +msgstr "" + +#: app/views/menu.html:334 msgid "Code" msgstr "Kodea" -#: app/views/menu.html:212 +#: app/views/menu.html:185 msgid "Collection" +msgstr "Bilduma" + +#: app/views/menu.html:165 +msgid "Collection info" msgstr "" -#: app/scripts/services/tools.js:631 -msgid "Collection {{name}} added" +#: app/scripts/controllers/menu.js:436 +msgid "Collection {{collection}} info not defined" msgstr "" -#: app/scripts/services/tools.js:625 +#: app/scripts/services/tools.js:773 +msgid "Collection {{name}} added" +msgstr "{{name}} bilduma gehitu da" + +#: app/scripts/services/tools.js:767 msgid "Collection {{name}} not replaced" -msgstr "" +msgstr "{{name}} bilduma ez da ordeztu" -#: app/scripts/services/tools.js:676 +#: app/scripts/services/tools.js:889 msgid "Collection {{name}} removed" msgstr "{{name}} bilduma ezabatu da" -#: app/scripts/services/tools.js:621 +#: app/scripts/services/tools.js:763 msgid "Collection {{name}} replaced" -msgstr "" +msgstr "{{name}} bilduma ordeztu da" -#: app/scripts/controllers/menu.js:410 +#: app/scripts/controllers/menu.js:444 msgid "Collection {{name}} selected" msgstr "{{name}} bilduma hautatu da" -#: app/views/menu.html:286 +#: app/views/menu.html:259 msgid "Collections" msgstr "Bildumak" -#: app/views/menu.html:332 +#: app/views/menu.html:305 msgid "Community forum" msgstr "Komunitatearen foroa" -#: app/views/menu.html:358 +#: app/views/menu.html:331 msgid "Constant" msgstr "Konstantea" @@ -174,15 +191,15 @@ msgstr "Kopiatu" msgid "Cut" msgstr "Ebaki" -#: app/views/menu.html:189 +#: app/views/menu.html:159 msgid "Datasheet" msgstr "Datu-fitxa" -#: app/views/menu.html:216 +#: app/views/menu.html:189 msgid "Default" msgstr "Lehenetsia" -#: app/scripts/services/tools.js:322 +#: app/scripts/services/tools.js:481 msgid "" "Default toolchain not found. Toolchain will be downloaded. This operation " "requires Internet connection. Do you want to continue?" @@ -190,51 +207,51 @@ msgstr "" "Toolchain lehenetsia ez da aurkitu. Hortaz, deskargatu egingo da. Eragiketak " "Interneteko sarbidea behar du, jarraitu nahi al duzu?" -#: app/scripts/services/utils.js:722 +#: app/scripts/services/utils.js:529 msgid "Description" msgstr "Azalpena" -#: app/views/menu.html:126 app/views/menu.html:279 +#: app/views/menu.html:126 app/views/menu.html:252 msgid "Disable" msgstr "Desgaitu" -#: app/scripts/controllers/menu.js:234 +#: app/scripts/controllers/menu.js:241 msgid "Do you want to close the application?" msgstr "Aplikazioa itxi nahi al duzu?" -#: app/scripts/services/project.js:104 +#: app/scripts/services/project.js:106 msgid "Do you want to convert it?" -msgstr "" +msgstr "Bihurtu nahi al duzu?" -#: app/scripts/controllers/menu.js:485 +#: app/scripts/controllers/menu.js:528 msgid "Do you want to remove the {{name}} collection?" msgstr "{{name}} bilduma ezabatu nahi al duzu?" -#: app/scripts/services/tools.js:617 +#: app/scripts/services/tools.js:759 msgid "Do you want to replace it?" -msgstr "" +msgstr "Ordeztu nahi al duzu?" -#: app/views/menu.html:325 +#: app/views/menu.html:298 msgid "Documentation" msgstr "Dokumentazioa" -#: app/views/menu.html:270 +#: app/views/menu.html:243 msgid "Drivers" msgstr "Driverrak" -#: app/scripts/services/utils.js:453 app/scripts/services/utils.js:521 +#: app/scripts/services/drivers.js:128 app/scripts/services/drivers.js:78 msgid "Drivers disabled" msgstr "Driverrak desgaitu dira" -#: app/scripts/services/utils.js:450 app/scripts/services/utils.js:502 +#: app/scripts/services/drivers.js:120 app/scripts/services/drivers.js:75 msgid "Drivers enabled" msgstr "Driverrak gaitu dira" -#: app/scripts/services/tools.js:246 +#: app/scripts/services/tools.js:265 msgid "Duplicated FPGA I/O ports" msgstr "FPGAren E/S portuak bikoiztu dira" -#: app/scripts/services/blocks.js:370 +#: app/scripts/services/blocks.js:376 msgid "Duplicated block attributes" msgstr "Blokearen ezaugarriak bikoiztu dira" @@ -242,56 +259,64 @@ msgstr "Blokearen ezaugarriak bikoiztu dira" msgid "Edit" msgstr "Editatu" -#: app/views/menu.html:121 app/views/menu.html:274 +#: app/scripts/services/tools.js:748 +msgid "Edit the collection name" +msgstr "" + +#: app/views/menu.html:121 app/views/menu.html:247 msgid "Enable" msgstr "Onartu" -#: app/views/menu.html:137 +#: app/views/languages.html:4 msgid "English" msgstr "Ingelesa" -#: app/scripts/services/blocks.js:181 +#: app/scripts/services/blocks.js:185 msgid "Enter the constant blocks" msgstr "Konstante-blokeak sar itzazu" #: app/scripts/services/blocks.js:52 msgid "Enter the input blocks" -msgstr "" +msgstr "Sarrerako blokeak sar itzazu" -#: app/scripts/services/blocks.js:269 +#: app/scripts/services/blocks.js:275 msgid "Enter the input ports" msgstr "Sarrerako portuak sar itzazu" -#: app/scripts/services/blocks.js:112 +#: app/scripts/services/blocks.js:114 msgid "Enter the output blocks" -msgstr "" +msgstr "Irteerako blokeak sar itzazu" -#: app/scripts/services/blocks.js:270 +#: app/scripts/services/blocks.js:276 msgid "Enter the output ports" msgstr "Irteerako portuak sar itzazu" -#: app/scripts/services/blocks.js:271 +#: app/scripts/services/blocks.js:277 msgid "Enter the parameters" msgstr "Parametroak sar itzazu" -#: app/scripts/controllers/menu.js:321 +#: app/scripts/controllers/menu.js:328 msgid "Enter the remote hostname user@host (experimental)" msgstr "" "Urrutiko ostalariaren izena sar ezazu erabiltzailea@host (esperimentala)" -#: app/scripts/services/tools.js:345 +#: app/scripts/services/tools.js:504 msgid "Error: default toolchain not found in '{{dir}}'" msgstr "Errorea: Toolchain lehenetsia ez da '{{dir}}'-en aurkitu" -#: app/scripts/services/utils.js:855 +#: app/scripts/services/utils.js:670 msgid "Error: {{error}}" msgstr "Errorea: {{error}}" +#: app/scripts/services/tools.js:336 +msgid "Errors detected in the code" +msgstr "" + #: app/views/menu.html:39 msgid "Examples" msgstr "Adibideak" -#: app/scripts/services/tools.js:204 +#: app/scripts/services/tools.js:206 msgid "Execute remote {{label}} ..." msgstr "Exekutatu urrutiko {{label}} ..." @@ -299,24 +324,24 @@ msgstr "Exekutatu urrutiko {{label}} ..." msgid "Export" msgstr "Esportatu" -#: app/scripts/services/tools.js:478 +#: app/scripts/services/tools.js:637 msgid "Extract default apio files..." msgstr "Apio fitxategiak atera..." -#: app/scripts/services/tools.js:488 +#: app/scripts/services/tools.js:647 msgid "Extract default apio packages..." msgstr "Apio pakete lehenetsiak atera..." -#: app/scripts/services/tools.js:466 +#: app/scripts/services/tools.js:625 msgid "Extract virtual env files..." msgstr "Env birtualaren fitxategiak atera..." -#: app/scripts/services/tools.js:240 app/scripts/services/tools.js:243 +#: app/scripts/services/tools.js:262 msgid "FPGA I/O ports not defined" msgstr "FPGAren E/S portuak definitu gabe daude" -#: app/scripts/services/blocks.js:113 app/scripts/services/blocks.js:53 -#: app/scripts/services/blocks.js:698 app/scripts/services/blocks.js:778 +#: app/scripts/services/blocks.js:115 app/scripts/services/blocks.js:53 +#: app/scripts/services/blocks.js:711 app/scripts/services/blocks.js:791 msgid "FPGA pin" msgstr "FPGA pina" @@ -324,18 +349,18 @@ msgstr "FPGA pina" msgid "File" msgstr "Fitxategia" -#: app/scripts/services/project.js:376 +#: app/scripts/services/project.js:425 msgid "" "File {{file}} already exists in the project path. Do you want to replace it?" msgstr "" "Proiektuaren direktorioan {{file}} fitxategia dagoeneko bada. Fitxategia " "ordeztu nahi al duzu?" -#: app/scripts/services/tools.js:180 +#: app/scripts/services/tools.js:182 msgid "File {{file}} does not exist" msgstr "Ez dago {{file}} izeneko fitxategirik" -#: app/scripts/services/project.js:408 +#: app/scripts/services/project.js:459 msgid "File {{file}} imported" msgstr "{{file}} fitxategia inportatu da" @@ -343,111 +368,107 @@ msgstr "{{file}} fitxategia inportatu da" msgid "Fit content" msgstr "Edukia doitu" -#: app/views/menu.html:161 +#: app/views/languages.html:28 msgid "French" msgstr "Frantsesa" -#: app/scripts/controllers/menu.js:213 +#: app/scripts/controllers/menu.js:220 msgid "GTKWave exported" msgstr "GTKWave-a esportatu da" -#: app/views/menu.html:149 +#: app/views/languages.html:16 msgid "Galician" msgstr "Galegoa" -#: app/views/menu.html:315 +#: app/views/menu.html:288 msgid "Help" msgstr "Laguntza" -#: app/scripts/services/utils.js:491 -msgid "Homebrew is required" -msgstr "Homebrew-a behar da" - -#: app/scripts/services/utils.js:736 +#: app/scripts/services/utils.js:543 msgid "Image" msgstr "Irudia" -#: app/scripts/controllers/menu.js:642 +#: app/scripts/controllers/menu.js:688 msgid "Image {{name}} saved" msgstr "{{name}} izeneko irudia gorde da" -#: app/views/menu.html:364 +#: app/views/menu.html:337 msgid "Information" msgstr "Informazioa" -#: app/views/menu.html:352 +#: app/views/menu.html:325 msgid "Input" msgstr "Sarrera" -#: app/views/menu.html:247 +#: app/views/menu.html:220 msgid "Install" msgstr "Instalatu" -#: app/scripts/services/tools.js:483 +#: app/scripts/services/tools.js:642 msgid "Install default apio..." msgstr "Apio lehenetsia instalatu..." -#: app/scripts/services/tools.js:532 +#: app/scripts/services/tools.js:691 msgid "Installation completed" msgstr "Instalazioa amaitu da" -#: app/scripts/services/tools.js:375 app/scripts/services/tools.js:412 +#: app/scripts/services/tools.js:534 app/scripts/services/tools.js:571 msgid "Installing toolchain" msgstr "Toolchain-a instalatzen ari da" -#: app/scripts/services/tools.js:448 app/scripts/services/utils.js:495 +#: app/scripts/services/drivers.js:112 app/scripts/services/tools.js:607 msgid "Internet connection required" msgstr "Interneteko sarbidea behar da" -#: app/scripts/services/graph.js:175 +#: app/scripts/services/graph.js:179 msgid "Invalid Pull up connection:
    block already connected" msgstr "Pull up konexio baliogabea:
    blokea dagoeneko konektatua dago" -#: app/scripts/services/graph.js:189 +#: app/scripts/services/graph.js:193 msgid "Invalid Pull up connection:
    only Input blocks allowed" msgstr "" "Pull up konexio baliogabea:
    sarrera blokeak soilik dira " "onargarriak" -#: app/scripts/services/graph.js:181 +#: app/scripts/services/graph.js:185 msgid "Invalid block connection:
    Pull up already connected" msgstr "" "Bloke konexio baliogabeak:
    Pull up -a dagoeneko konektatua dago" -#: app/scripts/services/tools.js:636 +#: app/scripts/services/tools.js:779 msgid "Invalid collection {{name}}" -msgstr "" +msgstr "{{name}} bilduma baliogabea" -#: app/scripts/services/graph.js:140 app/scripts/services/graph.js:147 -#: app/scripts/services/graph.js:154 +#: app/scripts/services/graph.js:143 app/scripts/services/graph.js:150 +#: app/scripts/services/graph.js:157 msgid "Invalid connection" msgstr "Konexio baliogabea" -#: app/scripts/services/graph.js:208 +#: app/scripts/services/graph.js:212 msgid "Invalid connection: {{a}} → {{b}}" msgstr "Konexio baliogabea: {{a}} → {{b}}" -#: app/scripts/services/graph.js:169 +#: app/scripts/services/graph.js:173 msgid "Invalid multiple input connections" msgstr "Sarrerako konexio anitzak baliogabeak" -#: app/views/menu.html:133 +#: app/scripts/services/drivers.js:190 +msgid "It is recommended to use USB 2.0 ports" +msgstr "" + +#: app/views/menu.html:134 msgid "Language" msgstr "Hizkuntza" -#: app/scripts/services/tools.js:579 -msgid "Load {{name}} ..." -msgstr "" - -#: app/scripts/services/blocks.js:182 app/scripts/services/blocks.js:851 +#: app/scripts/services/blocks.js:186 app/scripts/services/blocks.js:864 msgid "Local parameter" msgstr "Parametro lokala" -#: app/scripts/services/tools.js:471 +#: app/scripts/services/tools.js:630 msgid "Make virtual env..." msgstr "Env birtuala sortu..." -#: app/scripts/services/utils.js:720 +#: app/scripts/services/utils.js:527 msgid "Name" msgstr "Izena" @@ -455,11 +476,11 @@ msgstr "Izena" msgid "New" msgstr "Berria" -#: app/scripts/services/project.js:80 +#: app/scripts/services/project.js:81 msgid "New project {{name}} created" msgstr "{{name}} proiektua sortu da" -#: app/scripts/controllers/menu.js:503 +#: app/scripts/controllers/menu.js:546 msgid "No collections stored" msgstr "Ez dago gordeta bildumarik" @@ -467,27 +488,27 @@ msgstr "Ez dago gordeta bildumarik" msgid "OK" msgstr "Ok" -#: app/scripts/services/project.js:323 app/scripts/services/project.js:97 +#: app/scripts/services/project.js:364 app/scripts/services/project.js:99 msgid "Old project format {{version}}" -msgstr "{{version}} formatuko proiektu zaharra" +msgstr "{{version}} formatu zaharra duen proiektua" #: app/views/menu.html:32 msgid "Open" msgstr "Ireki" -#: app/scripts/services/utils.js:743 +#: app/scripts/services/utils.js:550 msgid "Open SVG" msgstr "SVGa ireki" -#: app/scripts/services/project.js:411 +#: app/scripts/services/project.js:462 msgid "Original file {{file}} does not exist" msgstr "Jatorrizko {{file}} fitxategia ez dago" -#: app/views/menu.html:355 +#: app/views/menu.html:328 msgid "Output" msgstr "Irteera" -#: app/scripts/controllers/menu.js:195 +#: app/scripts/controllers/menu.js:202 msgid "PCF file exported" msgstr "PCF fitxategia esportatu da" @@ -495,6 +516,10 @@ msgstr "PCF fitxategia esportatu da" msgid "Paste" msgstr "Itsatsi" +#: app/scripts/services/utils.js:872 +msgid "Please run: {{cmd}}" +msgstr "" + #: app/views/menu.html:108 msgid "Preferences" msgstr "Lehentasunak" @@ -503,15 +528,15 @@ msgstr "Lehentasunak" msgid "Project information" msgstr "Proiektuaren informazioa" -#: app/scripts/services/project.js:122 +#: app/scripts/services/project.js:125 msgid "Project {{name}} loaded" msgstr "{{name}} proiektua kargatu da" -#: app/scripts/services/project.js:295 +#: app/scripts/services/project.js:334 msgid "Project {{name}} saved" msgstr "{{name}} proiektua gorde da" -#: app/scripts/services/tools.js:459 +#: app/scripts/services/tools.js:618 msgid "Python 2.7 is required" msgstr "Python 2.7 behar da" @@ -519,7 +544,7 @@ msgstr "Python 2.7 behar da" msgid "Quit" msgstr "Utzi" -#: app/views/design.html:5 +#: app/scripts/services/blocks.js:946 app/views/design.html:5 msgid "Read only" msgstr "Irakurtzeko soilik" @@ -527,27 +552,27 @@ msgstr "Irakurtzeko soilik" msgid "Redo" msgstr "Berregin" -#: app/scripts/services/tools.js:271 +#: app/scripts/services/tools.js:368 msgid "Remote host {{name}} not connected" msgstr "{{name}} urrutiko ostalaria ez dago konektatua" -#: app/views/menu.html:170 +#: app/views/menu.html:140 msgid "Remote hostname" msgstr "Urrutiko ostalariaren izena" -#: app/views/menu.html:255 app/views/menu.html:294 +#: app/views/menu.html:228 app/views/menu.html:267 msgid "Remove" msgstr "Ezabatu" -#: app/views/menu.html:306 +#: app/views/menu.html:279 msgid "Remove all" msgstr "Dena ezabatu" -#: app/scripts/services/utils.js:745 +#: app/scripts/services/utils.js:552 msgid "Reset SVG" msgstr "SVGa berrezarri" -#: app/views/menu.html:260 +#: app/views/menu.html:233 msgid "Reset default" msgstr "Jatorrizkoa berrezarri" @@ -559,7 +584,7 @@ msgstr "Bista berrezarri" msgid "Save" msgstr "Gorde" -#: app/scripts/services/utils.js:744 +#: app/scripts/services/utils.js:551 msgid "Save SVG" msgstr "SVGa gorde" @@ -567,27 +592,27 @@ msgstr "SVGa gorde" msgid "Save as" msgstr "Gorde honela" -#: app/views/menu.html:198 +#: app/views/menu.html:171 msgid "Select" -msgstr "" +msgstr "Hautatu" #: app/views/menu.html:97 msgid "Select all" msgstr "Dena hautatu" -#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:699 +#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:712 msgid "Show clock" -msgstr "" +msgstr "Ordularia erakutsi" -#: app/views/menu.html:328 +#: app/views/menu.html:301 msgid "Source code" msgstr "Iturburu kodea" -#: app/views/menu.html:143 +#: app/views/languages.html:10 msgid "Spanish" msgstr "Gaztelera" -#: app/scripts/services/tools.js:193 +#: app/scripts/services/tools.js:195 msgid "Synchronize remote files ..." msgstr "Urrutiko fitxategiak sinkronizatu..." @@ -595,31 +620,31 @@ msgstr "Urrutiko fitxategiak sinkronizatu..." msgid "Testbench" msgstr "Testbench " -#: app/scripts/controllers/menu.js:204 +#: app/scripts/controllers/menu.js:211 msgid "Testbench exported" msgstr "Testbench-a esportatu da" -#: app/scripts/services/tools.js:616 +#: app/scripts/services/tools.js:758 msgid "The collection {{name}} already exists." -msgstr "" +msgstr "{{name}} bilduma badago" -#: app/scripts/controllers/menu.js:424 +#: app/scripts/controllers/menu.js:465 msgid "" "The current FPGA I/O configuration will be lost. Do you want to change to " "{{name}} board?" msgstr "" -"FPGAaren E/S konfigurazioa galduko da. {{name}} plaka aldatu nahi duzu?" +"FPGAaren E/S konfigurazioa galduko da. {{name}} txartela aldatu nahi al duzu?" -#: app/scripts/services/tools.js:350 +#: app/scripts/services/tools.js:509 msgid "The toolchain will be removed. Do you want to continue?" msgstr "Toolchain-a ezabatuko da. Jarraitu nahi al duzu?" -#: app/scripts/services/tools.js:338 +#: app/scripts/services/tools.js:497 msgid "The toolchain will be restored to default. Do you want to continue?" msgstr "" "Toolchain-aren jatorrizko balioak berrezarriko dira. Jarraitu nahi al duzu?" -#: app/scripts/services/tools.js:330 +#: app/scripts/services/tools.js:489 msgid "" "The toolchain will be updated. This operation requires Internet connection. " "Do you want to continue?" @@ -627,7 +652,7 @@ msgstr "" "Toolchain-a eguneratuko da. Operazio horrek Interneteko sarbidea behar du. " "Jarraitu nahi al duzu?" -#: app/scripts/services/project.js:345 +#: app/scripts/services/project.js:387 msgid "" "This import operation requires a project path. You need to save the current " "project. Do you want to continue?" @@ -635,32 +660,32 @@ msgstr "" "Inportazio operazioak proiektu-bidea behar du. Uneko proiektua gorde " "beharko duzu. Jarraitu nahi al duzu?" -#: app/scripts/services/project.js:103 +#: app/scripts/services/project.js:105 msgid "This project is designed for the {{name}} board." -msgstr "" +msgstr "Proiektua {{name}} txartelarentzat diseinatu da." -#: app/views/menu.html:243 +#: app/views/menu.html:216 msgid "Toolchain" msgstr "Toolchain" -#: app/scripts/services/tools.js:533 +#: app/scripts/services/tools.js:692 msgid "Toolchain installed" msgstr "Toolchain-a instalatu da" -#: app/scripts/services/tools.js:536 +#: app/scripts/services/tools.js:695 msgid "Toolchain not installed" msgstr "Toolchain-a ez da instalatu" -#: app/scripts/services/tools.js:92 app/scripts/services/utils.js:533 -#: app/scripts/services/utils.js:549 +#: app/scripts/services/drivers.js:197 app/scripts/services/drivers.js:213 +#: app/scripts/services/tools.js:94 msgid "Toolchain not installed. Please, install the toolchain" msgstr "Toolchain-a ez da instalatu. Mesedez, toolchaina instala ezazu" -#: app/scripts/services/tools.js:355 +#: app/scripts/services/tools.js:514 msgid "Toolchain removed" msgstr "Toolchain-a ezabatu da" -#: app/views/menu.html:230 +#: app/views/menu.html:203 msgid "Tools" msgstr "Tresnak" @@ -668,74 +693,74 @@ msgstr "Tresnak" msgid "Undo" msgstr "Desegin" -#: app/scripts/services/tools.js:237 +#: app/scripts/services/tools.js:257 msgid "Unknown board" -msgstr "Plaka ezezaguna" +msgstr "Txartel ezezaguna" -#: app/scripts/app.js:43 +#: app/scripts/app.js:37 msgid "Untitled" msgstr "Izenik gabe" -#: app/views/menu.html:250 +#: app/views/menu.html:223 msgid "Update" msgstr "Eguneratu" -#: app/scripts/services/blocks.js:697 app/scripts/services/blocks.js:777 -#: app/scripts/services/blocks.js:850 +#: app/scripts/services/blocks.js:710 app/scripts/services/blocks.js:790 +#: app/scripts/services/blocks.js:863 msgid "Update the block name" -msgstr "" +msgstr "Blokearen izena egunera ezazu" -#: app/views/menu.html:239 +#: app/views/menu.html:212 msgid "Upload" msgstr "Kargatu" -#: app/views/menu.html:233 +#: app/views/menu.html:206 msgid "Verify" msgstr "Egiaztatu" -#: app/scripts/controllers/menu.js:186 +#: app/scripts/controllers/menu.js:193 msgid "Verilog code exported" msgstr "Verilog kodea esportatu da" -#: app/scripts/services/utils.js:721 app/views/menu.html:321 +#: app/scripts/services/utils.js:528 app/views/menu.html:294 msgid "Version" msgstr "Bertsioa" -#: app/views/menu.html:180 +#: app/views/menu.html:150 msgid "View" msgstr "Ikusi" -#: app/views/menu.html:318 +#: app/views/menu.html:291 msgid "View license" msgstr "Lizentzia ikusi" -#: app/scripts/services/blocks.js:404 +#: app/scripts/services/blocks.js:410 msgid "Wrong block format: {{type}}" msgstr "Blokearen formatua okerra da: {{type}}" -#: app/scripts/services/blocks.js:132 app/scripts/services/blocks.js:201 -#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:768 -#: app/scripts/services/blocks.js:842 app/scripts/services/blocks.js:877 +#: app/scripts/services/blocks.js:134 app/scripts/services/blocks.js:205 +#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:781 +#: app/scripts/services/blocks.js:855 app/scripts/services/blocks.js:890 msgid "Wrong block name {{name}}" -msgstr "" +msgstr "{{name}} blokearen izena okerra da" -#: app/scripts/services/blocks.js:319 +#: app/scripts/services/blocks.js:325 msgid "Wrong parameter name {{name}}" msgstr "Parametroaren formatua okerra da: {{name}}" -#: app/scripts/services/blocks.js:289 app/scripts/services/blocks.js:304 +#: app/scripts/services/blocks.js:295 app/scripts/services/blocks.js:310 msgid "Wrong port name {{name}}" msgstr "Portuaren izena okerra da: {{name}}" -#: app/scripts/services/project.js:130 +#: app/scripts/services/project.js:133 msgid "Wrong project format: {{name}}" msgstr "Proiektuaren formatua okerra da: {{name}}" -#: app/scripts/services/tools.js:268 +#: app/scripts/services/tools.js:365 msgid "Wrong remote hostname {{name}}" msgstr "Urrutiko ostalariaren {{name}} izena okerra da" -#: app/scripts/controllers/menu.js:235 +#: app/scripts/controllers/menu.js:242 msgid "Your changes will be lost if you don’t save them" msgstr "Aldaketak galduko dituzu gordetzen ez badituzu" @@ -744,46 +769,56 @@ msgid "back" msgstr "atzera" #. Build done -#: app/scripts/services/tools.js:283 +#: app/scripts/services/tools.js:380 msgid "done_build" msgstr "Sintetizatua egin da" #. Upload done -#: app/scripts/services/tools.js:285 +#: app/scripts/services/tools.js:382 msgid "done_upload" msgstr "Karga egin da" #. Verification done -#: app/scripts/services/tools.js:281 +#: app/scripts/services/tools.js:378 msgid "done_verify" msgstr "Egiaztapena egin da" #. Start building ... -#: app/scripts/services/tools.js:60 +#: app/scripts/services/tools.js:61 msgid "start_build" msgstr "Sintetizatua hasi ..." #. Start uploading ... -#: app/scripts/services/tools.js:62 +#: app/scripts/services/tools.js:63 msgid "start_upload" msgstr "Karga hasi ..." #. Start verification ... -#: app/scripts/services/tools.js:58 +#: app/scripts/services/tools.js:59 msgid "start_verify" msgstr "Egiaztapena hasi ..." -#: app/scripts/controllers/menu.js:383 +#: app/scripts/services/drivers.js:103 app/scripts/services/utils.js:847 +msgid "{{app}} is required." +msgstr "" + +#: app/scripts/controllers/menu.js:398 msgid "{{board}} datasheet not defined" msgstr "{{board}} ez zehaztua" -#: app/scripts/controllers/menu.js:373 +#: app/scripts/controllers/menu.js:388 msgid "{{board}} pinout not defined" msgstr "{{board}} pinout ez zehaztua" -#: app/scripts/controllers/menu.js:402 +#: app/scripts/controllers/menu.js:417 msgid "{{board}} rules not defined" -msgstr "" +msgstr "{{board}} txartelaren arauak ez daude definituta" + +#~ msgid "Homebrew is required" +#~ msgstr "Homebrew-a behar da" + +#~ msgid "Load {{name}} ..." +#~ msgstr "{{name}} karga ezazu..." #~ msgid "1_basic" #~ msgstr "1. Oinarrizkoa" @@ -798,7 +833,7 @@ msgstr "" #~ msgstr "3. Pultsadorea eta AND atea" #~ msgid "Boards" -#~ msgstr "Plakak" +#~ msgstr "Txartelak" #~ msgid "Collection file {{name}} added" #~ msgstr "{{name}} bildumen fitxategia gehitu da" diff --git a/app/resources/locale/fr_FR/fr_FR.po b/app/resources/locale/fr_FR/fr_FR.po index 7d5ddb00b..f564e39c7 100644 --- a/app/resources/locale/fr_FR/fr_FR.po +++ b/app/resources/locale/fr_FR/fr_FR.po @@ -12,11 +12,11 @@ msgstr "" "X-Generator: Poedit 1.8.7.1\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: app/scripts/services/utils.js:456 app/scripts/services/utils.js:536 +#: app/scripts/services/drivers.js:200 app/scripts/services/drivers.js:81 msgid "Unplug and reconnect the board" msgstr "Débrancher et reconnecter la carte" -#: app/scripts/services/utils.js:527 +#: app/scripts/services/drivers.js:189 msgid "" "

    FTDI driver installation instructions

    1. Connect the FPGA " "board
    2. Replace the (Interface 0) driver of the board by " @@ -26,7 +26,7 @@ msgstr "" "carte FPGA
    3. Remplacer le pilote (Interface 0) de la carte par " "libusbK
    4. Débrancher puis rebrancher la carte
    " -#: app/scripts/services/utils.js:543 +#: app/scripts/services/drivers.js:207 msgid "" "

    FTDI driver uninstallation instructions

    1. Find the FPGA USB " "Device
    2. Select the board interface and uninstall the driver
    " @@ -35,83 +35,83 @@ msgstr "" "périphérique USB FPGA
  • Sélectionner la carte interface et " "désinstaller le pilote
  • " -#: app/views/menu.html:336 +#: app/views/menu.html:309 msgid "About Icestudio" msgstr "À propos d'Icestudio" -#: app/views/menu.html:290 +#: app/views/menu.html:263 msgid "Add" -msgstr "" +msgstr "Ajouter" -#: app/scripts/controllers/menu.js:471 +#: app/scripts/controllers/menu.js:516 msgid "Add a block to start" msgstr "Ajouter un bloc pour commencer" #: app/views/menu.html:43 -#, fuzzy msgid "Add as block" -msgstr "Ajouter un bloc pour commencer" +msgstr "Ajouter un bloc" -#: app/scripts/services/tools.js:682 +#: app/scripts/services/tools.js:895 msgid "All collections removed" -msgstr "" +msgstr "Toutes les collections ont été supprimées" -#: app/scripts/controllers/menu.js:495 +#: app/scripts/controllers/menu.js:538 msgid "All stored collections will be lost. Do you want to continue?" msgstr "" +"Toutes les collections enregistrées seront perdues. Voulez-vous continuer ?" -#: app/scripts/services/utils.js:723 +#: app/scripts/services/utils.js:530 msgid "Author" -msgstr "" +msgstr "Auteur" -#: app/views/menu.html:347 +#: app/views/menu.html:320 msgid "Basic" msgstr "Basique" -#: app/views/menu.html:155 +#: app/views/languages.html:22 msgid "Basque" msgstr "Basque" -#: app/scripts/services/blocks.js:742 app/scripts/services/blocks.js:763 -#: app/scripts/services/blocks.js:818 app/scripts/services/blocks.js:837 -#: app/scripts/services/blocks.js:872 app/scripts/services/blocks.js:911 -#, fuzzy +#: app/scripts/services/blocks.js:755 app/scripts/services/blocks.js:776 +#: app/scripts/services/blocks.js:831 app/scripts/services/blocks.js:850 +#: app/scripts/services/blocks.js:885 app/scripts/services/blocks.js:926 +#: app/scripts/services/blocks.js:960 msgid "Block updated" -msgstr "Titre mis à jour" +msgstr "Bloc mis à jour" -#: app/scripts/services/project.js:418 +#: app/scripts/services/project.js:413 msgid "Block {{name}} imported" msgstr "Bloc {{name}} importé" #: app/views/menu.html:35 msgid "Blocks" -msgstr "" +msgstr "Blocs" -#: app/views/menu.html:201 +#: app/views/menu.html:174 msgid "Board" -msgstr "" +msgstr "Carte" -#: app/views/menu.html:115 app/views/menu.html:192 +#: app/views/menu.html:115 app/views/menu.html:162 msgid "Board rules" -msgstr "" +msgstr "Règles de la carte" -#: app/scripts/controllers/menu.js:334 +#: app/scripts/controllers/menu.js:341 msgid "Board rules disabled" -msgstr "" +msgstr "Règles de la carte désactivées" -#: app/scripts/controllers/menu.js:329 +#: app/scripts/controllers/menu.js:336 msgid "Board rules enabled" -msgstr "" +msgstr "Règles de la carte activées" -#: app/scripts/services/tools.js:234 +#: app/scripts/services/tools.js:254 msgid "Board {{name}} not detected" -msgstr "Carte {{name}} non détectée" +msgstr "Carte {{name}} non détectée" -#: app/scripts/controllers/menu.js:435 +#: app/scripts/controllers/menu.js:477 msgid "Board {{name}} selected" msgstr "Carte {{name}} séléctionnée" -#: app/views/menu.html:236 +#: app/views/menu.html:209 msgid "Build" msgstr "Construire" @@ -119,382 +119,404 @@ msgstr "Construire" msgid "Cancel" msgstr "Annuler" -#: app/scripts/services/tools.js:446 +#: app/views/languages.html:34 +msgid "Catalan" +msgstr "Catalan" + +#: app/scripts/services/tools.js:605 msgid "Check Internet connection..." msgstr "Vérifier la connexion Internet..." -#: app/scripts/services/tools.js:454 +#: app/scripts/services/tools.js:613 msgid "Check Python..." msgstr "Vérifier Python..." -#: app/views/menu.html:361 +#: app/scripts/services/drivers.js:104 +msgid "Click here to install it" +msgstr "" + +#: app/views/menu.html:334 msgid "Code" msgstr "Code" -#: app/views/menu.html:212 +#: app/views/menu.html:185 msgid "Collection" +msgstr "Collection" + +#: app/views/menu.html:165 +msgid "Collection info" msgstr "" -#: app/scripts/services/tools.js:631 -msgid "Collection {{name}} added" +#: app/scripts/controllers/menu.js:436 +msgid "Collection {{collection}} info not defined" msgstr "" -#: app/scripts/services/tools.js:625 +#: app/scripts/services/tools.js:773 +msgid "Collection {{name}} added" +msgstr "Collection {{name}} ajoutée" + +#: app/scripts/services/tools.js:767 msgid "Collection {{name}} not replaced" -msgstr "" +msgstr "Collection {{name}} non remplacée" -#: app/scripts/services/tools.js:676 +#: app/scripts/services/tools.js:889 msgid "Collection {{name}} removed" -msgstr "" +msgstr "Collection {{name}} supprimée" -#: app/scripts/services/tools.js:621 +#: app/scripts/services/tools.js:763 msgid "Collection {{name}} replaced" -msgstr "" +msgstr "Collection {{name}} remplacée" -#: app/scripts/controllers/menu.js:410 +#: app/scripts/controllers/menu.js:444 msgid "Collection {{name}} selected" -msgstr "" +msgstr "Collection {{name}} sélectionée" -#: app/views/menu.html:286 +#: app/views/menu.html:259 msgid "Collections" -msgstr "" +msgstr "Collections" -#: app/views/menu.html:332 +#: app/views/menu.html:305 msgid "Community forum" msgstr "Forum communautaire" -#: app/views/menu.html:358 +#: app/views/menu.html:331 msgid "Constant" -msgstr "" +msgstr "Constante" #: app/views/menu.html:91 msgid "Copy" -msgstr "" +msgstr "Copier" #: app/views/menu.html:88 msgid "Cut" -msgstr "" +msgstr "Couper" -#: app/views/menu.html:189 +#: app/views/menu.html:159 msgid "Datasheet" msgstr "Documentation" -#: app/views/menu.html:216 +#: app/views/menu.html:189 msgid "Default" -msgstr "" +msgstr "Défaut" -#: app/scripts/services/tools.js:322 +#: app/scripts/services/tools.js:481 msgid "" "Default toolchain not found. Toolchain will be downloaded. This operation " "requires Internet connection. Do you want to continue?" msgstr "" -"La toolchain par default n'a pas été trouvée. La toolchain va être " -"téléchargée. Cette operation nécessite une connexion internet.Voulez-vous " +"La toolchain par défaut n'a pas été trouvée. La toolchain va être " +"téléchargée. Cette opération nécessite une connexion Internet. Voulez-vous " "continuer ?" -#: app/scripts/services/utils.js:722 +#: app/scripts/services/utils.js:529 msgid "Description" -msgstr "" +msgstr "Description" -#: app/views/menu.html:126 app/views/menu.html:279 +#: app/views/menu.html:126 app/views/menu.html:252 msgid "Disable" msgstr "Désactiver" -#: app/scripts/controllers/menu.js:234 +#: app/scripts/controllers/menu.js:241 msgid "Do you want to close the application?" -msgstr "" +msgstr "Voulez-vous fermer l'application ?" -#: app/scripts/services/project.js:104 +#: app/scripts/services/project.js:106 msgid "Do you want to convert it?" -msgstr "" +msgstr "Voulez-vous le convertir ?" -#: app/scripts/controllers/menu.js:485 +#: app/scripts/controllers/menu.js:528 msgid "Do you want to remove the {{name}} collection?" -msgstr "" +msgstr "Voulez-vous supprimer la collection {{name}} ?" -#: app/scripts/services/tools.js:617 +#: app/scripts/services/tools.js:759 msgid "Do you want to replace it?" -msgstr "" +msgstr "Voulez-vous le remplacer ?" -#: app/views/menu.html:325 +#: app/views/menu.html:298 msgid "Documentation" msgstr "Documentation" -#: app/views/menu.html:270 +#: app/views/menu.html:243 msgid "Drivers" msgstr "Pilote" -#: app/scripts/services/utils.js:453 app/scripts/services/utils.js:521 +#: app/scripts/services/drivers.js:128 app/scripts/services/drivers.js:78 msgid "Drivers disabled" msgstr "Pilote désactivé" -#: app/scripts/services/utils.js:450 app/scripts/services/utils.js:502 +#: app/scripts/services/drivers.js:120 app/scripts/services/drivers.js:75 msgid "Drivers enabled" msgstr "Pilote activé" -#: app/scripts/services/tools.js:246 +#: app/scripts/services/tools.js:265 msgid "Duplicated FPGA I/O ports" -msgstr "Ports d'entrée sortie FPGA dupliqué" +msgstr "Ports d'entrée/sortie FPGA dupliqués" -#: app/scripts/services/blocks.js:370 +#: app/scripts/services/blocks.js:376 msgid "Duplicated block attributes" -msgstr "" +msgstr "Attributs de bloc dupliqués" #: app/views/menu.html:78 msgid "Edit" msgstr "Édition" -#: app/views/menu.html:121 app/views/menu.html:274 +#: app/scripts/services/tools.js:748 +msgid "Edit the collection name" +msgstr "" + +#: app/views/menu.html:121 app/views/menu.html:247 msgid "Enable" msgstr "Activer" -#: app/views/menu.html:137 +#: app/views/languages.html:4 msgid "English" msgstr "Anglais" -#: app/scripts/services/blocks.js:181 -#, fuzzy +#: app/scripts/services/blocks.js:185 msgid "Enter the constant blocks" -msgstr "Entrer les ports de sortie" +msgstr "Entrer les constantes du bloc" #: app/scripts/services/blocks.js:52 msgid "Enter the input blocks" -msgstr "" +msgstr "Entrer les blocs d'entrée" -#: app/scripts/services/blocks.js:269 +#: app/scripts/services/blocks.js:275 msgid "Enter the input ports" msgstr "Entrer les ports d'entrée" -#: app/scripts/services/blocks.js:112 +#: app/scripts/services/blocks.js:114 msgid "Enter the output blocks" -msgstr "" +msgstr "Entrer les blocs de sortie" -#: app/scripts/services/blocks.js:270 +#: app/scripts/services/blocks.js:276 msgid "Enter the output ports" msgstr "Entrer les ports de sortie" -#: app/scripts/services/blocks.js:271 -#, fuzzy +#: app/scripts/services/blocks.js:277 msgid "Enter the parameters" -msgstr "Entrer les ports d'entrée" +msgstr "Entrer les paramètres" -#: app/scripts/controllers/menu.js:321 +#: app/scripts/controllers/menu.js:328 msgid "Enter the remote hostname user@host (experimental)" -msgstr "Entrer le hostname distant user@host (experimentale)" +msgstr "Entrer le nom d'hôte distant user@host (expérimental)" -#: app/scripts/services/tools.js:345 +#: app/scripts/services/tools.js:504 msgid "Error: default toolchain not found in '{{dir}}'" -msgstr "Erreur: La toolchaine par défaut n'a pas été trouvée dans '{{dir}}'" +msgstr "Erreur: La toolchain par défaut n'a pas été trouvée dans '{{dir}}'" -#: app/scripts/services/utils.js:855 +#: app/scripts/services/utils.js:670 msgid "Error: {{error}}" -msgstr "Erreur: {{error}}" +msgstr "Erreur : {{error}}" + +#: app/scripts/services/tools.js:336 +msgid "Errors detected in the code" +msgstr "" #: app/views/menu.html:39 msgid "Examples" msgstr "Exemples" -#: app/scripts/services/tools.js:204 +#: app/scripts/services/tools.js:206 msgid "Execute remote {{label}} ..." -msgstr "Executer à distance {{label}} ..." +msgstr "Exécuter à distance {{label}} ..." #: app/views/menu.html:54 msgid "Export" msgstr "Exporter" -#: app/scripts/services/tools.js:478 +#: app/scripts/services/tools.js:637 msgid "Extract default apio files..." msgstr "Extraction des fichiers apio par défaut..." -#: app/scripts/services/tools.js:488 +#: app/scripts/services/tools.js:647 msgid "Extract default apio packages..." -msgstr "Extraction des packets apio par défaut" +msgstr "Extraction des paquets apio par défaut..." -#: app/scripts/services/tools.js:466 +#: app/scripts/services/tools.js:625 msgid "Extract virtual env files..." -msgstr "Extraction des fichiers d'environnement virtuels" +msgstr "Extraction des fichiers d'environnement virtuels..." -#: app/scripts/services/tools.js:240 app/scripts/services/tools.js:243 +#: app/scripts/services/tools.js:262 msgid "FPGA I/O ports not defined" -msgstr "Ports d'entrée sortie FPGA non définits" +msgstr "Ports d'entrée/sortie FPGA non définis" -#: app/scripts/services/blocks.js:113 app/scripts/services/blocks.js:53 -#: app/scripts/services/blocks.js:698 app/scripts/services/blocks.js:778 +#: app/scripts/services/blocks.js:115 app/scripts/services/blocks.js:53 +#: app/scripts/services/blocks.js:711 app/scripts/services/blocks.js:791 msgid "FPGA pin" -msgstr "" +msgstr "Pin FPGA" #: app/views/menu.html:26 msgid "File" msgstr "Fichier" -#: app/scripts/services/project.js:376 +#: app/scripts/services/project.js:425 msgid "" "File {{file}} already exists in the project path. Do you want to replace it?" msgstr "" -"Le Fichier {{file}} existe déjà dans le chemin du projet. Voulez vous " -"leremplacer ?" +"Le fichier {{file}} existe déjà dans le chemin du projet. Voulez vous le " +"remplacer ?" -#: app/scripts/services/tools.js:180 +#: app/scripts/services/tools.js:182 msgid "File {{file}} does not exist" msgstr "Le fichier {{file}} n'existe pas" -#: app/scripts/services/project.js:408 +#: app/scripts/services/project.js:459 msgid "File {{file}} imported" msgstr "Fichier {{file}} importé" #: app/views/menu.html:104 msgid "Fit content" -msgstr "" +msgstr "Adapter le contenu" -#: app/views/menu.html:161 +#: app/views/languages.html:28 msgid "French" msgstr "Français" -#: app/scripts/controllers/menu.js:213 +#: app/scripts/controllers/menu.js:220 msgid "GTKWave exported" msgstr "GTKWave exporté" -#: app/views/menu.html:149 +#: app/views/languages.html:16 msgid "Galician" -msgstr "Galois" +msgstr "Galicien" -#: app/views/menu.html:315 +#: app/views/menu.html:288 msgid "Help" msgstr "Aide" -#: app/scripts/services/utils.js:491 -msgid "Homebrew is required" -msgstr "Homebrew est requis" - -#: app/scripts/services/utils.js:736 -#, fuzzy +#: app/scripts/services/utils.js:543 msgid "Image" -msgstr "Chemin image" +msgstr "Image" -#: app/scripts/controllers/menu.js:642 +#: app/scripts/controllers/menu.js:688 msgid "Image {{name}} saved" -msgstr "Image {{name}} sauvée" +msgstr "Image {{name}} sauvegardée" -#: app/views/menu.html:364 +#: app/views/menu.html:337 msgid "Information" -msgstr "" +msgstr "Information" -#: app/views/menu.html:352 +#: app/views/menu.html:325 msgid "Input" msgstr "Entrée" -#: app/views/menu.html:247 +#: app/views/menu.html:220 msgid "Install" msgstr "Installation" -#: app/scripts/services/tools.js:483 +#: app/scripts/services/tools.js:642 msgid "Install default apio..." msgstr "Installer l'apio par défaut..." -#: app/scripts/services/tools.js:532 +#: app/scripts/services/tools.js:691 msgid "Installation completed" msgstr "Installation terminée" -#: app/scripts/services/tools.js:375 app/scripts/services/tools.js:412 +#: app/scripts/services/tools.js:534 app/scripts/services/tools.js:571 msgid "Installing toolchain" msgstr "Installation de la toolchain" -#: app/scripts/services/tools.js:448 app/scripts/services/utils.js:495 +#: app/scripts/services/drivers.js:112 app/scripts/services/tools.js:607 msgid "Internet connection required" -msgstr "Une connexion internet est requise" +msgstr "Une connexion Internet est requise" -#: app/scripts/services/graph.js:175 +#: app/scripts/services/graph.js:179 msgid "Invalid Pull up connection:
    block already connected" -msgstr "Connexion de Pull up invalide:
    Le bloc est déjà connecté" +msgstr "Connexion de Pull up invalide:
    le bloc est déjà connecté" -#: app/scripts/services/graph.js:189 +#: app/scripts/services/graph.js:193 msgid "Invalid Pull up connection:
    only Input blocks allowed" -msgstr "Connexion de Pull up invalide:
    Une seule entrée autorisée" +msgstr "" +"Connexion de Pull up invalide:
    seules les entrées sont " +"autorisées" -#: app/scripts/services/graph.js:181 +#: app/scripts/services/graph.js:185 msgid "Invalid block connection:
    Pull up already connected" msgstr "Connexion de bloc invalide:
    Pull up déjà connectée" -#: app/scripts/services/tools.js:636 +#: app/scripts/services/tools.js:779 msgid "Invalid collection {{name}}" -msgstr "" +msgstr "Collection {{name}} invalide" -#: app/scripts/services/graph.js:140 app/scripts/services/graph.js:147 -#: app/scripts/services/graph.js:154 +#: app/scripts/services/graph.js:143 app/scripts/services/graph.js:150 +#: app/scripts/services/graph.js:157 msgid "Invalid connection" msgstr "Connexion invalide" -#: app/scripts/services/graph.js:208 -#, fuzzy +#: app/scripts/services/graph.js:212 msgid "Invalid connection: {{a}} → {{b}}" -msgstr "Connexion invalide" +msgstr "Connexion invalide: {{a}} → {{b}}" -#: app/scripts/services/graph.js:169 +#: app/scripts/services/graph.js:173 msgid "Invalid multiple input connections" msgstr "Connexions de multiples entrées invalides" -#: app/views/menu.html:133 -msgid "Language" -msgstr "Langage" - -#: app/scripts/services/tools.js:579 -msgid "Load {{name}} ..." +#: app/scripts/services/drivers.js:190 +msgid "It is recommended to use USB 2.0 ports" msgstr "" -#: app/scripts/services/blocks.js:182 app/scripts/services/blocks.js:851 +#: app/views/menu.html:134 +msgid "Language" +msgstr "Langue" + +#: app/scripts/services/blocks.js:186 app/scripts/services/blocks.js:864 msgid "Local parameter" -msgstr "" +msgstr "Paramètre local" -#: app/scripts/services/tools.js:471 +#: app/scripts/services/tools.js:630 msgid "Make virtual env..." -msgstr "Faire l'environnement virtuel..." +msgstr "Créer l'environnement virtuel..." -#: app/scripts/services/utils.js:720 +#: app/scripts/services/utils.js:527 msgid "Name" -msgstr "" +msgstr "Nom" #: app/views/menu.html:29 msgid "New" -msgstr "" +msgstr "Nouveau" -#: app/scripts/services/project.js:80 +#: app/scripts/services/project.js:81 msgid "New project {{name}} created" msgstr "Nouveau projet {{name}} créé" -#: app/scripts/controllers/menu.js:503 +#: app/scripts/controllers/menu.js:546 msgid "No collections stored" -msgstr "" +msgstr "Pas de collections sauvegardées" #: app/scripts/controllers/main.js:15 msgid "OK" msgstr "OK" -#: app/scripts/services/project.js:323 app/scripts/services/project.js:97 +#: app/scripts/services/project.js:364 app/scripts/services/project.js:99 msgid "Old project format {{version}}" -msgstr "" +msgstr "Vieux format de projet {{version}}" #: app/views/menu.html:32 msgid "Open" -msgstr "" +msgstr "Ouvrir" -#: app/scripts/services/utils.js:743 +#: app/scripts/services/utils.js:550 msgid "Open SVG" -msgstr "" +msgstr "Ouvrir SVG" -#: app/scripts/services/project.js:411 +#: app/scripts/services/project.js:462 msgid "Original file {{file}} does not exist" -msgstr "Le fichier originel {{file}} n'éxiste pas" +msgstr "Le fichier original {{file}} n'existe pas" -#: app/views/menu.html:355 +#: app/views/menu.html:328 msgid "Output" msgstr "Sortie" -#: app/scripts/controllers/menu.js:195 +#: app/scripts/controllers/menu.js:202 msgid "PCF file exported" msgstr "Fichier PCF exporté" #: app/views/menu.html:94 msgid "Paste" +msgstr "Coller" + +#: app/scripts/services/utils.js:872 +msgid "Please run: {{cmd}}" msgstr "" #: app/views/menu.html:108 @@ -503,293 +525,299 @@ msgstr "Préférences" #: app/views/menu.html:111 msgid "Project information" -msgstr "" +msgstr "Informations du projet" -#: app/scripts/services/project.js:122 +#: app/scripts/services/project.js:125 msgid "Project {{name}} loaded" msgstr "Projet {{name}} chargé" -#: app/scripts/services/project.js:295 +#: app/scripts/services/project.js:334 msgid "Project {{name}} saved" msgstr "Projet {{name}} sauvegardé" -#: app/scripts/services/tools.js:459 +#: app/scripts/services/tools.js:618 msgid "Python 2.7 is required" msgstr "Python 2.7 est requis" #: app/views/menu.html:72 msgid "Quit" -msgstr "" +msgstr "Quitter" -#: app/views/design.html:5 +#: app/scripts/services/blocks.js:946 app/views/design.html:5 msgid "Read only" msgstr "Lecture seule" #: app/views/menu.html:84 msgid "Redo" -msgstr "" +msgstr "Refaire" -#: app/scripts/services/tools.js:271 +#: app/scripts/services/tools.js:368 msgid "Remote host {{name}} not connected" -msgstr "Remote host {{name}} not connected" +msgstr "Hôte distant {{name}} non connecté" -#: app/views/menu.html:170 +#: app/views/menu.html:140 msgid "Remote hostname" -msgstr "Hostname distant" +msgstr "Nom d'hôte distant" -#: app/views/menu.html:255 app/views/menu.html:294 +#: app/views/menu.html:228 app/views/menu.html:267 msgid "Remove" msgstr "Supprimer" -#: app/views/menu.html:306 +#: app/views/menu.html:279 msgid "Remove all" -msgstr "" +msgstr "Supprimer tout" -#: app/scripts/services/utils.js:745 -#, fuzzy +#: app/scripts/services/utils.js:552 msgid "Reset SVG" -msgstr "Reinitialiser la vue" +msgstr "Réinitialiser le SVG" -#: app/views/menu.html:260 +#: app/views/menu.html:233 msgid "Reset default" msgstr "Réinitialiser avec les paramètres par défaut" #: app/views/menu.html:101 msgid "Reset view" -msgstr "Reinitialiser la vue" +msgstr "Réinitialiser la vue" #: app/views/menu.html:47 msgid "Save" msgstr "Sauvegarder" -#: app/scripts/services/utils.js:744 -#, fuzzy +#: app/scripts/services/utils.js:551 msgid "Save SVG" -msgstr "Sauvegarder sous" +msgstr "Sauvegarder le SVG" #: app/views/menu.html:50 msgid "Save as" msgstr "Sauvegarder sous" -#: app/views/menu.html:198 +#: app/views/menu.html:171 msgid "Select" -msgstr "" +msgstr "Sélectionner" #: app/views/menu.html:97 msgid "Select all" -msgstr "" +msgstr "Sélectionner tout" -#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:699 +#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:712 msgid "Show clock" -msgstr "" +msgstr "Montrer l'horloge" -#: app/views/menu.html:328 +#: app/views/menu.html:301 msgid "Source code" msgstr "Code source" -#: app/views/menu.html:143 +#: app/views/languages.html:10 msgid "Spanish" -msgstr "Espagnole" +msgstr "Espagnol" -#: app/scripts/services/tools.js:193 +#: app/scripts/services/tools.js:195 msgid "Synchronize remote files ..." msgstr "Synchroniser les fichiers distants ..." #: app/views/menu.html:63 msgid "Testbench" -msgstr "Banc de tests exporté" +msgstr "Testbench" -#: app/scripts/controllers/menu.js:204 +#: app/scripts/controllers/menu.js:211 msgid "Testbench exported" -msgstr "Banc de tests exporté" +msgstr "Testbench exporté" -#: app/scripts/services/tools.js:616 +#: app/scripts/services/tools.js:758 msgid "The collection {{name}} already exists." -msgstr "" +msgstr "La collection {{name}} existe déjà." -#: app/scripts/controllers/menu.js:424 +#: app/scripts/controllers/menu.js:465 msgid "" "The current FPGA I/O configuration will be lost. Do you want to change to " "{{name}} board?" msgstr "" -"La configuration des entrées sorties du FPGA actuel va être perdue. Voulez " +"La configuration actuelle des entrées/sorties du FPGA va être perdue. Voulez-" "vous changer pour la carte {{name}}?" -#: app/scripts/services/tools.js:350 +#: app/scripts/services/tools.js:509 msgid "The toolchain will be removed. Do you want to continue?" -msgstr "" -"Les répertoires de configuration d'Icestudio et apio vont être supprimés. " -"Voulez-vous continuer?" +msgstr "La toolchain va être supprimée. Voulez-vous continuer ?" -#: app/scripts/services/tools.js:338 +#: app/scripts/services/tools.js:497 msgid "The toolchain will be restored to default. Do you want to continue?" -msgstr "La toolchain va être restaurée par défaut. Voulez vous continuer ?" +msgstr "La toolchain par défaut va être restaurée. Voulez vous continuer ?" -#: app/scripts/services/tools.js:330 +#: app/scripts/services/tools.js:489 msgid "" "The toolchain will be updated. This operation requires Internet connection. " "Do you want to continue?" msgstr "" +"La toolchain va être mise à jour. Cette opération a besoin d'une connexion " +"Internet.Voulez-vous continuer ?" -#: app/scripts/services/project.js:345 +#: app/scripts/services/project.js:387 msgid "" "This import operation requires a project path. You need to save the current " "project. Do you want to continue?" msgstr "" -"Cette opération d'import requière un chemin de projet (path). Vous devez " -"sauvez le projet actuel. Voulez vous continuer ?" +"Cette opération d'importation requiert un chemin de projet. Vous devez " +"sauvegarder le projet actuel. Voulez vous continuer ?" -#: app/scripts/services/project.js:103 +#: app/scripts/services/project.js:105 msgid "This project is designed for the {{name}} board." -msgstr "" +msgstr "Ce projet est conçu pour la carte {{name}}" -#: app/views/menu.html:243 +#: app/views/menu.html:216 msgid "Toolchain" msgstr "Toolchain" -#: app/scripts/services/tools.js:533 +#: app/scripts/services/tools.js:692 msgid "Toolchain installed" msgstr "La toolchain est installée" -#: app/scripts/services/tools.js:536 +#: app/scripts/services/tools.js:695 msgid "Toolchain not installed" -msgstr "La toolchain n'est pas à jour" +msgstr "La toolchain n'est pas installée" -#: app/scripts/services/tools.js:92 app/scripts/services/utils.js:533 -#: app/scripts/services/utils.js:549 +#: app/scripts/services/drivers.js:197 app/scripts/services/drivers.js:213 +#: app/scripts/services/tools.js:94 msgid "Toolchain not installed. Please, install the toolchain" -msgstr "La toolchain n'est pas à jour. Installer, ou mettre à jour svp" +msgstr "La toolchain n'est pas installée. Veuillez installer la toolchain" -#: app/scripts/services/tools.js:355 +#: app/scripts/services/tools.js:514 msgid "Toolchain removed" msgstr "Toolchain supprimée" -#: app/views/menu.html:230 +#: app/views/menu.html:203 msgid "Tools" msgstr "Outils" #: app/views/menu.html:81 msgid "Undo" -msgstr "" +msgstr "Revenir en arrière" -#: app/scripts/services/tools.js:237 +#: app/scripts/services/tools.js:257 msgid "Unknown board" msgstr "Carte inconnue" -#: app/scripts/app.js:43 +#: app/scripts/app.js:37 msgid "Untitled" -msgstr "" +msgstr "Sans titre" -#: app/views/menu.html:250 +#: app/views/menu.html:223 msgid "Update" -msgstr "" +msgstr "Mettre à jour" -#: app/scripts/services/blocks.js:697 app/scripts/services/blocks.js:777 -#: app/scripts/services/blocks.js:850 +#: app/scripts/services/blocks.js:710 app/scripts/services/blocks.js:790 +#: app/scripts/services/blocks.js:863 msgid "Update the block name" -msgstr "" +msgstr "Mettre le nom du bloc à jour" -#: app/views/menu.html:239 +#: app/views/menu.html:212 msgid "Upload" msgstr "Télécharger" -#: app/views/menu.html:233 +#: app/views/menu.html:206 msgid "Verify" -msgstr "Verifier" +msgstr "Vérifier" -#: app/scripts/controllers/menu.js:186 +#: app/scripts/controllers/menu.js:193 msgid "Verilog code exported" msgstr "Code Verilog exporté" -#: app/scripts/services/utils.js:721 app/views/menu.html:321 +#: app/scripts/services/utils.js:528 app/views/menu.html:294 msgid "Version" msgstr "Version" -#: app/views/menu.html:180 +#: app/views/menu.html:150 msgid "View" msgstr "Vue" -#: app/views/menu.html:318 +#: app/views/menu.html:291 msgid "View license" msgstr "Voir la licence" -#: app/scripts/services/blocks.js:404 +#: app/scripts/services/blocks.js:410 msgid "Wrong block format: {{type}}" msgstr "Mauvais format de bloc: {{type}}" -#: app/scripts/services/blocks.js:132 app/scripts/services/blocks.js:201 -#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:768 -#: app/scripts/services/blocks.js:842 app/scripts/services/blocks.js:877 +#: app/scripts/services/blocks.js:134 app/scripts/services/blocks.js:205 +#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:781 +#: app/scripts/services/blocks.js:855 app/scripts/services/blocks.js:890 msgid "Wrong block name {{name}}" -msgstr "" +msgstr "Mauvais nom de bloc {{name}}" -#: app/scripts/services/blocks.js:319 -#, fuzzy +#: app/scripts/services/blocks.js:325 msgid "Wrong parameter name {{name}}" -msgstr "Mauvais hostname distant {{name}}" +msgstr "Mauvais nom de paramètre {{name}}" -#: app/scripts/services/blocks.js:289 app/scripts/services/blocks.js:304 -#, fuzzy +#: app/scripts/services/blocks.js:295 app/scripts/services/blocks.js:310 msgid "Wrong port name {{name}}" -msgstr "Mauvais hostname distant {{name}}" +msgstr "Mauvais nom de port {{name}}" -#: app/scripts/services/project.js:130 +#: app/scripts/services/project.js:133 msgid "Wrong project format: {{name}}" msgstr "Mauvais format de projet: {{name}}" -#: app/scripts/services/tools.js:268 +#: app/scripts/services/tools.js:365 msgid "Wrong remote hostname {{name}}" -msgstr "Mauvais hostname distant {{name}}" +msgstr "Mauvais nom d'hôte distant {{name}}" -#: app/scripts/controllers/menu.js:235 +#: app/scripts/controllers/menu.js:242 msgid "Your changes will be lost if you don’t save them" -msgstr "" +msgstr "Vos modifications seront perdues si vous ne les sauvegardez pas" #: app/views/design.html:6 msgid "back" msgstr "retour" #. Build done -#: app/scripts/services/tools.js:283 +#: app/scripts/services/tools.js:380 msgid "done_build" msgstr "Construction terminée" #. Upload done -#: app/scripts/services/tools.js:285 +#: app/scripts/services/tools.js:382 msgid "done_upload" msgstr "Téléchargement terminé" #. Verification done -#: app/scripts/services/tools.js:281 +#: app/scripts/services/tools.js:378 msgid "done_verify" msgstr "Vérification faite" #. Start building ... -#: app/scripts/services/tools.js:60 +#: app/scripts/services/tools.js:61 msgid "start_build" -msgstr "Début de la construction ..." +msgstr "Début de la construction" #. Start uploading ... -#: app/scripts/services/tools.js:62 +#: app/scripts/services/tools.js:63 msgid "start_upload" -msgstr "Début du téléchargement ..." +msgstr "Début du téléchargement" #. Start verification ... -#: app/scripts/services/tools.js:58 +#: app/scripts/services/tools.js:59 msgid "start_verify" -msgstr "Début de la verification ..." +msgstr "Début de la vérification" -#: app/scripts/controllers/menu.js:383 -msgid "{{board}} datasheet not defined" +#: app/scripts/services/drivers.js:103 app/scripts/services/utils.js:847 +msgid "{{app}} is required." msgstr "" -#: app/scripts/controllers/menu.js:373 +#: app/scripts/controllers/menu.js:398 +msgid "{{board}} datasheet not defined" +msgstr "Documentation {{board}} non définie" + +#: app/scripts/controllers/menu.js:388 msgid "{{board}} pinout not defined" -msgstr "" +msgstr "Pinout {{board}} non défini" -#: app/scripts/controllers/menu.js:402 +#: app/scripts/controllers/menu.js:417 msgid "{{board}} rules not defined" -msgstr "" +msgstr "Règles {{board}} non définies" + +#~ msgid "Homebrew is required" +#~ msgstr "Homebrew est requis" + +#~ msgid "Load {{name}} ..." +#~ msgstr "Charger {{name}} ..." #~ msgid "1_basic" #~ msgstr "1. Basique" @@ -801,7 +829,7 @@ msgstr "" #~ msgstr "2. Switch led" #~ msgid "3_switch_and_gate" -#~ msgstr "3. Switch and gate" +#~ msgstr "3. Switch et porte" #~ msgid "Boards" #~ msgstr "Cartes" @@ -812,11 +840,11 @@ msgstr "" #, fuzzy #~ msgid "Update the block label" -#~ msgstr "Entrer le titre du bloc" +#~ msgstr "Mettre le titre du bloc à jour" #, fuzzy #~ msgid "Update the port" -#~ msgstr "Entrer les ports d'entrée" +#~ msgstr "Mettre le port à jour" #~ msgid "and" #~ msgstr "Et" @@ -909,14 +937,14 @@ msgstr "" #~ msgstr "Cloner la selection" #~ msgid "Do you want to clear all?" -#~ msgstr "Voulez vous tout nettoyer?" +#~ msgstr "Voulez-vous tout nettoyer ?" #, fuzzy #~ msgid "Do you want to exit the application?" -#~ msgstr "Voulez vous supprimer le bloc séléctionné?" +#~ msgstr "Voulez-vous quitter l'application ?" #~ msgid "Do you want to remove the selected block?" -#~ msgstr "Voulez vous supprimer le bloc séléctionné?" +#~ msgstr "Voulez vous supprimer le bloc séléctionné ?" #, fuzzy #~ msgid "Enter the project name" @@ -924,15 +952,17 @@ msgstr "" #, fuzzy #~ msgid "Old project format" -#~ msgstr "Mauvais format de projet: {{name}}" +#~ msgstr "Mauvais format de projet" #~ msgid "Remove selected" -#~ msgstr "Supprimer la selection" +#~ msgstr "Supprimer la sélection" #~ msgid "" #~ "The current project will be removed. Do you want to continue loading the " #~ "project?" -#~ msgstr "Le projet actuel sera supprimé. Continuer de charger le projet?" +#~ msgstr "" +#~ "Le projet actuel sera supprimé. Voulez-vous continuer à charger le " +#~ "projet ?" #~ msgid "untitled" #~ msgstr "sans titre" @@ -944,7 +974,7 @@ msgstr "" #~ msgstr "Entrer le chemin image du projet" #~ msgid "Export as block" -#~ msgstr "Exporter un bloc" +#~ msgstr "Exporter en tant que bloc" #~ msgid "Import block" #~ msgstr "Importer un bloc" diff --git a/app/resources/locale/gl_ES/gl_ES.po b/app/resources/locale/gl_ES/gl_ES.po index 8d6e5cb38..4d19dab0d 100644 --- a/app/resources/locale/gl_ES/gl_ES.po +++ b/app/resources/locale/gl_ES/gl_ES.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: \n" +"Project-Id-Version: icestudio 0.3.0-beta3\n" "POT-Creation-Date: \n" "PO-Revision-Date: \n" -"Last-Translator: \n" +"Last-Translator: Xoan Sampaiño \n" "Language-Team: \n" "Language: gl_ES\n" "MIME-Version: 1.0\n" @@ -12,535 +12,566 @@ msgstr "" "X-Generator: Poedit 1.8.7.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: app/scripts/services/utils.js:456 app/scripts/services/utils.js:536 +#: app/scripts/services/drivers.js:200 app/scripts/services/drivers.js:81 msgid "Unplug and reconnect the board" -msgstr "" +msgstr "Desconecta e conecta de novo a placa" -#: app/scripts/services/utils.js:527 +#: app/scripts/services/drivers.js:189 msgid "" "

    FTDI driver installation instructions

    1. Connect the FPGA " "board
    2. Replace the (Interface 0) driver of the board by " "libusbK
    3. Unplug and reconnect the board
    " msgstr "" +"

    Instruccións para a instalación do controlador FTDI

    1. Conecta " +"a placa FPGA
    2. Troca o controlador (Interface 0) da placa por " +"libusbK
    3. Desconecta e conecta de novo a placa
    " -#: app/scripts/services/utils.js:543 +#: app/scripts/services/drivers.js:207 msgid "" "

    FTDI driver uninstallation instructions

    1. Find the FPGA USB " "Device
    2. Select the board interface and uninstall the driver
    " msgstr "" +"

    Instruccións para a desinstalación do controlador FTDI

    1. Atopa " +"o dispositivo USB da placa FPGA
    2. Selecciona a interfaz da placa e " +"desinstala o controlador
    " -#: app/views/menu.html:336 +#: app/views/menu.html:309 msgid "About Icestudio" msgstr "Acerca de Icestudio" -#: app/views/menu.html:290 +#: app/views/menu.html:263 msgid "Add" -msgstr "" +msgstr "Engadir" -#: app/scripts/controllers/menu.js:471 +#: app/scripts/controllers/menu.js:516 msgid "Add a block to start" -msgstr "" +msgstr "Engada un bloque para comezar" #: app/views/menu.html:43 -#, fuzzy msgid "Add as block" -msgstr "Exportar como bloque" +msgstr "Engadir como bloque" -#: app/scripts/services/tools.js:682 +#: app/scripts/services/tools.js:895 msgid "All collections removed" -msgstr "" +msgstr "Elimináronse todas as coleccións" -#: app/scripts/controllers/menu.js:495 +#: app/scripts/controllers/menu.js:538 msgid "All stored collections will be lost. Do you want to continue?" -msgstr "" +msgstr "Perderanse todas as coleccións gardadas. Desexa continuar?" -#: app/scripts/services/utils.js:723 +#: app/scripts/services/utils.js:530 msgid "Author" -msgstr "" +msgstr "Autor" -#: app/views/menu.html:347 +#: app/views/menu.html:320 msgid "Basic" msgstr "Básico" -#: app/views/menu.html:155 +#: app/views/languages.html:22 msgid "Basque" msgstr "Euskera" -#: app/scripts/services/blocks.js:742 app/scripts/services/blocks.js:763 -#: app/scripts/services/blocks.js:818 app/scripts/services/blocks.js:837 -#: app/scripts/services/blocks.js:872 app/scripts/services/blocks.js:911 -#, fuzzy +#: app/scripts/services/blocks.js:755 app/scripts/services/blocks.js:776 +#: app/scripts/services/blocks.js:831 app/scripts/services/blocks.js:850 +#: app/scripts/services/blocks.js:885 app/scripts/services/blocks.js:926 +#: app/scripts/services/blocks.js:960 msgid "Block updated" -msgstr "Etiqueta actualizada" +msgstr "Bloque actualizado" -#: app/scripts/services/project.js:418 +#: app/scripts/services/project.js:413 msgid "Block {{name}} imported" -msgstr "Bloque {{name}} importado" +msgstr "Importouse o bloque {{name}}" #: app/views/menu.html:35 msgid "Blocks" -msgstr "" +msgstr "Bloques" -#: app/views/menu.html:201 +#: app/views/menu.html:174 msgid "Board" -msgstr "" +msgstr "Placa" -#: app/views/menu.html:115 app/views/menu.html:192 +#: app/views/menu.html:115 app/views/menu.html:162 msgid "Board rules" -msgstr "" +msgstr "Regras da placa" -#: app/scripts/controllers/menu.js:334 +#: app/scripts/controllers/menu.js:341 msgid "Board rules disabled" -msgstr "" +msgstr "Deshabilitáronse as regras da placa" -#: app/scripts/controllers/menu.js:329 +#: app/scripts/controllers/menu.js:336 msgid "Board rules enabled" -msgstr "" +msgstr "Habilitáronse as regras da placa" -#: app/scripts/services/tools.js:234 +#: app/scripts/services/tools.js:254 msgid "Board {{name}} not detected" -msgstr "Placa {{name}} non detectada" +msgstr "Non se detectou a placa {{name}}" -#: app/scripts/controllers/menu.js:435 +#: app/scripts/controllers/menu.js:477 msgid "Board {{name}} selected" -msgstr "Placa {{name}} seleccionada" +msgstr "Seleccionouse a placa {{name}}" -#: app/views/menu.html:236 +#: app/views/menu.html:209 msgid "Build" msgstr "Sintetizar" #: app/scripts/controllers/main.js:16 msgid "Cancel" -msgstr "" +msgstr "Cancelar" -#: app/scripts/services/tools.js:446 +#: app/views/languages.html:34 +msgid "Catalan" +msgstr "Catalán" + +#: app/scripts/services/tools.js:605 msgid "Check Internet connection..." -msgstr "" +msgstr "Comprobando a conexión a Internet..." -#: app/scripts/services/tools.js:454 +#: app/scripts/services/tools.js:613 msgid "Check Python..." +msgstr "Comprobando Python..." + +#: app/scripts/services/drivers.js:104 +msgid "Click here to install it" msgstr "" -#: app/views/menu.html:361 +#: app/views/menu.html:334 msgid "Code" msgstr "Código" -#: app/views/menu.html:212 +#: app/views/menu.html:185 msgid "Collection" +msgstr "Colección" + +#: app/views/menu.html:165 +msgid "Collection info" msgstr "" -#: app/scripts/services/tools.js:631 -msgid "Collection {{name}} added" +#: app/scripts/controllers/menu.js:436 +msgid "Collection {{collection}} info not defined" msgstr "" -#: app/scripts/services/tools.js:625 +#: app/scripts/services/tools.js:773 +msgid "Collection {{name}} added" +msgstr "Engadiuse a coleción {{name}}" + +#: app/scripts/services/tools.js:767 msgid "Collection {{name}} not replaced" -msgstr "" +msgstr "Non se trocou a colección {{name}}" -#: app/scripts/services/tools.js:676 +#: app/scripts/services/tools.js:889 msgid "Collection {{name}} removed" -msgstr "" +msgstr "Eliminouse a colección {{name}}" -#: app/scripts/services/tools.js:621 +#: app/scripts/services/tools.js:763 msgid "Collection {{name}} replaced" -msgstr "" +msgstr "Trocouse a colección {{name}}" -#: app/scripts/controllers/menu.js:410 +#: app/scripts/controllers/menu.js:444 msgid "Collection {{name}} selected" -msgstr "" +msgstr "Seleccionouse a colección {{name}}" -#: app/views/menu.html:286 +#: app/views/menu.html:259 msgid "Collections" -msgstr "" +msgstr "Coleccións" -#: app/views/menu.html:332 +#: app/views/menu.html:305 msgid "Community forum" msgstr "Foro da comunidade" -#: app/views/menu.html:358 +#: app/views/menu.html:331 msgid "Constant" -msgstr "" +msgstr "Constante" #: app/views/menu.html:91 msgid "Copy" -msgstr "" +msgstr "Copiar" #: app/views/menu.html:88 msgid "Cut" -msgstr "" +msgstr "Cortar" -#: app/views/menu.html:189 +#: app/views/menu.html:159 msgid "Datasheet" -msgstr "" +msgstr "Folla de datos" -#: app/views/menu.html:216 +#: app/views/menu.html:189 msgid "Default" -msgstr "" +msgstr "Predeterminado" -#: app/scripts/services/tools.js:322 +#: app/scripts/services/tools.js:481 msgid "" "Default toolchain not found. Toolchain will be downloaded. This operation " "requires Internet connection. Do you want to continue?" msgstr "" +"Non se atopou a cadea de ferramentas predeterminada, e procederase á sua " +"descarga. Esta operación require dunha conexión a Internet. Desexa continuar?" -#: app/scripts/services/utils.js:722 +#: app/scripts/services/utils.js:529 msgid "Description" -msgstr "" +msgstr "Descripción" -#: app/views/menu.html:126 app/views/menu.html:279 +#: app/views/menu.html:126 app/views/menu.html:252 msgid "Disable" -msgstr "" +msgstr "Deshabilitar" -#: app/scripts/controllers/menu.js:234 +#: app/scripts/controllers/menu.js:241 msgid "Do you want to close the application?" -msgstr "" +msgstr "Desexa pechar a aplicación?" -#: app/scripts/services/project.js:104 +#: app/scripts/services/project.js:106 msgid "Do you want to convert it?" -msgstr "" +msgstr "Desexa convertelo?" -#: app/scripts/controllers/menu.js:485 +#: app/scripts/controllers/menu.js:528 msgid "Do you want to remove the {{name}} collection?" -msgstr "" +msgstr "Desexa eliminar a colección {{name}}?" -#: app/scripts/services/tools.js:617 +#: app/scripts/services/tools.js:759 msgid "Do you want to replace it?" -msgstr "" +msgstr "Desexa trocalo?" -#: app/views/menu.html:325 +#: app/views/menu.html:298 msgid "Documentation" msgstr "Documentación" -#: app/views/menu.html:270 +#: app/views/menu.html:243 msgid "Drivers" -msgstr "" +msgstr "Controladores" -#: app/scripts/services/utils.js:453 app/scripts/services/utils.js:521 +#: app/scripts/services/drivers.js:128 app/scripts/services/drivers.js:78 msgid "Drivers disabled" -msgstr "" +msgstr "Deshabilitáronse os controladores" -#: app/scripts/services/utils.js:450 app/scripts/services/utils.js:502 +#: app/scripts/services/drivers.js:120 app/scripts/services/drivers.js:75 msgid "Drivers enabled" -msgstr "" +msgstr "Habilitáronse os controladores" -#: app/scripts/services/tools.js:246 +#: app/scripts/services/tools.js:265 msgid "Duplicated FPGA I/O ports" -msgstr "Portos E/S da FPGA duplicados" +msgstr "Os portos E/S da FPGA están duplicados" -#: app/scripts/services/blocks.js:370 +#: app/scripts/services/blocks.js:376 msgid "Duplicated block attributes" -msgstr "" +msgstr "Os atributos do bloque están duplicados" #: app/views/menu.html:78 msgid "Edit" msgstr "Editar" -#: app/views/menu.html:121 app/views/menu.html:274 -msgid "Enable" +#: app/scripts/services/tools.js:748 +msgid "Edit the collection name" msgstr "" -#: app/views/menu.html:137 +#: app/views/menu.html:121 app/views/menu.html:247 +msgid "Enable" +msgstr "Habilitar" + +#: app/views/languages.html:4 msgid "English" msgstr "Inglés" -#: app/scripts/services/blocks.js:181 -#, fuzzy +#: app/scripts/services/blocks.js:185 msgid "Enter the constant blocks" -msgstr "Introduza a etiqueta para o bloque" +msgstr "Introduza os bloques constante" #: app/scripts/services/blocks.js:52 msgid "Enter the input blocks" -msgstr "" +msgstr "Introduza os bloques de entrada" -#: app/scripts/services/blocks.js:269 +#: app/scripts/services/blocks.js:275 msgid "Enter the input ports" -msgstr "" +msgstr "Introduza os portos de entrada" -#: app/scripts/services/blocks.js:112 +#: app/scripts/services/blocks.js:114 msgid "Enter the output blocks" -msgstr "" +msgstr "Introduza os bloques de saída" -#: app/scripts/services/blocks.js:270 +#: app/scripts/services/blocks.js:276 msgid "Enter the output ports" -msgstr "" +msgstr "Introduza os portos de saída" -#: app/scripts/services/blocks.js:271 -#, fuzzy +#: app/scripts/services/blocks.js:277 msgid "Enter the parameters" -msgstr "Introduza o título do proxecto" +msgstr "Introduza os parámetros" -#: app/scripts/controllers/menu.js:321 +#: app/scripts/controllers/menu.js:328 msgid "Enter the remote hostname user@host (experimental)" -msgstr "Enter the remote hostname user@host (experimental)" +msgstr "Introduza o nome do equipo remoto: usuario@equipo (experimental)" -#: app/scripts/services/tools.js:345 +#: app/scripts/services/tools.js:504 msgid "Error: default toolchain not found in '{{dir}}'" -msgstr "" +msgstr "Erro: non se atopou a cadea de ferramentas predeterminada en '{{dir}}'" -#: app/scripts/services/utils.js:855 +#: app/scripts/services/utils.js:670 msgid "Error: {{error}}" -msgstr "Error: {{error}}" +msgstr "Erro: {{error}}" + +#: app/scripts/services/tools.js:336 +msgid "Errors detected in the code" +msgstr "" #: app/views/menu.html:39 msgid "Examples" msgstr "Exemplos" -#: app/scripts/services/tools.js:204 +#: app/scripts/services/tools.js:206 msgid "Execute remote {{label}} ..." -msgstr "Execute remote {{label}} ..." +msgstr "Executando {{label}} remoto..." #: app/views/menu.html:54 msgid "Export" msgstr "Exportar" -#: app/scripts/services/tools.js:478 +#: app/scripts/services/tools.js:637 msgid "Extract default apio files..." -msgstr "" +msgstr "Extraíndo os ficheiros de apio..." -#: app/scripts/services/tools.js:488 +#: app/scripts/services/tools.js:647 msgid "Extract default apio packages..." -msgstr "" +msgstr "Extraíndo os paquetes de apio..." -#: app/scripts/services/tools.js:466 +#: app/scripts/services/tools.js:625 msgid "Extract virtual env files..." -msgstr "" +msgstr "Extraíndo ficheiros do contorno virtual..." -#: app/scripts/services/tools.js:240 app/scripts/services/tools.js:243 +#: app/scripts/services/tools.js:262 msgid "FPGA I/O ports not defined" msgstr "Portos E/S da FPGA non definidos" -#: app/scripts/services/blocks.js:113 app/scripts/services/blocks.js:53 -#: app/scripts/services/blocks.js:698 app/scripts/services/blocks.js:778 +#: app/scripts/services/blocks.js:115 app/scripts/services/blocks.js:53 +#: app/scripts/services/blocks.js:711 app/scripts/services/blocks.js:791 msgid "FPGA pin" -msgstr "" +msgstr "Pin da FPGA" #: app/views/menu.html:26 msgid "File" msgstr "Ficheiro" -#: app/scripts/services/project.js:376 +#: app/scripts/services/project.js:425 msgid "" "File {{file}} already exists in the project path. Do you want to replace it?" -msgstr "" +msgstr "Xa existe o ficheiro {{file}} no cartafol do proxecto. Desexa trocalo?" -#: app/scripts/services/tools.js:180 +#: app/scripts/services/tools.js:182 msgid "File {{file}} does not exist" msgstr "O ficheiro {{file}} non existe" -#: app/scripts/services/project.js:408 +#: app/scripts/services/project.js:459 msgid "File {{file}} imported" -msgstr "" +msgstr "Importouse o ficheiro {{file}}" #: app/views/menu.html:104 msgid "Fit content" -msgstr "" +msgstr "Axustar contido" -#: app/views/menu.html:161 +#: app/views/languages.html:28 msgid "French" -msgstr "" +msgstr "Francés" -#: app/scripts/controllers/menu.js:213 +#: app/scripts/controllers/menu.js:220 msgid "GTKWave exported" -msgstr "GTKWave exportado" +msgstr "Exportouse o ficheiro para GTKWave" -#: app/views/menu.html:149 +#: app/views/languages.html:16 msgid "Galician" msgstr "Galego" -#: app/views/menu.html:315 +#: app/views/menu.html:288 msgid "Help" msgstr "Axuda" -#: app/scripts/services/utils.js:491 -msgid "Homebrew is required" -msgstr "" - -#: app/scripts/services/utils.js:736 -#, fuzzy +#: app/scripts/services/utils.js:543 msgid "Image" -msgstr "Ruta da imaxe" +msgstr "Imaxe" -#: app/scripts/controllers/menu.js:642 +#: app/scripts/controllers/menu.js:688 msgid "Image {{name}} saved" -msgstr "" +msgstr "Gardouse a imaxe {{name}}" -#: app/views/menu.html:364 +#: app/views/menu.html:337 msgid "Information" -msgstr "" +msgstr "Información" -#: app/views/menu.html:352 +#: app/views/menu.html:325 msgid "Input" msgstr "Entrada" -#: app/views/menu.html:247 +#: app/views/menu.html:220 msgid "Install" -msgstr "" +msgstr "Instalar" -#: app/scripts/services/tools.js:483 +#: app/scripts/services/tools.js:642 msgid "Install default apio..." -msgstr "" +msgstr "Instalando apio..." -#: app/scripts/services/tools.js:532 +#: app/scripts/services/tools.js:691 msgid "Installation completed" msgstr "Instalación completada" -#: app/scripts/services/tools.js:375 app/scripts/services/tools.js:412 +#: app/scripts/services/tools.js:534 app/scripts/services/tools.js:571 msgid "Installing toolchain" -msgstr "Instalando a toolchain" +msgstr "Instalando a cadea de ferramentas..." -#: app/scripts/services/tools.js:448 app/scripts/services/utils.js:495 +#: app/scripts/services/drivers.js:112 app/scripts/services/tools.js:607 msgid "Internet connection required" msgstr "Requírese dunha conexión a Internet" -#: app/scripts/services/graph.js:175 +#: app/scripts/services/graph.js:179 msgid "Invalid Pull up connection:
    block already connected" msgstr "" +"A conexión pull-up non é válida:
    o bloque xa se atopa conectado" -#: app/scripts/services/graph.js:189 +#: app/scripts/services/graph.js:193 msgid "Invalid Pull up connection:
    only Input blocks allowed" msgstr "" +"A conexión pull-up non é válida:
    tan só permítense os bloques " +"Entrada" -#: app/scripts/services/graph.js:181 +#: app/scripts/services/graph.js:185 msgid "Invalid block connection:
    Pull up already connected" msgstr "" +"A conexión do bloque non é válida:
    xa existe unha conexión pull-up" -#: app/scripts/services/tools.js:636 +#: app/scripts/services/tools.js:779 msgid "Invalid collection {{name}}" -msgstr "" +msgstr "A colección {{name}} non é válida" -#: app/scripts/services/graph.js:140 app/scripts/services/graph.js:147 -#: app/scripts/services/graph.js:154 +#: app/scripts/services/graph.js:143 app/scripts/services/graph.js:150 +#: app/scripts/services/graph.js:157 msgid "Invalid connection" -msgstr "" +msgstr "Conexión non válida" -#: app/scripts/services/graph.js:208 +#: app/scripts/services/graph.js:212 msgid "Invalid connection: {{a}} → {{b}}" -msgstr "" +msgstr "Conexión non válida: {{a}} → {{b}}" -#: app/scripts/services/graph.js:169 +#: app/scripts/services/graph.js:173 msgid "Invalid multiple input connections" +msgstr "Conexións de entrada múltiple non válida" + +#: app/scripts/services/drivers.js:190 +msgid "It is recommended to use USB 2.0 ports" msgstr "" -#: app/views/menu.html:133 +#: app/views/menu.html:134 msgid "Language" msgstr "Idioma" -#: app/scripts/services/tools.js:579 -msgid "Load {{name}} ..." -msgstr "" - -#: app/scripts/services/blocks.js:182 app/scripts/services/blocks.js:851 +#: app/scripts/services/blocks.js:186 app/scripts/services/blocks.js:864 msgid "Local parameter" -msgstr "" +msgstr "Parámetro local" -#: app/scripts/services/tools.js:471 +#: app/scripts/services/tools.js:630 msgid "Make virtual env..." -msgstr "" +msgstr "Creando o contorno virtual..." -#: app/scripts/services/utils.js:720 +#: app/scripts/services/utils.js:527 msgid "Name" -msgstr "" +msgstr "Nome" #: app/views/menu.html:29 msgid "New" -msgstr "" +msgstr "Novo" -#: app/scripts/services/project.js:80 +#: app/scripts/services/project.js:81 msgid "New project {{name}} created" msgstr "Novo proxecto {{name}} creado" -#: app/scripts/controllers/menu.js:503 +#: app/scripts/controllers/menu.js:546 msgid "No collections stored" -msgstr "" +msgstr "Non hay coleccións gardadas" #: app/scripts/controllers/main.js:15 msgid "OK" -msgstr "" +msgstr "Aceptar" -#: app/scripts/services/project.js:323 app/scripts/services/project.js:97 +#: app/scripts/services/project.js:364 app/scripts/services/project.js:99 msgid "Old project format {{version}}" -msgstr "" +msgstr "O formato {{version}} do proxecto é antigo" #: app/views/menu.html:32 msgid "Open" -msgstr "" +msgstr "Abrir" -#: app/scripts/services/utils.js:743 +#: app/scripts/services/utils.js:550 msgid "Open SVG" -msgstr "" +msgstr "Abrir SVG" -#: app/scripts/services/project.js:411 +#: app/scripts/services/project.js:462 msgid "Original file {{file}} does not exist" -msgstr "" +msgstr "Non existe o ficheiro {{name}} orixinal" -#: app/views/menu.html:355 +#: app/views/menu.html:328 msgid "Output" msgstr "Saída" -#: app/scripts/controllers/menu.js:195 +#: app/scripts/controllers/menu.js:202 msgid "PCF file exported" msgstr "Ficheiro PCF exportado" #: app/views/menu.html:94 msgid "Paste" +msgstr "Pegar" + +#: app/scripts/services/utils.js:872 +msgid "Please run: {{cmd}}" msgstr "" #: app/views/menu.html:108 msgid "Preferences" -msgstr "" +msgstr "Preferencias" #: app/views/menu.html:111 msgid "Project information" -msgstr "" +msgstr "Información do proxecto" -#: app/scripts/services/project.js:122 +#: app/scripts/services/project.js:125 msgid "Project {{name}} loaded" msgstr "Proxecto {{name}} cargado" -#: app/scripts/services/project.js:295 +#: app/scripts/services/project.js:334 msgid "Project {{name}} saved" msgstr "Proxecto {{name}} gardado" -#: app/scripts/services/tools.js:459 +#: app/scripts/services/tools.js:618 msgid "Python 2.7 is required" -msgstr "" +msgstr "Requírese Python 2.7" #: app/views/menu.html:72 msgid "Quit" -msgstr "" +msgstr "Saír" -#: app/views/design.html:5 +#: app/scripts/services/blocks.js:946 app/views/design.html:5 msgid "Read only" msgstr "Só lectura" #: app/views/menu.html:84 msgid "Redo" -msgstr "" +msgstr "Refacer" -#: app/scripts/services/tools.js:271 +#: app/scripts/services/tools.js:368 msgid "Remote host {{name}} not connected" -msgstr "" +msgstr "Non se puido conectar ó equipo remoto {{name}}" -#: app/views/menu.html:170 +#: app/views/menu.html:140 msgid "Remote hostname" -msgstr "" +msgstr "Nome do equipo remoto" -#: app/views/menu.html:255 app/views/menu.html:294 +#: app/views/menu.html:228 app/views/menu.html:267 msgid "Remove" msgstr "Eliminar" -#: app/views/menu.html:306 +#: app/views/menu.html:279 msgid "Remove all" -msgstr "" +msgstr "Eliminar todo" -#: app/scripts/services/utils.js:745 -#, fuzzy +#: app/scripts/services/utils.js:552 msgid "Reset SVG" -msgstr "Restablecer vista" +msgstr "Restablecer SVG" -#: app/views/menu.html:260 +#: app/views/menu.html:233 msgid "Reset default" -msgstr "" +msgstr "Restablecer predeterminado" #: app/views/menu.html:101 msgid "Reset view" @@ -550,230 +581,243 @@ msgstr "Restablecer vista" msgid "Save" msgstr "Gardar" -#: app/scripts/services/utils.js:744 -#, fuzzy +#: app/scripts/services/utils.js:551 msgid "Save SVG" -msgstr "Gardar como" +msgstr "Gardar SVG" #: app/views/menu.html:50 msgid "Save as" msgstr "Gardar como" -#: app/views/menu.html:198 +#: app/views/menu.html:171 msgid "Select" -msgstr "" +msgstr "Seleccionar" #: app/views/menu.html:97 msgid "Select all" -msgstr "" +msgstr "Seleccionar todo" -#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:699 +#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:712 msgid "Show clock" -msgstr "" +msgstr "Mostrar reloxo" -#: app/views/menu.html:328 +#: app/views/menu.html:301 msgid "Source code" msgstr "Código fonte" -#: app/views/menu.html:143 +#: app/views/languages.html:10 msgid "Spanish" msgstr "Castelán" -#: app/scripts/services/tools.js:193 +#: app/scripts/services/tools.js:195 msgid "Synchronize remote files ..." -msgstr "Synchronize remote files ..." +msgstr "Sincronizando ficheiros remotos..." #: app/views/menu.html:63 msgid "Testbench" msgstr "Testbench" -#: app/scripts/controllers/menu.js:204 +#: app/scripts/controllers/menu.js:211 msgid "Testbench exported" msgstr "Testbench exportado" -#: app/scripts/services/tools.js:616 +#: app/scripts/services/tools.js:758 msgid "The collection {{name}} already exists." -msgstr "" +msgstr "A colección {{name}} xa existe." -#: app/scripts/controllers/menu.js:424 +#: app/scripts/controllers/menu.js:465 msgid "" "The current FPGA I/O configuration will be lost. Do you want to change to " "{{name}} board?" msgstr "" -"A configuración actual de E/S da FPGA perderase. ¿Desexa cambiar á placa " +"Perderase a configuración actual de E/S da FPGA. Desexa cambiar á placa " "{{name}}?" -#: app/scripts/services/tools.js:350 +#: app/scripts/services/tools.js:509 msgid "The toolchain will be removed. Do you want to continue?" -msgstr "" +msgstr "Vaise eliminar a cadea de ferramentas. Desexa continuar?" -#: app/scripts/services/tools.js:338 +#: app/scripts/services/tools.js:497 msgid "The toolchain will be restored to default. Do you want to continue?" msgstr "" +"Vaise restaurar a cadea de ferramentas coa configuración predeterminada. " +"Desexa continuar?" -#: app/scripts/services/tools.js:330 +#: app/scripts/services/tools.js:489 msgid "" "The toolchain will be updated. This operation requires Internet connection. " "Do you want to continue?" msgstr "" +"Vaise actualizar a cadea de ferramentas. Esta operación require dunha " +"conexión a Internet. Desexa continuar?" -#: app/scripts/services/project.js:345 +#: app/scripts/services/project.js:387 msgid "" "This import operation requires a project path. You need to save the current " "project. Do you want to continue?" msgstr "" +"É necesario gardar o proxecto actual xa que a operación de importación " +"require dun cartafol do proxecto. Desexa continuar?" -#: app/scripts/services/project.js:103 +#: app/scripts/services/project.js:105 msgid "This project is designed for the {{name}} board." -msgstr "" +msgstr "Este proxecto está deseñado para a placa {{name}}" -#: app/views/menu.html:243 +#: app/views/menu.html:216 msgid "Toolchain" -msgstr "Toolchain" +msgstr "Cadea de ferramentas" -#: app/scripts/services/tools.js:533 +#: app/scripts/services/tools.js:692 msgid "Toolchain installed" -msgstr "Toolchain instalada" +msgstr "Instalouse a cadea de ferramentas" -#: app/scripts/services/tools.js:536 +#: app/scripts/services/tools.js:695 msgid "Toolchain not installed" -msgstr "" +msgstr "Non se instalou a cadea de ferramentas" -#: app/scripts/services/tools.js:92 app/scripts/services/utils.js:533 -#: app/scripts/services/utils.js:549 +#: app/scripts/services/drivers.js:197 app/scripts/services/drivers.js:213 +#: app/scripts/services/tools.js:94 msgid "Toolchain not installed. Please, install the toolchain" -msgstr "" +msgstr "A cadea de ferramentas non está instalada. Por favor, instálea." -#: app/scripts/services/tools.js:355 +#: app/scripts/services/tools.js:514 msgid "Toolchain removed" -msgstr "Toolchain eliminada" +msgstr "Eliminouse a cadea de ferramentas" -#: app/views/menu.html:230 +#: app/views/menu.html:203 msgid "Tools" msgstr "Ferramentas" #: app/views/menu.html:81 msgid "Undo" -msgstr "" +msgstr "Desfacer" -#: app/scripts/services/tools.js:237 +#: app/scripts/services/tools.js:257 msgid "Unknown board" msgstr "Placa desconocida" -#: app/scripts/app.js:43 +#: app/scripts/app.js:37 msgid "Untitled" -msgstr "" +msgstr "Sen título" -#: app/views/menu.html:250 +#: app/views/menu.html:223 msgid "Update" -msgstr "" +msgstr "Actualizar" -#: app/scripts/services/blocks.js:697 app/scripts/services/blocks.js:777 -#: app/scripts/services/blocks.js:850 +#: app/scripts/services/blocks.js:710 app/scripts/services/blocks.js:790 +#: app/scripts/services/blocks.js:863 msgid "Update the block name" -msgstr "" +msgstr "Actualizar o nome do bloque" -#: app/views/menu.html:239 +#: app/views/menu.html:212 msgid "Upload" msgstr "Cargar" -#: app/views/menu.html:233 +#: app/views/menu.html:206 msgid "Verify" msgstr "Verificar" -#: app/scripts/controllers/menu.js:186 +#: app/scripts/controllers/menu.js:193 msgid "Verilog code exported" msgstr "Código Verilog exportado" -#: app/scripts/services/utils.js:721 app/views/menu.html:321 +#: app/scripts/services/utils.js:528 app/views/menu.html:294 msgid "Version" msgstr "Versión" -#: app/views/menu.html:180 +#: app/views/menu.html:150 msgid "View" msgstr "Ver" -#: app/views/menu.html:318 +#: app/views/menu.html:291 msgid "View license" msgstr "Ver licenza" -#: app/scripts/services/blocks.js:404 +#: app/scripts/services/blocks.js:410 msgid "Wrong block format: {{type}}" msgstr "Formato de bloque incorrecto: {{type}}" -#: app/scripts/services/blocks.js:132 app/scripts/services/blocks.js:201 -#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:768 -#: app/scripts/services/blocks.js:842 app/scripts/services/blocks.js:877 +#: app/scripts/services/blocks.js:134 app/scripts/services/blocks.js:205 +#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:781 +#: app/scripts/services/blocks.js:855 app/scripts/services/blocks.js:890 msgid "Wrong block name {{name}}" -msgstr "" +msgstr "O nome do bloque {{name}} non é correcto" -#: app/scripts/services/blocks.js:319 -#, fuzzy +#: app/scripts/services/blocks.js:325 msgid "Wrong parameter name {{name}}" -msgstr "Formato de proxecto incorrecto: {{name}}\"" +msgstr "O nome do parámetro {{name}} non é correcto" -#: app/scripts/services/blocks.js:289 app/scripts/services/blocks.js:304 -#, fuzzy +#: app/scripts/services/blocks.js:295 app/scripts/services/blocks.js:310 msgid "Wrong port name {{name}}" -msgstr "Formato de proxecto incorrecto: {{name}}\"" +msgstr "O nome do porto {{name}} non é correcto" -#: app/scripts/services/project.js:130 +#: app/scripts/services/project.js:133 msgid "Wrong project format: {{name}}" -msgstr "Formato de proxecto incorrecto: {{name}}\"" +msgstr "O formato do proxecto {{name}} non é correcto" -#: app/scripts/services/tools.js:268 +#: app/scripts/services/tools.js:365 msgid "Wrong remote hostname {{name}}" -msgstr "" +msgstr "O nome do equipo remoto {{name}} non é correcto" -#: app/scripts/controllers/menu.js:235 +#: app/scripts/controllers/menu.js:242 msgid "Your changes will be lost if you don’t save them" -msgstr "" +msgstr "Os cambios realizados perderanse se non se gardan" #: app/views/design.html:6 msgid "back" -msgstr "" +msgstr "Atrás" #. Build done -#: app/scripts/services/tools.js:283 +#: app/scripts/services/tools.js:380 msgid "done_build" msgstr "Sintetizado realizado" #. Upload done -#: app/scripts/services/tools.js:285 +#: app/scripts/services/tools.js:382 msgid "done_upload" msgstr "Carga realizada" #. Verification done -#: app/scripts/services/tools.js:281 +#: app/scripts/services/tools.js:378 msgid "done_verify" msgstr "Verificación realizada" #. Start building ... -#: app/scripts/services/tools.js:60 +#: app/scripts/services/tools.js:61 msgid "start_build" -msgstr "Iniciar a sintetizado ..." +msgstr "Iniciando o sintetizado..." #. Start uploading ... -#: app/scripts/services/tools.js:62 +#: app/scripts/services/tools.js:63 msgid "start_upload" -msgstr "Iniciar a carga ..." +msgstr "Iniciando a carga..." #. Start verification ... -#: app/scripts/services/tools.js:58 +#: app/scripts/services/tools.js:59 msgid "start_verify" -msgstr "Iniciar a verificación ..." +msgstr "Iniciando a verificación..." -#: app/scripts/controllers/menu.js:383 -msgid "{{board}} datasheet not defined" +#: app/scripts/services/drivers.js:103 app/scripts/services/utils.js:847 +msgid "{{app}} is required." msgstr "" -#: app/scripts/controllers/menu.js:373 +#: app/scripts/controllers/menu.js:398 +msgid "{{board}} datasheet not defined" +msgstr "Non se definiu a folla de datos para a placa {{board}}" + +#: app/scripts/controllers/menu.js:388 msgid "{{board}} pinout not defined" -msgstr "" +msgstr "Non se definiu o pinout para a placa {{board}}" -#: app/scripts/controllers/menu.js:402 +#: app/scripts/controllers/menu.js:417 msgid "{{board}} rules not defined" -msgstr "" +msgstr "Non se definiron as regras para a placa {{board}}" + +#~ msgid "Homebrew is required" +#~ msgstr "Requírese Homebrew" + +#~ msgid "Load {{name}} ..." +#~ msgstr "Cargando {{name}}..." #~ msgid "1_basic" #~ msgstr "1. Básico" diff --git a/app/resources/locale/template.pot b/app/resources/locale/template.pot index 6c18ab3bf..cff71181e 100644 --- a/app/resources/locale/template.pot +++ b/app/resources/locale/template.pot @@ -4,28 +4,28 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Project-Id-Version: \n" -#: app/scripts/services/utils.js:456 -#: app/scripts/services/utils.js:536 +#: app/scripts/services/drivers.js:200 +#: app/scripts/services/drivers.js:81 msgid "Unplug and reconnect the board" msgstr "" -#: app/scripts/services/utils.js:527 +#: app/scripts/services/drivers.js:189 msgid "

    FTDI driver installation instructions

    1. Connect the FPGA board
    2. Replace the (Interface 0) driver of the board by libusbK
    3. Unplug and reconnect the board
    " msgstr "" -#: app/scripts/services/utils.js:543 +#: app/scripts/services/drivers.js:207 msgid "

    FTDI driver uninstallation instructions

    1. Find the FPGA USB Device
    2. Select the board interface and uninstall the driver
    " msgstr "" -#: app/views/menu.html:336 +#: app/views/menu.html:309 msgid "About Icestudio" msgstr "" -#: app/views/menu.html:290 +#: app/views/menu.html:263 msgid "Add" msgstr "" -#: app/scripts/controllers/menu.js:471 +#: app/scripts/controllers/menu.js:516 msgid "Add a block to start" msgstr "" @@ -33,36 +33,37 @@ msgstr "" msgid "Add as block" msgstr "" -#: app/scripts/services/tools.js:682 +#: app/scripts/services/tools.js:895 msgid "All collections removed" msgstr "" -#: app/scripts/controllers/menu.js:495 +#: app/scripts/controllers/menu.js:538 msgid "All stored collections will be lost. Do you want to continue?" msgstr "" -#: app/scripts/services/utils.js:723 +#: app/scripts/services/utils.js:530 msgid "Author" msgstr "" -#: app/views/menu.html:347 +#: app/views/menu.html:320 msgid "Basic" msgstr "" -#: app/views/menu.html:155 +#: app/views/languages.html:22 msgid "Basque" msgstr "" -#: app/scripts/services/blocks.js:742 -#: app/scripts/services/blocks.js:763 -#: app/scripts/services/blocks.js:818 -#: app/scripts/services/blocks.js:837 -#: app/scripts/services/blocks.js:872 -#: app/scripts/services/blocks.js:911 +#: app/scripts/services/blocks.js:755 +#: app/scripts/services/blocks.js:776 +#: app/scripts/services/blocks.js:831 +#: app/scripts/services/blocks.js:850 +#: app/scripts/services/blocks.js:885 +#: app/scripts/services/blocks.js:926 +#: app/scripts/services/blocks.js:960 msgid "Block updated" msgstr "" -#: app/scripts/services/project.js:418 +#: app/scripts/services/project.js:413 msgid "Block {{name}} imported" msgstr "" @@ -70,32 +71,32 @@ msgstr "" msgid "Blocks" msgstr "" -#: app/views/menu.html:201 +#: app/views/menu.html:174 msgid "Board" msgstr "" #: app/views/menu.html:115 -#: app/views/menu.html:192 +#: app/views/menu.html:162 msgid "Board rules" msgstr "" -#: app/scripts/controllers/menu.js:334 +#: app/scripts/controllers/menu.js:341 msgid "Board rules disabled" msgstr "" -#: app/scripts/controllers/menu.js:329 +#: app/scripts/controllers/menu.js:336 msgid "Board rules enabled" msgstr "" -#: app/scripts/services/tools.js:234 +#: app/scripts/services/tools.js:254 msgid "Board {{name}} not detected" msgstr "" -#: app/scripts/controllers/menu.js:435 +#: app/scripts/controllers/menu.js:477 msgid "Board {{name}} selected" msgstr "" -#: app/views/menu.html:236 +#: app/views/menu.html:209 msgid "Build" msgstr "" @@ -103,51 +104,67 @@ msgstr "" msgid "Cancel" msgstr "" -#: app/scripts/services/tools.js:446 +#: app/views/languages.html:34 +msgid "Catalan" +msgstr "" + +#: app/scripts/services/tools.js:605 msgid "Check Internet connection..." msgstr "" -#: app/scripts/services/tools.js:454 +#: app/scripts/services/tools.js:613 msgid "Check Python..." msgstr "" -#: app/views/menu.html:361 +#: app/scripts/services/drivers.js:104 +msgid "Click here to install it" +msgstr "" + +#: app/views/menu.html:334 msgid "Code" msgstr "" -#: app/views/menu.html:212 +#: app/views/menu.html:185 msgid "Collection" msgstr "" -#: app/scripts/services/tools.js:631 +#: app/views/menu.html:165 +msgid "Collection info" +msgstr "" + +#: app/scripts/controllers/menu.js:436 +msgid "Collection {{collection}} info not defined" +msgstr "" + +#: app/scripts/services/tools.js:773 msgid "Collection {{name}} added" msgstr "" -#: app/scripts/services/tools.js:625 +#: app/scripts/services/tools.js:767 msgid "Collection {{name}} not replaced" msgstr "" -#: app/scripts/services/tools.js:676 +#: app/scripts/services/tools.js:889 msgid "Collection {{name}} removed" msgstr "" -#: app/scripts/services/tools.js:621 +#: app/scripts/services/tools.js:763 msgid "Collection {{name}} replaced" msgstr "" -#: app/scripts/controllers/menu.js:410 +#: app/scripts/controllers/menu.js:444 msgid "Collection {{name}} selected" msgstr "" -#: app/views/menu.html:286 +#: app/views/menu.html:259 msgid "Collections" msgstr "" -#: app/views/menu.html:332 +#: app/views/menu.html:305 msgid "Community forum" msgstr "" -#: app/views/menu.html:358 +#: app/views/menu.html:331 msgid "Constant" msgstr "" @@ -159,66 +176,66 @@ msgstr "" msgid "Cut" msgstr "" -#: app/views/menu.html:189 +#: app/views/menu.html:159 msgid "Datasheet" msgstr "" -#: app/views/menu.html:216 +#: app/views/menu.html:189 msgid "Default" msgstr "" -#: app/scripts/services/tools.js:322 +#: app/scripts/services/tools.js:481 msgid "Default toolchain not found. Toolchain will be downloaded. This operation requires Internet connection. Do you want to continue?" msgstr "" -#: app/scripts/services/utils.js:722 +#: app/scripts/services/utils.js:529 msgid "Description" msgstr "" #: app/views/menu.html:126 -#: app/views/menu.html:279 +#: app/views/menu.html:252 msgid "Disable" msgstr "" -#: app/scripts/controllers/menu.js:234 +#: app/scripts/controllers/menu.js:241 msgid "Do you want to close the application?" msgstr "" -#: app/scripts/services/project.js:104 +#: app/scripts/services/project.js:106 msgid "Do you want to convert it?" msgstr "" -#: app/scripts/controllers/menu.js:485 +#: app/scripts/controllers/menu.js:528 msgid "Do you want to remove the {{name}} collection?" msgstr "" -#: app/scripts/services/tools.js:617 +#: app/scripts/services/tools.js:759 msgid "Do you want to replace it?" msgstr "" -#: app/views/menu.html:325 +#: app/views/menu.html:298 msgid "Documentation" msgstr "" -#: app/views/menu.html:270 +#: app/views/menu.html:243 msgid "Drivers" msgstr "" -#: app/scripts/services/utils.js:453 -#: app/scripts/services/utils.js:521 +#: app/scripts/services/drivers.js:128 +#: app/scripts/services/drivers.js:78 msgid "Drivers disabled" msgstr "" -#: app/scripts/services/utils.js:450 -#: app/scripts/services/utils.js:502 +#: app/scripts/services/drivers.js:120 +#: app/scripts/services/drivers.js:75 msgid "Drivers enabled" msgstr "" -#: app/scripts/services/tools.js:246 +#: app/scripts/services/tools.js:265 msgid "Duplicated FPGA I/O ports" msgstr "" -#: app/scripts/services/blocks.js:370 +#: app/scripts/services/blocks.js:376 msgid "Duplicated block attributes" msgstr "" @@ -226,16 +243,20 @@ msgstr "" msgid "Edit" msgstr "" +#: app/scripts/services/tools.js:748 +msgid "Edit the collection name" +msgstr "" + #: app/views/menu.html:121 -#: app/views/menu.html:274 +#: app/views/menu.html:247 msgid "Enable" msgstr "" -#: app/views/menu.html:137 +#: app/views/languages.html:4 msgid "English" msgstr "" -#: app/scripts/services/blocks.js:181 +#: app/scripts/services/blocks.js:185 msgid "Enter the constant blocks" msgstr "" @@ -243,39 +264,43 @@ msgstr "" msgid "Enter the input blocks" msgstr "" -#: app/scripts/services/blocks.js:269 +#: app/scripts/services/blocks.js:275 msgid "Enter the input ports" msgstr "" -#: app/scripts/services/blocks.js:112 +#: app/scripts/services/blocks.js:114 msgid "Enter the output blocks" msgstr "" -#: app/scripts/services/blocks.js:270 +#: app/scripts/services/blocks.js:276 msgid "Enter the output ports" msgstr "" -#: app/scripts/services/blocks.js:271 +#: app/scripts/services/blocks.js:277 msgid "Enter the parameters" msgstr "" -#: app/scripts/controllers/menu.js:321 +#: app/scripts/controllers/menu.js:328 msgid "Enter the remote hostname user@host (experimental)" msgstr "" -#: app/scripts/services/tools.js:345 +#: app/scripts/services/tools.js:504 msgid "Error: default toolchain not found in '{{dir}}'" msgstr "" -#: app/scripts/services/utils.js:855 +#: app/scripts/services/utils.js:670 msgid "Error: {{error}}" msgstr "" +#: app/scripts/services/tools.js:336 +msgid "Errors detected in the code" +msgstr "" + #: app/views/menu.html:39 msgid "Examples" msgstr "" -#: app/scripts/services/tools.js:204 +#: app/scripts/services/tools.js:206 msgid "Execute remote {{label}} ..." msgstr "" @@ -283,27 +308,26 @@ msgstr "" msgid "Export" msgstr "" -#: app/scripts/services/tools.js:478 +#: app/scripts/services/tools.js:637 msgid "Extract default apio files..." msgstr "" -#: app/scripts/services/tools.js:488 +#: app/scripts/services/tools.js:647 msgid "Extract default apio packages..." msgstr "" -#: app/scripts/services/tools.js:466 +#: app/scripts/services/tools.js:625 msgid "Extract virtual env files..." msgstr "" -#: app/scripts/services/tools.js:240 -#: app/scripts/services/tools.js:243 +#: app/scripts/services/tools.js:262 msgid "FPGA I/O ports not defined" msgstr "" -#: app/scripts/services/blocks.js:113 +#: app/scripts/services/blocks.js:115 #: app/scripts/services/blocks.js:53 -#: app/scripts/services/blocks.js:698 -#: app/scripts/services/blocks.js:778 +#: app/scripts/services/blocks.js:711 +#: app/scripts/services/blocks.js:791 msgid "FPGA pin" msgstr "" @@ -311,15 +335,15 @@ msgstr "" msgid "File" msgstr "" -#: app/scripts/services/project.js:376 +#: app/scripts/services/project.js:425 msgid "File {{file}} already exists in the project path. Do you want to replace it?" msgstr "" -#: app/scripts/services/tools.js:180 +#: app/scripts/services/tools.js:182 msgid "File {{file}} does not exist" msgstr "" -#: app/scripts/services/project.js:408 +#: app/scripts/services/project.js:459 msgid "File {{file}} imported" msgstr "" @@ -327,112 +351,108 @@ msgstr "" msgid "Fit content" msgstr "" -#: app/views/menu.html:161 +#: app/views/languages.html:28 msgid "French" msgstr "" -#: app/scripts/controllers/menu.js:213 +#: app/scripts/controllers/menu.js:220 msgid "GTKWave exported" msgstr "" -#: app/views/menu.html:149 +#: app/views/languages.html:16 msgid "Galician" msgstr "" -#: app/views/menu.html:315 +#: app/views/menu.html:288 msgid "Help" msgstr "" -#: app/scripts/services/utils.js:491 -msgid "Homebrew is required" -msgstr "" - -#: app/scripts/services/utils.js:736 +#: app/scripts/services/utils.js:543 msgid "Image" msgstr "" -#: app/scripts/controllers/menu.js:642 +#: app/scripts/controllers/menu.js:688 msgid "Image {{name}} saved" msgstr "" -#: app/views/menu.html:364 +#: app/views/menu.html:337 msgid "Information" msgstr "" -#: app/views/menu.html:352 +#: app/views/menu.html:325 msgid "Input" msgstr "" -#: app/views/menu.html:247 +#: app/views/menu.html:220 msgid "Install" msgstr "" -#: app/scripts/services/tools.js:483 +#: app/scripts/services/tools.js:642 msgid "Install default apio..." msgstr "" -#: app/scripts/services/tools.js:532 +#: app/scripts/services/tools.js:691 msgid "Installation completed" msgstr "" -#: app/scripts/services/tools.js:375 -#: app/scripts/services/tools.js:412 +#: app/scripts/services/tools.js:534 +#: app/scripts/services/tools.js:571 msgid "Installing toolchain" msgstr "" -#: app/scripts/services/tools.js:448 -#: app/scripts/services/utils.js:495 +#: app/scripts/services/drivers.js:112 +#: app/scripts/services/tools.js:607 msgid "Internet connection required" msgstr "" -#: app/scripts/services/graph.js:175 +#: app/scripts/services/graph.js:179 msgid "Invalid Pull up connection:
    block already connected" msgstr "" -#: app/scripts/services/graph.js:189 +#: app/scripts/services/graph.js:193 msgid "Invalid Pull up connection:
    only Input blocks allowed" msgstr "" -#: app/scripts/services/graph.js:181 +#: app/scripts/services/graph.js:185 msgid "Invalid block connection:
    Pull up already connected" msgstr "" -#: app/scripts/services/tools.js:636 +#: app/scripts/services/tools.js:779 msgid "Invalid collection {{name}}" msgstr "" -#: app/scripts/services/graph.js:140 -#: app/scripts/services/graph.js:147 -#: app/scripts/services/graph.js:154 +#: app/scripts/services/graph.js:143 +#: app/scripts/services/graph.js:150 +#: app/scripts/services/graph.js:157 msgid "Invalid connection" msgstr "" -#: app/scripts/services/graph.js:208 +#: app/scripts/services/graph.js:212 msgid "Invalid connection: {{a}} → {{b}}" msgstr "" -#: app/scripts/services/graph.js:169 +#: app/scripts/services/graph.js:173 msgid "Invalid multiple input connections" msgstr "" -#: app/views/menu.html:133 -msgid "Language" +#: app/scripts/services/drivers.js:190 +msgid "It is recommended to use USB 2.0 ports" msgstr "" -#: app/scripts/services/tools.js:579 -msgid "Load {{name}} ..." +#: app/views/menu.html:134 +msgid "Language" msgstr "" -#: app/scripts/services/blocks.js:182 -#: app/scripts/services/blocks.js:851 +#: app/scripts/services/blocks.js:186 +#: app/scripts/services/blocks.js:864 msgid "Local parameter" msgstr "" -#: app/scripts/services/tools.js:471 +#: app/scripts/services/tools.js:630 msgid "Make virtual env..." msgstr "" -#: app/scripts/services/utils.js:720 +#: app/scripts/services/utils.js:527 msgid "Name" msgstr "" @@ -440,11 +460,11 @@ msgstr "" msgid "New" msgstr "" -#: app/scripts/services/project.js:80 +#: app/scripts/services/project.js:81 msgid "New project {{name}} created" msgstr "" -#: app/scripts/controllers/menu.js:503 +#: app/scripts/controllers/menu.js:546 msgid "No collections stored" msgstr "" @@ -452,8 +472,8 @@ msgstr "" msgid "OK" msgstr "" -#: app/scripts/services/project.js:323 -#: app/scripts/services/project.js:97 +#: app/scripts/services/project.js:364 +#: app/scripts/services/project.js:99 msgid "Old project format {{version}}" msgstr "" @@ -461,19 +481,19 @@ msgstr "" msgid "Open" msgstr "" -#: app/scripts/services/utils.js:743 +#: app/scripts/services/utils.js:550 msgid "Open SVG" msgstr "" -#: app/scripts/services/project.js:411 +#: app/scripts/services/project.js:462 msgid "Original file {{file}} does not exist" msgstr "" -#: app/views/menu.html:355 +#: app/views/menu.html:328 msgid "Output" msgstr "" -#: app/scripts/controllers/menu.js:195 +#: app/scripts/controllers/menu.js:202 msgid "PCF file exported" msgstr "" @@ -481,6 +501,10 @@ msgstr "" msgid "Paste" msgstr "" +#: app/scripts/services/utils.js:872 +msgid "Please run: {{cmd}}" +msgstr "" + #: app/views/menu.html:108 msgid "Preferences" msgstr "" @@ -489,15 +513,15 @@ msgstr "" msgid "Project information" msgstr "" -#: app/scripts/services/project.js:122 +#: app/scripts/services/project.js:125 msgid "Project {{name}} loaded" msgstr "" -#: app/scripts/services/project.js:295 +#: app/scripts/services/project.js:334 msgid "Project {{name}} saved" msgstr "" -#: app/scripts/services/tools.js:459 +#: app/scripts/services/tools.js:618 msgid "Python 2.7 is required" msgstr "" @@ -505,6 +529,7 @@ msgstr "" msgid "Quit" msgstr "" +#: app/scripts/services/blocks.js:946 #: app/views/design.html:5 msgid "Read only" msgstr "" @@ -513,28 +538,28 @@ msgstr "" msgid "Redo" msgstr "" -#: app/scripts/services/tools.js:271 +#: app/scripts/services/tools.js:368 msgid "Remote host {{name}} not connected" msgstr "" -#: app/views/menu.html:170 +#: app/views/menu.html:140 msgid "Remote hostname" msgstr "" -#: app/views/menu.html:255 -#: app/views/menu.html:294 +#: app/views/menu.html:228 +#: app/views/menu.html:267 msgid "Remove" msgstr "" -#: app/views/menu.html:306 +#: app/views/menu.html:279 msgid "Remove all" msgstr "" -#: app/scripts/services/utils.js:745 +#: app/scripts/services/utils.js:552 msgid "Reset SVG" msgstr "" -#: app/views/menu.html:260 +#: app/views/menu.html:233 msgid "Reset default" msgstr "" @@ -546,7 +571,7 @@ msgstr "" msgid "Save" msgstr "" -#: app/scripts/services/utils.js:744 +#: app/scripts/services/utils.js:551 msgid "Save SVG" msgstr "" @@ -554,7 +579,7 @@ msgstr "" msgid "Save as" msgstr "" -#: app/views/menu.html:198 +#: app/views/menu.html:171 msgid "Select" msgstr "" @@ -563,19 +588,19 @@ msgid "Select all" msgstr "" #: app/scripts/services/blocks.js:54 -#: app/scripts/services/blocks.js:699 +#: app/scripts/services/blocks.js:712 msgid "Show clock" msgstr "" -#: app/views/menu.html:328 +#: app/views/menu.html:301 msgid "Source code" msgstr "" -#: app/views/menu.html:143 +#: app/views/languages.html:10 msgid "Spanish" msgstr "" -#: app/scripts/services/tools.js:193 +#: app/scripts/services/tools.js:195 msgid "Synchronize remote files ..." msgstr "" @@ -583,61 +608,61 @@ msgstr "" msgid "Testbench" msgstr "" -#: app/scripts/controllers/menu.js:204 +#: app/scripts/controllers/menu.js:211 msgid "Testbench exported" msgstr "" -#: app/scripts/services/tools.js:616 +#: app/scripts/services/tools.js:758 msgid "The collection {{name}} already exists." msgstr "" -#: app/scripts/controllers/menu.js:424 +#: app/scripts/controllers/menu.js:465 msgid "The current FPGA I/O configuration will be lost. Do you want to change to {{name}} board?" msgstr "" -#: app/scripts/services/tools.js:350 +#: app/scripts/services/tools.js:509 msgid "The toolchain will be removed. Do you want to continue?" msgstr "" -#: app/scripts/services/tools.js:338 +#: app/scripts/services/tools.js:497 msgid "The toolchain will be restored to default. Do you want to continue?" msgstr "" -#: app/scripts/services/tools.js:330 +#: app/scripts/services/tools.js:489 msgid "The toolchain will be updated. This operation requires Internet connection. Do you want to continue?" msgstr "" -#: app/scripts/services/project.js:345 +#: app/scripts/services/project.js:387 msgid "This import operation requires a project path. You need to save the current project. Do you want to continue?" msgstr "" -#: app/scripts/services/project.js:103 +#: app/scripts/services/project.js:105 msgid "This project is designed for the {{name}} board." msgstr "" -#: app/views/menu.html:243 +#: app/views/menu.html:216 msgid "Toolchain" msgstr "" -#: app/scripts/services/tools.js:533 +#: app/scripts/services/tools.js:692 msgid "Toolchain installed" msgstr "" -#: app/scripts/services/tools.js:536 +#: app/scripts/services/tools.js:695 msgid "Toolchain not installed" msgstr "" -#: app/scripts/services/tools.js:92 -#: app/scripts/services/utils.js:533 -#: app/scripts/services/utils.js:549 +#: app/scripts/services/drivers.js:197 +#: app/scripts/services/drivers.js:213 +#: app/scripts/services/tools.js:94 msgid "Toolchain not installed. Please, install the toolchain" msgstr "" -#: app/scripts/services/tools.js:355 +#: app/scripts/services/tools.js:514 msgid "Toolchain removed" msgstr "" -#: app/views/menu.html:230 +#: app/views/menu.html:203 msgid "Tools" msgstr "" @@ -645,80 +670,80 @@ msgstr "" msgid "Undo" msgstr "" -#: app/scripts/services/tools.js:237 +#: app/scripts/services/tools.js:257 msgid "Unknown board" msgstr "" -#: app/scripts/app.js:43 +#: app/scripts/app.js:37 msgid "Untitled" msgstr "" -#: app/views/menu.html:250 +#: app/views/menu.html:223 msgid "Update" msgstr "" -#: app/scripts/services/blocks.js:697 -#: app/scripts/services/blocks.js:777 -#: app/scripts/services/blocks.js:850 +#: app/scripts/services/blocks.js:710 +#: app/scripts/services/blocks.js:790 +#: app/scripts/services/blocks.js:863 msgid "Update the block name" msgstr "" -#: app/views/menu.html:239 +#: app/views/menu.html:212 msgid "Upload" msgstr "" -#: app/views/menu.html:233 +#: app/views/menu.html:206 msgid "Verify" msgstr "" -#: app/scripts/controllers/menu.js:186 +#: app/scripts/controllers/menu.js:193 msgid "Verilog code exported" msgstr "" -#: app/scripts/services/utils.js:721 -#: app/views/menu.html:321 +#: app/scripts/services/utils.js:528 +#: app/views/menu.html:294 msgid "Version" msgstr "" -#: app/views/menu.html:180 +#: app/views/menu.html:150 msgid "View" msgstr "" -#: app/views/menu.html:318 +#: app/views/menu.html:291 msgid "View license" msgstr "" -#: app/scripts/services/blocks.js:404 +#: app/scripts/services/blocks.js:410 msgid "Wrong block format: {{type}}" msgstr "" -#: app/scripts/services/blocks.js:132 -#: app/scripts/services/blocks.js:201 +#: app/scripts/services/blocks.js:134 +#: app/scripts/services/blocks.js:205 #: app/scripts/services/blocks.js:75 -#: app/scripts/services/blocks.js:768 -#: app/scripts/services/blocks.js:842 -#: app/scripts/services/blocks.js:877 +#: app/scripts/services/blocks.js:781 +#: app/scripts/services/blocks.js:855 +#: app/scripts/services/blocks.js:890 msgid "Wrong block name {{name}}" msgstr "" -#: app/scripts/services/blocks.js:319 +#: app/scripts/services/blocks.js:325 msgid "Wrong parameter name {{name}}" msgstr "" -#: app/scripts/services/blocks.js:289 -#: app/scripts/services/blocks.js:304 +#: app/scripts/services/blocks.js:295 +#: app/scripts/services/blocks.js:310 msgid "Wrong port name {{name}}" msgstr "" -#: app/scripts/services/project.js:130 +#: app/scripts/services/project.js:133 msgid "Wrong project format: {{name}}" msgstr "" -#: app/scripts/services/tools.js:268 +#: app/scripts/services/tools.js:365 msgid "Wrong remote hostname {{name}}" msgstr "" -#: app/scripts/controllers/menu.js:235 +#: app/scripts/controllers/menu.js:242 msgid "Your changes will be lost if you don’t save them" msgstr "" @@ -727,43 +752,48 @@ msgid "back" msgstr "" #. Build done -#: app/scripts/services/tools.js:283 +#: app/scripts/services/tools.js:380 msgid "done_build" msgstr "" #. Upload done -#: app/scripts/services/tools.js:285 +#: app/scripts/services/tools.js:382 msgid "done_upload" msgstr "" #. Verification done -#: app/scripts/services/tools.js:281 +#: app/scripts/services/tools.js:378 msgid "done_verify" msgstr "" #. Start building ... -#: app/scripts/services/tools.js:60 +#: app/scripts/services/tools.js:61 msgid "start_build" msgstr "" #. Start uploading ... -#: app/scripts/services/tools.js:62 +#: app/scripts/services/tools.js:63 msgid "start_upload" msgstr "" #. Start verification ... -#: app/scripts/services/tools.js:58 +#: app/scripts/services/tools.js:59 msgid "start_verify" msgstr "" -#: app/scripts/controllers/menu.js:383 +#: app/scripts/services/drivers.js:103 +#: app/scripts/services/utils.js:847 +msgid "{{app}} is required." +msgstr "" + +#: app/scripts/controllers/menu.js:398 msgid "{{board}} datasheet not defined" msgstr "" -#: app/scripts/controllers/menu.js:373 +#: app/scripts/controllers/menu.js:388 msgid "{{board}} pinout not defined" msgstr "" -#: app/scripts/controllers/menu.js:402 +#: app/scripts/controllers/menu.js:417 msgid "{{board}} rules not defined" msgstr "" diff --git a/app/resources/viewers/markdown/css/github-markdown.css b/app/resources/viewers/markdown/css/github-markdown.css new file mode 100644 index 000000000..42e38eba8 --- /dev/null +++ b/app/resources/viewers/markdown/css/github-markdown.css @@ -0,0 +1,681 @@ +@font-face { + font-family: octicons-link; + src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAAAAeAAAAME3QpOBwcmVwAAAEbAAAAHYAAAB/aFGpk3jaTY6xa8JAGMW/O62BDi0tJLYQincXEypYIiGJjSgHniQ6umTsUEyLm5BV6NDBP8Tpts6F0v+k/0an2i+itHDw3v2+9+DBKTzsJNnWJNTgHEy4BgG3EMI9DCEDOGEXzDADU5hBKMIgNPZqoD3SilVaXZCER3/I7AtxEJLtzzuZfI+VVkprxTlXShWKb3TBecG11rwoNlmmn1P2WYcJczl32etSpKnziC7lQyWe1smVPy/Lt7Kc+0vWY/gAgIIEqAN9we0pwKXreiMasxvabDQMM4riO+qxM2ogwDGOZTXxwxDiycQIcoYFBLj5K3EIaSctAq2kTYiw+ymhce7vwM9jSqO8JyVd5RH9gyTt2+J/yUmYlIR0s04n6+7Vm1ozezUeLEaUjhaDSuXHwVRgvLJn1tQ7xiuVv/ocTRF42mNgZGBgYGbwZOBiAAFGJBIMAAizAFoAAABiAGIAznjaY2BkYGAA4in8zwXi+W2+MjCzMIDApSwvXzC97Z4Ig8N/BxYGZgcgl52BCSQKAA3jCV8CAABfAAAAAAQAAEB42mNgZGBg4f3vACQZQABIMjKgAmYAKEgBXgAAeNpjYGY6wTiBgZWBg2kmUxoDA4MPhGZMYzBi1AHygVLYQUCaawqDA4PChxhmh/8ODDEsvAwHgMKMIDnGL0x7gJQCAwMAJd4MFwAAAHjaY2BgYGaA4DAGRgYQkAHyGMF8NgYrIM3JIAGVYYDT+AEjAwuDFpBmA9KMDEwMCh9i/v8H8sH0/4dQc1iAmAkALaUKLgAAAHjaTY9LDsIgEIbtgqHUPpDi3gPoBVyRTmTddOmqTXThEXqrob2gQ1FjwpDvfwCBdmdXC5AVKFu3e5MfNFJ29KTQT48Ob9/lqYwOGZxeUelN2U2R6+cArgtCJpauW7UQBqnFkUsjAY/kOU1cP+DAgvxwn1chZDwUbd6CFimGXwzwF6tPbFIcjEl+vvmM/byA48e6tWrKArm4ZJlCbdsrxksL1AwWn/yBSJKpYbq8AXaaTb8AAHja28jAwOC00ZrBeQNDQOWO//sdBBgYGRiYWYAEELEwMTE4uzo5Zzo5b2BxdnFOcALxNjA6b2ByTswC8jYwg0VlNuoCTWAMqNzMzsoK1rEhNqByEyerg5PMJlYuVueETKcd/89uBpnpvIEVomeHLoMsAAe1Id4AAAAAAAB42oWQT07CQBTGv0JBhagk7HQzKxca2sJCE1hDt4QF+9JOS0nbaaYDCQfwCJ7Au3AHj+LO13FMmm6cl7785vven0kBjHCBhfpYuNa5Ph1c0e2Xu3jEvWG7UdPDLZ4N92nOm+EBXuAbHmIMSRMs+4aUEd4Nd3CHD8NdvOLTsA2GL8M9PODbcL+hD7C1xoaHeLJSEao0FEW14ckxC+TU8TxvsY6X0eLPmRhry2WVioLpkrbp84LLQPGI7c6sOiUzpWIWS5GzlSgUzzLBSikOPFTOXqly7rqx0Z1Q5BAIoZBSFihQYQOOBEdkCOgXTOHA07HAGjGWiIjaPZNW13/+lm6S9FT7rLHFJ6fQbkATOG1j2OFMucKJJsxIVfQORl+9Jyda6Sl1dUYhSCm1dyClfoeDve4qMYdLEbfqHf3O/AdDumsjAAB42mNgYoAAZQYjBmyAGYQZmdhL8zLdDEydARfoAqIAAAABAAMABwAKABMAB///AA8AAQAAAAAAAAAAAAAAAAABAAAAAA==) format('woff'); +} + +.markdown-body { + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; + line-height: 1.5; + color: #333; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 16px; + line-height: 1.5; + word-wrap: break-word; +} + +.markdown-body .pl-c { + color: #969896; +} + +.markdown-body .pl-c1, +.markdown-body .pl-s .pl-v { + color: #0086b3; +} + +.markdown-body .pl-e, +.markdown-body .pl-en { + color: #795da3; +} + +.markdown-body .pl-smi, +.markdown-body .pl-s .pl-s1 { + color: #333; +} + +.markdown-body .pl-ent { + color: #63a35c; +} + +.markdown-body .pl-k { + color: #a71d5d; +} + +.markdown-body .pl-s, +.markdown-body .pl-pds, +.markdown-body .pl-s .pl-pse .pl-s1, +.markdown-body .pl-sr, +.markdown-body .pl-sr .pl-cce, +.markdown-body .pl-sr .pl-sre, +.markdown-body .pl-sr .pl-sra { + color: #183691; +} + +.markdown-body .pl-v { + color: #ed6a43; +} + +.markdown-body .pl-id { + color: #b52a1d; +} + +.markdown-body .pl-ii { + color: #f8f8f8; + background-color: #b52a1d; +} + +.markdown-body .pl-sr .pl-cce { + font-weight: bold; + color: #63a35c; +} + +.markdown-body .pl-ml { + color: #693a17; +} + +.markdown-body .pl-mh, +.markdown-body .pl-mh .pl-en, +.markdown-body .pl-ms { + font-weight: bold; + color: #1d3e81; +} + +.markdown-body .pl-mq { + color: #008080; +} + +.markdown-body .pl-mi { + font-style: italic; + color: #333; +} + +.markdown-body .pl-mb { + font-weight: bold; + color: #333; +} + +.markdown-body .pl-md { + color: #bd2c00; + background-color: #ffecec; +} + +.markdown-body .pl-mi1 { + color: #55a532; + background-color: #eaffea; +} + +.markdown-body .pl-mdr { + font-weight: bold; + color: #795da3; +} + +.markdown-body .pl-mo { + color: #1d3e81; +} + +.markdown-body .octicon { + display: inline-block; + vertical-align: text-top; + fill: currentColor; +} + +.markdown-body a { + background-color: transparent; + -webkit-text-decoration-skip: objects; +} + +.markdown-body a:active, +.markdown-body a:hover { + outline-width: 0; +} + +.markdown-body strong { + font-weight: inherit; +} + +.markdown-body strong { + font-weight: bolder; +} + +.markdown-body h1 { + font-size: 2em; + margin: 0.67em 0; +} + +.markdown-body img { + border-style: none; +} + +.markdown-body svg:not(:root) { + overflow: hidden; +} + +.markdown-body code, +.markdown-body kbd, +.markdown-body pre { + font-family: monospace, monospace; + font-size: 1em; +} + +.markdown-body hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +.markdown-body input { + font: inherit; + margin: 0; +} + +.markdown-body input { + overflow: visible; +} + +.markdown-body [type="checkbox"] { + box-sizing: border-box; + padding: 0; +} + +.markdown-body * { + box-sizing: border-box; +} + +.markdown-body input { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +.markdown-body a { + color: #4078c0; + text-decoration: none; +} + +.markdown-body a:hover, +.markdown-body a:active { + text-decoration: underline; +} + +.markdown-body strong { + font-weight: 600; +} + +.markdown-body hr { + height: 0; + margin: 15px 0; + overflow: hidden; + background: transparent; + border: 0; + border-bottom: 1px solid #ddd; +} + +.markdown-body hr::before { + display: table; + content: ""; +} + +.markdown-body hr::after { + display: table; + clear: both; + content: ""; +} + +.markdown-body table { + border-spacing: 0; + border-collapse: collapse; +} + +.markdown-body td, +.markdown-body th { + padding: 0; +} + +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin-top: 0; + margin-bottom: 0; +} + +.markdown-body h1 { + font-size: 32px; + font-weight: 600; +} + +.markdown-body h2 { + font-size: 24px; + font-weight: 600; +} + +.markdown-body h3 { + font-size: 20px; + font-weight: 600; +} + +.markdown-body h4 { + font-size: 16px; + font-weight: 600; +} + +.markdown-body h5 { + font-size: 14px; + font-weight: 600; +} + +.markdown-body h6 { + font-size: 12px; + font-weight: 600; +} + +.markdown-body p { + margin-top: 0; + margin-bottom: 10px; +} + +.markdown-body blockquote { + margin: 0; +} + +.markdown-body ul, +.markdown-body ol { + padding-left: 0; + margin-top: 0; + margin-bottom: 0; +} + +.markdown-body ol ol, +.markdown-body ul ol { + list-style-type: lower-roman; +} + +.markdown-body ul ul ol, +.markdown-body ul ol ol, +.markdown-body ol ul ol, +.markdown-body ol ol ol { + list-style-type: lower-alpha; +} + +.markdown-body dd { + margin-left: 0; +} + +.markdown-body code { + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size: 12px; +} + +.markdown-body pre { + margin-top: 0; + margin-bottom: 0; + font: 12px Consolas, "Liberation Mono", Menlo, Courier, monospace; +} + +.markdown-body .octicon { + vertical-align: text-bottom; +} + +.markdown-body input { + -webkit-font-feature-settings: "liga" 0; + font-feature-settings: "liga" 0; +} + +.markdown-body::before { + display: table; + content: ""; +} + +.markdown-body::after { + display: table; + clear: both; + content: ""; +} + +.markdown-body>*:first-child { + margin-top: 0 !important; +} + +.markdown-body>*:last-child { + margin-bottom: 0 !important; +} + +.markdown-body a:not([href]) { + color: inherit; + text-decoration: none; +} + +.markdown-body .anchor { + float: left; + padding-right: 4px; + margin-left: -20px; + line-height: 1; +} + +.markdown-body .anchor:focus { + outline: none; +} + +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre { + margin-top: 0; + margin-bottom: 16px; +} + +.markdown-body hr { + height: 0.25em; + padding: 0; + margin: 24px 0; + background-color: #e7e7e7; + border: 0; +} + +.markdown-body blockquote { + padding: 0 1em; + color: #777; + border-left: 0.25em solid #ddd; +} + +.markdown-body blockquote>:first-child { + margin-top: 0; +} + +.markdown-body blockquote>:last-child { + margin-bottom: 0; +} + +.markdown-body kbd { + display: inline-block; + padding: 3px 5px; + font-size: 11px; + line-height: 10px; + color: #555; + vertical-align: middle; + background-color: #fcfcfc; + border: solid 1px #ccc; + border-bottom-color: #bbb; + border-radius: 3px; + box-shadow: inset 0 -1px 0 #bbb; +} + +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin-top: 24px; + margin-bottom: 16px; + font-weight: 600; + line-height: 1.25; +} + +.markdown-body h1 .octicon-link, +.markdown-body h2 .octicon-link, +.markdown-body h3 .octicon-link, +.markdown-body h4 .octicon-link, +.markdown-body h5 .octicon-link, +.markdown-body h6 .octicon-link { + color: #000; + vertical-align: middle; + visibility: hidden; +} + +.markdown-body h1:hover .anchor, +.markdown-body h2:hover .anchor, +.markdown-body h3:hover .anchor, +.markdown-body h4:hover .anchor, +.markdown-body h5:hover .anchor, +.markdown-body h6:hover .anchor { + text-decoration: none; +} + +.markdown-body h1:hover .anchor .octicon-link, +.markdown-body h2:hover .anchor .octicon-link, +.markdown-body h3:hover .anchor .octicon-link, +.markdown-body h4:hover .anchor .octicon-link, +.markdown-body h5:hover .anchor .octicon-link, +.markdown-body h6:hover .anchor .octicon-link { + visibility: visible; +} + +.markdown-body h1 { + padding-bottom: 0.3em; + font-size: 2em; + border-bottom: 1px solid #eee; +} + +.markdown-body h2 { + padding-bottom: 0.3em; + font-size: 1.5em; + border-bottom: 1px solid #eee; +} + +.markdown-body h3 { + font-size: 1.25em; +} + +.markdown-body h4 { + font-size: 1em; +} + +.markdown-body h5 { + font-size: 0.875em; +} + +.markdown-body h6 { + font-size: 0.85em; + color: #777; +} + +.markdown-body ul, +.markdown-body ol { + padding-left: 2em; +} + +.markdown-body ul ul, +.markdown-body ul ol, +.markdown-body ol ol, +.markdown-body ol ul { + margin-top: 0; + margin-bottom: 0; +} + +.markdown-body li>p { + margin-top: 16px; +} + +.markdown-body li+li { + margin-top: 0.25em; +} + +.markdown-body dl { + padding: 0; +} + +.markdown-body dl dt { + padding: 0; + margin-top: 16px; + font-size: 1em; + font-style: italic; + font-weight: bold; +} + +.markdown-body dl dd { + padding: 0 16px; + margin-bottom: 16px; +} + +.markdown-body table { + display: block; + width: 100%; + overflow: auto; +} + +.markdown-body table th { + font-weight: bold; +} + +.markdown-body table th, +.markdown-body table td { + padding: 6px 13px; + border: 1px solid #ddd; +} + +.markdown-body table tr { + background-color: #fff; + border-top: 1px solid #ccc; +} + +.markdown-body table tr:nth-child(2n) { + background-color: #f8f8f8; +} + +.markdown-body img { + max-width: 100%; + box-sizing: content-box; + background-color: #fff; +} + +.markdown-body code { + padding: 0; + padding-top: 0.2em; + padding-bottom: 0.2em; + margin: 0; + font-size: 85%; + background-color: rgba(0,0,0,0.04); + border-radius: 3px; +} + +.markdown-body code::before, +.markdown-body code::after { + letter-spacing: -0.2em; + content: "\00a0"; +} + +.markdown-body pre { + word-wrap: normal; +} + +.markdown-body pre>code { + padding: 0; + margin: 0; + font-size: 100%; + word-break: normal; + white-space: pre; + background: transparent; + border: 0; +} + +.markdown-body .highlight { + margin-bottom: 16px; +} + +.markdown-body .highlight pre { + margin-bottom: 0; + word-break: normal; +} + +.markdown-body .highlight pre, +.markdown-body pre { + padding: 16px; + overflow: auto; + font-size: 85%; + line-height: 1.45; + background-color: #f7f7f7; + border-radius: 3px; +} + +.markdown-body pre code { + display: inline; + max-width: auto; + padding: 0; + margin: 0; + overflow: visible; + line-height: inherit; + word-wrap: normal; + background-color: transparent; + border: 0; +} + +.markdown-body pre code::before, +.markdown-body pre code::after { + content: normal; +} + +.markdown-body .pl-0 { + padding-left: 0 !important; +} + +.markdown-body .pl-1 { + padding-left: 3px !important; +} + +.markdown-body .pl-2 { + padding-left: 6px !important; +} + +.markdown-body .pl-3 { + padding-left: 12px !important; +} + +.markdown-body .pl-4 { + padding-left: 24px !important; +} + +.markdown-body .pl-5 { + padding-left: 36px !important; +} + +.markdown-body .pl-6 { + padding-left: 48px !important; +} + +.markdown-body .full-commit .btn-outline:not(:disabled):hover { + color: #4078c0; + border: 1px solid #4078c0; +} + +.markdown-body kbd { + display: inline-block; + padding: 3px 5px; + font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace; + line-height: 10px; + color: #555; + vertical-align: middle; + background-color: #fcfcfc; + border: solid 1px #ccc; + border-bottom-color: #bbb; + border-radius: 3px; + box-shadow: inset 0 -1px 0 #bbb; +} + +.markdown-body :checked+.radio-label { + position: relative; + z-index: 1; + border-color: #4078c0; +} + +.markdown-body .task-list-item { + list-style-type: none; +} + +.markdown-body .task-list-item+.task-list-item { + margin-top: 3px; +} + +.markdown-body .task-list-item input { + margin: 0 0.2em 0.25em -1.6em; + vertical-align: middle; +} + +.markdown-body hr { + border-bottom-color: #eee; +} diff --git a/app/resources/viewers/markdown/lib/marked.js b/app/resources/viewers/markdown/lib/marked.js new file mode 100644 index 000000000..9f1584bb3 --- /dev/null +++ b/app/resources/viewers/markdown/lib/marked.js @@ -0,0 +1,1286 @@ +/** + * marked - a markdown parser + * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed) + * https://github.com/chjj/marked + */ + +;(function() { + +/** + * Block-Level Grammar + */ + +var block = { + newline: /^\n+/, + code: /^( {4}[^\n]+\n*)+/, + fences: noop, + hr: /^( *[-*_]){3,} *(?:\n+|$)/, + heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/, + nptable: noop, + lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/, + blockquote: /^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/, + list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/, + html: /^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/, + def: /^ *\[([^\]]+)\]: *]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/, + table: noop, + paragraph: /^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/, + text: /^[^\n]+/ +}; + +block.bullet = /(?:[*+-]|\d+\.)/; +block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/; +block.item = replace(block.item, 'gm') + (/bull/g, block.bullet) + (); + +block.list = replace(block.list) + (/bull/g, block.bullet) + ('hr', '\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))') + ('def', '\\n+(?=' + block.def.source + ')') + (); + +block.blockquote = replace(block.blockquote) + ('def', block.def) + (); + +block._tag = '(?!(?:' + + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code' + + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo' + + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b'; + +block.html = replace(block.html) + ('comment', //) + ('closed', /<(tag)[\s\S]+?<\/\1>/) + ('closing', /])*?>/) + (/tag/g, block._tag) + (); + +block.paragraph = replace(block.paragraph) + ('hr', block.hr) + ('heading', block.heading) + ('lheading', block.lheading) + ('blockquote', block.blockquote) + ('tag', '<' + block._tag) + ('def', block.def) + (); + +/** + * Normal Block Grammar + */ + +block.normal = merge({}, block); + +/** + * GFM Block Grammar + */ + +block.gfm = merge({}, block.normal, { + fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\s*\1 *(?:\n+|$)/, + paragraph: /^/, + heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/ +}); + +block.gfm.paragraph = replace(block.paragraph) + ('(?!', '(?!' + + block.gfm.fences.source.replace('\\1', '\\2') + '|' + + block.list.source.replace('\\1', '\\3') + '|') + (); + +/** + * GFM + Tables Block Grammar + */ + +block.tables = merge({}, block.gfm, { + nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/, + table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/ +}); + +/** + * Block Lexer + */ + +function Lexer(options) { + this.tokens = []; + this.tokens.links = {}; + this.options = options || marked.defaults; + this.rules = block.normal; + + if (this.options.gfm) { + if (this.options.tables) { + this.rules = block.tables; + } else { + this.rules = block.gfm; + } + } +} + +/** + * Expose Block Rules + */ + +Lexer.rules = block; + +/** + * Static Lex Method + */ + +Lexer.lex = function(src, options) { + var lexer = new Lexer(options); + return lexer.lex(src); +}; + +/** + * Preprocessing + */ + +Lexer.prototype.lex = function(src) { + src = src + .replace(/\r\n|\r/g, '\n') + .replace(/\t/g, ' ') + .replace(/\u00a0/g, ' ') + .replace(/\u2424/g, '\n'); + + return this.token(src, true); +}; + +/** + * Lexing + */ + +Lexer.prototype.token = function(src, top, bq) { + var src = src.replace(/^ +$/gm, '') + , next + , loose + , cap + , bull + , b + , item + , space + , i + , l; + + while (src) { + // newline + if (cap = this.rules.newline.exec(src)) { + src = src.substring(cap[0].length); + if (cap[0].length > 1) { + this.tokens.push({ + type: 'space' + }); + } + } + + // code + if (cap = this.rules.code.exec(src)) { + src = src.substring(cap[0].length); + cap = cap[0].replace(/^ {4}/gm, ''); + this.tokens.push({ + type: 'code', + text: !this.options.pedantic + ? cap.replace(/\n+$/, '') + : cap + }); + continue; + } + + // fences (gfm) + if (cap = this.rules.fences.exec(src)) { + src = src.substring(cap[0].length); + this.tokens.push({ + type: 'code', + lang: cap[2], + text: cap[3] || '' + }); + continue; + } + + // heading + if (cap = this.rules.heading.exec(src)) { + src = src.substring(cap[0].length); + this.tokens.push({ + type: 'heading', + depth: cap[1].length, + text: cap[2] + }); + continue; + } + + // table no leading pipe (gfm) + if (top && (cap = this.rules.nptable.exec(src))) { + src = src.substring(cap[0].length); + + item = { + type: 'table', + header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */), + align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */), + cells: cap[3].replace(/\n$/, '').split('\n') + }; + + for (i = 0; i < item.align.length; i++) { + if (/^ *-+: *$/.test(item.align[i])) { + item.align[i] = 'right'; + } else if (/^ *:-+: *$/.test(item.align[i])) { + item.align[i] = 'center'; + } else if (/^ *:-+ *$/.test(item.align[i])) { + item.align[i] = 'left'; + } else { + item.align[i] = null; + } + } + + for (i = 0; i < item.cells.length; i++) { + item.cells[i] = item.cells[i].split(/ *\| */); + } + + this.tokens.push(item); + + continue; + } + + // lheading + if (cap = this.rules.lheading.exec(src)) { + src = src.substring(cap[0].length); + this.tokens.push({ + type: 'heading', + depth: cap[2] === '=' ? 1 : 2, + text: cap[1] + }); + continue; + } + + // hr + if (cap = this.rules.hr.exec(src)) { + src = src.substring(cap[0].length); + this.tokens.push({ + type: 'hr' + }); + continue; + } + + // blockquote + if (cap = this.rules.blockquote.exec(src)) { + src = src.substring(cap[0].length); + + this.tokens.push({ + type: 'blockquote_start' + }); + + cap = cap[0].replace(/^ *> ?/gm, ''); + + // Pass `top` to keep the current + // "toplevel" state. This is exactly + // how markdown.pl works. + this.token(cap, top, true); + + this.tokens.push({ + type: 'blockquote_end' + }); + + continue; + } + + // list + if (cap = this.rules.list.exec(src)) { + src = src.substring(cap[0].length); + bull = cap[2]; + + this.tokens.push({ + type: 'list_start', + ordered: bull.length > 1 + }); + + // Get each top-level item. + cap = cap[0].match(this.rules.item); + + next = false; + l = cap.length; + i = 0; + + for (; i < l; i++) { + item = cap[i]; + + // Remove the list item's bullet + // so it is seen as the next token. + space = item.length; + item = item.replace(/^ *([*+-]|\d+\.) +/, ''); + + // Outdent whatever the + // list item contains. Hacky. + if (~item.indexOf('\n ')) { + space -= item.length; + item = !this.options.pedantic + ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '') + : item.replace(/^ {1,4}/gm, ''); + } + + // Determine whether the next list item belongs here. + // Backpedal if it does not belong in this list. + if (this.options.smartLists && i !== l - 1) { + b = block.bullet.exec(cap[i + 1])[0]; + if (bull !== b && !(bull.length > 1 && b.length > 1)) { + src = cap.slice(i + 1).join('\n') + src; + i = l - 1; + } + } + + // Determine whether item is loose or not. + // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/ + // for discount behavior. + loose = next || /\n\n(?!\s*$)/.test(item); + if (i !== l - 1) { + next = item.charAt(item.length - 1) === '\n'; + if (!loose) loose = next; + } + + this.tokens.push({ + type: loose + ? 'loose_item_start' + : 'list_item_start' + }); + + // Recurse. + this.token(item, false, bq); + + this.tokens.push({ + type: 'list_item_end' + }); + } + + this.tokens.push({ + type: 'list_end' + }); + + continue; + } + + // html + if (cap = this.rules.html.exec(src)) { + src = src.substring(cap[0].length); + this.tokens.push({ + type: this.options.sanitize + ? 'paragraph' + : 'html', + pre: !this.options.sanitizer + && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'), + text: cap[0] + }); + continue; + } + + // def + if ((!bq && top) && (cap = this.rules.def.exec(src))) { + src = src.substring(cap[0].length); + this.tokens.links[cap[1].toLowerCase()] = { + href: cap[2], + title: cap[3] + }; + continue; + } + + // table (gfm) + if (top && (cap = this.rules.table.exec(src))) { + src = src.substring(cap[0].length); + + item = { + type: 'table', + header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */), + align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */), + cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') + }; + + for (i = 0; i < item.align.length; i++) { + if (/^ *-+: *$/.test(item.align[i])) { + item.align[i] = 'right'; + } else if (/^ *:-+: *$/.test(item.align[i])) { + item.align[i] = 'center'; + } else if (/^ *:-+ *$/.test(item.align[i])) { + item.align[i] = 'left'; + } else { + item.align[i] = null; + } + } + + for (i = 0; i < item.cells.length; i++) { + item.cells[i] = item.cells[i] + .replace(/^ *\| *| *\| *$/g, '') + .split(/ *\| */); + } + + this.tokens.push(item); + + continue; + } + + // top-level paragraph + if (top && (cap = this.rules.paragraph.exec(src))) { + src = src.substring(cap[0].length); + this.tokens.push({ + type: 'paragraph', + text: cap[1].charAt(cap[1].length - 1) === '\n' + ? cap[1].slice(0, -1) + : cap[1] + }); + continue; + } + + // text + if (cap = this.rules.text.exec(src)) { + // Top-level should never reach here. + src = src.substring(cap[0].length); + this.tokens.push({ + type: 'text', + text: cap[0] + }); + continue; + } + + if (src) { + throw new + Error('Infinite loop on byte: ' + src.charCodeAt(0)); + } + } + + return this.tokens; +}; + +/** + * Inline-Level Grammar + */ + +var inline = { + escape: /^\\([\\`*{}\[\]()#+\-.!_>])/, + autolink: /^<([^ >]+(@|:\/)[^ >]+)>/, + url: noop, + tag: /^|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/, + link: /^!?\[(inside)\]\(href\)/, + reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/, + nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/, + strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/, + em: /^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/, + code: /^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/, + br: /^ {2,}\n(?!\s*$)/, + del: noop, + text: /^[\s\S]+?(?=[\\?(?:\s+['"]([\s\S]*?)['"])?\s*/; + +inline.link = replace(inline.link) + ('inside', inline._inside) + ('href', inline._href) + (); + +inline.reflink = replace(inline.reflink) + ('inside', inline._inside) + (); + +/** + * Normal Inline Grammar + */ + +inline.normal = merge({}, inline); + +/** + * Pedantic Inline Grammar + */ + +inline.pedantic = merge({}, inline.normal, { + strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/, + em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/ +}); + +/** + * GFM Inline Grammar + */ + +inline.gfm = merge({}, inline.normal, { + escape: replace(inline.escape)('])', '~|])')(), + url: /^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/, + del: /^~~(?=\S)([\s\S]*?\S)~~/, + text: replace(inline.text) + (']|', '~]|') + ('|', '|https?://|') + () +}); + +/** + * GFM + Line Breaks Inline Grammar + */ + +inline.breaks = merge({}, inline.gfm, { + br: replace(inline.br)('{2,}', '*')(), + text: replace(inline.gfm.text)('{2,}', '*')() +}); + +/** + * Inline Lexer & Compiler + */ + +function InlineLexer(links, options) { + this.options = options || marked.defaults; + this.links = links; + this.rules = inline.normal; + this.renderer = this.options.renderer || new Renderer; + this.renderer.options = this.options; + + if (!this.links) { + throw new + Error('Tokens array requires a `links` property.'); + } + + if (this.options.gfm) { + if (this.options.breaks) { + this.rules = inline.breaks; + } else { + this.rules = inline.gfm; + } + } else if (this.options.pedantic) { + this.rules = inline.pedantic; + } +} + +/** + * Expose Inline Rules + */ + +InlineLexer.rules = inline; + +/** + * Static Lexing/Compiling Method + */ + +InlineLexer.output = function(src, links, options) { + var inline = new InlineLexer(links, options); + return inline.output(src); +}; + +/** + * Lexing/Compiling + */ + +InlineLexer.prototype.output = function(src) { + var out = '' + , link + , text + , href + , cap; + + while (src) { + // escape + if (cap = this.rules.escape.exec(src)) { + src = src.substring(cap[0].length); + out += cap[1]; + continue; + } + + // autolink + if (cap = this.rules.autolink.exec(src)) { + src = src.substring(cap[0].length); + if (cap[2] === '@') { + text = cap[1].charAt(6) === ':' + ? this.mangle(cap[1].substring(7)) + : this.mangle(cap[1]); + href = this.mangle('mailto:') + text; + } else { + text = escape(cap[1]); + href = text; + } + out += this.renderer.link(href, null, text); + continue; + } + + // url (gfm) + if (!this.inLink && (cap = this.rules.url.exec(src))) { + src = src.substring(cap[0].length); + text = escape(cap[1]); + href = text; + out += this.renderer.link(href, null, text); + continue; + } + + // tag + if (cap = this.rules.tag.exec(src)) { + if (!this.inLink && /^/i.test(cap[0])) { + this.inLink = false; + } + src = src.substring(cap[0].length); + out += this.options.sanitize + ? this.options.sanitizer + ? this.options.sanitizer(cap[0]) + : escape(cap[0]) + : cap[0] + continue; + } + + // link + if (cap = this.rules.link.exec(src)) { + src = src.substring(cap[0].length); + this.inLink = true; + out += this.outputLink(cap, { + href: cap[2], + title: cap[3] + }); + this.inLink = false; + continue; + } + + // reflink, nolink + if ((cap = this.rules.reflink.exec(src)) + || (cap = this.rules.nolink.exec(src))) { + src = src.substring(cap[0].length); + link = (cap[2] || cap[1]).replace(/\s+/g, ' '); + link = this.links[link.toLowerCase()]; + if (!link || !link.href) { + out += cap[0].charAt(0); + src = cap[0].substring(1) + src; + continue; + } + this.inLink = true; + out += this.outputLink(cap, link); + this.inLink = false; + continue; + } + + // strong + if (cap = this.rules.strong.exec(src)) { + src = src.substring(cap[0].length); + out += this.renderer.strong(this.output(cap[2] || cap[1])); + continue; + } + + // em + if (cap = this.rules.em.exec(src)) { + src = src.substring(cap[0].length); + out += this.renderer.em(this.output(cap[2] || cap[1])); + continue; + } + + // code + if (cap = this.rules.code.exec(src)) { + src = src.substring(cap[0].length); + out += this.renderer.codespan(escape(cap[2], true)); + continue; + } + + // br + if (cap = this.rules.br.exec(src)) { + src = src.substring(cap[0].length); + out += this.renderer.br(); + continue; + } + + // del (gfm) + if (cap = this.rules.del.exec(src)) { + src = src.substring(cap[0].length); + out += this.renderer.del(this.output(cap[1])); + continue; + } + + // text + if (cap = this.rules.text.exec(src)) { + src = src.substring(cap[0].length); + out += this.renderer.text(escape(this.smartypants(cap[0]))); + continue; + } + + if (src) { + throw new + Error('Infinite loop on byte: ' + src.charCodeAt(0)); + } + } + + return out; +}; + +/** + * Compile Link + */ + +InlineLexer.prototype.outputLink = function(cap, link) { + var href = escape(link.href) + , title = link.title ? escape(link.title) : null; + + return cap[0].charAt(0) !== '!' + ? this.renderer.link(href, title, this.output(cap[1])) + : this.renderer.image(href, title, escape(cap[1])); +}; + +/** + * Smartypants Transformations + */ + +InlineLexer.prototype.smartypants = function(text) { + if (!this.options.smartypants) return text; + return text + // em-dashes + .replace(/---/g, '\u2014') + // en-dashes + .replace(/--/g, '\u2013') + // opening singles + .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018') + // closing singles & apostrophes + .replace(/'/g, '\u2019') + // opening doubles + .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c') + // closing doubles + .replace(/"/g, '\u201d') + // ellipses + .replace(/\.{3}/g, '\u2026'); +}; + +/** + * Mangle Links + */ + +InlineLexer.prototype.mangle = function(text) { + if (!this.options.mangle) return text; + var out = '' + , l = text.length + , i = 0 + , ch; + + for (; i < l; i++) { + ch = text.charCodeAt(i); + if (Math.random() > 0.5) { + ch = 'x' + ch.toString(16); + } + out += '&#' + ch + ';'; + } + + return out; +}; + +/** + * Renderer + */ + +function Renderer(options) { + this.options = options || {}; +} + +Renderer.prototype.code = function(code, lang, escaped) { + if (this.options.highlight) { + var out = this.options.highlight(code, lang); + if (out != null && out !== code) { + escaped = true; + code = out; + } + } + + if (!lang) { + return '
    '
    +      + (escaped ? code : escape(code, true))
    +      + '\n
    '; + } + + return '
    '
    +    + (escaped ? code : escape(code, true))
    +    + '\n
    \n'; +}; + +Renderer.prototype.blockquote = function(quote) { + return '
    \n' + quote + '
    \n'; +}; + +Renderer.prototype.html = function(html) { + return html; +}; + +Renderer.prototype.heading = function(text, level, raw) { + return '' + + text + + '\n'; +}; + +Renderer.prototype.hr = function() { + return this.options.xhtml ? '
    \n' : '
    \n'; +}; + +Renderer.prototype.list = function(body, ordered) { + var type = ordered ? 'ol' : 'ul'; + return '<' + type + '>\n' + body + '\n'; +}; + +Renderer.prototype.listitem = function(text) { + return '
  • ' + text + '
  • \n'; +}; + +Renderer.prototype.paragraph = function(text) { + return '

    ' + text + '

    \n'; +}; + +Renderer.prototype.table = function(header, body) { + return '\n' + + '\n' + + header + + '\n' + + '\n' + + body + + '\n' + + '
    \n'; +}; + +Renderer.prototype.tablerow = function(content) { + return '\n' + content + '\n'; +}; + +Renderer.prototype.tablecell = function(content, flags) { + var type = flags.header ? 'th' : 'td'; + var tag = flags.align + ? '<' + type + ' style="text-align:' + flags.align + '">' + : '<' + type + '>'; + return tag + content + '\n'; +}; + +// span level renderer +Renderer.prototype.strong = function(text) { + return '' + text + ''; +}; + +Renderer.prototype.em = function(text) { + return '' + text + ''; +}; + +Renderer.prototype.codespan = function(text) { + return '' + text + ''; +}; + +Renderer.prototype.br = function() { + return this.options.xhtml ? '
    ' : '
    '; +}; + +Renderer.prototype.del = function(text) { + return '' + text + ''; +}; + +Renderer.prototype.link = function(href, title, text) { + if (this.options.sanitize) { + try { + var prot = decodeURIComponent(unescape(href)) + .replace(/[^\w:]/g, '') + .toLowerCase(); + } catch (e) { + return ''; + } + if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0) { + return ''; + } + } + var out = '
    '; + return out; +}; + +Renderer.prototype.image = function(href, title, text) { + var out = '' + text + '' : '>'; + return out; +}; + +Renderer.prototype.text = function(text) { + return text; +}; + +/** + * Parsing & Compiling + */ + +function Parser(options) { + this.tokens = []; + this.token = null; + this.options = options || marked.defaults; + this.options.renderer = this.options.renderer || new Renderer; + this.renderer = this.options.renderer; + this.renderer.options = this.options; +} + +/** + * Static Parse Method + */ + +Parser.parse = function(src, options, renderer) { + var parser = new Parser(options, renderer); + return parser.parse(src); +}; + +/** + * Parse Loop + */ + +Parser.prototype.parse = function(src) { + this.inline = new InlineLexer(src.links, this.options, this.renderer); + this.tokens = src.reverse(); + + var out = ''; + while (this.next()) { + out += this.tok(); + } + + return out; +}; + +/** + * Next Token + */ + +Parser.prototype.next = function() { + return this.token = this.tokens.pop(); +}; + +/** + * Preview Next Token + */ + +Parser.prototype.peek = function() { + return this.tokens[this.tokens.length - 1] || 0; +}; + +/** + * Parse Text Tokens + */ + +Parser.prototype.parseText = function() { + var body = this.token.text; + + while (this.peek().type === 'text') { + body += '\n' + this.next().text; + } + + return this.inline.output(body); +}; + +/** + * Parse Current Token + */ + +Parser.prototype.tok = function() { + switch (this.token.type) { + case 'space': { + return ''; + } + case 'hr': { + return this.renderer.hr(); + } + case 'heading': { + return this.renderer.heading( + this.inline.output(this.token.text), + this.token.depth, + this.token.text); + } + case 'code': { + return this.renderer.code(this.token.text, + this.token.lang, + this.token.escaped); + } + case 'table': { + var header = '' + , body = '' + , i + , row + , cell + , flags + , j; + + // header + cell = ''; + for (i = 0; i < this.token.header.length; i++) { + flags = { header: true, align: this.token.align[i] }; + cell += this.renderer.tablecell( + this.inline.output(this.token.header[i]), + { header: true, align: this.token.align[i] } + ); + } + header += this.renderer.tablerow(cell); + + for (i = 0; i < this.token.cells.length; i++) { + row = this.token.cells[i]; + + cell = ''; + for (j = 0; j < row.length; j++) { + cell += this.renderer.tablecell( + this.inline.output(row[j]), + { header: false, align: this.token.align[j] } + ); + } + + body += this.renderer.tablerow(cell); + } + return this.renderer.table(header, body); + } + case 'blockquote_start': { + var body = ''; + + while (this.next().type !== 'blockquote_end') { + body += this.tok(); + } + + return this.renderer.blockquote(body); + } + case 'list_start': { + var body = '' + , ordered = this.token.ordered; + + while (this.next().type !== 'list_end') { + body += this.tok(); + } + + return this.renderer.list(body, ordered); + } + case 'list_item_start': { + var body = ''; + + while (this.next().type !== 'list_item_end') { + body += this.token.type === 'text' + ? this.parseText() + : this.tok(); + } + + return this.renderer.listitem(body); + } + case 'loose_item_start': { + var body = ''; + + while (this.next().type !== 'list_item_end') { + body += this.tok(); + } + + return this.renderer.listitem(body); + } + case 'html': { + var html = !this.token.pre && !this.options.pedantic + ? this.inline.output(this.token.text) + : this.token.text; + return this.renderer.html(html); + } + case 'paragraph': { + return this.renderer.paragraph(this.inline.output(this.token.text)); + } + case 'text': { + return this.renderer.paragraph(this.parseText()); + } + } +}; + +/** + * Helpers + */ + +function escape(html, encode) { + return html + .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} + +function unescape(html) { + // explicitly match decimal, hex, and named HTML entities + return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/g, function(_, n) { + n = n.toLowerCase(); + if (n === 'colon') return ':'; + if (n.charAt(0) === '#') { + return n.charAt(1) === 'x' + ? String.fromCharCode(parseInt(n.substring(2), 16)) + : String.fromCharCode(+n.substring(1)); + } + return ''; + }); +} + +function replace(regex, opt) { + regex = regex.source; + opt = opt || ''; + return function self(name, val) { + if (!name) return new RegExp(regex, opt); + val = val.source || val; + val = val.replace(/(^|[^\[])\^/g, '$1'); + regex = regex.replace(name, val); + return self; + }; +} + +function noop() {} +noop.exec = noop; + +function merge(obj) { + var i = 1 + , target + , key; + + for (; i < arguments.length; i++) { + target = arguments[i]; + for (key in target) { + if (Object.prototype.hasOwnProperty.call(target, key)) { + obj[key] = target[key]; + } + } + } + + return obj; +} + + +/** + * Marked + */ + +function marked(src, opt, callback) { + if (callback || typeof opt === 'function') { + if (!callback) { + callback = opt; + opt = null; + } + + opt = merge({}, marked.defaults, opt || {}); + + var highlight = opt.highlight + , tokens + , pending + , i = 0; + + try { + tokens = Lexer.lex(src, opt) + } catch (e) { + return callback(e); + } + + pending = tokens.length; + + var done = function(err) { + if (err) { + opt.highlight = highlight; + return callback(err); + } + + var out; + + try { + out = Parser.parse(tokens, opt); + } catch (e) { + err = e; + } + + opt.highlight = highlight; + + return err + ? callback(err) + : callback(null, out); + }; + + if (!highlight || highlight.length < 3) { + return done(); + } + + delete opt.highlight; + + if (!pending) return done(); + + for (; i < tokens.length; i++) { + (function(token) { + if (token.type !== 'code') { + return --pending || done(); + } + return highlight(token.text, token.lang, function(err, code) { + if (err) return done(err); + if (code == null || code === token.text) { + return --pending || done(); + } + token.text = code; + token.escaped = true; + --pending || done(); + }); + })(tokens[i]); + } + + return; + } + try { + if (opt) opt = merge({}, marked.defaults, opt); + return Parser.parse(Lexer.lex(src, opt), opt); + } catch (e) { + e.message += '\nPlease report this to https://github.com/chjj/marked.'; + if ((opt || marked.defaults).silent) { + return '

    An error occured:

    '
    +        + escape(e.message + '', true)
    +        + '
    '; + } + throw e; + } +} + +/** + * Options + */ + +marked.options = +marked.setOptions = function(opt) { + merge(marked.defaults, opt); + return marked; +}; + +marked.defaults = { + gfm: true, + tables: true, + breaks: false, + pedantic: false, + sanitize: false, + sanitizer: null, + mangle: true, + smartLists: false, + silent: false, + highlight: null, + langPrefix: 'lang-', + smartypants: false, + headerPrefix: '', + renderer: new Renderer, + xhtml: false +}; + +/** + * Expose + */ + +marked.Parser = Parser; +marked.parser = Parser.parse; + +marked.Renderer = Renderer; + +marked.Lexer = Lexer; +marked.lexer = Lexer.lex; + +marked.InlineLexer = InlineLexer; +marked.inlineLexer = InlineLexer.output; + +marked.parse = marked; + +if (typeof module !== 'undefined' && typeof exports === 'object') { + module.exports = marked; +} else if (typeof define === 'function' && define.amd) { + define(function() { return marked; }); +} else { + this.marked = marked; +} + +}).call(function() { + return this || (typeof window !== 'undefined' ? window : global); +}()); diff --git a/app/resources/viewers/markdown/readme.html b/app/resources/viewers/markdown/readme.html new file mode 100644 index 000000000..190e876c3 --- /dev/null +++ b/app/resources/viewers/markdown/readme.html @@ -0,0 +1,44 @@ + + + + + + + + +
    +
    + Sorry, README.md file does not exist +
    +
    + + + + diff --git a/app/scripts/app.js b/app/scripts/app.js index 6f54dd8cc..9cc6f1dea 100644 --- a/app/scripts/app.js +++ b/app/scripts/app.js @@ -20,25 +20,19 @@ angular ]) .run(function(profile, project, - resources, + common, utils, - gettextCatalog, - nodeLangInfo) { + boards, + collections, + gettextCatalog) + { + // Load boards + boards.loadBoards(); + // Load collections + collections.loadCollections(); // Load language - profile.load(function() { - var lang = profile.get('language'); - if (lang) { - utils.setLocale(lang, resources.collections); - } - else { - // If lang is empty, use the system language - nodeLangInfo(function(err, sysLang) { - if (!err) { - profile.set('language', utils.setLocale(sysLang, resources.collections)); - } - }); - } - }); + utils.loadLanguage(profile); + setTimeout(function() { project.updateTitle(gettextCatalog.getString('Untitled')); }, 200); diff --git a/app/scripts/controllers/design.js b/app/scripts/controllers/design.js index fc7adaaac..f0c249ae4 100644 --- a/app/scripts/controllers/design.js +++ b/app/scripts/controllers/design.js @@ -44,7 +44,9 @@ angular.module('icestudio') else { var type = graph.breadcrumbs[n-1].type; var dependency = common.allDependencies[type]; - graph.loadDesign(dependency.design, opt); + graph.loadDesign(dependency.design, opt, function() { + graph.fitContent(); + }); $scope.information = dependency.package; } } @@ -54,11 +56,15 @@ angular.module('icestudio') if (args.update) { // Update the main project project.update({ deps: false }, function() { - graph.loadDesign(args.project.design, opt); + graph.loadDesign(args.project.design, opt, function() { + graph.fitContent(); + }); }); } else { - graph.loadDesign(args.project.design, opt); + graph.loadDesign(args.project.design, opt, function() { + graph.fitContent(); + }); } $scope.information = args.project.package; utils.rootScopeSafeApply(); diff --git a/app/scripts/controllers/menu.js b/app/scripts/controllers/menu.js index f33e0553c..a46ddd979 100644 --- a/app/scripts/controllers/menu.js +++ b/app/scripts/controllers/menu.js @@ -7,7 +7,7 @@ angular.module('icestudio') boards, profile, project, - resources, + collections, graph, tools, utils, @@ -21,11 +21,9 @@ angular.module('icestudio') //-- Initialize scope - $scope.boards = boards; $scope.profile = profile; $scope.project = project; $scope.tools = tools; - $scope.resources = resources; $scope.common = common; $scope.version = _package.version; @@ -45,6 +43,9 @@ angular.module('icestudio') win.on('close', function() { exit(); }); + win.on('resize', function() { + graph.fitContent(); + }); // Darwin fix for shortcuts if (process.platform === 'darwin') { @@ -56,17 +57,22 @@ angular.module('icestudio') // Menu timer var timer; + // mousedown event + var mousedown = false; + $(document).on('mouseup', function() { mousedown = false; }); + $(document).on('mousedown', function() { mousedown = true; }); + // mouseover event - $scope.showMenu = function (menu) { + $scope.showMenu = function(menu) { $timeout.cancel(timer); - if (!graph.mousedown) { + if (!mousedown && !graph.addingDraggableBlock) { $scope.status[menu] = true; } }; // mouseleave event - $scope.hideMenu = function (menu) { - timer = $timeout(function () { + $scope.hideMenu = function(menu) { + timer = $timeout(function() { $scope.status[menu] = false; }, 700); }; @@ -172,10 +178,11 @@ angular.module('icestudio') }); $scope.addAsBlock = function() { + var notification = true; utils.openDialog('#input-add-as-block', '.ice', function(filepaths) { filepaths = filepaths.split(';'); for (var i in filepaths) { - project.addAsBlock(filepaths[i]); + project.addBlockFile(filepaths[i], notification); } }); }; @@ -292,7 +299,7 @@ angular.module('icestudio') graph.resetView(); }; - $scope.fitContent = function () { + $scope.fitContent = function() { graph.fitContent(); }; @@ -334,10 +341,18 @@ angular.module('icestudio') alertify.success(gettextCatalog.getString('Board rules disabled')); }; + $(document).on('langChanged', function(evt, lang) { + $scope.selectLanguage(lang); + }); + $scope.selectLanguage = function(language) { if (profile.get('language') !== language) { - profile.set('language', language); - utils.setLocale(language, resources.collections); + profile.set('language', graph.selectLanguage(language)); + // Reload the project + project.update({ deps: false }, function() { + graph.loadDesign(project.get('design'), { disabled: false }); + //alertify.success(gettextCatalog.getString('Language {{name}} selected', { name: utils.bold(language) })); + }); } }; @@ -403,21 +418,47 @@ angular.module('icestudio') } }; + $scope.showCollectionData = function() { + var collection = common.selectedCollection; + var readme = collection.content.readme; + if (readme) { + gui.Window.open('resources/viewers/markdown/readme.html?readme=' + readme, { + title: collection.name + ' - Data', + focus: true, + toolbar: false, + resizable: true, + width: 700, + height: 700, + icon: 'resources/images/icestudio-logo.png' + }); + } + else { + alertify.error(gettextCatalog.getString('Collection {{collection}} info not defined', { collection: utils.bold(collection.name) }), 5); + } + }; + $scope.selectCollection = function(collection) { - if (resources.selectedCollection.name !== collection.name) { - var name = resources.selectCollection(collection.name); + if (common.selectedCollection.name !== collection.name) { + var name = collections.selectCollection(collection.name); profile.set('collection', name); alertify.success(gettextCatalog.getString('Collection {{name}} selected', { name: utils.bold(name) })); } }; function updateSelectedCollection() { - profile.set('collection', resources.selectCollection(profile.get('collection'))); + profile.set('collection', collections.selectCollection(profile.get('collection'))); } //-- Boards + $(document).on('boardChanged', function(evt, board) { + if (common.selectedBoard.name !== board.name) { + var newBoard = graph.selectBoard(board); + profile.set('board', newBoard.name); + } + }); + $scope.selectBoard = function(board) { if (common.selectedBoard.name !== board.name) { if (!graph.isEmpty()) { @@ -431,13 +472,14 @@ angular.module('icestudio') } } function _boardSelected() { - profile.set('board', graph.selectBoard(board.name)); - alertify.success(gettextCatalog.getString('Board {{name}} selected', { name: utils.bold(board.info.label) })); + var newBoard = graph.selectBoard(board); + profile.set('board', newBoard.name); + alertify.success(gettextCatalog.getString('Board {{name}} selected', { name: utils.bold(newBoard.info.label) })); } }; function updateSelectedBoard() { - profile.set('board', boards.selectBoard(profile.get('board'))); + profile.set('board', boards.selectBoard(profile.get('board')).name); } @@ -445,18 +487,21 @@ angular.module('icestudio') $scope.verifyCode = function() { checkGraph(function() { + graph.resetCodeErrors(); tools.verifyCode(); }); }; $scope.buildCode = function() { checkGraph(function() { + graph.resetCodeErrors(); tools.buildCode(); }); }; $scope.uploadCode = function() { checkGraph(function() { + graph.resetCodeErrors(); tools.uploadCode(); }); }; @@ -475,9 +520,7 @@ angular.module('icestudio') $scope.addCollections = function() { utils.openDialog('#input-add-collection', '.zip', function(filepaths) { filepaths = filepaths.split(';'); - for (var i in filepaths) { - tools.addCollections(filepaths[i]); - } + tools.addCollections(filepaths); }); }; @@ -491,7 +534,7 @@ angular.module('icestudio') }; $scope.removeAllCollections = function() { - if (resources.collections.length > 1) { + if (common.collections.length > 1) { alertify.confirm(gettextCatalog.getString('All stored collections will be lost. Do you want to continue?'), function() { tools.removeAllCollections(); @@ -604,8 +647,11 @@ angular.module('icestudio') shortcuts.method('stepRight', graph.stepRight); shortcuts.method('removeSelected', removeSelected); - shortcuts.method('breadcrumbsBack', function() { - if (!graph.isEnabled()) { + shortcuts.method('back', function() { + if (graph.isEnabled()) { + removeSelected(); + } + else { $rootScope.$broadcast('breadcrumbsBack'); } }); @@ -635,7 +681,7 @@ angular.module('icestudio') function saveSnapshot(base64Data) { utils.saveDialog('#input-save-snapshot', '.png', function(filepath) { - nodeFs.writeFile(filepath, base64Data, 'base64', function (err) { + nodeFs.writeFile(filepath, base64Data, 'base64', function(err) { $scope.snapshotdir = utils.dirname(filepath) + utils.sep; $scope.$apply(); if (!err) { diff --git a/app/scripts/directives/menutree.js b/app/scripts/directives/menutree.js index 2d04a1e91..11b0b91a4 100644 --- a/app/scripts/directives/menutree.js +++ b/app/scripts/directives/menutree.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('icestudio') - .directive('menutree', function () { + .directive('menutree', function() { return { restrict: 'E', replace: true, @@ -13,14 +13,14 @@ angular.module('icestudio') template: '
      ' + '' + '
    ', - link: function (scope/*, element, attrs*/) { + link: function(scope/*, element, attrs*/) { scope.click = function(path) { scope.callback({ path: path }); }; } }; }) - .directive('child', function ($compile) { + .directive('child', function($compile) { return { restrict: 'E', replace: true, @@ -29,11 +29,11 @@ angular.module('icestudio') right: '=', callback: '&' }, - template: '
  • ' + + template: '
  • ' + '{{ child.name | translate }}' + '{{ child.name | translate }}' + '
  • ', - link: function (scope, element/*, attrs*/) { + link: function(scope, element/*, attrs*/) { scope.click = function(path) { scope.callback({ path: path }); }; diff --git a/app/scripts/factories/node.js b/app/scripts/factories/node.js index 76c0e064a..d77e948f9 100644 --- a/app/scripts/factories/node.js +++ b/app/scripts/factories/node.js @@ -52,6 +52,57 @@ angular.module('icestudio') .factory('nodeCP', function() { return require('copy-paste'); }) + .factory('nodeGetOS', function() { + return require('getos'); + }) .factory('SVGO', function() { - return require('svgo'); + var config = { + full: true, + plugins: [ + 'removeDoctype', + 'removeXMLProcInst', + 'removeComments', + 'removeMetadata', + 'removeXMLNS', + 'removeEditorsNSData', + 'cleanupAttrs', + 'minifyStyles', + 'convertStyleToAttrs', + 'cleanupIDs', + 'removeRasterImages', + 'removeUselessDefs', + 'cleanupNumericValues', + 'cleanupListOfValues', + 'convertColors', + 'removeUnknownsAndDefaults', + 'removeNonInheritableGroupAttrs', + 'removeUselessStrokeAndFill', + 'removeViewBox', + 'cleanupEnableBackground', + 'removeHiddenElems', + 'removeEmptyText', + 'convertShapeToPath', + 'moveElemsAttrsToGroup', + 'moveGroupAttrsToElems', + 'collapseGroups', + 'convertPathData', + 'convertTransform', + 'removeEmptyAttrs', + 'removeEmptyContainers', + 'mergePaths', + 'removeUnusedNS', + 'transformsWithOnePath', + 'sortAttrs', + 'removeTitle', + 'removeDesc', + 'removeDimensions', + 'removeAttrs', + 'removeElementsByAttr', + 'addClassesToSVGElement', + 'removeStyleElement', + 'removeStyleElement' + ] + }; + var SVGO = require('svgo'); + return new SVGO(config); }); diff --git a/app/scripts/graphics/joint.command.js b/app/scripts/graphics/joint.command.js index 6c459937e..abf193b96 100755 --- a/app/scripts/graphics/joint.command.js +++ b/app/scripts/graphics/joint.command.js @@ -9,7 +9,7 @@ joint.dia.CommandManager = Backbone.Model.extend({ defaults: { cmdBeforeAdd: null, - cmdNameRegex: /^(?:add|remove|board|change:\w+)$/ + cmdNameRegex: /^(?:add|remove|board|lang|change:\w+)$/ }, // length of prefix 'change:' in the event name @@ -140,7 +140,7 @@ joint.dia.CommandManager = Backbone.Model.extend({ return push(command); } - if (cmdName === 'board') { + if (cmdName === 'board' || cmdName === 'lang') { command.action = cmdName; command.data = cell.data; @@ -210,7 +210,11 @@ joint.dia.CommandManager = Backbone.Model.extend({ this.redoStack = []; this.undoStack.push(this.batchCommand); - this.triggerChange(); + if (this.batchCommand && this.batchCommand[0] && this.batchCommand[0].action !== 'lang') { + // Do not store lang in changesStack + this.changesStack.push(this.batchCommand); + this.triggerChange(); + } this.trigger('add', this.batchCommand); } @@ -256,6 +260,10 @@ joint.dia.CommandManager = Backbone.Model.extend({ this.triggerBoard(cmd.data.previous); break; + case 'lang': + this.triggerLanguage(cmd.data.previous); + break; + default: var data = null; var options = null; @@ -318,6 +326,10 @@ joint.dia.CommandManager = Backbone.Model.extend({ this.triggerBoard(cmd.data.next); break; + case 'lang': + this.triggerLanguage(cmd.data.next); + break; + default: var data = null; var options = null; @@ -345,7 +357,10 @@ joint.dia.CommandManager = Backbone.Model.extend({ undo: function() { var command = this.undoStack.pop(); - this.triggerChange(); + if (command && command[0] && command[0].action !== 'lang') { + this.changesStack.pop(); + this.triggerChange(); + } if (command) { this.revertCommand(command); @@ -361,7 +376,10 @@ joint.dia.CommandManager = Backbone.Model.extend({ if (command) { this.applyCommand(command); this.undoStack.push(command); - this.triggerChange(); + if (command && command[0] && command[0].action !== 'lang') { + this.changesStack.push(command); + this.triggerChange(); + } } }, @@ -378,6 +396,8 @@ joint.dia.CommandManager = Backbone.Model.extend({ this.undoStack = []; this.redoStack = []; + + this.changesStack = []; }, hasUndo: function() { @@ -391,12 +411,16 @@ joint.dia.CommandManager = Backbone.Model.extend({ }, triggerChange: function() { - var currentUndoStack = _.clone(this.undoStack); + var currentUndoStack = _.clone(this.changesStack); $(document).trigger('stackChanged', [currentUndoStack]); }, - triggerBoard: function(name) { - $(document).trigger('boardChanged', [name]); + triggerBoard: function(board) { + $(document).trigger('boardChanged', [board]); + }, + + triggerLanguage: function(lang) { + $(document).trigger('langChanged', [lang]); } }); diff --git a/app/scripts/graphics/joint.selection.js b/app/scripts/graphics/joint.selection.js index c88737235..059a43bc1 100644 --- a/app/scripts/graphics/joint.selection.js +++ b/app/scripts/graphics/joint.selection.js @@ -8,38 +8,65 @@ Copyright (c) 2013 client IO joint.ui.SelectionView = Backbone.View.extend({ - className: 'selectionarea', + className: 'selection', events: { + 'click .selection-box': 'click', 'mousedown .selection-box': 'startTranslatingSelection' }, + $selectionArea: null, + initialize: function(options) { - _.bindAll(this, 'startSelecting', 'stopSelecting', 'adjustSelection'); + _.bindAll(this, 'click', 'startSelecting', 'stopSelecting', 'adjustSelection'); + + var self = this; - $(document.body).on('mouseup touchend', this.stopSelecting); + $(document.body).on('mouseup touchend', function(evt) { + if (evt.which === 1) { + // Mouse left button + self.stopSelecting(evt); + } + }); $(document.body).on('mousemove touchmove', this.adjustSelection); this.options = options; this.options.paper.$el.append(this.$el); + this.$el.addClass('selected').show(); }, - startTranslatingSelection: function(evt) { + click: function(evt) { + + if (evt.which === 1) { + // Mouse left button - this._action = 'translating'; + this.trigger('selection-box:pointerclick', evt); + } + }, - this.options.graph.trigger('batch:start'); + startTranslatingSelection: function(evt, noBatch) { - var snappedClientCoords = this.options.paper.snapToGrid(g.point(evt.clientX, evt.clientY)); - this._snappedClientX = snappedClientCoords.x; - this._snappedClientY = snappedClientCoords.y; + if (evt.which === 1 || noBatch) { + // Mouse left button - this.trigger('selection-box:pointerdown', evt); + if (!evt.shiftKey) { + this._action = 'translating'; + + if (!noBatch) { + this.options.graph.trigger('batch:stop'); + this.options.graph.trigger('batch:start'); + } - evt.stopPropagation(); + var snappedClientCoords = this.options.paper.snapToGrid(g.point(evt.clientX, evt.clientY)); + this._snappedClientX = snappedClientCoords.x; + this._snappedClientY = snappedClientCoords.y; + + this.trigger('selection-box:pointerdown', evt); + } + } }, isTranslating: function() { @@ -49,9 +76,7 @@ joint.ui.SelectionView = Backbone.View.extend({ startSelecting: function(evt/*, x, y*/) { - this.$el.removeClass('selected'); - this.$el.empty(); - this.model.reset([]); + this.createSelectionArea(); this._action = 'selecting'; @@ -67,13 +92,12 @@ joint.ui.SelectionView = Backbone.View.extend({ this._offsetX = evt.offsetX === undefined ? evt.clientX - paperOffset.left + window.pageXOffset + paperScrollLeft : evt.offsetX; this._offsetY = evt.offsetY === undefined ? evt.clientY - paperOffset.top + window.pageYOffset + paperScrollTop : evt.offsetY; - this.$el.css({ + this.$selectionArea.css({ width: 1, height: 1, left: this._offsetX, top: this._offsetY - - }).show(); + }); }, adjustSelection: function(evt) { @@ -88,10 +112,10 @@ joint.ui.SelectionView = Backbone.View.extend({ dx = evt.clientX - this._clientX; dy = evt.clientY - this._clientY; - var left = parseInt(this.$el.css('left'), 10); - var top = parseInt(this.$el.css('top'), 10); + var left = parseInt(this.$selectionArea.css('left'), 10); + var top = parseInt(this.$selectionArea.css('top'), 10); - this.$el.css({ + this.$selectionArea.css({ left: dx < 0 ? this._offsetX + dx : left, top: dy < 0 ? this._offsetY + dy : top, width: Math.abs(dx), @@ -157,15 +181,20 @@ joint.ui.SelectionView = Backbone.View.extend({ } }, - stopSelecting: function() { + stopSelecting: function(evt) { switch (this._action) { case 'selecting': - var offset = this.$el.offset(); - var width = this.$el.width(); - var height = this.$el.height(); + if (!evt.shiftKey) { + // Reset previous selection + this.cancelSelection(); + } + + var offset = this.$selectionArea.offset(); + var width = this.$selectionArea.width(); + var height = this.$selectionArea.height(); // Convert offset coordinates to the local point of the root element. var localPoint = V(this.options.paper.svg).toLocalPoint(offset.left, offset.top); @@ -182,24 +211,12 @@ joint.ui.SelectionView = Backbone.View.extend({ height / this.options.state.zoom )); - if (elementViews.length) { + this.model.add(_.pluck(elementViews, 'model')); - // Create a `selection-box` `
    ` for each element covering its bounding box area. - _.each(elementViews, this.createSelectionBox, this); + _.each(this.model.models, this.createSelectionBox, this); - // The root element of the selection switches `position` to `static` when `selected`. This - // is neccessary in order for the `selection-box` coordinates to be relative to the - // `paper` element, not the `selection` `
    `. - this.$el.addClass('selected'); + this.destroySelectionArea(); - } else { - - // Hide the selection box if there was no element found in the area covered by the - // selection box. - this.$el.hide(); - } - - this.model.reset(_.pluck(elementViews, 'model')); break; case 'translating': @@ -215,9 +232,6 @@ joint.ui.SelectionView = Backbone.View.extend({ break; default: - // Hide selection if the user clicked somehwere else in the document. - // this.$el.hide().empty(); - // this.model.reset([]); break; } @@ -227,22 +241,34 @@ joint.ui.SelectionView = Backbone.View.extend({ cancelSelection: function() { this.$('.selection-box').remove(); - this.$el.hide().removeClass('selected'); this.model.reset([]); }, - destroySelectionBox: function(elementView) { + destroySelectionArea: function() { - this.$('[data-model="' + elementView.model.get('id') + '"]').remove(); - if (this.$('.selection-box').length === 0) { + this.$selectionArea.remove(); + this.$selectionArea = this.$('.selection-area'); + this.$el.addClass('selected'); + }, - this.$el.hide().removeClass('selected'); - } + createSelectionArea: function() { + + var $selectionArea = $('
    ', { + 'class': 'selection-area' + }); + this.$el.append($selectionArea); + this.$selectionArea = this.$('.selection-area'); + this.$el.removeClass('selected'); }, - createSelectionBox: function(elementView) { + destroySelectionBox: function(element) { - var element = elementView.model; + this.$('[data-model="' + element.get('id') + '"]').remove(); + }, + + createSelectionBox: function(element, opt) { + + opt = opt || {}; if (!element.isLink()) { @@ -250,12 +276,13 @@ joint.ui.SelectionView = Backbone.View.extend({ 'class': 'selection-box', 'data-model': element.get('id') }); - this.$el.append($selectionBox); + if (this.$('[data-model="' + element.get('id') + '"]').length === 0) { + this.$el.append($selectionBox); + } + $selectionBox.css({ opacity: (opt.transparent ? 0 : 1) }); this.updateBox(element); - this.$el.addClass('selected').show(); - this._action = 'cherry-picking'; } }, diff --git a/app/scripts/graphics/joint.shapes.js b/app/scripts/graphics/joint.shapes.js index 8f6c61de4..b0d4a1286 100644 --- a/app/scripts/graphics/joint.shapes.js +++ b/app/scripts/graphics/joint.shapes.js @@ -254,6 +254,20 @@ joint.shapes.ice.ModelView = joint.dia.ElementView.extend({ } }, + enableResizer: function() { + if (!this.model.get('disabled')) { + this.resizerDisabled = false; + this.resizer.css('cursor', 'se-resize'); + } + }, + + disableResizer: function() { + if (!this.model.get('disabled')) { + this.resizerDisabled = true; + this.resizer.css('cursor', 'move'); + } + }, + apply: function() { }, @@ -263,6 +277,10 @@ joint.shapes.ice.ModelView = joint.dia.ElementView.extend({ startResizing: function(event) { var self = event.data.self; + if (self.resizerDisabled) { + return; + } + self.model.graph.trigger('batch:start'); self.resizing = true; @@ -273,7 +291,7 @@ joint.shapes.ice.ModelView = joint.dia.ElementView.extend({ performResizing: function(event) { var self = event.data.self; - if (!self.resizing) { + if (!self.resizing || self.resizerDisabled) { return; } @@ -313,7 +331,7 @@ joint.shapes.ice.ModelView = joint.dia.ElementView.extend({ stopResizing: function(event) { var self = event.data.self; - if (!self.resizing) { + if (!self.resizing || self.resizerDisabled) { return; } @@ -532,10 +550,10 @@ joint.shapes.ice.GenericView = joint.shapes.ice.ModelView.extend({ for (var i in ports) { var port = ports[i]; if (port.clock) { - var top = Math.round((parseInt(i) + 0.5) * height / n / gridsize) * gridsize - 12; + var top = Math.round((parseInt(i) + 0.5) * height / n / gridsize) * gridsize - 10; this.$box.append('\ -
    \ - \ +
    \ + \
    '); } } @@ -915,6 +933,16 @@ joint.shapes.ice.CodeView = joint.shapes.ice.ModelView.extend({ }); this.editor.on('focus', function() { $(document).trigger('disableSelected'); + // Show cursor + self.editor.renderer.$cursorLayer.element.style.opacity = 1; + }); + this.editor.on('blur', function() { + var selection = self.editor.session.selection; + if (selection) { + selection.clearSelection(); + } + // Hide cursor + self.editor.renderer.$cursorLayer.element.style.opacity = 0; }); this.editor.on('paste', function(e) { if (e.text.startsWith('{"icestudio":')) { @@ -975,6 +1003,22 @@ joint.shapes.ice.CodeView = joint.shapes.ice.ModelView.extend({ this.applyValue(opt); }, + setAnnotation: function(codeError) { + this.editor.gotoLine(codeError.line); + var annotations = this.editor.session.getAnnotations(); + annotations.push({ + row: codeError.line-1, + column: 0, + text: codeError.msg, + type: codeError.type + }); + this.editor.session.setAnnotations(annotations); + }, + + clearAnnotations: function() { + this.editor.session.clearAnnotations(); + }, + update: function() { this.renderPorts(); this.editor.setReadOnly(this.model.get('disabled')); @@ -992,9 +1036,14 @@ joint.shapes.ice.CodeView = joint.shapes.ice.ModelView.extend({ // Set font size if (this.editor) { - this.editor.setFontSize(aceFontSize * state.zoom); + this.$box.find('.code-editor').css({ + margin: 8 * state.zoom, + 'border-radius': 5 * state.zoom + }); + this.editor.setFontSize(Math.round(aceFontSize * state.zoom)); this.editor.resize(); } + // Set ports width var width = WIRE_WIDTH * state.zoom; this.$('.port-wire').css('stroke-width', width); @@ -1026,7 +1075,9 @@ joint.shapes.ice.CodeView = joint.shapes.ice.ModelView.extend({ } } - this.$box.find('.code-editor').css('margin', 8 * state.zoom); + this.$box.css({ + 'border-radius': 5 * state.zoom + }); this.$box.css({ width: bbox.width * state.zoom, height: bbox.height * state.zoom, left: bbox.x * state.zoom + state.pan.x, @@ -1056,15 +1107,21 @@ joint.shapes.ice.InfoView = joint.shapes.ice.ModelView.extend({ var id = sha1(this.model.get('id')).toString().substring(0, 6); var blockLabel = 'block' + id; + var textLabel = 'text' + id; var editorLabel = 'editor' + id; + var readonly = this.model.get('data').readonly; this.$box = $(joint.util.template( '\
    \ -
    \ +
    \ +
    \ +
    \ +
    \ \
    \ @@ -1078,10 +1135,11 @@ joint.shapes.ice.InfoView = joint.shapes.ice.ModelView.extend({ this.updateBox(); this.updating = false; - var selector = this.$box.find('#' + editorLabel); + this.textSelector = this.$box.find('#' + textLabel); + this.editorSelector = this.$box.find('#' + editorLabel); // Prevent paper from handling pointerdown. - selector.on('mousedown click', function(event) { event.stopPropagation(); }); + this.editorSelector.on('mousedown click', function(event) { event.stopPropagation(); }); this.deltas = []; this.counter = 0; @@ -1089,7 +1147,7 @@ joint.shapes.ice.InfoView = joint.shapes.ice.ModelView.extend({ var undoGroupingInterval = 200; var self = this; - this.editor = ace.edit(selector[0]); + this.editor = ace.edit(this.editorSelector[0]); this.editor.$blockScrolling = Infinity; this.editor.commands.removeCommand('undo'); this.editor.commands.removeCommand('redo'); @@ -1117,6 +1175,16 @@ joint.shapes.ice.InfoView = joint.shapes.ice.ModelView.extend({ }); this.editor.on('focus', function() { $(document).trigger('disableSelected'); + // Show cursor + self.editor.renderer.$cursorLayer.element.style.opacity = 1; + }); + this.editor.on('blur', function() { + var selection = self.editor.session.selection; + if (selection) { + selection.clearSelection(); + } + // Hide cursor + self.editor.renderer.$cursorLayer.element.style.opacity = 0; }); this.editor.on('paste', function(e) { if (e.text.startsWith('{"icestudio":')) { @@ -1156,7 +1224,6 @@ joint.shapes.ice.InfoView = joint.shapes.ice.ModelView.extend({ } break; case 'data': - break; default: break; @@ -1173,8 +1240,41 @@ joint.shapes.ice.InfoView = joint.shapes.ice.ModelView.extend({ }, 10, this); }, + applyReadonly: function() { + var readonly = this.model.get('data').readonly; + if (readonly) { + this.$box.addClass('info-block-readonly'); + this.textSelector.removeClass('hidden'); + this.editorSelector.addClass('hidden'); + this.disableResizer(); + // Hide cursor + this.editor.renderer.$cursorLayer.element.style.opacity = 0; + // Clear selection + var selection = this.editor.session.selection; + if (selection) { + selection.clearSelection(); + } + } + else { + this.$box.removeClass('info-block-readonly'); + this.textSelector.addClass('hidden'); + this.editorSelector.removeClass('hidden'); + this.enableResizer(); + // Show cursor + this.editor.renderer.$cursorLayer.element.style.opacity = 1; + } + }, + + applyText: function() { + var data = this.model.get('data'); + this.textSelector.children().html(data.text || ''); + }, + apply: function(opt) { this.applyValue(opt); + this.applyReadonly(); + this.applyText(); + this.updateBox(); }, render: function() { @@ -1192,14 +1292,27 @@ joint.shapes.ice.InfoView = joint.shapes.ice.ModelView.extend({ updateBox: function() { var bbox = this.model.getBBox(); var state = this.model.get('state'); + var data = this.model.get('data'); - // Set font size - if (this.editor) { - this.editor.setFontSize(aceFontSize * state.zoom); + if (data.readonly) { + this.$box.find('.info-text').css({ + margin: 8 * state.zoom, + 'border-radius': 5 * state.zoom, + fontSize: Math.round(aceFontSize * state.zoom) + }); + } + else if (this.editor) { + this.$box.find('.info-editor').css({ + margin: 8 * state.zoom, + 'border-radius': 5 * state.zoom + }); + this.editor.setFontSize(Math.round(aceFontSize * state.zoom)); this.editor.resize(); } - this.$box.find('.info-editor').css('margin', 8 * state.zoom); + this.$box.css({ + 'border-radius': 5 * state.zoom + }); this.$box.css({ width: bbox.width * state.zoom, height: bbox.height * state.zoom, left: bbox.x * state.zoom + state.pan.x, @@ -1245,7 +1358,7 @@ joint.shapes.ice.Wire = joint.dia.Link.extend({ arrowheadMarkup: [ '', - '', + '', '' ].join(''), @@ -1273,20 +1386,18 @@ joint.shapes.ice.Wire = joint.dia.Link.extend({ type: 'ice.Wire', - labels: [ - { - position: 0.5, - attrs: { - text: { - text: '', - 'font-weight': 'bold', - 'font-size': '13px', - 'text-anchor': 'middle', - 'y': '4px' - } + labels: [{ + position: 0.5, + attrs: { + text: { + text: '', + y: '4px', + 'font-weight': 'bold', + 'font-size': '13px', + 'text-anchor': 'middle' } } - ], + }], attrs: { '.connection': { @@ -1304,6 +1415,12 @@ joint.shapes.ice.Wire = joint.dia.Link.extend({ joint.shapes.ice.WireView = joint.dia.LinkView.extend({ + options: { + shortLinkLength: 100, + longLinkLength: 160, + linkToolsOffset: 40, + }, + initialize: function() { joint.dia.LinkView.prototype.initialize.apply(this, arguments); @@ -1399,6 +1516,29 @@ joint.shapes.ice.WireView = joint.dia.LinkView.extend({ return this; }, + updateToolsPosition: function() { + if (!this._V.linkTools) { + return this; + } + + var scale = ''; + var offset = this.options.linkToolsOffset; + var connectionLength = this.getConnectionLength(); + + if (!_.isNaN(connectionLength)) { + // If the link is too short, make the tools half the size and the offset twice as low. + if (connectionLength < this.options.shortLinkLength) { + scale = 'scale(.5)'; + offset /= 2; + } + + var toolPosition = this.getPointAtLength(connectionLength - offset); + this._toolCache.attr('transform', 'translate(' + toolPosition.x + ', ' + toolPosition.y + ') ' + scale); + } + + return this; + }, + updateWireProperties: function(size) { if (size > 1) { this.$('.connection').css('stroke-width', WIRE_WIDTH * 3); diff --git a/app/scripts/services/blocks.js b/app/scripts/services/blocks.js index 276ce8a85..0d6b26707 100644 --- a/app/scripts/services/blocks.js +++ b/app/scripts/services/blocks.js @@ -19,29 +19,29 @@ angular.module('icestudio') //-- New - function newBasic(type, addCellCallback) { + function newBasic(type, addCellsCallback) { switch(type) { case 'basic.input': - newBasicInput(addCellCallback); + newBasicInput(addCellsCallback); break; case 'basic.output': - newBasicOutput(addCellCallback); + newBasicOutput(addCellsCallback); break; case 'basic.constant': - newBasicConstant(addCellCallback); + newBasicConstant(addCellsCallback); break; case 'basic.code': - newBasicCode(addCellCallback); + newBasicCode(addCellsCallback); break; case 'basic.info': - newBasicInfo(addCellCallback); + newBasicInfo(addCellsCallback); break; default: break; } } - function newBasicInput(addCellCallback) { + function newBasicInput(addCellsCallback) { var blockInstance = { id: null, data: {}, @@ -82,6 +82,7 @@ angular.module('icestudio') } } // Create blocks + var cells = []; for (var p in portInfos) { portInfo = portInfos[p]; var pins = getPins(portInfo); @@ -92,16 +93,17 @@ angular.module('icestudio') virtual: virtual, clock: clock }; - if (addCellCallback) { - addCellCallback(loadBasic(blockInstance)); - } + cells.push(loadBasic(blockInstance)); // Next block position blockInstance.position.y += (virtual ? 10 : (6 + 4 * pins.length)) * gridsize; } + if (addCellsCallback) { + addCellsCallback(cells); + } }); } - function newBasicOutput(addCellCallback) { + function newBasicOutput(addCellsCallback) { var blockInstance = { id: null, data: {}, @@ -139,6 +141,7 @@ angular.module('icestudio') } } // Create blocks + var cells = []; for (var p in portInfos) { portInfo = portInfos[p]; var pins = getPins(portInfo); @@ -148,12 +151,13 @@ angular.module('icestudio') pins: pins, virtual: virtual }; - if (addCellCallback) { - addCellCallback(loadBasic(blockInstance)); - } + cells.push(loadBasic(blockInstance)); // Next block position blockInstance.position.y += (virtual ? 10 : (6 + 4 * pins.length)) * gridsize; } + if (addCellsCallback) { + addCellsCallback(cells); + } }); } @@ -170,7 +174,7 @@ angular.module('icestudio') return pins; } - function newBasicConstant(addCellCallback) { + function newBasicConstant(addCellsCallback) { var blockInstance = { id: null, data: {}, @@ -208,6 +212,7 @@ angular.module('icestudio') } } // Create blocks + var cells = []; for (var p in paramInfos) { paramInfo = paramInfos[p]; blockInstance.data = { @@ -215,15 +220,16 @@ angular.module('icestudio') value: '', local: local }; - if (addCellCallback) { - addCellCallback(loadBasicConstant(blockInstance)); - } + cells.push(loadBasicConstant(blockInstance)); blockInstance.position.x += 15 * gridsize; } + if (addCellsCallback) { + addCellsCallback(cells); + } }); } - function newBasicCode(addCellCallback, block) { + function newBasicCode(addCellsCallback, block) { var blockInstance = { id: null, data: { @@ -361,8 +367,8 @@ angular.module('icestudio') if (numNames === $.unique(allNames).length) { evt.cancel = false; // Create block - if (addCellCallback) { - addCellCallback(loadBasicCode(blockInstance)); + if (addCellsCallback) { + addCellsCallback([loadBasicCode(blockInstance)]); } } else { @@ -372,16 +378,16 @@ angular.module('icestudio') }); } - function newBasicInfo(addCellCallback) { + function newBasicInfo(addCellsCallback) { var blockInstance = { id: null, - data: { info: '' }, + data: { info: '', readonly: false }, type: 'basic.info', position: { x: 40 * gridsize, y: 36 * gridsize }, size: { width: 192, height: 128 } }; - if (addCellCallback) { - addCellCallback(loadBasicInfo(blockInstance)); + if (addCellsCallback) { + addCellsCallback([loadBasicInfo(blockInstance)]); } } @@ -537,6 +543,10 @@ angular.module('icestudio') } function loadBasicInfo(instance, disabled) { + // Translate info content + if (instance.data.info && instance.data.readonly) { + instance.data.text = gettextCatalog.getString(instance.data.info); + } var cell = new joint.shapes.ice.Info({ id: instance.id, blockType: instance.type, @@ -624,7 +634,7 @@ angular.module('icestudio') pullup: block.design.pullup, image: blockImage, label: blockLabel, - tooltip: gettextCatalog.getString(block.package.description), // TODO: update on change language + tooltip: gettextCatalog.getString(block.package.description), position: instance.position, size: size, disabled: disabled, @@ -685,6 +695,9 @@ angular.module('icestudio') case 'basic.code': editBasicCode(cellView, addCellCallback); break; + case 'basic.info': + editBasicInfo(cellView); + break; default: break; } @@ -890,25 +903,28 @@ angular.module('icestudio') position: block.position, size: block.size }; - newBasicCode(function(cell) { + newBasicCode(function(cells) { if (addCellCallback) { - var connectedWires = graph.getConnectedLinks(cellView.model); - graph.startBatch('change'); - cellView.model.remove(); - addCellCallback(cell); - // Restore previous connections - for (var w in connectedWires) { - var wire = connectedWires[w]; - var source = wire.get('source'); - var target = wire.get('target'); - if ((source.id === cell.id && containsPort(source.port, cell.get('rightPorts'))) || - (target.id === cell.id && containsPort(target.port, cell.get('leftPorts')) && source.port !== 'constant-out') || - (target.id === cell.id && containsPort(target.port, cell.get('topPorts')) && source.port === 'constant-out')) { - graph.addCell(wire); + var cell = cells[0]; + if (cell) { + var connectedWires = graph.getConnectedLinks(cellView.model); + graph.startBatch('change'); + cellView.model.remove(); + addCellCallback(cell); + // Restore previous connections + for (var w in connectedWires) { + var wire = connectedWires[w]; + var source = wire.get('source'); + var target = wire.get('target'); + if ((source.id === cell.id && containsPort(source.port, cell.get('rightPorts'))) || + (target.id === cell.id && containsPort(target.port, cell.get('leftPorts')) && source.port !== 'constant-out') || + (target.id === cell.id && containsPort(target.port, cell.get('topPorts')) && source.port === 'constant-out')) { + graph.addCell(wire); + } } + graph.stopBatch('change'); + alertify.success(gettextCatalog.getString('Block updated')); } - graph.stopBatch('change'); - alertify.success(gettextCatalog.getString('Block updated')); } }, blockInstance); } @@ -924,4 +940,25 @@ angular.module('icestudio') return found; } + function editBasicInfo(cellView) { + var block = cellView.model.attributes; + utils.checkboxprompt([ + gettextCatalog.getString('Read only') + ], [ + block.data.readonly || false, + ], + function(evt, values) { + var readonly = values[0]; + var data = utils.clone(block.data); + data.readonly = readonly; + // Translate info content + if (data.info && data.readonly) { + data.text = gettextCatalog.getString(data.info); + } + cellView.model.set('data', data); + cellView.apply(); + alertify.success(gettextCatalog.getString('Block updated')); + }); + } + }); diff --git a/app/scripts/services/boards.js b/app/scripts/services/boards.js index 3e8ed6ff7..00df50ce2 100644 --- a/app/scripts/services/boards.js +++ b/app/scripts/services/boards.js @@ -7,9 +7,8 @@ angular.module('icestudio') nodePath) { const DEFAULT = 'icezum'; - this.currentBoards = loadBoards(nodePath.join('resources', 'boards')); - - function loadBoards(path) { + this.loadBoards = function(path) { + path = path || nodePath.join('resources', 'boards'); var boards = []; var contents = nodeFs.readdirSync(path); contents.forEach(function (content) { @@ -28,8 +27,8 @@ angular.module('icestudio') } } }); - return boards; - } + common.boards = _.sortBy(boards, 'info.label'); + }; function readJSONFile(filepath, filename) { var ret = {}; @@ -41,27 +40,21 @@ angular.module('icestudio') return ret; } - var self = this; - - $(document).on('boardChanged', function(evt, name) { - self.selectBoard(name); - }); - this.selectBoard = function(name) { name = name || DEFAULT; var i; var selectedBoard = null; - for (i in this.currentBoards) { - if (this.currentBoards[i].name === name) { - selectedBoard = this.currentBoards[i]; + for (i in common.boards) { + if (common.boards[i].name === name) { + selectedBoard = common.boards[i]; break; } } if (selectedBoard === null) { // Board not found: select default board - for (i in this.currentBoards) { - if (this.currentBoards[i].name === DEFAULT) { - selectedBoard = this.currentBoards[i]; + for (i in common.boards) { + if (common.boards[i].name === DEFAULT) { + selectedBoard = common.boards[i]; break; } } @@ -70,13 +63,13 @@ angular.module('icestudio') common.pinoutInputHTML = generateHTMLOptions(common.selectedBoard.pinout, 'input'); common.pinoutOutputHTML = generateHTMLOptions(common.selectedBoard.pinout, 'output'); utils.rootScopeSafeApply(); - return common.selectedBoard.name; + return common.selectedBoard; }; this.boardLabel = function(name) { - for (var i in this.currentBoards) { - if (this.currentBoards[i].name === name) { - return this.currentBoards[i].info.label; + for (var i in common.boards) { + if (common.boards[i].name === name) { + return common.boards[i].info.label; } } return name; diff --git a/app/scripts/services/resources.js b/app/scripts/services/collections.js similarity index 66% rename from app/scripts/services/resources.js rename to app/scripts/services/collections.js index fbdf161c5..41cf266bf 100644 --- a/app/scripts/services/resources.js +++ b/app/scripts/services/collections.js @@ -1,31 +1,29 @@ 'use strict'; angular.module('icestudio') - .service('resources', function(utils, - nodePath) { + .service('collections', function(utils, + common, + nodePath) { const DEFAULT = ''; - this.collections = []; - this.selectedCollection = null; - this.loadCollections = function() { - this.collections = []; + common.collections = []; // Add Default collection var defaultPath = nodePath.join('resources', 'collection'); var defaultData = { 'name': DEFAULT, 'path': nodePath.resolve(defaultPath), - 'children': utils.getFilesRecursive(defaultPath) + 'children': utils.getFilesRecursive(nodePath.resolve(defaultPath)) }; var defaultCollection = getCollection(defaultData); - this.collections.push(defaultCollection); + common.collections.push(defaultCollection); // Add installed collections - var data = utils.getFilesRecursive(utils.COLLECTIONS_DIR); + var data = utils.getFilesRecursive(common.COLLECTIONS_DIR); for (var i in data) { var collection = getCollection(data[i]); if (collection) { - this.collections.push(collection); + common.collections.push(collection); } } }; @@ -37,7 +35,8 @@ angular.module('icestudio') content: { blocks: [], examples: [], - package: {} + package: {}, + readme: '' } }; for (var i in data.children) { @@ -59,27 +58,30 @@ angular.module('icestudio') //collection.content.package = require(child.path); } break; + case ('README'): + if (!child.children) { + collection.content.readme = child.path; + } + break; } } return collection; } - this.loadCollections(); - this.selectCollection = function(name) { name = name || DEFAULT; var selectedCollection = null; - for (var i in this.collections) { - if (this.collections[i].name === name) { - selectedCollection = this.collections[i]; + for (var i in common.collections) { + if (common.collections[i].name === name) { + selectedCollection = common.collections[i]; break; } } if (selectedCollection === null) { // Collection not found: select default collection - selectedCollection = this.collections[0]; + selectedCollection = common.collections[0]; } - this.selectedCollection = selectedCollection; + common.selectedCollection = selectedCollection; return selectedCollection.name; }; diff --git a/app/scripts/services/common.js b/app/scripts/services/common.js index b8f8874d6..06e2b0048 100644 --- a/app/scripts/services/common.js +++ b/app/scripts/services/common.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('icestudio') - .service('common', function() { + .service('common', function(nodePath) { // Project version this.VERSION = '1.1'; @@ -10,10 +10,70 @@ angular.module('icestudio') this.allDependencies = {}; // Selected board + this.boards = []; this.selectedBoard = null; this.pinoutInputHTML = ''; this.pinoutOutputHTML = ''; - // TODO: move all constants + // Selected collection + this.collections = []; + this.selectedCollection = null; + + // OS + this.LINUX = Boolean(process.platform.indexOf('linux') > -1); + this.WIN32 = Boolean(process.platform.indexOf('win32') > -1); + this.DARWIN = Boolean(process.platform.indexOf('darwin') > -1); + + // Paths + this.LOCALE_DIR = nodePath.join('resources', 'locale'); + this.SAMPLE_DIR = nodePath.join('resources', 'sample'); + + this.BASE_DIR = process.env.HOME || process.env.USERPROFILE; + this.ICESTUDIO_DIR = safeDir(nodePath.join(this.BASE_DIR, '.icestudio'), this); + this.COLLECTIONS_DIR = nodePath.join(this.ICESTUDIO_DIR, 'collections'); + this.APIO_HOME_DIR = nodePath.join(this.ICESTUDIO_DIR, 'apio'); + this.PROFILE_PATH = nodePath.join(this.ICESTUDIO_DIR, 'profile.json'); + this.CACHE_DIR = nodePath.join(this.ICESTUDIO_DIR, '.cache'); + this.BUILD_DIR = nodePath.join(this.ICESTUDIO_DIR, '.build'); + + this.VENV = 'virtualenv-15.0.1'; + this.VENV_DIR = nodePath.join(this.CACHE_DIR, this.VENV); + this.VENV_TARGZ = nodePath.join('resources', 'virtualenv', this.VENV + '.tar.gz'); + + this.APP_DIR = nodePath.dirname(process.execPath); + this.TOOLCHAIN_DIR = nodePath.join(this.APP_DIR, 'toolchain'); + + this.DEFAULT_APIO = 'default-apio'; + this.DEFAULT_APIO_DIR = nodePath.join(this.CACHE_DIR, this.DEFAULT_APIO); + this.DEFAULT_APIO_TARGZ = nodePath.join(this.TOOLCHAIN_DIR, this.DEFAULT_APIO + '.tar.gz'); + + this.DEFAULT_APIO_PACKAGES = 'default-apio-packages'; + this.DEFAULT_APIO_PACKAGES_TARGZ = nodePath.join(this.TOOLCHAIN_DIR, this.DEFAULT_APIO_PACKAGES + '.tar.gz'); + + this.ENV_DIR = nodePath.join(this.ICESTUDIO_DIR, 'venv'); + this.ENV_BIN_DIR = nodePath.join(this.ENV_DIR, this.WIN32 ? 'Scripts' : 'bin'); + this.ENV_PIP = nodePath.join(this.ENV_BIN_DIR, 'pip'); + this.ENV_APIO = nodePath.join(this.ENV_BIN_DIR, this.WIN32 ? 'apio.exe' : 'apio'); + this.APIO_CMD = (this.WIN32 ? 'set' : 'export') + ' APIO_HOME_DIR=' + this.APIO_HOME_DIR + (this.WIN32 ? '& ' : '; ') + '"' + this.ENV_APIO + '"'; + this.SYSTEM_APIO = '/usr/bin/apio'; + + function safeDir(_dir, self) { + if (self.WIN32) { + // Put the env directory to the root of the current local disk when + // default path contains non-ASCII characters. Virtualenv will fail to + for (var i in _dir) { + if (_dir[i].charCodeAt(0) > 127) { + const _dirFormat = nodePath.parse(_dir); + return nodePath.format({ + root: _dirFormat.root, + dir: _dirFormat.root, + base: '.icestudio', + name: '.icestudio', + }); + } + } + } + return _dir; + } }); diff --git a/app/scripts/services/compiler.js b/app/scripts/services/compiler.js index 11ca86f7d..7e6b9c95f 100644 --- a/app/scripts/services/compiler.js +++ b/app/scripts/services/compiler.js @@ -2,6 +2,7 @@ angular.module('icestudio') .service('compiler', function(common, + utils, nodeSha1, _package) { @@ -40,13 +41,6 @@ angular.module('icestudio') return header; } - function digestId(id) { - if (id.indexOf('-') !== -1) { - id = nodeSha1(id).toString(); - } - return 'v' + id.substring(0, 6); - } - function module(data) { var code = ''; if (data && data.name && data.ports) { @@ -119,7 +113,7 @@ angular.module('icestudio') var block = graph.blocks[i]; if (block.type === 'basic.constant') { params.push({ - name: digestId(block.id), + name: utils.digestId(block.id), value: block.data.value }); } @@ -139,13 +133,13 @@ angular.module('icestudio') var block = graph.blocks[i]; if (block.type === 'basic.input') { ports.in.push({ - name: digestId(block.id), + name: utils.digestId(block.id), range: block.data.range ? block.data.range : '' }); } else if (block.type === 'basic.output') { ports.out.push({ - name: digestId(block.id), + name: utils.digestId(block.id), range: block.data.range ? block.data.range : '' }); } @@ -169,7 +163,7 @@ angular.module('icestudio') if (wire.source.port === 'constant-out') { // Local Parameters var constantBlock = findBlock(wire.source.block, graph); - var paramValue = digestId(constantBlock.id); + var paramValue = utils.digestId(constantBlock.id); if (paramValue) { connections.localparam.push('localparam p' + w + ' = ' + paramValue + ';'); } @@ -184,7 +178,7 @@ angular.module('icestudio') var block = graph.blocks[i]; if (block.type === 'basic.input') { if (wire.source.block === block.id) { - connections.assign.push('assign w' + w + ' = ' + digestId(block.id) + ';'); + connections.assign.push('assign w' + w + ' = ' + utils.digestId(block.id) + ';'); } } else if (block.type === 'basic.output') { @@ -193,7 +187,7 @@ angular.module('icestudio') // connections.assign.push('assign ' + digestId(block.id) + ' = p' + w + ';'); } else { - connections.assign.push('assign ' + digestId(block.id) + ' = w' + w + ';'); + connections.assign.push('assign ' + utils.digestId(block.id) + ' = w' + w + ';'); } } } @@ -243,10 +237,10 @@ angular.module('icestudio') var instance; if (block.type === 'basic.code') { - instance = name + '_' + digestId(block.id); + instance = name + '_' + utils.digestId(block.id); } else { - instance = digestId(block.type); + instance = utils.digestId(block.type); } //-- Parameters @@ -258,7 +252,7 @@ angular.module('icestudio') (wire.source.port === 'constant-out')) { var paramName = wire.target.port; if (block.type !== 'basic.code') { - paramName = digestId(paramName); + paramName = utils.digestId(paramName); } var param = ''; param += ' .' + paramName; @@ -273,7 +267,7 @@ angular.module('icestudio') //-- Instance name - instance += ' ' + digestId(block.id); + instance += ' ' + utils.digestId(block.id); //-- Ports @@ -302,7 +296,7 @@ angular.module('icestudio') function connectPort(portName, portsNames, ports, block) { if (portName) { if (block.type !== 'basic.code') { - portName = digestId(portName); + portName = utils.digestId(portName); } if (portsNames.indexOf(portName) === -1) { portsNames.push(portName); @@ -504,7 +498,7 @@ angular.module('icestudio') // Dependencies modules for (var d in dependencies) { - code += verilogCompiler(digestId(d), dependencies[d]); + code += verilogCompiler(utils.digestId(d), dependencies[d]); } // Code modules @@ -514,10 +508,10 @@ angular.module('icestudio') if (block) { if (block.type === 'basic.code') { data = { - name: name + '_' + digestId(block.id), + name: name + '_' + utils.digestId(block.id), params: block.data.params, ports: block.data.ports, - content: block.data.code.replace(/\n+/g, '\n').replace(/\n$/g, '') + content: block.data.code //.replace(/\n+/g, '\n').replace(/\n$/g, '') }; code += module(data); } @@ -543,7 +537,7 @@ angular.module('icestudio') pin = block.data.pins[p]; value = block.data.virtual ? '' : pin.value; code += 'set_io '; - code += digestId(block.id); + code += utils.digestId(block.id); code += '[' + pin.index + '] '; code += value; code += '\n'; @@ -553,7 +547,7 @@ angular.module('icestudio') pin = block.data.pins[0]; value = block.data.virtual ? '' : pin.value; code += 'set_io '; - code += digestId(block.id); + code += utils.digestId(block.id); code += ' '; code += value; code += '\n'; @@ -747,14 +741,14 @@ angular.module('icestudio') if (block.type === 'basic.input') { if (block.data.name) { input.push({ - id: digestId(block.id), + id: utils.digestId(block.id), name: block.data.name.replace(/ /g, '_'), range: block.data.range }); } else { input.push({ - id: digestId(block.id), + id: utils.digestId(block.id), name: inputUnnamed.toString(), }); inputUnnamed += 1; @@ -763,14 +757,14 @@ angular.module('icestudio') else if (block.type === 'basic.output') { if (block.data.name) { output.push({ - id: digestId(block.id), + id: utils.digestId(block.id), name: block.data.name.replace(/ /g, '_'), range: block.data.range }); } else { output.push({ - id: digestId(block.id), + id: utils.digestId(block.id), name: outputUnnamed.toString() }); outputUnnamed += 1; @@ -794,14 +788,14 @@ angular.module('icestudio') if (!block.data.local) { if (block.data.name) { params.push({ - id: digestId(block.id), + id: utils.digestId(block.id), name: 'constant_' + block.data.name.replace(/ /g, '_'), value: block.data.value }); } else { params.push({ - id: digestId(block.id), + id: utils.digestId(block.id), name: 'constant_' + paramsUnnamed.toString(), value: block.data.value }); diff --git a/app/scripts/services/drivers.js b/app/scripts/services/drivers.js new file mode 100644 index 000000000..cf1727f85 --- /dev/null +++ b/app/scripts/services/drivers.js @@ -0,0 +1,229 @@ +'use strict'; + +angular.module('icestudio') + .service('drivers', function(gettextCatalog, + profile, + common, + gui, + nodePath, + nodeSudo, + nodeChildProcess) { + + this.enable = function() { + if (common.WIN32) { + enableWindowsDrivers(); + } + else if (common.DARWIN) { + enableDarwinDrivers(); + } + else { + linuxDrivers(true); + } + }; + + this.disable = function() { + if (common.WIN32) { + disableWindowsDrivers(); + } + else if (common.DARWIN) { + disableDarwinDrivers(); + } + else { + linuxDrivers(false); + } + }; + + this.preUpload = function(callback) { + if (common.DARWIN) { + preUploadDarwin(callback); + } + else { + if (callback) { + callback(); + } + } + }; + + this.postUpload = function() { + if (common.DARWIN) { + postUploadDarwin(); + } + }; + + function linuxDrivers(enable) { + var commands; + if (enable) { + commands = [ + 'cp ' + nodePath.resolve('resources/config/80-icestick.rules') + ' /etc/udev/rules.d/80-icestick.rules', + 'service udev restart' + ]; + } + else { + commands = [ + 'rm /etc/udev/rules.d/80-icestick.rules', + 'service udev restart' + ]; + } + var command = 'sh -c "' + commands.join('; ') + '"'; + + beginLazyProcess(); + nodeSudo.exec(command, {name: 'Icestudio'}, function(error/*, stdout, stderr*/) { + // console.log(error, stdout, stderr); + endLazyProcess(); + if (!error) { + if (enable) { + alertify.success(gettextCatalog.getString('Drivers enabled')); + } + else { + alertify.warning(gettextCatalog.getString('Drivers disabled')); + } + setTimeout(function() { + alertify.message(gettextCatalog.getString('Unplug and reconnect the board'), 5); + }, 1000); + } + }); + } + + function enableDarwinDrivers() { + var brewCommands = [ + '/usr/local/bin/brew update', + '/usr/local/bin/brew install --force libftdi', + '/usr/local/bin/brew unlink libftdi', + '/usr/local/bin/brew link --force libftdi', + '/usr/local/bin/brew install --force libffi', + '/usr/local/bin/brew unlink libffi', + '/usr/local/bin/brew link --force libffi' + ]; + beginLazyProcess(); + nodeChildProcess.exec(brewCommands.join('; '), function(error, stdout, stderr) { + // console.log(error, stdout, stderr); + if (error) { + if ((stderr.indexOf('brew: command not found') !== -1) || + (stderr.indexOf('brew: No such file or directory') !== -1)) { + alertify.warning(gettextCatalog.getString('{{app}} is required.', { app: 'Homebrew' }) + '
    ' + + '' + gettextCatalog.getString('Click here to install it') + '', 30) + .callback = function(isClicked) { + if (isClicked) { + gui.Shell.openExternal('https://brew.sh'); + } + }; + } + else if (stderr.indexOf('Error: Failed to download') !== -1) { + alertify.error(gettextCatalog.getString('Internet connection required'), 30); + } + else { + alertify.error(stderr, 30); + } + } + else { + profile.set('macosDrivers', true); + alertify.success(gettextCatalog.getString('Drivers enabled')); + } + endLazyProcess(); + }); + } + + function disableDarwinDrivers() { + profile.set('macosDrivers', false); + alertify.warning(gettextCatalog.getString('Drivers disabled')); + } + + var driverC = ''; + + function preUploadDarwin(callback) { + if (profile.get('macosDrivers')) { + // Check and unload the Drivers + var driverA = 'com.FTDI.driver.FTDIUSBSerialDriver'; + var driverB = 'com.apple.driver.AppleUSBFTDI'; + if (checkDriverDarwin(driverA)) { + driverC = driverA; + processDriverDarwin(driverA, false, callback); + } + else if (checkDriverDarwin(driverB)) { + driverC = driverB; + processDriverDarwin(driverB, false, callback); + } + else { + driverC = ''; + if (callback) { + callback(); + } + } + } + else { + if (callback) { + callback(); + } + } + } + + function postUploadDarwin() { + if (profile.get('macosDrivers')) { + processDriverDarwin(driverC, true); + } + } + + function checkDriverDarwin(driver) { + var output = nodeChildProcess.execSync('kextstat').toString(); + return output.indexOf(driver) > -1; + } + + function processDriverDarwin(driver, load, callback) { + if (driver) { + var command = (load ? 'kextload' : 'kextunload') + ' -b ' + driver; + nodeSudo.exec(command, {name: 'Icestudio'}, function(/*error, stdout, stderr*/) { + //console.log(error, stdout, stderr); + if (callback) { + callback(); + } + }); + } + else { + if (callback) { + callback(); + } + } + } + + function enableWindowsDrivers() { + alertify.confirm(gettextCatalog.getString('

    FTDI driver installation instructions

    1. Connect the FPGA board
    2. Replace the (Interface 0) driver of the board by libusbK
    3. Unplug and reconnect the board
    ') + + gettextCatalog.getString('It is recommended to use USB 2.0 ports'), + function() { + beginLazyProcess(); + nodeSudo.exec([common.APIO_CMD, 'drivers', '--enable'].join(' '), {name: 'Icestudio'}, function(error, stdout, stderr) { + // console.log(error, stdout, stderr); + endLazyProcess(); + if (stderr) { + alertify.error(gettextCatalog.getString('Toolchain not installed. Please, install the toolchain'), 30); + } + else if (!error) { + alertify.message(gettextCatalog.getString('Unplug and reconnect the board'), 5); + } + }); + }); + } + + function disableWindowsDrivers() { + alertify.confirm(gettextCatalog.getString('

    FTDI driver uninstallation instructions

    1. Find the FPGA USB Device
    2. Select the board interface and uninstall the driver
    '), function() { + beginLazyProcess(); + nodeChildProcess.exec([common.APIO_CMD, 'drivers', '--disable'].join(' '), function(error, stdout, stderr) { + // console.log(error, stdout, stderr); + endLazyProcess(); + if (stderr) { + alertify.error(gettextCatalog.getString('Toolchain not installed. Please, install the toolchain'), 30); + } + }); + }); + } + + function beginLazyProcess() { + $('body').addClass('waiting'); + angular.element('#menu').addClass('disable-menu'); + } + + function endLazyProcess() { + $('body').removeClass('waiting'); + angular.element('#menu').removeClass('disable-menu'); + } + + }); diff --git a/app/scripts/services/graph.js b/app/scripts/services/graph.js index 27be97512..7704f98f1 100644 --- a/app/scripts/services/graph.js +++ b/app/scripts/services/graph.js @@ -12,23 +12,25 @@ angular.module('icestudio') window) { // Variables - var z = { - index: 100 - }; - + var z = { index: 100 }; var graph = null; var paper = null; var selection = null; var selectionView = null; var commandManager = null; var mousePosition = { x: 0, y: 0 }; - - this.breadcrumbs = [{ name: '', type: '' }]; - + var menuHeight = 51; var gridsize = 8; var state = { pan: { x: 0, y: 0 }, zoom: 1.0 }; - const ZOOM_MAX = 2.0; + + var self = this; + + const ZOOM_MAX = 2.1; const ZOOM_MIN = 0.3; + const ZOOM_SENS = 0.3; + + this.breadcrumbs = [{ name: '', type: '' }]; + this.addingDraggableBlock = false; // Functions @@ -81,8 +83,8 @@ angular.module('icestudio') else { scale = tbox.width / sbox.width; } - if (state.zoom * scale > ZOOM_MAX) { - scale = ZOOM_MAX / state.zoom; + if (state.zoom * scale > 1) { + scale = 1 / state.zoom; } var target = { x: tbox.x + tbox.width / 2, @@ -118,6 +120,7 @@ angular.module('icestudio') height: 1000, model: graph, gridSize: gridsize, + clickThreshold: 6, snapLinks: { radius: 16 }, linkPinning: false, embeddingMode: false, @@ -158,26 +161,27 @@ angular.module('icestudio') var i; var links = graph.getLinks(); for (i in links) { - var linkIView = links[i].findView(paper); + var link = links[i]; + var linkIView = link.findView(paper); if (linkView === linkIView) { //Skip the wire the user is drawing continue; } // Prevent multiple input links - if ((cellViewT.model.id === links[i].get('target').id) && - (magnetT.getAttribute('port') === links[i].get('target').port)) { + if ((cellViewT.model.id === link.get('target').id) && + (magnetT.getAttribute('port') === link.get('target').port)) { warning(gettextCatalog.getString('Invalid multiple input connections')); return false; } // Prevent to connect a pull-up if other blocks are connected if ((cellViewT.model.get('pullup')) && - (cellViewS.model.id === links[i].get('source').id)) { + (cellViewS.model.id === link.get('source').id)) { warning(gettextCatalog.getString('Invalid Pull up connection:
    block already connected')); return false; } // Prevent to connect other blocks if a pull-up is connected if ((linkIView.targetView.model.get('pullup')) && - (cellViewS.model.id === links[i].get('source').id)) { + (cellViewS.model.id === link.get('source').id)) { warning(gettextCatalog.getString('Invalid block connection:
    Pull up already connected')); return false; } @@ -252,7 +256,7 @@ angular.module('icestudio') center: false, zoomEnabled: true, panEnabled: false, - zoomScaleSensitivity: 0.1, + zoomScaleSensitivity: ZOOM_SENS, dblClickZoomEnabled: false, minZoom: ZOOM_MIN, maxZoom: ZOOM_MAX, @@ -290,84 +294,122 @@ angular.module('icestudio') }); } - // Events + // Events - this.mousedown = false; - $(document).on('mouseup', function() { self.mousedown = false; }); - $(document).on('mousedown', function() { self.mousedown = true; }); + $('body').mousemove(function(event) { + mousePosition = { + x: event.pageX, + y: event.pageY + }; + }); - var self = this; - $('#paper').mousemove(function(event) { - mousePosition = { - x: event.offsetX, - y: event.offsetY - }; - }); + selectionView.on('selection-box:pointerdown', function(/*evt*/) { + // Move selection to top view + if (selection) { + selection.each(function(cell) { + var cellView = paper.findViewByModel(cell); + if (!cellView.model.isLink()) { + if (cellView.$box.css('z-index') < z.index) { + cellView.$box.css('z-index', ++z.index); + } + } + }); + } + }); - selectionView.on('selection-box:pointerdown', function(evt) { - // Selection to top view - if (selection) { - selection.each(function(cell) { - var cellView = paper.findViewByModel(cell); - if (!cellView.model.isLink()) { - if (cellView.$box.css('z-index') < z.index) { - cellView.$box.css('z-index', ++z.index); - } - } - }); - } - // Toggle selection - if (evt.which === 3) { - var cell = selection.get($(evt.target).data('model')); - selection.reset(selection.without(cell)); - selectionView.destroySelectionBox(paper.findViewByModel(cell)); - } - }); + selectionView.on('selection-box:pointerclick', function(evt) { + if (self.addingDraggableBlock) { + // Set new block position + self.addingDraggableBlock = false; + disableSelected(); + updateWiresOnObstacles(); + } + else { + // Toggle selected cell + if (utils.hasShift(evt)) { + var cell = selection.get($(evt.target).data('model')); + selection.reset(selection.without(cell)); + selectionView.destroySelectionBox(cell); + } + } + }); - paper.on('cell:pointerup', function(cellView, evt/*, x, y*/) { - if (paper.options.enabled) { - if (!cellView.model.isLink()) { - if (evt.which === 3) { - // Disable current focus - document.activeElement.blur(); - // Right button - selection.add(cellView.model); - selectionView.createSelectionBox(cellView); - unhighlight(cellView); - } - updateWiresOnObstacles(); - } - } - }); + var pointerDown = false; + var dblClickCell = false; - paper.on('cell:pointerdown', function(cellView) { - if (paper.options.enabled) { - if (cellView.model.isLink()) { - // Unhighlight source block of the wire - unhighlight(paper.findViewByModel(cellView.model.get('source').id)); - } - } - }); + paper.on('cell:pointerclick', function(cellView, evt/*, x, y*/) { + if (utils.hasShift(evt)) { + // If Shift is pressed process the click (no Shift+dblClick allowed) + processCellClick(cellView, evt); + } + else { + // If not, wait 150ms to ensure that it's not a dblclick + var ensureTime = 150; + pointerDown = false; + setTimeout(function() { + if (!dblClickCell && !pointerDown) { + processCellClick(cellView, evt); + } + }, ensureTime); + } - paper.on('cell:pointerdblclick', function(cellView/*, evt, x, y*/) { - var type = cellView.model.get('blockType'); - if (type.indexOf('basic.') !== -1) { + function processCellClick(cellView, evt) { if (paper.options.enabled) { - blocks.editBasic(type, cellView, function(cell) { - addCell(cell); - }); + if (!cellView.model.isLink()) { + // Disable current focus + document.activeElement.blur(); + if (utils.hasLeftButton(evt)) { + if (!utils.hasShift(evt)) { + // Cancel previous selection + disableSelected(); + } + // Add cell to selection + selection.add(cellView.model); + selectionView.createSelectionBox(cellView.model); + //unhighlight(cellView); + } + } } } - else if (common.allDependencies[type]) { - z.index = 1; - var project = common.allDependencies[type]; - var breadcrumbsLength = self.breadcrumbs.length; - $rootScope.$broadcast('navigateProject', { - update: breadcrumbsLength === 1, - project: project - }); - self.breadcrumbs.push({ name: project.package.name || '#', type: type }); - utils.rootScopeSafeApply(); + }); + + paper.on('cell:pointerdown', function(/*cellView, evt, x, y*/) { + if (paper.options.enabled) { + pointerDown = true; + } + }); + + paper.on('cell:pointerup', function(/*cellView, evt, x, y*/) { + if (paper.options.enabled) { + updateWiresOnObstacles(); + } + }); + + paper.on('cell:pointerdblclick', function(cellView, evt/*, x, y*/) { + if (!utils.hasShift(evt)) { + // Allow dblClick if Shift is not pressed + dblClickCell = true; + var type = cellView.model.get('blockType'); + if (type.indexOf('basic.') !== -1) { + if (paper.options.enabled) { + blocks.editBasic(type, cellView, function(cell) { + addCell(cell); + }); + } + } + else if (common.allDependencies[type]) { + z.index = 1; + var project = common.allDependencies[type]; + var breadcrumbsLength = self.breadcrumbs.length; + $rootScope.$broadcast('navigateProject', { + update: breadcrumbsLength === 1, + project: project + }); + self.breadcrumbs.push({ name: project.package.name || '#', type: type }); + utils.rootScopeSafeApply(); + } + // Enable click event + setTimeout(function() { dblClickCell = false; }, 200); } }); @@ -375,26 +417,32 @@ angular.module('icestudio') // Disable current focus document.activeElement.blur(); - if (evt.which === 3) { - // Right button - if (paper.options.enabled) { + if (utils.hasLeftButton(evt)) { + if (utils.hasCtrl(evt)) { + if (!self.isEmpty()) { + self.panAndZoom.enablePan(); + } + } + else if (paper.options.enabled) { selectionView.startSelecting(evt, x, y); } } - else if (evt.which === 1) { - // Left button - self.panAndZoom.enablePan(); + else if (utils.hasRightButton(evt)) { + if (!self.isEmpty()) { + self.panAndZoom.enablePan(); + } } }); - paper.on('cell:pointerup blank:pointerup', function(/*cellView, evt*/) { + paper.on('blank:pointerup', function(/*cellView, evt*/) { self.panAndZoom.disablePan(); }); - paper.on('cell:mouseover', function(cellView/*, evt*/) { - if (!self.mousedown) { + paper.on('cell:mouseover', function(cellView, evt) { + // Move selection to top view if !mousedown + if (!utils.hasButtonPressed(evt)) { if (!cellView.model.isLink()) { - highlight(cellView); + //highlight(cellView); if (cellView.$box.css('z-index') < z.index) { cellView.$box.css('z-index', ++z.index); } @@ -402,27 +450,30 @@ angular.module('icestudio') } }); - paper.on('cell:mouseout', function(cellView/*, evt*/) { - if (!self.mousedown) { + /*paper.on('cell:mouseout', function(cellView, evt) { + if (!utils.hasButtonPressed(evt)) { if (!cellView.model.isLink()) { unhighlight(cellView); } } - }); + });*/ - graph.on('change:position', function(/*cell*/) { - /*if (!selectionView.isTranslating()) { - // Update wires on obstacles motion - var cells = graph.getCells(); - for (var i in cells) { - var cell = cells[i]; - if (cell.isLink()) { - paper.findViewByModel(cell).update(); - } + /*paper.on('cell:pointerdown', function(cellView) { + if (paper.options.enabled) { + if (cellView.model.isLink()) { + // Unhighlight source block of the wire + unhighlight(paper.findViewByModel(cellView.model.get('source').id)); } - }*/ + } }); + graph.on('change:position', function(cell) { + if (!selectionView.isTranslating()) { + // Update wires on obstacles motion + updateWiresOnObstacles(); + } + });*/ + graph.on('add change:source change:target', function(cell) { if (cell.isLink() && cell.get('source').id) { // Link connected @@ -478,12 +529,11 @@ angular.module('icestudio') function updateWiresOnObstacles() { var cells = graph.getCells(); - for (var i in cells) { - var cell = cells[i]; + _.each(cells, function(cell) { if (cell.isLink()) { paper.findViewByModel(cell).update(); } - } + }); } this.setBoardRules = function(value) { @@ -528,10 +578,10 @@ angular.module('icestudio') angular.element('#banner').removeClass('hidden'); } var cells = graph.getCells(); - for (var i in cells) { - var cellView = paper.findViewByModel(cells[i].id); + _.each(cells, function(cell) { + var cellView = paper.findViewByModel(cell.id); cellView.options.interactive = value; - if (cells[i].get('type') !== 'ice.Generic') { + if (cell.get('type') !== 'ice.Generic') { if (value) { cellView.$el.removeClass('disable-graph'); } @@ -539,7 +589,7 @@ angular.module('icestudio') cellView.$el.addClass('disable-graph'); } } - else if (cells[i].get('type') !== 'ice.Wire') { + else if (cell.get('type') !== 'ice.Wire') { if (value) { cellView.$el.find('.port-body').removeClass('disable-graph'); } @@ -547,21 +597,62 @@ angular.module('icestudio') cellView.$el.find('.port-body').addClass('disable-graph'); } } - } + }); }; this.createBlock = function(type, block) { blocks.newGeneric(type, block, function(cell) { - addCell(cell); + self.addDraggableCell(cell); }); }; this.createBasicBlock = function(type) { - blocks.newBasic(type, function(cell) { - addCell(cell); + blocks.newBasic(type, function(cells) { + self.addDraggableCells(cells); }); }; + this.addDraggableCell = function(cell) { + this.addingDraggableBlock = true; + cell.attributes.position = { + x: Math.round(((mousePosition.x - state.pan.x) / state.zoom - cell.attributes.size.width/2) / gridsize) * gridsize, + y: Math.round(((mousePosition.y - state.pan.y - menuHeight) / state.zoom - cell.attributes.size.height/2) / gridsize) * gridsize, + }; + graph.trigger('batch:start'); + addCell(cell); + disableSelected(); + var opt = { transparent: true }; + var noBatch = true; + selection.add(cell); + selectionView.createSelectionBox(cell, opt); + selectionView.startTranslatingSelection({ clientX: mousePosition.x, clientY: mousePosition.y }, noBatch); + }; + + this.addDraggableCells = function(cells) { + this.addingDraggableBlock = true; + if (cells.length > 0) { + var firstCellAttrs = cells[0].attributes; + var offset = { + x: Math.round(((mousePosition.x - state.pan.x) / state.zoom - firstCellAttrs.size.width/2) / gridsize) * gridsize - firstCellAttrs.position.x, + y: Math.round(((mousePosition.y - state.pan.y - menuHeight) / state.zoom - firstCellAttrs.size.height/2) / gridsize) * gridsize - firstCellAttrs.position.y, + }; + _.each(cells, function(cell) { + cell.attributes.position.x += offset.x; + cell.attributes.position.y += offset.y; + }); + graph.trigger('batch:start'); + addCells(cells); + disableSelected(); + var opt = { transparent: true }; + var noBatch = true; + _.each(cells, function(cell) { + selection.add(cell); + selectionView.createSelectionBox(cell, opt); + }); + selectionView.startTranslatingSelection({ clientX: mousePosition.x, clientY: mousePosition.y }, noBatch); + } + }; + this.toJSON = function() { return graph.toJSON(); }; @@ -574,27 +665,39 @@ angular.module('icestudio') graph.attributes.cells.models = cells; }; - this.selectBoard = function(boardName) { + this.selectBoard = function(board) { graph.startBatch('change'); // Trigger board event var data = { - previous: common.selectedBoard.name, - next: boardName + previous: common.selectedBoard, + next: board }; graph.trigger('board', { data: data }); - boardName = boards.selectBoard(boardName); + var newBoard = boards.selectBoard(board.name); resetBlocks(); graph.stopBatch('change'); - return boardName; + return newBoard; + }; + + this.selectLanguage = function(language) { + graph.startBatch('change'); + // Trigger lang event + var data = { + previous: profile.get('language'), + next: language + }; + graph.trigger('lang', { data: data }); + language = utils.setLocale(language); + graph.stopBatch('change'); + return language; }; function resetBlocks() { var data; var cells = graph.getCells(); - for (var i in cells) { - var cell = cells[i]; + _.each(cells, function(cell) { if (cell.isLink()) { - break; + return; } var type = cell.get('blockType'); if (type === 'basic.input' || type === 'basic.output') { @@ -620,7 +723,7 @@ angular.module('icestudio') // Reset rules in Generic block ports var block = common.allDependencies[type]; data = { ports: { in: [] }}; - for (i in block.design.graph.blocks) { + for (var i in block.design.graph.blocks) { var item = block.design.graph.blocks[i]; if (item.type === 'basic.input') { if (!item.data.range) { @@ -634,7 +737,7 @@ angular.module('icestudio') cell.set('data', data); paper.findViewByModel(cell.id).updateBox(); } - } + }); } this.resetCommandStack = function() { @@ -655,14 +758,15 @@ angular.module('icestudio') }; this.pasteSelected = function() { - var self = this; - utils.pasteFromClipboard(function(object) { - if (object.version === common.VERSION && - (document.activeElement.tagName === 'A' || - document.activeElement.tagName === 'BODY')) { - self.appendDesign(object.design, object.dependencies); - } - }); + if (document.activeElement.tagName === 'A' || + document.activeElement.tagName === 'BODY') + { + utils.pasteFromClipboard(function(object) { + if (object.version === common.VERSION) { + self.appendDesign(object.design, object.dependencies); + } + }); + } }; this.selectAll = function() { @@ -670,15 +774,14 @@ angular.module('icestudio') var cells = graph.getCells(); _.each(cells, function(cell) { if (!cell.isLink()) { - var cellView = paper.findViewByModel(cell); selection.add(cell); - selectionView.createSelectionBox(cellView); - unhighlight(cellView); + selectionView.createSelectionBox(cell); + //unhighlight(cellView); } }); }; - function highlight(cellView) { + /*function highlight(cellView) { if (cellView) { switch(cellView.model.get('type')) { case 'ice.Input': @@ -742,7 +845,7 @@ angular.module('icestudio') break; } } - } + }*/ function hasSelection() { return selection && selection.length > 0; @@ -856,8 +959,6 @@ angular.module('icestudio') design.graph.blocks && design.graph.wires) { - var self = this; - opt = opt || {}; $('body').addClass('waiting'); @@ -871,6 +972,7 @@ angular.module('icestudio') self.clearAll(); var cells = graphToCells(design.graph, opt); + graph.addCells(cells); self.appEnable(!opt.disabled); @@ -990,7 +1092,7 @@ angular.module('icestudio') reset: design.board !== common.selectedBoard.name, offset: { x: Math.round(((mousePosition.x - state.pan.x) / state.zoom - origin.x) / gridsize) * gridsize, - y: Math.round(((mousePosition.y - state.pan.y) / state.zoom - origin.y) / gridsize) * gridsize, + y: Math.round(((mousePosition.y - state.pan.y - menuHeight) / state.zoom - origin.y) / gridsize) * gridsize, } }; var cells = graphToCells(design.graph, opt); @@ -1000,9 +1102,12 @@ angular.module('icestudio') _.each(cells, function(cell) { if (!cell.isLink()) { var cellView = paper.findViewByModel(cell); + if (cellView.$box.css('z-index') < z.index) { + cellView.$box.css('z-index', ++z.index); + } selection.add(cell); - selectionView.createSelectionBox(cellView); - unhighlight(cellView); + selectionView.createSelectionBox(cell); + //unhighlight(cellView); } }); } @@ -1039,4 +1144,58 @@ angular.module('icestudio') } } + function addCells(cells) { + _.each(cells, function(cell) { + updateCellAttributes(cell); + }); + graph.addCells(cells); + _.each(cells, function(cell) { + if (!cell.isLink()) { + var cellView = paper.findViewByModel(cell); + if (cellView.$box.css('z-index') < z.index) { + cellView.$box.css('z-index', ++z.index); + } + } + }); + } + + this.resetCodeErrors = function() { + var cells = graph.getCells(); + _.each(cells, function(cell) { + var cellView; + if (cell.attributes.type === 'ice.Code') { + cellView = paper.findViewByModel(cell); + cellView.clearAnnotations(); + } + else if (cell.attributes.type === 'ice.Generic') { + cellView = paper.findViewByModel(cell); + } + if (cellView) { + cellView.$box.removeClass('highlight-error'); + } + }); + }; + + $(document).on('codeError', function(evt, codeError) { + var cells = graph.getCells(); + _.each(cells, function(cell) { + var blockId, cellView; + if (codeError.blockType === 'code' && cell.attributes.type === 'ice.Code') { + blockId = utils.digestId(cell.id); + if (codeError.blockId === blockId) { + cellView = paper.findViewByModel(cell); + cellView.$box.addClass('highlight-error'); + cellView.setAnnotation(codeError); + } + } + else if (codeError.blockType === 'generic' && cell.attributes.type === 'ice.Generic') { + blockId = utils.digestId(cell.attributes.blockType); + if (codeError.blockId === blockId) { + cellView = paper.findViewByModel(cell); + cellView.$box.addClass('highlight-error'); + } + } + }); + }); + }); diff --git a/app/scripts/services/profile.js b/app/scripts/services/profile.js index 03fc01b0f..280b610ca 100644 --- a/app/scripts/services/profile.js +++ b/app/scripts/services/profile.js @@ -2,6 +2,7 @@ angular.module('icestudio') .service('profile', function(utils, + common, nodeFs) { this.data = { @@ -12,17 +13,24 @@ angular.module('icestudio') 'boardRules': true }; + if (common.DARWIN) { + this.data['macosDrivers'] = false; + } + this.load = function(callback) { var self = this; - utils.readFile(utils.PROFILE_PATH, function(data) { + utils.readFile(common.PROFILE_PATH, function(data) { if (data) { self.data = { 'language': data.language || '', 'remoteHostname': data.remoteHostname || '', 'collection': data.collection || '', 'board': data.board || '', - 'boardRules': data.remoteHostname || true + 'boardRules': data.boardRules !== false }; + if (common.DARWIN) { + self.data['macosDrivers'] = data.macosDrivers || false; + } } if (callback) { callback(); @@ -42,10 +50,10 @@ angular.module('icestudio') }; this.save = function() { - if (!nodeFs.existsSync(utils.ICESTUDIO_DIR)) { - nodeFs.mkdirSync(utils.ICESTUDIO_DIR); + if (!nodeFs.existsSync(common.ICESTUDIO_DIR)) { + nodeFs.mkdirSync(common.ICESTUDIO_DIR); } - utils.saveFile(utils.PROFILE_PATH, this.data, function() { + utils.saveFile(common.PROFILE_PATH, this.data, function() { // Success }, true); }; diff --git a/app/scripts/services/project.js b/app/scripts/services/project.js index c6755c693..f4afee9ad 100644 --- a/app/scripts/services/project.js +++ b/app/scripts/services/project.js @@ -14,6 +14,7 @@ angular.module('icestudio') this.name = ''; // Used in File dialogs this.path = ''; // Used in Save / Save as + this.filepath = ''; // Used to find external resources (.v, .vh, .list) this.changed = false; var project = _default(); @@ -83,6 +84,7 @@ angular.module('icestudio') this.open = function(filepath, emptyPath) { var self = this; this.path = emptyPath ? '' : filepath; + this.filepath = filepath; utils.readFile(filepath, function(data) { if (data) { var name = utils.basename(filepath); @@ -119,11 +121,12 @@ angular.module('icestudio') var opt = { reset: reset || false, disabled: false }; var ret = graph.loadDesign(project.design, opt, function() { graph.resetCommandStack(); + graph.fitContent(); alertify.success(gettextCatalog.getString('Project {{name}} loaded', { name: utils.bold(name) })); }); if (ret) { - profile.set('board', boards.selectBoard(project.design.board)); + profile.set('board', boards.selectBoard(project.design.board).name); self.updateTitle(name); } else { @@ -286,14 +289,52 @@ angular.module('icestudio') this.save = function(filepath) { var name = utils.basename(filepath); - this.path = filepath; this.updateTitle(name); - sortGraph(); this.update(); - utils.saveFile(filepath, pruneProject(project), function() { - alertify.success(gettextCatalog.getString('Project {{name}} saved', { name: utils.bold(name) })); - }, true); + + // Copy included files if the previous filepath + // is different from the new filepath + if (this.filepath !== filepath) { + var origPath = utils.dirname(this.filepath); + var destPath = utils.dirname(filepath); + // 1. Parse and find included files + var code = compiler.generate('verilog', project); + var files = utils.findIncludedFiles(code); + // Are there included files? + if (files.length > 0) { + // 2. Check project's directory + if (filepath) { + // 3. Copy the included files + copyIncludedFiles(files, origPath, destPath, function(success) { + if (success) { + // 4. Success: save project + doSaveProject(); + } + }); + } + } + else { + // No included files to copy + // 4. Save project + doSaveProject(); + } + } + else { + // Same filepath + // 4. Save project + doSaveProject(); + } + + this.path = filepath; + this.filepath = filepath; + + function doSaveProject() { + utils.saveFile(filepath, pruneProject(project), function() { + alertify.success(gettextCatalog.getString('Project {{name}} saved', { name: utils.bold(name) })); + }, true); + } + }; function sortGraph() { @@ -316,7 +357,7 @@ angular.module('icestudio') graph.setCells(cells); } - this.addAsBlock = function(filepath) { + this.addBlockFile = function(filepath, notification) { var self = this; utils.readFile(filepath, function(data) { if (data.version !== common.VERSION) { @@ -325,19 +366,20 @@ angular.module('icestudio') var name = utils.basename(filepath); var block = _safeLoad(data, name); if (block) { - var path = utils.dirname(filepath); + var origPath = utils.dirname(filepath); + var destPath = utils.dirname(self.path); // 1. Parse and find included files - var code = JSON.stringify(block); + var code = compiler.generate('verilog', block); var files = utils.findIncludedFiles(code); // Are there included files? if (files.length > 0) { // 2. Check project's directory if (self.path) { // 3. Copy the included files - copyIncludedFiles(function(success) { + copyIncludedFiles(files, origPath, destPath, function(success) { if (success) { // 4. Success: import block - doImportBlock(block); + doImportBlock(); } }); } @@ -347,10 +389,10 @@ angular.module('icestudio') $rootScope.$emit('saveProjectAs', function() { setTimeout(function() { // 3. Copy the included files - copyIncludedFiles(function(success) { + copyIncludedFiles(files, origPath, destPath, function(success) { if (success) { // 4. Success: import block - doImportBlock(block); + doImportBlock(); } }); }, 500); @@ -361,66 +403,68 @@ angular.module('icestudio') else { // No included files to copy // 4. Import block - doImportBlock(block); + doImportBlock(); } } - function copyIncludedFiles(callback) { - var success = true; - async.eachSeries(files, function(filename, next) { - setTimeout(function() { - var origPath = nodePath.join(path, filename); - var destPath = nodePath.join(utils.dirname(self.path), filename); - if (origPath !== destPath) { - if (nodeFs.existsSync(destPath)) { - alertify.confirm(gettextCatalog.getString('File {{file}} already exists in the project path. Do you want to replace it?', { file: utils.bold(filename) }), - function() { - success = success && doCopySync(origPath, destPath, filename); - if (!success) { - return next(); // break - } - next(); - }, - function() { - next(); - }); - } - else { - success = success && doCopySync(origPath, destPath, filename); - if (!success) { - return next(); // break - } - next(); + function doImportBlock() { + self.addBlock(block); + if (notification) { + alertify.success(gettextCatalog.getString('Block {{name}} imported', { name: utils.bold(block.package.name) })); + } + } + }); + }; + + function copyIncludedFiles(files, origPath, destPath, callback) { + var success = true; + async.eachSeries(files, function(filename, next) { + setTimeout(function() { + if (origPath !== destPath) { + if (nodeFs.existsSync(nodePath.join(destPath, filename))) { + alertify.confirm(gettextCatalog.getString('File {{file}} already exists in the project path. Do you want to replace it?', { file: utils.bold(filename) }), + function() { + success = success && doCopySync(origPath, destPath, filename); + if (!success) { + return next(); // break } - } - else { + next(); + }, + function() { + next(); + }); + } + else { + success = success && doCopySync(origPath, destPath, filename); + if (!success) { return next(); // break } - }, 0); - }, function(/*result*/) { - return callback(success); - }); - } - - function doCopySync(orig, dest, filename) { - var success = utils.copySync(orig, dest); - if (success) { - alertify.message(gettextCatalog.getString('File {{file}} imported', { file: utils.bold(filename) }), 5); + next(); + } } else { - alertify.error(gettextCatalog.getString('Original file {{file}} does not exist', { file: utils.bold(filename) }), 30); + return next(); // break } - return success; - } - - function doImportBlock(block) { - self.addBlock(block); - alertify.success(gettextCatalog.getString('Block {{name}} imported', { name: utils.bold(block.package.name) })); - } + }, 0); + }, function(/*result*/) { + return callback(success); }); - }; + } - function pruneProject (project) { + function doCopySync(origPath, destPath, filename) { + var orig = nodePath.join(origPath, filename); + var dest = nodePath.join(destPath, filename); + var success = utils.copySync(orig, dest); + if (success) { + alertify.message(gettextCatalog.getString('File {{file}} imported', { file: utils.bold(filename) }), 5); + } + else { + alertify.error(gettextCatalog.getString('Original file {{file}} does not exist', { file: utils.bold(filename) }), 30); + } + return success; + } + + function pruneProject(project) { var _project = utils.clone(project); _prune(_project); @@ -435,7 +479,9 @@ angular.module('icestudio') case 'basic.input': case 'basic.output': case 'basic.constant': + break; case 'basic.info': + delete block.data.text; break; case 'basic.code': for (var j in block.data.ports.in) { @@ -496,26 +542,13 @@ angular.module('icestudio') graph.createBasicBlock(type); }; - this.addBlock = function(arg) { - if (typeof arg === 'string') { - // arg is a filepath - utils.readFile(arg, function(block) { - _addBlock(block); - }); - } - else { - // arg is a block - _addBlock(arg); - } - - function _addBlock(block) { - if (block) { - block = _safeLoad(block); - block = pruneBlock(block); - var type = utils.dependencyID(block); - utils.mergeDependencies(type, block); - graph.createBlock(type, block); - } + this.addBlock = function(block) { + if (block) { + block = _safeLoad(block); + block = pruneBlock(block); + var type = utils.dependencyID(block); + utils.mergeDependencies(type, block); + graph.createBlock(type, block); } }; diff --git a/app/scripts/services/shortcuts.js b/app/scripts/services/shortcuts.js index 08ac8e53e..eff553569 100644 --- a/app/scripts/services/shortcuts.js +++ b/app/scripts/services/shortcuts.js @@ -6,7 +6,7 @@ angular.module('icestudio') return shortcuts.label(action); }; }) - .service('shortcuts', function(utils) { + .service('shortcuts', function(common) { this.method = function(action, method) { // Configure shortcut method @@ -23,7 +23,7 @@ angular.module('icestudio') var action = ''; var method = null; - var system = utils.DARWIN ? 'mac' : 'linux'; + var system = common.DARWIN ? 'mac' : 'linux'; var ret = { preventDefault: false }; for (action in shortcuts) { var options = shortcuts[action].opt || {}; @@ -50,7 +50,7 @@ angular.module('icestudio') // Return shortcut label var label = ''; if (action in shortcuts) { - if (utils.DARWIN) { + if (common.DARWIN) { label = shortcuts[action].mac.label; } else { @@ -154,7 +154,7 @@ angular.module('icestudio') linux: { label: 'Supr', key: 46 }, mac: { label: 'Fn+Delete', key: 46 }, }, - breadcrumbsBack: { + back: { linux: { label: 'Back', key: 8 }, mac: { label: 'Delete', key: 8 }, opt: { disabled: true } diff --git a/app/scripts/services/tools.js b/app/scripts/services/tools.js index 5e2dd4e95..0d698e21d 100644 --- a/app/scripts/services/tools.js +++ b/app/scripts/services/tools.js @@ -4,7 +4,8 @@ angular.module('icestudio') .service('tools', function(project, compiler, profile, - resources, + collections, + drivers, utils, common, gettextCatalog, @@ -29,7 +30,7 @@ angular.module('icestudio') checkToolchain(); // Remove build directory on start - nodeFse.removeSync(utils.BUILD_DIR); + nodeFse.removeSync(common.BUILD_DIR); this.verifyCode = function() { this.apio(['verify']); @@ -60,13 +61,14 @@ angular.module('icestudio') gettext('start_build'); /// Start uploading ... gettext('start_upload'); - var message = 'start_' + commands[0]; + var label = commands[0]; + var message = 'start_' + label; currentAlert = alertify.message(gettextCatalog.getString(message), 100000); $('body').addClass('waiting'); check = this.syncResources(code); try { if (check) { - execute(commands, commands[0], currentAlert, function() { + execute(commands, label, code, currentAlert, function() { if (currentAlert) { setTimeout(function() { angular.element('#menu').removeClass('disable-menu'); @@ -115,7 +117,7 @@ angular.module('icestudio') toolchain.installed = toolchain.apio >= _package.apio.min && toolchain.apio < _package.apio.max; if (toolchain.installed) { - nodeChildProcess.exec([apio, 'clean', '-p', utils.SAMPLE_DIR].join(' '), function(error/*, stdout, stderr*/) { + nodeChildProcess.exec([apio, 'clean', '-p', common.SAMPLE_DIR].join(' '), function(error/*, stdout, stderr*/) { toolchain.installed = !error; if (callback) { callback(); @@ -133,8 +135,8 @@ angular.module('icestudio') } this.generateCode = function() { - if (!nodeFs.existsSync(utils.BUILD_DIR)) { - nodeFs.mkdirSync(utils.BUILD_DIR); + if (!nodeFs.existsSync(common.BUILD_DIR)) { + nodeFs.mkdirSync(common.BUILD_DIR); } project.update(); var opt = { boardRules: profile.get('boardRules') }; @@ -144,8 +146,8 @@ angular.module('icestudio') } var verilog = compiler.generate('verilog', project.get(), opt); var pcf = compiler.generate('pcf', project.get(), opt); - nodeFs.writeFileSync(nodePath.join(utils.BUILD_DIR, 'main.v'), verilog, 'utf8'); - nodeFs.writeFileSync(nodePath.join(utils.BUILD_DIR, 'main.pcf'), pcf, 'utf8'); + nodeFs.writeFileSync(nodePath.join(common.BUILD_DIR, 'main.v'), verilog, 'utf8'); + nodeFs.writeFileSync(nodePath.join(common.BUILD_DIR, 'main.pcf'), pcf, 'utf8'); return verilog; }; @@ -156,11 +158,11 @@ angular.module('icestudio') nodeFse.removeSync('!(main.*)'); // Sync included files - ret = this.syncFiles(/@include\s(.*?)(\\n|\n|\s)/g, code); + ret = this.syncFiles(/(\n|\s)\/\/\s*@include\s+([^\s]*\.(v|vh))(\n|\s)/g, code); // Sync list files if (ret) { - ret = this.syncFiles(/\"(.*\.list?)\"/g, code); + ret = this.syncFiles(/(\n|\s)[^\/]?\"(.*\.list?)\"/g, code); } return ret; @@ -170,9 +172,9 @@ angular.module('icestudio') var ret = true; var match; while (match = pattern.exec(code)) { - var file = match[1]; - var destPath = nodePath.join(utils.BUILD_DIR, file); - var origPath = nodePath.join(utils.dirname(project.path), file); + var file = match[2]; + var destPath = nodePath.join(common.BUILD_DIR, file); + var origPath = nodePath.join(utils.dirname(project.filepath), file); // Copy included file var copySuccess = utils.copySync(origPath, destPath); @@ -186,13 +188,13 @@ angular.module('icestudio') return ret; }; - function execute(commands, label, currentAlert, callback) { + function execute(commands, label, code, currentAlert, callback) { var remoteHostname = profile.get('remoteHostname'); if (remoteHostname) { currentAlert.setContent(gettextCatalog.getString('Synchronize remote files ...')); nodeRSync({ - src: utils.BUILD_DIR + '/', + src: common.BUILD_DIR + '/', dest: remoteHostname + ':.build/', ssh: true, recursive: true, @@ -204,31 +206,49 @@ angular.module('icestudio') currentAlert.setContent(gettextCatalog.getString('Execute remote {{label}} ...', { label: label })); nodeSSHexec((['apio'].concat(commands).concat(['-p', '.build'])).join(' '), remoteHostname, function (error, stdout, stderr) { - processExecute(label, callback, error, stdout, stderr); + processExecute(label, code, callback, error, stdout, stderr); }); } else { - processExecute(label, callback, error, stdout, stderr); + processExecute(label, code, callback, error, stdout, stderr); } }); } else { + if (commands[0] === 'upload') { + drivers.preUpload(function() { + _execute(); + }); + } + else { + _execute(); + } + } + + function _execute() { var apio = utils.getApioExecutable(); toolchain.disabled = utils.toolchainDisabled; - nodeChildProcess.exec(([apio].concat(commands).concat(['-p', utils.coverPath(utils.BUILD_DIR)])).join(' '), { maxBuffer: 5000 * 1024 }, + nodeChildProcess.exec(([apio].concat(commands).concat(['-p', utils.coverPath(common.BUILD_DIR)])).join(' '), { maxBuffer: 5000 * 1024 }, function(error, stdout, stderr) { - processExecute(label, callback, error, stdout, stderr); + if (!error && !stderr) { + if (commands[0] === 'upload') { + drivers.postUpload(); + } + } + processExecute(label, code, callback, error, stdout, stderr); }); } } - function processExecute(label, callback, error, stdout, stderr) { + function processExecute(label, code, callback, error, stdout, stderr) { if (callback) { callback(); } + //console.log(label, error, stdout, stderr) if (label) { if (error || stderr) { if (stdout) { + // - Apio errors if (stdout.indexOf('[upload] Error') !== -1 || stdout.indexOf('Error: board not detected') !== -1) { alertify.error(gettextCatalog.getString('Board {{name}} not detected', { name: utils.bold(common.selectedBoard.info.label) }), 30); @@ -236,33 +256,110 @@ angular.module('icestudio') else if (stdout.indexOf('Error: unkown board') !== -1) { alertify.error(gettextCatalog.getString('Unknown board'), 30); } - else if (stdout.indexOf('set_io: too few arguments') !== -1) { - alertify.error(gettextCatalog.getString('FPGA I/O ports not defined'), 30); - } - else if (stdout.indexOf('error: unknown pin') !== -1) { + // - Arachne-pnr errors + else if (stdout.indexOf('set_io: too few arguments') !== -1 || + stdout.indexOf('fatal error: unknown pin') !== -1) { alertify.error(gettextCatalog.getString('FPGA I/O ports not defined'), 30); } - else if (stdout.indexOf('error: duplicate pin constraints') !== -1) { + else if (stdout.indexOf('fatal error: duplicate pin constraints') !== -1) { alertify.error(gettextCatalog.getString('Duplicated FPGA I/O ports'), 30); } else { - var stdoutError = stdout.split('\n').filter(function (line) { - return (line.indexOf('syntax error') !== -1 || - line.indexOf('not installed') !== -1 || - line.indexOf('error: ') !== -1 || - line.indexOf('ERROR: ') !== -1 || - line.indexOf('Error: ') !== -1 || - line.indexOf('already declared') !== -1); - }); - if (stdoutError.length > 0) { - alertify.error(stdoutError[0], 30); + var re, matchError, codeErrors = []; + + // - Iverilog errors & warnings + // main.v:#: error: ... + // main.v:#: warning: ... + // main.v:#: syntax error + re = /main.v:([0-9]+):\s(error|warning):\s(.*?)\n/g; + while (matchError = re.exec(stdout)) { + codeErrors.push({ + line: parseInt(matchError[1]), + msg: matchError[3], + type: matchError[2] + }); + } + re = /main.v:([0-9]+):\ssyntax\serror\n/g; + while (matchError = re.exec(stdout)) { + codeErrors.push({ + line: parseInt(matchError[1]), + msg: 'Syntax error', + type: 'error' + }); + } + + // - Yosys errors + // ERROR: ... main.v:#...\n + // Warning: ... main.v:#...\n + re = /(ERROR|Warning):\s(.*?)\smain\.v:([0-9]+)(.*?)\n/g; + while (matchError = re.exec(stdout)) { + var msg = ''; + var line = parseInt(matchError[3]); + var type = matchError[1].toLowerCase(); + var preContent = matchError[2]; + var postContent = matchError[4]; + // Process error + if (preContent === 'Parser error in line') { + postContent = postContent.substring(2); // remove :\s + if (postContent.startsWith('syntax error')) { + postContent = 'Syntax error'; + } + msg = postContent; + } + else if (preContent.endsWith(' in line ')) { + msg = preContent.replace(/\sin\sline\s$/, ' ') + postContent; + } + else { + preContent = preContent.replace(/\sat\s$/, ''); + preContent = preContent.replace(/\sin\s$/, ''); + msg = preContent; + } + codeErrors.push({ + line: line, + msg: msg, + type: type + }); + } + + // Extract modules map from code + var modules = mapCodeModules(code); + + for (var i in codeErrors) { + var codeError = normalizeCodeError(codeErrors[i], modules); + if (codeError) { + // Launch codeError event + $(document).trigger('codeError', [codeError]); + } + } + + if (codeErrors.length !== 0) { + alertify.error(gettextCatalog.getString('Errors detected in the code'), 5); } else { - alertify.error(stdout, 30); + var stdoutWarning = stdout.split('\n').filter(function (line) { + line = line.toLowerCase(); + return (line.indexOf('warning: ') !== -1); + }); + var stdoutError = stdout.split('\n').filter(function (line) { + line = line.toLowerCase(); + return (line.indexOf('error: ') !== -1 || + line.indexOf('not installed') !== -1 || + line.indexOf('already declared') !== -1); + }); + if (stdoutWarning.length > 0) { + alertify.warning(stdoutWarning[0]); + } + if (stdoutError.length > 0) { + alertify.error(stdoutError[0], 30); + } + else { + alertify.error(stdout, 30); + } } } } else if (stderr) { + // Remote hostname errors if (stderr.indexOf('Could not resolve hostname') !== -1 || stderr.indexOf('Connection refused') !== -1) { alertify.error(gettextCatalog.getString('Wrong remote hostname {{name}}', { name: profile.get('remoteHostname') }), 30); @@ -313,6 +410,68 @@ angular.module('icestudio') } } + function mapCodeModules(code) { + var codelines = code.split('\n'); + var match, module = {}, modules = []; + // Find begin/end lines of the modules + for (var i in codelines) { + var codeline = codelines[i]; + // Get the module name + if (!module.name) { + match = /module\s+(.*?)[\s|\(|$]/.exec(codeline); + if (match) { + module.name = match[1]; + continue; + } + } + // Get the begin of the module code + if (!module.begin) { + match = /;/.exec(codeline); + if (match) { + module.begin = parseInt(i) + 1; + continue; + } + } + // Get the end of the module code + if (!module.end) { + match = /endmodule/.exec(codeline); + if (match) { + module.end = parseInt(i) + 1; + modules.push(module); + module = {}; + } + } + } + return modules; + } + + function normalizeCodeError(codeError, modules) { + var newCodeError; + // Find the module with the error + for (var i in modules) { + var module = modules[i]; + if ((codeError.line > module.begin) && (codeError.line <= module.end)) { + newCodeError = { + type: codeError.type, + line: codeError.line - module.begin - ((codeError.line === module.end) ? 1 : 0), + msg: (codeError.msg.length > 2) ? codeError.msg[0].toUpperCase() + codeError.msg.substring(1) : codeError.msg + }; + if (module.name.startsWith('main_')) { + // Code block + newCodeError.blockId = module.name.split('_')[1]; + newCodeError.blockType = 'code'; + } + else { + // Generic block + newCodeError.blockId = module.name.split('_')[0]; + newCodeError.blockType = 'generic'; + } + break; + } + } + return newCodeError; + } + this.installToolchain = function() { utils.removeToolchain(); if (utils.checkDefaultToolchain()) { @@ -342,7 +501,7 @@ angular.module('icestudio') }); } else { - alertify.alert(gettextCatalog.getString('Error: default toolchain not found in \'{{dir}}\'', { dir: utils.TOOLCHAIN_DIR})); + alertify.alert(gettextCatalog.getString('Error: default toolchain not found in \'{{dir}}\'', { dir: common.TOOLCHAIN_DIR})); } }; @@ -357,11 +516,11 @@ angular.module('icestudio') }; this.enableDrivers = function() { - utils.enableDrivers(); + drivers.enable(); }; this.disableDrivers = function() { - utils.disableDrivers(); + drivers.disable(); }; function installDefaultToolchain() { @@ -512,7 +671,7 @@ angular.module('icestudio') } function apioInstallDrivers(callback) { - if (utils.WIN32) { + if (common.WIN32) { updateProgress('apio install drivers', 80); utils.apioInstall('drivers', callback); } @@ -575,110 +734,164 @@ angular.module('icestudio') // Collections management - this.addCollections = function(filepath) { - alertify.message(gettextCatalog.getString('Load {{name}} ...', { name: utils.bold(utils.basename(filepath) + '.zip') })); + this.addCollections = function(filepaths) { + // Load zip file + async.eachSeries(filepaths, function(filepath, nextzip) { + //alertify.message(gettextCatalog.getString('Load {{name}} ...', { name: utils.bold(utils.basename(filepath)) })); + var zipData = nodeAdmZip(filepath); + var _collections = getCollections(zipData); - var collections = {}; - var zip = nodeAdmZip(filepath); - var zipEntries = zip.getEntries(); + async.eachSeries(_collections, function(collection, next) { + setTimeout(function() { + if (collection.package && (collection.blocks || collection.examples)) { + + alertify.prompt(gettextCatalog.getString('Edit the collection name'), collection.origName, + function(evt, name) { + if (!name) { + return false; + } + collection.name = name; + + var destPath = nodePath.join(common.COLLECTIONS_DIR, name); + if (nodeFs.existsSync(destPath)) { + alertify.confirm( + gettextCatalog.getString('The collection {{name}} already exists.', { name: utils.bold(name) }) + '
    ' + + gettextCatalog.getString('Do you want to replace it?'), + function() { + utils.deleteFolderRecursive(destPath); + installCollection(collection, zipData); + alertify.success(gettextCatalog.getString('Collection {{name}} replaced', { name: utils.bold(name) })); + next(name); + }, + function() { + alertify.warning(gettextCatalog.getString('Collection {{name}} not replaced', { name: utils.bold(name) })); + next(name); + }); + } + else { + installCollection(collection, zipData); + alertify.success(gettextCatalog.getString('Collection {{name}} added', { name: utils.bold(name) })); + next(name); + } + }); + } + else { + alertify.warning(gettextCatalog.getString('Invalid collection {{name}}', { name: utils.bold(name) })); + } + }, 0); + }, function(name) { + collections.loadCollections(); + // If the selected collection is replaced, load it again + if (common.selectedCollection.name === name) { + collections.selectCollection(name); + } + utils.rootScopeSafeApply(); + nextzip(); + }); + }); + }; + + function getCollections(zipData) { + var data = ''; + var _collections = {}; + var zipEntries = zipData.getEntries(); // Validate collections zipEntries.forEach(function(zipEntry) { - var name = zipEntry.entryName.match(/^([^\/]+)\/$/); - if (name) { - collections[name[1]] = { - name: name[1], blocks: [], examples: [], locale: [], package: '' + data = zipEntry.entryName.match(/^([^\/]+)\/$/); + if (data) { + _collections[data[1]] = { + origName: data[1], blocks: [], examples: [], locale: [], package: '' }; } - name = zipEntry.entryName.match(/^([^\/]+)\/blocks\/.*\.ice$/); - if (name) { - collections[name[1]].blocks.push(zipEntry.entryName); + data = zipEntry.entryName.match(/^([^\/]+)\/blocks\/.*\.ice$/); + if (data) { + _collections[data[1]].blocks.push(zipEntry.entryName); } - name = zipEntry.entryName.match(/^([^\/]+)\/examples\/.*\.ice$/); - if (name) { - collections[name[1]].examples.push(zipEntry.entryName); + data = zipEntry.entryName.match(/^([^\/]+)\/examples\/.*\.ice$/); + if (data) { + _collections[data[1]].examples.push(zipEntry.entryName); } - name = zipEntry.entryName.match(/^([^\/]+)\/locale\/.*\.po$/); - if (name) { - collections[name[1]].locale.push(zipEntry.entryName); + data = zipEntry.entryName.match(/^([^\/]+)\/examples\/.*\.v$/); + if (data) { + _collections[data[1]].examples.push(zipEntry.entryName); } - name = zipEntry.entryName.match(/^([^\/]+)\/package\.json$/); - if (name) { - collections[name[1]].package = zipEntry.entryName; + data = zipEntry.entryName.match(/^([^\/]+)\/examples\/.*\.vh$/); + if (data) { + _collections[data[1]].examples.push(zipEntry.entryName); + } + data = zipEntry.entryName.match(/^([^\/]+)\/examples\/.*\.list$/); + if (data) { + _collections[data[1]].examples.push(zipEntry.entryName); + } + data = zipEntry.entryName.match(/^([^\/]+)\/locale\/.*\.po$/); + if (data) { + _collections[data[1]].locale.push(zipEntry.entryName); + } + data = zipEntry.entryName.match(/^([^\/]+)\/package\.json$/); + if (data) { + _collections[data[1]].package = zipEntry.entryName; + } + data = zipEntry.entryName.match(/^([^\/]+)\/README\.md$/); + if (data) { + _collections[data[1]].readme = zipEntry.entryName; } }); - async.eachSeries(collections, function(collection, next) { - setTimeout(function() { - if (collection.package && (collection.blocks || collection.examples)) { - var destPath = nodePath.join(utils.COLLECTIONS_DIR, collection.name); - if (nodeFs.existsSync(destPath)) { - alertify.confirm( - gettextCatalog.getString('The collection {{name}} already exists.', { name: utils.bold(collection.name) }) + '
    ' + - gettextCatalog.getString('Do you want to replace it?'), - function() { - utils.deleteFolderRecursive(destPath); - installCollection(collection, zip); - alertify.success(gettextCatalog.getString('Collection {{name}} replaced', { name: utils.bold(collection.name) })); - next(); - }, - function() { - alertify.warning(gettextCatalog.getString('Collection {{name}} not replaced', { name: utils.bold(collection.name) })); - next(); - }); - } - else { - installCollection(collection, zip); - alertify.success(gettextCatalog.getString('Collection {{name}} added', { name: utils.bold(collection.name) })); - next(); - } - } - else { - alertify.warning(gettextCatalog.getString('Invalid collection {{name}}', { name: utils.bold(collection.name) })); - } - }, 0); - }, function() { - resources.loadCollections(); - }); - }; + + return _collections; + } function installCollection(collection, zip) { - for (var b in collection.blocks) { - safeExtract(collection.blocks[b], zip); + var i, dest = ''; + var pattern = RegExp('^' + collection.origName); + for (i in collection.blocks) { + dest = collection.blocks[i].replace(pattern, collection.name); + safeExtract(collection.blocks[i], dest, zip); } - for (var e in collection.examples) { - safeExtract(collection.examples[e], zip); + for (i in collection.examples) { + dest = collection.examples[i].replace(pattern, collection.name); + safeExtract(collection.examples[i], dest, zip); } - for (var l in collection.locale) { - safeExtract(collection.locale[l], zip); + for (i in collection.locale) { + dest = collection.locale[i].replace(pattern, collection.name); + safeExtract(collection.locale[i], dest, zip); // Generate locale JSON files var compiler = new nodeGettext.Compiler({ format: 'json' }); - var sourcePath = nodePath.join(utils.COLLECTIONS_DIR, collection.locale[l]); - var targetPath = nodePath.join(utils.COLLECTIONS_DIR, collection.locale[l].replace(/\.po$/, '.json')); + var sourcePath = nodePath.join(common.COLLECTIONS_DIR, dest); + var targetPath = nodePath.join(common.COLLECTIONS_DIR, dest.replace(/\.po$/, '.json')); var content = nodeFs.readFileSync(sourcePath).toString(); var json = compiler.convertPo([content]); nodeFs.writeFileSync(targetPath, json); - // Add string to gettext + // Add strings to gettext gettextCatalog.loadRemote(targetPath); } - safeExtract(collection.package, zip); + if (collection.package) { + dest = collection.package.replace(pattern, collection.name); + safeExtract(collection.package, dest, zip); + } + if (collection.readme) { + dest = collection.readme.replace(pattern, collection.name); + safeExtract(collection.readme, dest, zip); + } } - function safeExtract(entry, zip) { + function safeExtract(entry, dest, zip) { try { - zip.extractEntryTo(entry, utils.COLLECTIONS_DIR); + var newPath = nodePath.join(common.COLLECTIONS_DIR, dest); + zip.extractEntryTo(entry, utils.dirname(newPath), /*maintainEntryPath*/false); } catch(e) {} } this.removeCollection = function(collection) { utils.deleteFolderRecursive(collection.path); - resources.loadCollections(); + collections.loadCollections(); alertify.success(gettextCatalog.getString('Collection {{name}} removed', { name: utils.bold(collection.name) })); }; this.removeAllCollections = function() { utils.removeCollections(); - resources.loadCollections(); + collections.loadCollections(); alertify.success(gettextCatalog.getString('All collections removed')); }; diff --git a/app/scripts/services/utils.js b/app/scripts/services/utils.js index 5eb98ab2e..16e547cb9 100644 --- a/app/scripts/services/utils.js +++ b/app/scripts/services/utils.js @@ -12,82 +12,21 @@ angular.module('icestudio') nodeChildProcess, nodeTarball, nodeZlib, - nodeSudo, nodeOnline, nodeGlob, nodeSha1, nodeCP, + nodeGetOS, + nodeLangInfo, SVGO) { - const WIN32 = Boolean(process.platform.indexOf('win32') > -1); - this.WIN32 = WIN32; - const DARWIN = Boolean(process.platform.indexOf('darwin') > -1); - this.DARWIN = DARWIN; - - const LOCALE_DIR = nodePath.join('resources', 'locale'); - const SAMPLE_DIR = nodePath.join('resources', 'sample'); - this.SAMPLE_DIR = SAMPLE_DIR; - - const BASE_DIR = process.env.HOME || process.env.USERPROFILE; - const ICESTUDIO_DIR = safeDir(nodePath.join(BASE_DIR, '.icestudio')); - this.ICESTUDIO_DIR = ICESTUDIO_DIR; - const COLLECTIONS_DIR = nodePath.join(ICESTUDIO_DIR, 'collections'); - this.COLLECTIONS_DIR = COLLECTIONS_DIR; - const APIO_HOME_DIR = nodePath.join(ICESTUDIO_DIR, 'apio'); - const PROFILE_PATH = nodePath.join(ICESTUDIO_DIR, 'profile.json'); - this.PROFILE_PATH = PROFILE_PATH; - const CACHE_DIR = nodePath.join(ICESTUDIO_DIR, '.cache'); - const BUILD_DIR = nodePath.join(ICESTUDIO_DIR, '.build'); - this.BUILD_DIR = BUILD_DIR; - - const VENV = 'virtualenv-15.0.1'; - const VENV_DIR = nodePath.join(CACHE_DIR, VENV); - const VENV_TARGZ = nodePath.join('resources', 'virtualenv', VENV + '.tar.gz'); - - const APP_DIR = nodePath.dirname(process.execPath); - const TOOLCHAIN_DIR = nodePath.join(APP_DIR, 'toolchain'); - this.TOOLCHAIN_DIR = TOOLCHAIN_DIR; - - const DEFAULT_APIO = 'default-apio'; - const DEFAULT_APIO_DIR = nodePath.join(CACHE_DIR, DEFAULT_APIO); - const DEFAULT_APIO_TARGZ = nodePath.join(TOOLCHAIN_DIR, DEFAULT_APIO + '.tar.gz'); - - const DEFAULT_APIO_PACKAGES = 'default-apio-packages'; - const DEFAULT_APIO_PACKAGES_TARGZ = nodePath.join(TOOLCHAIN_DIR, DEFAULT_APIO_PACKAGES + '.tar.gz'); - - const ENV_DIR = nodePath.join(ICESTUDIO_DIR, 'venv'); - const ENV_BIN_DIR = nodePath.join(ENV_DIR, WIN32 ? 'Scripts' : 'bin'); - const ENV_PIP = nodePath.join(ENV_BIN_DIR, 'pip'); - const ENV_APIO = nodePath.join(ENV_BIN_DIR, WIN32 ? 'apio.exe' : 'apio'); - const APIO_CMD = (WIN32 ? 'set' : 'export') + ' APIO_HOME_DIR=' + APIO_HOME_DIR + (WIN32 ? '& ' : '; ') + coverPath(ENV_APIO); - const SYSTEM_APIO = '/usr/bin/apio'; - - function safeDir(_dir) { - if (WIN32) { - // Put the env directory to the root of the current local disk when - // default path contains non-ASCII characters. Virtualenv will fail to - for (var i in _dir) { - if (_dir[i].charCodeAt(0) > 127) { - const _dirFormat = nodePath.parse(_dir); - return nodePath.format({ - root: _dirFormat.root, - dir: _dirFormat.root, - base: '.icestudio', - name: '.icestudio', - }); - } - } - } - return _dir; - } - var _pythonExecutableCached = null; // Get the system executable this.getPythonExecutable = function() { if (!_pythonExecutableCached) { const possibleExecutables = []; - if (WIN32) { + if (common.WIN32) { possibleExecutables.push('python.exe'); possibleExecutables.push('C:\\Python27\\python.exe'); } else { @@ -129,7 +68,7 @@ angular.module('icestudio') }; this.extractVirtualEnv = function(callback) { - this.extractTargz(VENV_TARGZ, CACHE_DIR, callback); + this.extractTargz(common.VENV_TARGZ, common.CACHE_DIR, callback); }; function disableClick(e) { @@ -172,15 +111,15 @@ angular.module('icestudio') }; this.makeVenvDirectory = function(callback) { - if (!nodeFs.existsSync(ICESTUDIO_DIR)) { - nodeFs.mkdirSync(ICESTUDIO_DIR); + if (!nodeFs.existsSync(common.ICESTUDIO_DIR)) { + nodeFs.mkdirSync(common.ICESTUDIO_DIR); } - if (!nodeFs.existsSync(ENV_DIR)) { - nodeFs.mkdirSync(ENV_DIR); + if (!nodeFs.existsSync(common.ENV_DIR)) { + nodeFs.mkdirSync(common.ENV_DIR); this.executeCommand( [this.getPythonExecutable(), - coverPath(nodePath.join(VENV_DIR, 'virtualenv.py')), - coverPath(ENV_DIR)], callback); + coverPath(nodePath.join(common.VENV_DIR, 'virtualenv.py')), + coverPath(common.ENV_DIR)], callback); } else { callback(); @@ -190,7 +129,7 @@ angular.module('icestudio') this.checkDefaultToolchain = function() { try { // TODO: use tar.gz with sha1 - return nodeFs.statSync(TOOLCHAIN_DIR).isDirectory(); + return nodeFs.statSync(common.TOOLCHAIN_DIR).isDirectory(); } catch (err) { return false; @@ -198,21 +137,21 @@ angular.module('icestudio') }; this.extractDefaultApio = function(callback) { - this.extractTargz(DEFAULT_APIO_TARGZ, DEFAULT_APIO_DIR, callback); + this.extractTargz(common.DEFAULT_APIO_TARGZ, common.DEFAULT_APIO_DIR, callback); }; this.installDefaultApio = function(callback) { var self = this; - nodeGlob(nodePath.join(DEFAULT_APIO_DIR, '*.*'), {}, function (error, files) { + nodeGlob(nodePath.join(common.DEFAULT_APIO_DIR, '*.*'), {}, function (error, files) { if (!error) { files = files.map(function(item) { return coverPath(item); }); - self.executeCommand([coverPath(ENV_PIP), 'install', '-U', '--no-deps'].concat(files), callback); + self.executeCommand([coverPath(common.ENV_PIP), 'install', '-U', '--no-deps'].concat(files), callback); } }); }; this.extractDefaultApioPackages = function(callback) { - this.extractTargz(DEFAULT_APIO_PACKAGES_TARGZ, APIO_HOME_DIR, callback); + this.extractTargz(common.DEFAULT_APIO_PACKAGES_TARGZ, common.APIO_HOME_DIR, callback); }; this.isOnline = function(callback, error) { @@ -230,17 +169,17 @@ angular.module('icestudio') }; this.installOnlineApio = function(callback) { - this.executeCommand([coverPath(ENV_PIP), 'install', '-U', 'apio">=' + _package.apio.min + ',<' + _package.apio.max + '"'], callback); + this.executeCommand([coverPath(common.ENV_PIP), 'install', '-U', 'apio">=' + _package.apio.min + ',<' + _package.apio.max + '"'], callback); }; this.apioInstall = function(_package, callback) { - this.executeCommand([APIO_CMD, 'install', _package], callback); + this.executeCommand([common.APIO_CMD, 'install', _package], callback); }; this.toolchainDisabled = false; this.getApioExecutable = function() { - var candidateApio = process.env.ICESTUDIO_APIO ? process.env.ICESTUDIO_APIO : SYSTEM_APIO; + var candidateApio = process.env.ICESTUDIO_APIO ? process.env.ICESTUDIO_APIO : common.SYSTEM_APIO; if (nodeFs.existsSync(candidateApio)) { if (!this.toolchainDisabled) { // Show message only on start @@ -250,17 +189,17 @@ angular.module('icestudio') return coverPath(candidateApio); } this.toolchainDisabled = false; - return APIO_CMD; + return common.APIO_CMD; }; this.removeToolchain = function() { - deleteFolderRecursive(ENV_DIR); - deleteFolderRecursive(CACHE_DIR); - deleteFolderRecursive(APIO_HOME_DIR); + deleteFolderRecursive(common.ENV_DIR); + deleteFolderRecursive(common.CACHE_DIR); + deleteFolderRecursive(common.APIO_HOME_DIR); }; this.removeCollections = function() { - deleteFolderRecursive(COLLECTIONS_DIR); + deleteFolderRecursive(common.COLLECTIONS_DIR); }; this.deleteFolderRecursive = deleteFolderRecursive; @@ -284,7 +223,8 @@ angular.module('icestudio') this.basename = basename; function basename(filepath) { - return nodePath.basename(filepath).split('.')[0]; + var b = nodePath.basename(filepath); + return b.substr(0, b.lastIndexOf('.')); } this.dirname = function(filepath) { @@ -374,7 +314,7 @@ angular.module('icestudio') function getFilesRecursive(folder) { var fileTree = []; - var validator = /.*\.(ice|json)$/; + var validator = /.*\.(ice|json|md)$/; if (nodeFs.existsSync(folder)) { var fileContents = nodeFs.readdirSync(folder); @@ -401,168 +341,7 @@ angular.module('icestudio') return fileTree; } - this.enableDrivers = function() { - if (WIN32) { - enableWindowsDrivers(); - } - else if (DARWIN) { - enableDarwinDrivers(); - } - else { - linuxDrivers(true); - } - }; - - this.disableDrivers = function() { - if (WIN32) { - disableWindowsDrivers(); - } - else if (DARWIN) { - disableDarwinDrivers(); - } - else { - linuxDrivers(false); - } - }; - - function linuxDrivers(enable) { - var commands; - if (enable) { - commands = [ - 'cp ' + nodePath.resolve('resources/config/80-icestick.rules') + ' /etc/udev/rules.d/80-icestick.rules', - 'service udev restart' - ]; - } - else { - commands = [ - 'rm /etc/udev/rules.d/80-icestick.rules', - 'service udev restart' - ]; - } - var command = 'sh -c "' + commands.join('; ') + '"'; - - beginLazyProcess(); - nodeSudo.exec(command, {name: 'Icestudio'}, function(error/*, stdout, stderr*/) { - // console.log(error, stdout, stderr); - endLazyProcess(); - if (!error) { - if (enable) { - alertify.success(gettextCatalog.getString('Drivers enabled')); - } - else { - alertify.warning(gettextCatalog.getString('Drivers disabled')); - } - setTimeout(function() { - alertify.message(gettextCatalog.getString('Unplug and reconnect the board'), 5); - }, 1000); - } - }); - } - - function enableDarwinDrivers() { - var commands = [ - 'kextunload -b com.FTDI.driver.FTDIUSBSerialDriver -q || true', - 'kextunload -b com.apple.driver.AppleUSBFTDI -q || true' - ]; - var command = 'sh -c "' + commands.join('; ') + '"'; - - beginLazyProcess(); - nodeSudo.exec(command, {name: 'Icestudio'}, function(error/*, stdout, stderr*/) { - // console.log(error, stdout, stderr); - if (error) { - endLazyProcess(); - } - else { - var brewCommands = [ - '/usr/local/bin/brew update', - '/usr/local/bin/brew install --force libftdi', - '/usr/local/bin/brew unlink libftdi', - '/usr/local/bin/brew link --force libftdi', - '/usr/local/bin/brew install --force libffi', - '/usr/local/bin/brew unlink libffi', - '/usr/local/bin/brew link --force libffi' - ]; - nodeChildProcess.exec(brewCommands.join('; '), function(error, stdout, stderr) { - // console.log(error, stdout, stderr); - endLazyProcess(); - if (error) { - if ((stderr.indexOf('brew: command not found') !== -1) || - (stderr.indexOf('brew: No such file or directory') !== -1)) { - alertify.error(gettextCatalog.getString('Homebrew is required'), 30); - // TODO: open web browser with Homebrew website on click - } - else if (stderr.indexOf('Error: Failed to download') !== -1) { - alertify.error(gettextCatalog.getString('Internet connection required'), 30); - } - else { - alertify.error(stderr, 30); - } - } - else { - alertify.success(gettextCatalog.getString('Drivers enabled')); - } - }); - } - }); - } - - function disableDarwinDrivers() { - var commands = [ - 'kextload -b com.FTDI.driver.FTDIUSBSerialDriver -q || true', - 'kextload -b com.apple.driver.AppleUSBFTDI -q || true' - ]; - var command = 'sh -c "' + commands.join('; ') + '"'; - - beginLazyProcess(); - nodeSudo.exec(command, {name: 'Icestudio'}, function(error/*, stdout, stderr*/) { - // console.log(error, stdout, stderr); - endLazyProcess(); - if (!error) { - alertify.warning(gettextCatalog.getString('Drivers disabled')); - } - }); - } - - function enableWindowsDrivers() { - alertify.confirm(gettextCatalog.getString('

    FTDI driver installation instructions

    1. Connect the FPGA board
    2. Replace the (Interface 0) driver of the board by libusbK
    3. Unplug and reconnect the board
    '), function() { - beginLazyProcess(); - nodeSudo.exec([APIO_CMD, 'drivers', '--enable'].join(' '), {name: 'Icestudio'}, function(error, stdout, stderr) { - // console.log(error, stdout, stderr); - endLazyProcess(); - if (stderr) { - alertify.error(gettextCatalog.getString('Toolchain not installed. Please, install the toolchain'), 30); - } - if (!error) { - alertify.message(gettextCatalog.getString('Unplug and reconnect the board'), 5); - } - }); - }); - } - - function disableWindowsDrivers() { - alertify.confirm(gettextCatalog.getString('

    FTDI driver uninstallation instructions

    1. Find the FPGA USB Device
    2. Select the board interface and uninstall the driver
    '), function() { - beginLazyProcess(); - nodeChildProcess.exec([APIO_CMD, 'drivers', '--disable'].join(' '), function(error, stdout, stderr) { - // console.log(error, stdout, stderr); - endLazyProcess(); - if (stderr) { - alertify.error(gettextCatalog.getString('Toolchain not installed. Please, install the toolchain'), 30); - } - }); - }); - } - - function beginLazyProcess() { - $('body').addClass('waiting'); - angular.element('#menu').addClass('disable-menu'); - } - - function endLazyProcess() { - $('body').removeClass('waiting'); - angular.element('#menu').removeClass('disable-menu'); - } - - this.setLocale = function(locale, collections) { + this.setLocale = function(locale) { // Update current locale format locale = splitLocale(locale); // Load supported languages @@ -571,16 +350,16 @@ angular.module('icestudio') var bestLang = bestLocale(locale, supported); gettextCatalog.setCurrentLanguage(bestLang); // Application strings - gettextCatalog.loadRemote(nodePath.join(LOCALE_DIR, bestLang, bestLang + '.json')); + gettextCatalog.loadRemote(nodePath.join(common.LOCALE_DIR, bestLang, bestLang + '.json')); // Collections strings - for (var c in collections) { - var collection = collections[c]; + for (var c in common.collections) { + var collection = common.collections[c]; var filepath = nodePath.join(collection.path, 'locale', bestLang, bestLang + '.json'); if (nodeFs.existsSync(filepath)) { gettextCatalog.loadRemote(filepath); } } - // COLLECTIONS_DIR + // Return the best language return bestLang; }; @@ -598,8 +377,8 @@ angular.module('icestudio') function getSupportedLanguages() { var supported = []; - nodeFs.readdirSync(LOCALE_DIR).forEach(function(element/*, index*/) { - var curPath = nodePath.join(LOCALE_DIR, element); + nodeFs.readdirSync(common.LOCALE_DIR).forEach(function(element/*, index*/) { + var curPath = nodePath.join(common.LOCALE_DIR, element); if (nodeFs.lstatSync(curPath).isDirectory()) { supported.push(splitLocale(element)); } @@ -660,11 +439,31 @@ angular.module('icestudio') }); }; + this.checkboxprompt = function(messages, values, callback) { + var content = []; + content.push('
    '); + content.push('
    '); + content.push('
    '); + // Restore values + $('#check').prop('checked', values[0]); + + alertify.confirm(content.join('\n')) + .set('onok', function(evt) { + var values = []; + values.push($('#check').prop('checked')); + if (callback) { + callback(evt, values); + } + }) + .set('oncancel', function(/*evt*/) { + }); + }; + this.inputcheckboxprompt = function(messages, values, callback) { var content = []; content.push('
    '); content.push('

    ' + messages[0] + '

    '); - content.push(' '); + content.push(' '); content.push('
    '); content.push('
    '); content.push('
    '); @@ -683,13 +482,17 @@ angular.module('icestudio') }) .set('oncancel', function(/*evt*/) { }); + + setTimeout(function(){ + $('#label').select(); + }, 50); }; this.inputcheckbox2prompt = function(messages, values, callback) { var content = []; content.push('
    '); content.push('

    ' + messages[0] + '

    '); - content.push(' '); + content.push(' '); content.push('
    '); content.push('
    '); content.push('
    '); @@ -711,6 +514,10 @@ angular.module('icestudio') }) .set('oncancel', function(/*evt*/) { }); + + setTimeout(function(){ + $('#label').select(); + }, 50); }; this.projectinfoprompt = function(values, callback) { @@ -731,7 +538,7 @@ angular.module('icestudio') //content.push('
    '); } content.push('

    ' + messages[i] + '

    '); - content.push(' '); + content.push(' '); } content.push('

    ' + gettextCatalog.getString('Image') + '

    '); content.push(' '); @@ -769,12 +576,12 @@ angular.module('icestudio') chooserOpen.unbind('change'); chooserOpen.change(function(/*evt*/) { var filepath = $(this).val(); - var svgo = new SVGO(); + nodeFs.readFile(filepath, 'utf8', function(err, data) { if (err) { throw err; } - svgo.optimize(data, function(result) { + optimizeSVG(data, function(result) { image = encodeURI(result.data); registerSave(); $('#preview-svg').attr('src', 'data:image/svg+xml,' + image); @@ -784,6 +591,14 @@ angular.module('icestudio') }); } + function optimizeSVG(data, callback) { + SVGO.optimize(data, function(result) { + if (callback) { + callback(result); + } + }); + } + function registerSave() { // Save SVG var label = $('#save-svg'); @@ -861,13 +676,13 @@ angular.module('icestudio') this.findIncludedFiles = function(code) { var ret = []; var patterns = [ - /@include\s(.*?)(\\n|\n|\s)/g, - /\\"(.*\.list?)\\"/g + /(\n|\s)\/\/\s*@include\s+([^\s]*\.(v|vh))(\n|\s)/g, + /(\n|\s)[^\/]?\"(.*\.list?)\"/g ]; for (var p in patterns) { var match; while (match = patterns[p].exec(code)) { - var file = match[1].replace(/ /g, ''); + var file = match[2].replace(/ /g, ''); if (ret.indexOf(file) === -1) { ret.push(file); } @@ -1024,15 +839,50 @@ angular.module('icestudio') }; this.pasteFromClipboard = function(callback) { - nodeCP.paste(function(a, text) { - try { + nodeCP.paste(function(err, text) { + if (err) { + if (common.LINUX) { + // xclip installation message + var cmd = ''; + var message = gettextCatalog.getString('{{app}} is required.', { app: 'xclip' }); + nodeGetOS(function(e, os) { + if (!e) { + if (os.dist.indexOf('Debian') !== -1 || + os.dist.indexOf('Ubuntu Linux') !== -1 || + os.dist.indexOf('Linux Mint') !== -1) + { + cmd = 'sudo apt-get install xclip'; + } + else if (os.dist.indexOf('Fedora')) + { + cmd = 'sudo dnf install xclip'; + } + else if (os.dist.indexOf('RHEL') !== -1 || + os.dist.indexOf('RHAS') !== -1 || + os.dist.indexOf('Centos') !== -1 || + os.dist.indexOf('Red Hat Linux') !== -1) + { + cmd = 'sudo yum install xclip'; + } + else if (os.dist.indexOf('Arch Linux') !== -1) + { + cmd = 'sudo pacman install xclip'; + } + if (cmd) { + message += ' ' + gettextCatalog.getString('Please run: {{cmd}}', { cmd: '
    ' + cmd + '' }); + } + } + alertify.warning(message, 30); + }); + } + } + else { // Parse the global clipboard var clipboard = JSON.parse(text); if (callback && clipboard && clipboard.icestudio) { callback(clipboard.icestudio); } } - catch (e) { } }); }; @@ -1160,4 +1010,53 @@ angular.module('icestudio') return _.clone(_default); }; + this.hasLeftButton = function(evt) { + return evt.which === 1; + }; + + this.hasMiddleButton = function(evt) { + return evt.which === 2; + }; + + this.hasRightButton = function(evt) { + return evt.which === 3; + }; + + this.hasButtonPressed = function(evt) { + return evt.which !== 0; + }; + + this.hasShift = function(evt) { + return evt.shiftKey; + }; + + this.hasCtrl = function(evt) { + return evt.ctrlKey; + }; + + this.loadLanguage = function(profile) { + var self = this; + profile.load(function() { + var lang = profile.get('language'); + if (lang) { + self.setLocale(lang); + } + else { + // If lang is empty, use the system language + nodeLangInfo(function(err, sysLang) { + if (!err) { + profile.set('language', self.setLocale(sysLang)); + } + }); + } + }); + }; + + this.digestId = function(id) { + if (id.indexOf('-') !== -1) { + id = nodeSha1(id).toString(); + } + return 'v' + id.substring(0, 6); + }; + }); diff --git a/app/styles/design.css b/app/styles/design.css index 004b23cac..95c6cbb53 100644 --- a/app/styles/design.css +++ b/app/styles/design.css @@ -100,10 +100,6 @@ .generic-block .clock { position: absolute; - top: 3px; - left: -1px; - font-size: 18px; - color: #777; } .generic-block .tooltiptext { @@ -342,6 +338,7 @@ left: -2px; right: -2px; bottom: -2px; + margin: 8px; border-radius: 5px; border: 1px solid #BBB; pointer-events: auto; @@ -358,12 +355,32 @@ z-index: 0; } +.info-block-readonly { + background: transparent; + border: 1px solid transparent; +} + +.info-block .info-text { + position: absolute; + overflow: visible; + background: transparent; + top: -2px; + left: -2px; + right: -2px; + bottom: -2px; + margin: 8px; + border-radius: 5px; + border: 1px solid transparent; + pointer-events: none; +} + .info-block .info-editor { position: absolute; top: -2px; left: -2px; right: -2px; bottom: -2px; + margin: 8px; border-radius: 5px; border: 1px solid #BBB; pointer-events: auto; @@ -376,6 +393,10 @@ display: none; } +.highlight-error { + background: #ff8084; +} + .highlight-yellow { box-shadow: 0 0 8px 8px rgba(248, 248, 160, 0.5); } @@ -396,26 +417,26 @@ box-shadow: 0 0 8px 8px rgba(221, 221, 221, 0.5); } -.selectionarea { - position: absolute; - border: 1px solid rgba(42, 118, 198, 1); - background-color: rgba(42, 118, 198, 0.2); - overflow: visible; - z-index: 1500; -} - -.selectionarea.selected { +.selection.selected { background-color: transparent; border: none; opacity: 1; cursor: move; - /* Position the selection rectangle static so that the selection-boxe are contained within + /* Position the selection rectangle static so that the selection-boxes are contained within the paper container (which is supposed to be positioned relative). The height 0 !important makes sure the selection rectangle is not-visible, only the selection-boxes inside it (thanks to overflow: visible). */ position: static; height: 0 !important; } +.selection-area { + position: absolute; + border: 1px solid rgba(42, 118, 198, 1); + background-color: rgba(42, 118, 198, 0.2); + overflow: visible; + z-index: 1500; +} + .selection-box { position: absolute; border: 1px dotted rgba(42, 118, 198, 1); @@ -424,6 +445,12 @@ z-index: 1500; } +.selection-box-transparent { + position: absolute; + border-radius: 5px; + z-index: 1500; +} + /* Wires makers */ .joint-link.joint-theme-default .connection-wrap { diff --git a/app/views/languages.html b/app/views/languages.html new file mode 100644 index 000000000..fcf7874d7 --- /dev/null +++ b/app/views/languages.html @@ -0,0 +1,37 @@ + +
  • + + {{ 'English' | translate }}  + + +
  • +
  • + + {{ 'Spanish' | translate }}  + + +
  • +
  • + + {{ 'Galician' | translate }}  + + +
  • +
  • + + {{ 'Basque' | translate }}  + + +
  • +
  • + + {{ 'French' | translate }}  + + +
  • +
  • + + {{ 'Catalan' | translate }}  + + +
  • diff --git a/app/views/menu.html b/app/views/menu.html index 7e9650f1a..72da9f14d 100644 --- a/app/views/menu.html +++ b/app/views/menu.html @@ -1,7 +1,7 @@
    -