From 5e0a4b06df2faeaadc4b33ef42a76b08cf0e40e4 Mon Sep 17 00:00:00 2001 From: obijuan Date: Wed, 11 Aug 2021 11:35:32 +0200 Subject: [PATCH 1/2] Collection reorganization --- LICENSE | 360 +++++- README.md | 98 +- .../int_math_sd/int16/abs_int16.ice | 0 .../int_math_sd/int16/add_int16_sat.ice | 0 .../int_math_sd/int16/compare_int16.ice | 0 .../int_math_sd/int16/div_int16.ice | 0 .../int_math_sd/int16/div_int16_clocked.ice | 0 .../int_math_sd/int16/max_int16.ice | 0 .../int_math_sd/int16/min_int16.ice | 0 .../int_math_sd/int16/mul_int16.ice | 0 .../int_math_sd/int16/mul_int16_32.ice | 0 .../int_math_sd/int16/mul_int16_sat.ice | 0 .../int_math_sd/int16/muldiv_int16_sat.ice | 0 .../int16/muldiv_int16_sat_clocked.ice | 0 .../int_math_sd/int16/neg_int16.ice | 0 .../int_math_sd/int16/nop_int16.ice | 0 .../int_math_sd/int16/nop_int16_clocked.ice | 0 .../int_math_sd/int16/select_int16.ice | 0 .../int_math_sd/int16/sub_int16_sat.ice | 0 .../int_math_sd/int24/abs_int24.ice | 0 .../int_math_sd/int24/add_int24_sat.ice | 0 .../int_math_sd/int24/compare_int24.ice | 0 .../int_math_sd/int24/div_int24.ice | 0 .../int_math_sd/int24/max_int24.ice | 0 .../int_math_sd/int24/min_int24.ice | 0 .../int_math_sd/int24/mul_int24_48.ice | 0 blocks/int_math_sd/int24/muldiv_int16_sat.ice | 553 +++++++++ .../int_math_sd/int24/muldiv_int24.ice | 0 .../int_math_sd/int24/neg_int24.ice | 0 .../int_math_sd/int24/nop_int24.ice | 0 .../int_math_sd/int24/nop_int24_clocked.ice | 0 .../int_math_sd/int24/select_int24.ice | 0 .../int_math_sd/int24/sub_int24_sat.ice | 0 .../int_math_sd/int32/add_int32_sat.ice | 0 .../int_math_sd/int32/div_int32.ice | 0 .../int_math_sd/int32/div_int32_16.ice | 0 .../int_math_sd/int32/sub_int32_sat.ice | 0 .../int_math_sd/int48/div_int48_24.ice | 0 .../int_math_sd/int8/mul_int8_16.ice | 0 .../int_math_sd/uint16/div_uint16.ice | 0 .../int_math_sd/uint16/sqrt_uint16.ice | 0 .../int_math_sd/uint24/div_uint24.ice | 0 .../int_math_sd/uint24/sqrt_uint24.ice | 0 .../int_math_sd/uint32/div_uint32.ice | 0 .../int_math_sd/uint32/sqrt_uint32.ice | 0 .../utils/timer_16bits.ice | 0 .../test_serial_muldiv_int16.ice | 0 .../test_serial_sqrt_uint16.ice | 0 int_math_Collection_sd.zip | Bin 98547 -> 0 bytes locale/en/en.po | 9 + locale/translation.js | 162 +++ muldiv_int16.ice | 1007 ----------------- package.json | 17 + 53 files changed, 1175 insertions(+), 1031 deletions(-) rename abs_int16.ice => blocks/int_math_sd/int16/abs_int16.ice (100%) rename add_int16_sat.ice => blocks/int_math_sd/int16/add_int16_sat.ice (100%) rename compare_int16.ice => blocks/int_math_sd/int16/compare_int16.ice (100%) rename div_int16.ice => blocks/int_math_sd/int16/div_int16.ice (100%) rename div_int16_clocked.ice => blocks/int_math_sd/int16/div_int16_clocked.ice (100%) rename max_int16.ice => blocks/int_math_sd/int16/max_int16.ice (100%) rename min_int16.ice => blocks/int_math_sd/int16/min_int16.ice (100%) rename mul_int16.ice => blocks/int_math_sd/int16/mul_int16.ice (100%) rename mul_int16_32.ice => blocks/int_math_sd/int16/mul_int16_32.ice (100%) rename mul_int16_sat.ice => blocks/int_math_sd/int16/mul_int16_sat.ice (100%) rename muldiv_int16_sat.ice => blocks/int_math_sd/int16/muldiv_int16_sat.ice (100%) rename muldiv_int16_sat_clocked.ice => blocks/int_math_sd/int16/muldiv_int16_sat_clocked.ice (100%) rename neg_int16.ice => blocks/int_math_sd/int16/neg_int16.ice (100%) rename nop_int16.ice => blocks/int_math_sd/int16/nop_int16.ice (100%) rename nop_int16_clocked.ice => blocks/int_math_sd/int16/nop_int16_clocked.ice (100%) rename select_int16.ice => blocks/int_math_sd/int16/select_int16.ice (100%) rename sub_int16_sat.ice => blocks/int_math_sd/int16/sub_int16_sat.ice (100%) rename abs_int24.ice => blocks/int_math_sd/int24/abs_int24.ice (100%) rename add_int24_sat.ice => blocks/int_math_sd/int24/add_int24_sat.ice (100%) rename compare_int24.ice => blocks/int_math_sd/int24/compare_int24.ice (100%) rename div_int24.ice => blocks/int_math_sd/int24/div_int24.ice (100%) rename max_int24.ice => blocks/int_math_sd/int24/max_int24.ice (100%) rename min_int24.ice => blocks/int_math_sd/int24/min_int24.ice (100%) rename mul_int24_48.ice => blocks/int_math_sd/int24/mul_int24_48.ice (100%) create mode 100644 blocks/int_math_sd/int24/muldiv_int16_sat.ice rename muldiv_int24.ice => blocks/int_math_sd/int24/muldiv_int24.ice (100%) rename neg_int24.ice => blocks/int_math_sd/int24/neg_int24.ice (100%) rename nop_int24.ice => blocks/int_math_sd/int24/nop_int24.ice (100%) rename nop_int24_clocked.ice => blocks/int_math_sd/int24/nop_int24_clocked.ice (100%) rename select_int24.ice => blocks/int_math_sd/int24/select_int24.ice (100%) rename sub_int24_sat.ice => blocks/int_math_sd/int24/sub_int24_sat.ice (100%) rename add_int32_sat.ice => blocks/int_math_sd/int32/add_int32_sat.ice (100%) rename div_int32.ice => blocks/int_math_sd/int32/div_int32.ice (100%) rename div_int32_16.ice => blocks/int_math_sd/int32/div_int32_16.ice (100%) rename sub_int32_sat.ice => blocks/int_math_sd/int32/sub_int32_sat.ice (100%) rename div_int48_24.ice => blocks/int_math_sd/int48/div_int48_24.ice (100%) rename mul_int8_16.ice => blocks/int_math_sd/int8/mul_int8_16.ice (100%) rename div_uint16.ice => blocks/int_math_sd/uint16/div_uint16.ice (100%) rename sqrt_uint16.ice => blocks/int_math_sd/uint16/sqrt_uint16.ice (100%) rename div_uint24.ice => blocks/int_math_sd/uint24/div_uint24.ice (100%) rename sqrt_uint24.ice => blocks/int_math_sd/uint24/sqrt_uint24.ice (100%) rename div_uint32.ice => blocks/int_math_sd/uint32/div_uint32.ice (100%) rename sqrt_uint32.ice => blocks/int_math_sd/uint32/sqrt_uint32.ice (100%) rename timer_16bits.ice => blocks/utils/timer_16bits.ice (100%) rename test_serial_muldiv_int16.ice => examples/test_serial_muldiv_int16.ice (100%) rename test_serial_sqrt_uint16.ice => examples/test_serial_sqrt_uint16.ice (100%) delete mode 100644 int_math_Collection_sd.zip create mode 100644 locale/en/en.po create mode 100644 locale/translation.js delete mode 100644 muldiv_int16.ice create mode 100644 package.json diff --git a/LICENSE b/LICENSE index 20ab941..23cb790 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,339 @@ -MIT License - -Copyright (c) 2021 SiccoDwars - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/README.md b/README.md index 6d2f9da..2222f1c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,96 @@ -# Icestudio-ArithmeticBlocks -.ice blocks for FPGA signed and unsigned integer operations + - * / sqrt min max abs neg. 16, 24 and some 32 bits blocks -A collection of Icestudio blocks for signed integer digital signal processing and control applications. + +# arithmetic Collection + +[![Icestudio][icestudio-image]][icestudio-url] +![Version][version-image] + + +Signed arithmetic collections + + +## License + +Licensed under [LGPL-3.0](https://opensource.org/licenses/LGPL-3.0). + +## Install + +For installing and using this colection in Icestudio follow these steps: + +* Download the collection: [stable](https://github.com/FPGAwars/Icestudio-ArithmeticBlocks/archive/refs/tags/v0.1.0.zip) or [development](https://github.com/FPGAwars/Icestudio-ArithmeticBlocks/archive/refs/heads/main.zip) +* Install the collection: *Tools > Collections > Add* +* Select the collection: *Select > Collection* + + +## Blocks +* **int_math_sd** + * **int16** + * abs_int16 + * add_int16_sat + * compare_int16 + * div_int16 + * div_int16_clocked + * max_int16 + * min_int16 + * mul_int16 + * mul_int16_32 + * mul_int16_sat + * muldiv_int16_sat + * muldiv_int16_sat_clocked + * neg_int16 + * nop_int16 + * nop_int16_clocked + * select_int16 + * sub_int16_sat + * **int24** + * abs_int24 + * add_int24_sat + * compare_int24 + * div_int24 + * max_int24 + * min_int24 + * mul_int24_48 + * muldiv_int16_sat + * muldiv_int24 + * neg_int24 + * nop_int24 + * nop_int24_clocked + * select_int24 + * sub_int24_sat + * **int32** + * add_int32_sat + * div_int32 + * div_int32_16 + * sub_int32_sat + * **int48** + * div_int48_24 + * **int8** + * mul_int8_16 + * **uint16** + * div_uint16 + * sqrt_uint16 + * **uint24** + * div_uint24 + * sqrt_uint24 + * **uint32** + * div_uint32 + * sqrt_uint32 +* **utils** + * timer_16bits + +## Examples +* test_serial_muldiv_int16 +* test_serial_sqrt_uint16 + +## Authors +* [SiccoDwars](https://github.com/SiccoDwars) + + + +------- + + + +[icestudio-image]: https://img.shields.io/badge/collection-icestudio-blue.svg +[icestudio-url]: https://github.com/FPGAwars/icestudio +[version-image]: https://img.shields.io/badge/version-v0.1.0-orange.svg diff --git a/abs_int16.ice b/blocks/int_math_sd/int16/abs_int16.ice similarity index 100% rename from abs_int16.ice rename to blocks/int_math_sd/int16/abs_int16.ice diff --git a/add_int16_sat.ice b/blocks/int_math_sd/int16/add_int16_sat.ice similarity index 100% rename from add_int16_sat.ice rename to blocks/int_math_sd/int16/add_int16_sat.ice diff --git a/compare_int16.ice b/blocks/int_math_sd/int16/compare_int16.ice similarity index 100% rename from compare_int16.ice rename to blocks/int_math_sd/int16/compare_int16.ice diff --git a/div_int16.ice b/blocks/int_math_sd/int16/div_int16.ice similarity index 100% rename from div_int16.ice rename to blocks/int_math_sd/int16/div_int16.ice diff --git a/div_int16_clocked.ice b/blocks/int_math_sd/int16/div_int16_clocked.ice similarity index 100% rename from div_int16_clocked.ice rename to blocks/int_math_sd/int16/div_int16_clocked.ice diff --git a/max_int16.ice b/blocks/int_math_sd/int16/max_int16.ice similarity index 100% rename from max_int16.ice rename to blocks/int_math_sd/int16/max_int16.ice diff --git a/min_int16.ice b/blocks/int_math_sd/int16/min_int16.ice similarity index 100% rename from min_int16.ice rename to blocks/int_math_sd/int16/min_int16.ice diff --git a/mul_int16.ice b/blocks/int_math_sd/int16/mul_int16.ice similarity index 100% rename from mul_int16.ice rename to blocks/int_math_sd/int16/mul_int16.ice diff --git a/mul_int16_32.ice b/blocks/int_math_sd/int16/mul_int16_32.ice similarity index 100% rename from mul_int16_32.ice rename to blocks/int_math_sd/int16/mul_int16_32.ice diff --git a/mul_int16_sat.ice b/blocks/int_math_sd/int16/mul_int16_sat.ice similarity index 100% rename from mul_int16_sat.ice rename to blocks/int_math_sd/int16/mul_int16_sat.ice diff --git a/muldiv_int16_sat.ice b/blocks/int_math_sd/int16/muldiv_int16_sat.ice similarity index 100% rename from muldiv_int16_sat.ice rename to blocks/int_math_sd/int16/muldiv_int16_sat.ice diff --git a/muldiv_int16_sat_clocked.ice b/blocks/int_math_sd/int16/muldiv_int16_sat_clocked.ice similarity index 100% rename from muldiv_int16_sat_clocked.ice rename to blocks/int_math_sd/int16/muldiv_int16_sat_clocked.ice diff --git a/neg_int16.ice b/blocks/int_math_sd/int16/neg_int16.ice similarity index 100% rename from neg_int16.ice rename to blocks/int_math_sd/int16/neg_int16.ice diff --git a/nop_int16.ice b/blocks/int_math_sd/int16/nop_int16.ice similarity index 100% rename from nop_int16.ice rename to blocks/int_math_sd/int16/nop_int16.ice diff --git a/nop_int16_clocked.ice b/blocks/int_math_sd/int16/nop_int16_clocked.ice similarity index 100% rename from nop_int16_clocked.ice rename to blocks/int_math_sd/int16/nop_int16_clocked.ice diff --git a/select_int16.ice b/blocks/int_math_sd/int16/select_int16.ice similarity index 100% rename from select_int16.ice rename to blocks/int_math_sd/int16/select_int16.ice diff --git a/sub_int16_sat.ice b/blocks/int_math_sd/int16/sub_int16_sat.ice similarity index 100% rename from sub_int16_sat.ice rename to blocks/int_math_sd/int16/sub_int16_sat.ice diff --git a/abs_int24.ice b/blocks/int_math_sd/int24/abs_int24.ice similarity index 100% rename from abs_int24.ice rename to blocks/int_math_sd/int24/abs_int24.ice diff --git a/add_int24_sat.ice b/blocks/int_math_sd/int24/add_int24_sat.ice similarity index 100% rename from add_int24_sat.ice rename to blocks/int_math_sd/int24/add_int24_sat.ice diff --git a/compare_int24.ice b/blocks/int_math_sd/int24/compare_int24.ice similarity index 100% rename from compare_int24.ice rename to blocks/int_math_sd/int24/compare_int24.ice diff --git a/div_int24.ice b/blocks/int_math_sd/int24/div_int24.ice similarity index 100% rename from div_int24.ice rename to blocks/int_math_sd/int24/div_int24.ice diff --git a/max_int24.ice b/blocks/int_math_sd/int24/max_int24.ice similarity index 100% rename from max_int24.ice rename to blocks/int_math_sd/int24/max_int24.ice diff --git a/min_int24.ice b/blocks/int_math_sd/int24/min_int24.ice similarity index 100% rename from min_int24.ice rename to blocks/int_math_sd/int24/min_int24.ice diff --git a/mul_int24_48.ice b/blocks/int_math_sd/int24/mul_int24_48.ice similarity index 100% rename from mul_int24_48.ice rename to blocks/int_math_sd/int24/mul_int24_48.ice diff --git a/blocks/int_math_sd/int24/muldiv_int16_sat.ice b/blocks/int_math_sd/int24/muldiv_int16_sat.ice new file mode 100644 index 0000000..87aee9c --- /dev/null +++ b/blocks/int_math_sd/int24/muldiv_int16_sat.ice @@ -0,0 +1,553 @@ +{ + "version": "1.2", + "package": { + "name": "muldiv_int16_sat", + "version": "1.0", + "description": "16 bits signed integer multiplication and division with minint,maxint saturation, 100%=16384", + "author": "Sicco Dwars", + "image": "%3Csvg%20width=%22800%22%20height=%22600%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Ctitle%3ELayer%201%3C/title%3E%3Ctext%20fill=%22#46673D%22%20stroke-width=%220%22%20x=%22138.638%22%20y=%22173.671%22%20font-size=%2224%22%20font-family=%22sans-serif%22%20stroke=%22#000%22%20transform=%22matrix(6.12846%200%200%2014.5988%20-734.172%20-2177.67)%22%3EMULDIV%3C/text%3E%3Ctext%20stroke-width=%220%22%20x=%22407.223%22%20y=%22473.289%22%20font-size=%2224%22%20font-family=%22sans-serif%22%20stroke=%22#000%22%20transform=%22matrix(6.02479%200%200%203.13937%20-2371.17%20-955.151)%22%3Eint_16_sat%3C/text%3E%3Ctext%20font-family=%22sans-serif%22%20font-size=%2224%22%20y=%2284%22%20x=%2216%22%20stroke-width=%220%22%20stroke=%22#000%22%3EA%3C/text%3E%3Ctext%20font-family=%22sans-serif%22%20font-size=%2224%22%20y=%22271%22%20x=%2213%22%20stroke-width=%220%22%20stroke=%22#000%22%3E*%3C/text%3E%3Ctext%20font-family=%22sans-serif%22%20font-size=%2224%22%20y=%22456%22%20x=%2214%22%20stroke-width=%220%22%20stroke=%22#000%22%3E/%3C/text%3E%3C/svg%3E" + }, + "design": { + "board": "iCEBreaker", + "graph": { + "blocks": [ + { + "id": "a947797a-75f6-419b-8ebc-98ee46ff3307", + "type": "basic.output", + "data": { + "name": "y", + "range": "[15:0]", + "pins": [ + { + "index": "15", + "name": "", + "value": "" + }, + { + "index": "14", + "name": "", + "value": "" + }, + { + "index": "13", + "name": "", + "value": "" + }, + { + "index": "12", + "name": "", + "value": "" + }, + { + "index": "11", + "name": "", + "value": "" + }, + { + "index": "10", + "name": "", + "value": "" + }, + { + "index": "9", + "name": "", + "value": "" + }, + { + "index": "8", + "name": "", + "value": "" + }, + { + "index": "7", + "name": "", + "value": "" + }, + { + "index": "6", + "name": "", + "value": "" + }, + { + "index": "5", + "name": "", + "value": "" + }, + { + "index": "4", + "name": "", + "value": "" + }, + { + "index": "3", + "name": "", + "value": "" + }, + { + "index": "2", + "name": "", + "value": "" + }, + { + "index": "1", + "name": "", + "value": "" + }, + { + "index": "0", + "name": "", + "value": "" + } + ], + "virtual": true + }, + "position": { + "x": 784, + "y": -24 + } + }, + { + "id": "4d45fe21-e51e-4794-8198-1a724fcfcfe4", + "type": "basic.input", + "data": { + "name": "a", + "range": "[15:0]", + "pins": [ + { + "index": "15", + "name": "", + "value": "" + }, + { + "index": "14", + "name": "", + "value": "" + }, + { + "index": "13", + "name": "", + "value": "" + }, + { + "index": "12", + "name": "", + "value": "" + }, + { + "index": "11", + "name": "", + "value": "" + }, + { + "index": "10", + "name": "", + "value": "" + }, + { + "index": "9", + "name": "", + "value": "" + }, + { + "index": "8", + "name": "", + "value": "" + }, + { + "index": "7", + "name": "", + "value": "" + }, + { + "index": "6", + "name": "", + "value": "" + }, + { + "index": "5", + "name": "", + "value": "" + }, + { + "index": "4", + "name": "", + "value": "" + }, + { + "index": "3", + "name": "", + "value": "" + }, + { + "index": "2", + "name": "", + "value": "" + }, + { + "index": "1", + "name": "", + "value": "" + }, + { + "index": "0", + "name": "", + "value": "" + } + ], + "virtual": true, + "clock": false + }, + "position": { + "x": -8, + "y": -24 + } + }, + { + "id": "7376e6a0-ed86-48b1-b06f-59cfe1915a37", + "type": "basic.output", + "data": { + "name": "clipMaxInt", + "pins": [ + { + "index": "0", + "name": "NULL", + "value": "NULL" + } + ], + "virtual": true + }, + "position": { + "x": 792, + "y": 80 + } + }, + { + "id": "62db479e-f47e-4d03-9093-d3610ae08709", + "type": "basic.input", + "data": { + "name": "mul", + "range": "[15:0]", + "pins": [ + { + "index": "15", + "name": "", + "value": "" + }, + { + "index": "14", + "name": "", + "value": "" + }, + { + "index": "13", + "name": "", + "value": "" + }, + { + "index": "12", + "name": "", + "value": "" + }, + { + "index": "11", + "name": "", + "value": "" + }, + { + "index": "10", + "name": "", + "value": "" + }, + { + "index": "9", + "name": "", + "value": "" + }, + { + "index": "8", + "name": "", + "value": "" + }, + { + "index": "7", + "name": "", + "value": "" + }, + { + "index": "6", + "name": "", + "value": "" + }, + { + "index": "5", + "name": "", + "value": "" + }, + { + "index": "4", + "name": "", + "value": "" + }, + { + "index": "3", + "name": "", + "value": "" + }, + { + "index": "2", + "name": "", + "value": "" + }, + { + "index": "1", + "name": "", + "value": "" + }, + { + "index": "0", + "name": "", + "value": "" + } + ], + "virtual": true, + "clock": false + }, + "position": { + "x": 0, + "y": 80 + } + }, + { + "id": "5aad4260-c2e8-44ca-a726-52122bc47a1e", + "type": "basic.output", + "data": { + "name": "clipMinInt", + "pins": [ + { + "index": "0", + "name": "NULL", + "value": "NULL" + } + ], + "virtual": true + }, + "position": { + "x": 792, + "y": 176 + } + }, + { + "id": "261ad5a4-3233-4df3-a493-9fa7894c09c4", + "type": "basic.input", + "data": { + "name": "div", + "range": "[15:0]", + "pins": [ + { + "index": "15", + "name": "", + "value": "" + }, + { + "index": "14", + "name": "", + "value": "" + }, + { + "index": "13", + "name": "", + "value": "" + }, + { + "index": "12", + "name": "", + "value": "" + }, + { + "index": "11", + "name": "", + "value": "" + }, + { + "index": "10", + "name": "", + "value": "" + }, + { + "index": "9", + "name": "", + "value": "" + }, + { + "index": "8", + "name": "", + "value": "" + }, + { + "index": "7", + "name": "", + "value": "" + }, + { + "index": "6", + "name": "", + "value": "" + }, + { + "index": "5", + "name": "", + "value": "" + }, + { + "index": "4", + "name": "", + "value": "" + }, + { + "index": "3", + "name": "", + "value": "" + }, + { + "index": "2", + "name": "", + "value": "" + }, + { + "index": "1", + "name": "", + "value": "" + }, + { + "index": "0", + "name": "", + "value": "" + } + ], + "virtual": true, + "clock": false + }, + "position": { + "x": 0, + "y": 176 + } + }, + { + "id": "1305a83f-5378-4d61-a0ab-8ad1e8b196d4", + "type": "basic.code", + "data": { + "code": "// y = (a * mul) / div; signed 16 bits integers, coerce product y in [-32768..32767 range]\n\nwire signed [31:0] product32bits;\nwire signed [31:0] div32bits;\n\nassign product32bits = $signed(a) * $signed(mul);\nassign div32bits = product32bits / $signed(div);\nassign clipMinInt = (div32bits < -32768);\nassign clipMaxInt = (div32bits > 32767);\n\nassign y = (a==0) ? 0 : clipMinInt ? -32768 : clipMaxInt ? 32767 : div32bits[15:0];\n", + "params": [], + "ports": { + "in": [ + { + "name": "a", + "range": "[15:0]", + "size": 16 + }, + { + "name": "mul", + "range": "[15:0]", + "size": 16 + }, + { + "name": "div", + "range": "[15:0]", + "size": 16 + } + ], + "out": [ + { + "name": "y", + "range": "[15:0]", + "size": 16 + }, + { + "name": "clipMaxInt" + }, + { + "name": "clipMinInt" + } + ] + } + }, + "position": { + "x": 224, + "y": -40 + }, + "size": { + "width": 472, + "height": 296 + } + } + ], + "wires": [ + { + "source": { + "block": "4d45fe21-e51e-4794-8198-1a724fcfcfe4", + "port": "out" + }, + "target": { + "block": "1305a83f-5378-4d61-a0ab-8ad1e8b196d4", + "port": "a" + }, + "size": 16 + }, + { + "source": { + "block": "1305a83f-5378-4d61-a0ab-8ad1e8b196d4", + "port": "clipMaxInt" + }, + "target": { + "block": "7376e6a0-ed86-48b1-b06f-59cfe1915a37", + "port": "in" + } + }, + { + "source": { + "block": "1305a83f-5378-4d61-a0ab-8ad1e8b196d4", + "port": "clipMinInt" + }, + "target": { + "block": "5aad4260-c2e8-44ca-a726-52122bc47a1e", + "port": "in" + } + }, + { + "source": { + "block": "1305a83f-5378-4d61-a0ab-8ad1e8b196d4", + "port": "y" + }, + "target": { + "block": "a947797a-75f6-419b-8ebc-98ee46ff3307", + "port": "in" + }, + "size": 16 + }, + { + "source": { + "block": "62db479e-f47e-4d03-9093-d3610ae08709", + "port": "out" + }, + "target": { + "block": "1305a83f-5378-4d61-a0ab-8ad1e8b196d4", + "port": "mul" + }, + "size": 16 + }, + { + "source": { + "block": "261ad5a4-3233-4df3-a493-9fa7894c09c4", + "port": "out" + }, + "target": { + "block": "1305a83f-5378-4d61-a0ab-8ad1e8b196d4", + "port": "div" + }, + "size": 16 + } + ] + } + }, + "dependencies": {} +} \ No newline at end of file diff --git a/muldiv_int24.ice b/blocks/int_math_sd/int24/muldiv_int24.ice similarity index 100% rename from muldiv_int24.ice rename to blocks/int_math_sd/int24/muldiv_int24.ice diff --git a/neg_int24.ice b/blocks/int_math_sd/int24/neg_int24.ice similarity index 100% rename from neg_int24.ice rename to blocks/int_math_sd/int24/neg_int24.ice diff --git a/nop_int24.ice b/blocks/int_math_sd/int24/nop_int24.ice similarity index 100% rename from nop_int24.ice rename to blocks/int_math_sd/int24/nop_int24.ice diff --git a/nop_int24_clocked.ice b/blocks/int_math_sd/int24/nop_int24_clocked.ice similarity index 100% rename from nop_int24_clocked.ice rename to blocks/int_math_sd/int24/nop_int24_clocked.ice diff --git a/select_int24.ice b/blocks/int_math_sd/int24/select_int24.ice similarity index 100% rename from select_int24.ice rename to blocks/int_math_sd/int24/select_int24.ice diff --git a/sub_int24_sat.ice b/blocks/int_math_sd/int24/sub_int24_sat.ice similarity index 100% rename from sub_int24_sat.ice rename to blocks/int_math_sd/int24/sub_int24_sat.ice diff --git a/add_int32_sat.ice b/blocks/int_math_sd/int32/add_int32_sat.ice similarity index 100% rename from add_int32_sat.ice rename to blocks/int_math_sd/int32/add_int32_sat.ice diff --git a/div_int32.ice b/blocks/int_math_sd/int32/div_int32.ice similarity index 100% rename from div_int32.ice rename to blocks/int_math_sd/int32/div_int32.ice diff --git a/div_int32_16.ice b/blocks/int_math_sd/int32/div_int32_16.ice similarity index 100% rename from div_int32_16.ice rename to blocks/int_math_sd/int32/div_int32_16.ice diff --git a/sub_int32_sat.ice b/blocks/int_math_sd/int32/sub_int32_sat.ice similarity index 100% rename from sub_int32_sat.ice rename to blocks/int_math_sd/int32/sub_int32_sat.ice diff --git a/div_int48_24.ice b/blocks/int_math_sd/int48/div_int48_24.ice similarity index 100% rename from div_int48_24.ice rename to blocks/int_math_sd/int48/div_int48_24.ice diff --git a/mul_int8_16.ice b/blocks/int_math_sd/int8/mul_int8_16.ice similarity index 100% rename from mul_int8_16.ice rename to blocks/int_math_sd/int8/mul_int8_16.ice diff --git a/div_uint16.ice b/blocks/int_math_sd/uint16/div_uint16.ice similarity index 100% rename from div_uint16.ice rename to blocks/int_math_sd/uint16/div_uint16.ice diff --git a/sqrt_uint16.ice b/blocks/int_math_sd/uint16/sqrt_uint16.ice similarity index 100% rename from sqrt_uint16.ice rename to blocks/int_math_sd/uint16/sqrt_uint16.ice diff --git a/div_uint24.ice b/blocks/int_math_sd/uint24/div_uint24.ice similarity index 100% rename from div_uint24.ice rename to blocks/int_math_sd/uint24/div_uint24.ice diff --git a/sqrt_uint24.ice b/blocks/int_math_sd/uint24/sqrt_uint24.ice similarity index 100% rename from sqrt_uint24.ice rename to blocks/int_math_sd/uint24/sqrt_uint24.ice diff --git a/div_uint32.ice b/blocks/int_math_sd/uint32/div_uint32.ice similarity index 100% rename from div_uint32.ice rename to blocks/int_math_sd/uint32/div_uint32.ice diff --git a/sqrt_uint32.ice b/blocks/int_math_sd/uint32/sqrt_uint32.ice similarity index 100% rename from sqrt_uint32.ice rename to blocks/int_math_sd/uint32/sqrt_uint32.ice diff --git a/timer_16bits.ice b/blocks/utils/timer_16bits.ice similarity index 100% rename from timer_16bits.ice rename to blocks/utils/timer_16bits.ice diff --git a/test_serial_muldiv_int16.ice b/examples/test_serial_muldiv_int16.ice similarity index 100% rename from test_serial_muldiv_int16.ice rename to examples/test_serial_muldiv_int16.ice diff --git a/test_serial_sqrt_uint16.ice b/examples/test_serial_sqrt_uint16.ice similarity index 100% rename from test_serial_sqrt_uint16.ice rename to examples/test_serial_sqrt_uint16.ice diff --git a/int_math_Collection_sd.zip b/int_math_Collection_sd.zip deleted file mode 100644 index 16d257fd0ad64ae2d680f146ea4719948e6a1d92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98547 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�A%$L{Q$l8q+=5>F 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 diff --git a/locale/en/en.po b/locale/en/en.po new file mode 100644 index 0000000..d35b87d --- /dev/null +++ b/locale/en/en.po @@ -0,0 +1,9 @@ +msgid "" +msgstr "" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Basepath: ..\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SearchPath-0: translation.js\n" diff --git a/locale/translation.js b/locale/translation.js new file mode 100644 index 0000000..ce7e23a --- /dev/null +++ b/locale/translation.js @@ -0,0 +1,162 @@ +// Translation document for the collection +// ======================================= +// This file contains the texts +// annotated for translation +// +// Instructions: +// 1. Open the PO file with Poedit +// 2. Press "Update" to update from sources + +gettext('int_math_sd'); +gettext('utils'); +gettext('int16'); +gettext('int24'); +gettext('int32'); +gettext('int48'); +gettext('int8'); +gettext('uint16'); +gettext('uint24'); +gettext('uint32'); +gettext('abs_int16'); +gettext('16 bits signed integer absolute value ( y = abs (a) ) '); +gettext('add_int16_sat'); +gettext('16 bits signed integer add with minint,maxint saturation'); +gettext('compare_int16'); +gettext('16 bits signed integer value comparator'); +gettext('div_int16'); +gettext('16 bits signed integer divider'); +gettext('div_int16_clocked'); +gettext('16 bits signed integer division, y = a * 16384 / b'); +gettext('max_int16'); +gettext('16 bits signed integer maximum value selector'); +gettext('min_int16'); +gettext('16 bits signed integer minimum value selector'); +gettext('mul_int16'); +gettext('mul_int16_32'); +gettext('16 bit inputs signed integer multiplier, 32 bits output'); +gettext('mul_int16_sat'); +gettext('16 bits signed integer multiplication with minint,maxint saturation, 100%=16384'); +gettext('muldiv_int16_sat'); +gettext('16 bits signed integer multiplication and division with minint,maxint saturation, 100%=16384'); +gettext('muldiv_int16_sat_clocked'); +gettext('clocked 16 bits signed integer multiplication and division with minint,maxint saturation'); +gettext('neg_int16'); +gettext('16 bits signed integer negation ( y = -a ) '); +gettext('nop_int16'); +gettext('16 bits signed integer no operation (y=a)'); +gettext('nop_int16_clocked'); +gettext('pos and neg edge d-flipflip, 16 bits'); +gettext('select_int16'); +gettext('16 bits signed integer value selector (switch, mux)'); +gettext('sub_int16_sat'); +gettext('16 bits signed integer subtract with minint,maxint saturation'); +gettext('abs_int24'); +gettext('24 bits signed integer absolute value ( y = abs (a) ) '); +gettext('add_int24_sat'); +gettext('24 bits signed integer add with minint,maxint saturation'); +gettext('compare_int24'); +gettext('24 bits signed integer value comparator'); +gettext('div_int24'); +gettext('24 bits signed integer divider'); +gettext('max_int24'); +gettext('24 bits signed integer maximum value selector'); +gettext('min_int24'); +gettext('24 bits signed integer minimum value selector'); +gettext('mul_int24_48'); +gettext('24 bit inputs signed integer multiplier, 48 bits output'); +gettext('muldiv_int16_sat'); +gettext('muldiv_int24'); +gettext('24 bits signed integer multiply divide with output saturation, 48 bits internal'); +gettext('Puerta OR'); +gettext('48 bits signed integer division, divide 48 bits numerator by a 24 bits int denominator, result in 24 bits int'); +gettext('neg_int24'); +gettext('24 bits signed integer negation ( y = -a ) '); +gettext('nop_int24'); +gettext('24 bits signed integer no operation (y=a)'); +gettext('nop_int24_clocked'); +gettext('pos and neg edge d-flipflip, 24 bits'); +gettext('select_int24'); +gettext('24 bits signed integer value selector (switch, mux)'); +gettext('sub_int24_sat'); +gettext('24 bits signed integer subtract with minint,maxint saturation'); +gettext('add_int32_sat'); +gettext('32 bits signed integer add with minint,maxint saturation'); +gettext('div_int32'); +gettext('32 bits signed integer divider'); +gettext('div_int32_16'); +gettext('32 bits signed integer division, divide 32 bits numerator by a 16 bits int denominator, result in 16 bits int'); +gettext('sub_int32_sat'); +gettext('32 bits signed integer subtract with minint,maxint saturation'); +gettext('div_int48_24'); +gettext('mul_int8_16'); +gettext('8 bit inputs signed integer multiplier, 16 bits output'); +gettext('div_uint16'); +gettext('16 bits unsigned divider'); +gettext('sqrt_uint16'); +gettext('16 bits unsigned integer square root'); +gettext('div_uint24'); +gettext('24 bits unsigned divider'); +gettext('sqrt_uint24'); +gettext('24 bits unsigned integer square root'); +gettext('div_uint32'); +gettext('32 bits unsigned divider'); +gettext('sqrt_uint32'); +gettext('32 bits unsigned integer square root'); +gettext('timer_16bits'); +gettext('measure time by counting clk periods between start and stop pulse'); +gettext('test_serial_muldiv_int16'); +gettext('Registro de 16 bits'); +gettext('Puerta NOT'); +gettext('Transmisor serie (hecho a partir de bloques)'); +gettext('Biestable de datos (Tipo D). Cuando se recibe un tic por load se captura el dato'); +gettext('Un bit constante a 1'); +gettext('Biestable con entradas de Set y Reset síncronas, para poner y quitar notaficaciones de eventos'); +gettext('Contador módulo M, ascendente, de 4 bits, con reset '); +gettext('Un simple cable pasivo, para organizar las conexiones complicadas'); +gettext('Corazón de tics para generar las velocidades de transmisión serie en baudios (Por defecto emite tics a 11500 baudios)'); +gettext('Registro de desplazamiento (derecha) de 9 bits'); +gettext('Agregador de buses de 8 y 2 bits a uno de 9bits'); +gettext('Un bit constante a 0'); +gettext('Detector de flanco de subida. Emite un tic cuando detecta un flanco ascendente'); +gettext('Convierte números (0..65535) introducidos desde el serial a binario de 16 bits.'); +gettext('Receptor serie asíncrono. Velocidad por defecto: 115200 baudios'); +gettext('Char detect & LF, CR, space & comma.'); +gettext('Comparador de un operando de 8 bits. Se compara si el operando es igual al parámetro'); +gettext('Puerta AND'); +gettext('Puerta OR de 4 entradas'); +gettext('Convierte un número ASCII a binario de 16 bits.'); +gettext('Registro doble de 16 bits, con entrada normal y el reset vale el ASCII 48 ----->'0'.'); +gettext('Registro de 8 bits ASCII'); +gettext('16 bits signed integer multiply divide with output saturation, 32 bits internal'); +gettext('Biestable De del sistema que hay que \nañadir para cumplir las reglas de diseño \nsíncrono: toda señal sacada al exterior, \nespecialmente si es un cable de comunicaciones \nasíncronas, debe pasar por un biestable'); +gettext('Este Biestable desde \nestar inicialmente \na 1, ya que es el \nvalor de reposo de la \nlínea serie'); +gettext('**Registro de**\n**Desplazamiento**'); +gettext('Conversión de los datos serie a \nparalelo, mediante un registro \nde 9 bits. Inicialmente tiene todos \nsus bits a 1, porque la línea está \nen reposo'); +gettext('**Biestable D**'); +gettext('Evento: Comienzo de \ntransmisión'); +gettext('Cargar el registro con \nel dato a enviar en el \narranque (0 -> 1)'); +gettext('**Biestable RS** \nEstado del transmisor'); +gettext('0: Parado. Sin transmitir \n1: Ocupado. Transmitiendo dato'); +gettext('**Generador de**\n**Baudios**'); +gettext('Contador de bits \ntransmitidos'); +gettext('El registro de desplazamiento \nes de 9 bits, para almacenar \nlos 8 bits de datos y \nel bit de comienzo (start)'); +gettext('Evento: Ultimo \nbit enviado'); +gettext('Al enviarse el último \nbit, se cambia el estado \na parado (reset)'); +gettext('**Cable pasivo** \nPara organizar el \ncableado del reloj'); +gettext('**Dato a transmitir**'); +gettext('**Bit de Stop**'); +gettext('**Bit de start**'); +gettext('**Tic de transmisión** \n¡Que comience la \ntransmisión!'); +gettext('**Línea serie**'); +gettext('**Tic de terminación (done)**'); +gettext('**Reloj del sistema**'); +gettext('**BAUDIOS**\n'); +gettext('El tic de terminación está un \nperiodo de reloj retrasado para \nque el transmisor pase al estado \nParado, y que todo se reinicie \nantes de que se pueda volve a \nenviar el siguiente caracter'); +gettext('El estado del transmisor \nse saca por la señal \nbusy'); +gettext('Arrancar el generar de baudios \nal activarse el transmisor'); +gettext('**Parámetro**: Módulo del contador'); +gettext('Estos registros de 8 bits con reset son especiales. Cuando recibe un reset no se pone a 0, sino a 48, que es el '0' ASCII.'); +gettext('Estos registros se inician con el valor 48 ('0' en ASCII).'); +gettext('Convierte el valor ASCII a binario.'); +gettext('Cuando recibe LF o CR produce un pulso en \"rst\" para el resto de caracteres da un pulso por \"tic\".'); +gettext('test_serial_sqrt_uint16'); diff --git a/muldiv_int16.ice b/muldiv_int16.ice deleted file mode 100644 index 7d7c70f..0000000 --- a/muldiv_int16.ice +++ /dev/null @@ -1,1007 +0,0 @@ -{ - "version": "1.2", - "package": { - "name": "muldiv_int16", - "version": "1.0", - "description": "16 bits signed integer multiply divide with output saturation, 32 bits internal", - "author": "Sicco Dwars", - "image": "%3Csvg%20width=%22800%22%20height=%22600%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Ctitle%3ELayer%201%3C/title%3E%3Ctext%20transform=%22matrix(6.12846%200%200%2014.5988%20-734.172%20-2177.67)%22%20stroke=%22#000%22%20font-family=%22sans-serif%22%20font-size=%2224%22%20y=%22173.671%22%20x=%22138.638%22%20stroke-width=%220%22%20fill=%22#46673D%22%3EMULDIV%3C/text%3E%3Ctext%20transform=%22matrix(6.02479%200%200%203.13937%20-2371.17%20-955.151)%22%20stroke=%22#000%22%20font-family=%22sans-serif%22%20font-size=%2224%22%20y=%22473.289%22%20x=%22407.223%22%20stroke-width=%220%22%3Eint_16_sat%3C/text%3E%3C/svg%3E" - }, - "design": { - "board": "iCEBreaker", - "graph": { - "blocks": [ - { - "id": "f1563461-afa3-4b7c-b465-b46a8c4261f8", - "type": "basic.output", - "data": { - "name": "done", - "virtual": true - }, - "position": { - "x": 1240, - "y": 104 - } - }, - { - "id": "e822434e-07c5-4913-b57c-fb4d972f3b63", - "type": "basic.input", - "data": { - "name": "clk", - "clock": false, - "virtual": true - }, - "position": { - "x": 256, - "y": 144 - } - }, - { - "id": "d45828e7-f230-4848-8ce7-24f76bd5c09f", - "type": "basic.output", - "data": { - "name": "busy", - "virtual": true - }, - "position": { - "x": 1232, - "y": 192 - } - }, - { - "id": "b512d541-6eb9-4c74-8331-dc769bd0392a", - "type": "basic.input", - "data": { - "name": "start", - "clock": false, - "virtual": true - }, - "position": { - "x": 256, - "y": 208 - } - }, - { - "id": "807b52c8-5bb6-4f9e-938c-9a23bf2f0d06", - "type": "basic.output", - "data": { - "name": "valid", - "virtual": true - }, - "position": { - "x": 1248, - "y": 272 - } - }, - { - "id": "422e51a3-1c43-4f6d-a220-d0d46ea1276f", - "type": "basic.input", - "data": { - "name": "x", - "range": "[15:0]", - "clock": false, - "size": 16, - "virtual": true - }, - "position": { - "x": 256, - "y": 280 - } - }, - { - "id": "f132e5bb-c3bb-4839-9f6f-536166893a40", - "type": "basic.input", - "data": { - "name": "MUL", - "range": "[15:0]", - "clock": false, - "size": 16, - "virtual": true - }, - "position": { - "x": 256, - "y": 352 - } - }, - { - "id": "93bf6126-4a59-4232-9bea-a4ae3849eb16", - "type": "basic.output", - "data": { - "name": "dbz", - "virtual": true - }, - "position": { - "x": 1240, - "y": 368 - } - }, - { - "id": "d845ff18-5941-4cd1-b7bf-36ae84f11bcb", - "type": "basic.output", - "data": { - "name": "y", - "range": "[15:0]", - "size": 16, - "virtual": true - }, - "position": { - "x": 1232, - "y": 464 - } - }, - { - "id": "cf54e7ab-4fa5-487d-83eb-b7ee3cedc6ae", - "type": "basic.input", - "data": { - "name": "DIV", - "range": "[15:0]", - "clock": false, - "size": 16, - "virtual": true - }, - "position": { - "x": 256, - "y": 472 - } - }, - { - "id": "7c9c402f-c54b-429b-9642-3254ac9c6935", - "type": "81613874c6152f06c06ed7014bf4235900cfcc30", - "position": { - "x": 1080, - "y": 192 - }, - "size": { - "width": 96, - "height": 64 - } - }, - { - "id": "22c1aea8-f98d-490e-a04f-3f5d8602bfe9", - "type": "79160940654c898c17e95b64f628b589752483f4", - "position": { - "x": 472, - "y": 240 - }, - "size": { - "width": 96, - "height": 128 - } - }, - { - "id": "adc610a6-3ec4-4137-913e-c1a76221fb06", - "type": "53e376e76eb0fbf461402cb00907f2bec8d9ff24", - "position": { - "x": 800, - "y": 224 - }, - "size": { - "width": 96, - "height": 192 - } - } - ], - "wires": [ - { - "source": { - "block": "7c9c402f-c54b-429b-9642-3254ac9c6935", - "port": "664caf9e-5f40-4df4-800a-b626af702e62" - }, - "target": { - "block": "d45828e7-f230-4848-8ce7-24f76bd5c09f", - "port": "in" - } - }, - { - "source": { - "block": "422e51a3-1c43-4f6d-a220-d0d46ea1276f", - "port": "out" - }, - "target": { - "block": "22c1aea8-f98d-490e-a04f-3f5d8602bfe9", - "port": "9ec9e347-b88c-48f5-86e0-606495e1ce43" - }, - "size": 16 - }, - { - "source": { - "block": "f132e5bb-c3bb-4839-9f6f-536166893a40", - "port": "out" - }, - "target": { - "block": "22c1aea8-f98d-490e-a04f-3f5d8602bfe9", - "port": "8d4a8181-ec5c-4309-948f-ae351261da55" - }, - "size": 16 - }, - { - "source": { - "block": "22c1aea8-f98d-490e-a04f-3f5d8602bfe9", - "port": "77545349-454a-4d5f-82e6-a8b1f6261f26" - }, - "target": { - "block": "7c9c402f-c54b-429b-9642-3254ac9c6935", - "port": "18c2ebc7-5152-439c-9b3f-851c59bac834" - }, - "vertices": [ - { - "x": 664, - "y": 232 - } - ] - }, - { - "source": { - "block": "e822434e-07c5-4913-b57c-fb4d972f3b63", - "port": "out" - }, - "target": { - "block": "22c1aea8-f98d-490e-a04f-3f5d8602bfe9", - "port": "c52eb53f-45ba-4dc2-a1ed-3471922053c3" - } - }, - { - "source": { - "block": "b512d541-6eb9-4c74-8331-dc769bd0392a", - "port": "out" - }, - "target": { - "block": "22c1aea8-f98d-490e-a04f-3f5d8602bfe9", - "port": "008bc8ae-2c14-480d-ad2a-b595e21d6980" - } - }, - { - "source": { - "block": "adc610a6-3ec4-4137-913e-c1a76221fb06", - "port": "77545349-454a-4d5f-82e6-a8b1f6261f26" - }, - "target": { - "block": "7c9c402f-c54b-429b-9642-3254ac9c6935", - "port": "97b51945-d716-4b6c-9db9-970d08541249" - } - }, - { - "source": { - "block": "adc610a6-3ec4-4137-913e-c1a76221fb06", - "port": "b594bd8c-4263-4b91-9aa3-591541041457" - }, - "target": { - "block": "f1563461-afa3-4b7c-b465-b46a8c4261f8", - "port": "in" - }, - "vertices": [ - { - "x": 984, - "y": 160 - } - ] - }, - { - "source": { - "block": "adc610a6-3ec4-4137-913e-c1a76221fb06", - "port": "fb0d9a68-cf3f-4768-b540-483468429470" - }, - "target": { - "block": "807b52c8-5bb6-4f9e-938c-9a23bf2f0d06", - "port": "in" - } - }, - { - "source": { - "block": "adc610a6-3ec4-4137-913e-c1a76221fb06", - "port": "2cf01ed6-9923-4eee-9fd0-1c9c9ca24346" - }, - "target": { - "block": "93bf6126-4a59-4232-9bea-a4ae3849eb16", - "port": "in" - } - }, - { - "source": { - "block": "adc610a6-3ec4-4137-913e-c1a76221fb06", - "port": "f82803bd-2218-4b79-bc5d-0b5fa6f00b59" - }, - "target": { - "block": "d845ff18-5941-4cd1-b7bf-36ae84f11bcb", - "port": "in" - }, - "size": 16 - }, - { - "source": { - "block": "cf54e7ab-4fa5-487d-83eb-b7ee3cedc6ae", - "port": "out" - }, - "target": { - "block": "adc610a6-3ec4-4137-913e-c1a76221fb06", - "port": "4ed0fc5b-2081-4c05-98e5-5262bcb776e5" - }, - "size": 16 - }, - { - "source": { - "block": "22c1aea8-f98d-490e-a04f-3f5d8602bfe9", - "port": "5b4ccfd9-6cb9-4e4a-92b9-540ff20533ff" - }, - "target": { - "block": "adc610a6-3ec4-4137-913e-c1a76221fb06", - "port": "de4d0ace-40c4-481b-b5f6-7a5fa629ee32" - }, - "size": 32 - }, - { - "source": { - "block": "22c1aea8-f98d-490e-a04f-3f5d8602bfe9", - "port": "b594bd8c-4263-4b91-9aa3-591541041457" - }, - "target": { - "block": "adc610a6-3ec4-4137-913e-c1a76221fb06", - "port": "008bc8ae-2c14-480d-ad2a-b595e21d6980" - } - }, - { - "source": { - "block": "e822434e-07c5-4913-b57c-fb4d972f3b63", - "port": "out" - }, - "target": { - "block": "adc610a6-3ec4-4137-913e-c1a76221fb06", - "port": "c52eb53f-45ba-4dc2-a1ed-3471922053c3" - } - } - ] - } - }, - "dependencies": { - "81613874c6152f06c06ed7014bf4235900cfcc30": { - "package": { - "name": "OR", - "version": "1.0.1", - "description": "Puerta OR", - "author": "Jesús Arroyo, Juan González", - "image": "%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20height=%22192.718%22%20width=%22383.697%22%20version=%221%22%3E%3Cpath%20d=%22M175.56%20188.718H84.527s30.345-42.538%2031.086-94.03c.743-51.49-31.821-90.294-31.821-90.294L176.109%204c46.445%201.948%20103.899%2053.44%20123.047%2093.678-32.601%2067.503-92.158%2089.79-123.596%2091.04z%22%20fill=%22none%22%20stroke=%22#000%22%20stroke-width=%228%22%20stroke-linecap=%22round%22%20stroke-linejoin=%22round%22/%3E%3Cpath%20d=%22M4.057%2047.292h99.605M4.883%20145.168h100.981M298.57%2098.89h81.07%22%20fill=%22none%22%20stroke=%22#000%22%20stroke-width=%228%22%20stroke-linecap=%22round%22/%3E%3Ctext%20style=%22line-height:125%25%22%20font-weight=%22400%22%20font-size=%2266.317%22%20y=%22121.28%22%20x=%22131.572%22%20font-family=%22sans-serif%22%20letter-spacing=%220%22%20word-spacing=%220%22%20fill=%22#00f%22%3E%3Ctspan%20font-weight=%22700%22%20y=%22121.28%22%20x=%22131.572%22%3EOR%3C/tspan%3E%3C/text%3E%3C/svg%3E" - }, - "design": { - "graph": { - "blocks": [ - { - "id": "18c2ebc7-5152-439c-9b3f-851c59bac834", - "type": "basic.input", - "data": { - "name": "" - }, - "position": { - "x": 64, - "y": 88 - } - }, - { - "id": "664caf9e-5f40-4df4-800a-b626af702e62", - "type": "basic.output", - "data": { - "name": "" - }, - "position": { - "x": 784, - "y": 152 - } - }, - { - "id": "97b51945-d716-4b6c-9db9-970d08541249", - "type": "basic.input", - "data": { - "name": "" - }, - "position": { - "x": 64, - "y": 224 - } - }, - { - "id": "00925b04-5004-4307-a737-fa4e97c8b6ab", - "type": "basic.code", - "data": { - "code": "//-- Puerta OR\n\n//-- module and (input wire a, input wire b,\n//-- output wire c);\n\nassign c = a | b;\n\n//-- endmodule", - "params": [], - "ports": { - "in": [ - { - "name": "a" - }, - { - "name": "b" - } - ], - "out": [ - { - "name": "c" - } - ] - } - }, - "position": { - "x": 256, - "y": 48 - }, - "size": { - "width": 464, - "height": 272 - } - } - ], - "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" - } - } - ] - } - } - }, - "79160940654c898c17e95b64f628b589752483f4": { - "package": { - "name": "mul_int16_32", - "version": "1.0", - "description": "16 bit inputs signed integer multiplier, 32 bits output", - "author": "", - "image": "%3Csvg%20width=%22800%22%20height=%22600%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Ctitle%3ELayer%201%3C/title%3E%3Ctext%20transform=%22matrix(13.559%200%200%2014.5989%20-1767.64%20-2201.72)%22%20stroke=%22#000%22%20font-family=%22sans-serif%22%20font-size=%2224%22%20y=%22173.397%22%20x=%22135.701%22%20stroke-width=%220%22%20fill=%22#46673D%22%3EMUL%3C/text%3E%3Ctext%20transform=%22matrix(6.40974%200%200%205.3641%20-2559.75%20-1996.65)%22%20stroke=%22#000%22%20font-family=%22sans-serif%22%20font-size=%2224%22%20y=%22473.289%22%20x=%22407.223%22%20stroke-width=%220%22%20cursor=%22text%22%3Eint_16_32%3C/text%3E%3C/svg%3E" - }, - "design": { - "graph": { - "blocks": [ - { - "id": "c52eb53f-45ba-4dc2-a1ed-3471922053c3", - "type": "basic.input", - "data": { - "name": "clk", - "clock": false - }, - "position": { - "x": 304, - "y": 160 - } - }, - { - "id": "b594bd8c-4263-4b91-9aa3-591541041457", - "type": "basic.output", - "data": { - "name": "done" - }, - "position": { - "x": 1616, - "y": 192 - } - }, - { - "id": "008bc8ae-2c14-480d-ad2a-b595e21d6980", - "type": "basic.input", - "data": { - "name": "start", - "clock": false - }, - "position": { - "x": 296, - "y": 344 - } - }, - { - "id": "77545349-454a-4d5f-82e6-a8b1f6261f26", - "type": "basic.output", - "data": { - "name": "busy" - }, - "position": { - "x": 1616, - "y": 440 - } - }, - { - "id": "9ec9e347-b88c-48f5-86e0-606495e1ce43", - "type": "basic.input", - "data": { - "name": "a", - "range": "[15:0]", - "clock": false, - "size": 16 - }, - "position": { - "x": 296, - "y": 528 - } - }, - { - "id": "5b4ccfd9-6cb9-4e4a-92b9-540ff20533ff", - "type": "basic.output", - "data": { - "name": "y", - "range": "[31:0]", - "size": 32 - }, - "position": { - "x": 1632, - "y": 680 - } - }, - { - "id": "8d4a8181-ec5c-4309-948f-ae351261da55", - "type": "basic.input", - "data": { - "name": "b", - "range": "[15:0]", - "clock": false, - "size": 16 - }, - "position": { - "x": 296, - "y": 712 - } - }, - { - "id": "396814a2-9764-4311-96f8-10d766e29af3", - "type": "basic.code", - "data": { - "code": "// y = a * b, signed integers\r\n\r\nlocalparam N = 16;\r\n\r\nreg [(N+N-1):0] y = 0;\r\nreg out_valid;\r\nreg ready = 1;\r\nreg pulse_done = 0;\r\nreg busy = 0;\r\n\r\nreg [N-1:0] A;\r\nreg [N-1:0] B;\r\nreg [$clog2(N+1)-1:0] state = 0;\r\nreg [N-1:0] work; \r\nreg [N-2:0] resultLsb;\r\n\r\nwire [N-1:0] pp = {N{A[0]}} & B;\r\nwire [N-1:0] pMod1 = {~pp[N-1], pp[N-2:0]};\r\nwire [N-1:0] pMod2 = ~pMod1;\r\nwire [N:0] sum12 = work + ((state == N) ? pMod2 : pMod1);\r\nwire [N:0] sum1 = sum12;\r\nwire [N:0] sum2 = sum12;\r\n \r\nreg prev_start = 0; \r\n \r\nalways @(posedge clk) \r\nbegin\r\n out_valid <= 0;\r\n A <= {1'bx, A[N-1:1]}; \r\n case (state)\r\n\t 0:\r\n\t begin \r\n\t pulse_done <= 0;\r\n\t busy <= 0;\r\n\t end\r\n\t 1: begin\r\n\t work <= {1'b1, pMod1[N-1:1]};\r\n\t resultLsb <= {pMod1[0], {N-2{1'bx}}};\r\n\t state <= state + 1;\r\n\t end\r\n\t default: \r\n\t begin\r\n\t work <= sum1[N:1];\r\n\t resultLsb <= {sum1[0], resultLsb[N-2:1]};\t \r\n\t state <= state + 1;\r\n\t end\r\n\t N: \r\n\t begin\r\n\t y <= {~sum2[N], sum2[N-1:0], resultLsb};\r\n\t out_valid <= 1;\r\n\t pulse_done <= 1;\r\n\t work <= 'bx;\r\n\t state <= 0;\r\n\t resultLsb <= 'bx;\r\n\t B <= 'bx;\r\n\t ready <= 1;\t \r\n\t end\r\n endcase\r\n \r\n if (start && !prev_start) \r\n begin\r\n\t A <= a;\r\n\t B <= b;\r\n\t state <= 1;\r\n\t ready <= 0;\r\n\t busy <= 1;\r\n end\r\n \r\n prev_start <= start;\r\nend", - "params": [], - "ports": { - "in": [ - { - "name": "clk" - }, - { - "name": "start" - }, - { - "name": "a", - "range": "[15:0]", - "size": 16 - }, - { - "name": "b", - "range": "[15:0]", - "size": 16 - } - ], - "out": [ - { - "name": "pulse_done" - }, - { - "name": "busy" - }, - { - "name": "y", - "range": "[31:0]", - "size": 32 - } - ] - } - }, - "position": { - "x": 488, - "y": 104 - }, - "size": { - "width": 1032, - "height": 728 - } - } - ], - "wires": [ - { - "source": { - "block": "008bc8ae-2c14-480d-ad2a-b595e21d6980", - "port": "out" - }, - "target": { - "block": "396814a2-9764-4311-96f8-10d766e29af3", - "port": "start" - } - }, - { - "source": { - "block": "c52eb53f-45ba-4dc2-a1ed-3471922053c3", - "port": "out" - }, - "target": { - "block": "396814a2-9764-4311-96f8-10d766e29af3", - "port": "clk" - } - }, - { - "source": { - "block": "396814a2-9764-4311-96f8-10d766e29af3", - "port": "busy" - }, - "target": { - "block": "77545349-454a-4d5f-82e6-a8b1f6261f26", - "port": "in" - } - }, - { - "source": { - "block": "396814a2-9764-4311-96f8-10d766e29af3", - "port": "pulse_done" - }, - "target": { - "block": "b594bd8c-4263-4b91-9aa3-591541041457", - "port": "in" - } - }, - { - "source": { - "block": "396814a2-9764-4311-96f8-10d766e29af3", - "port": "y" - }, - "target": { - "block": "5b4ccfd9-6cb9-4e4a-92b9-540ff20533ff", - "port": "in" - }, - "size": 32 - }, - { - "source": { - "block": "9ec9e347-b88c-48f5-86e0-606495e1ce43", - "port": "out" - }, - "target": { - "block": "396814a2-9764-4311-96f8-10d766e29af3", - "port": "a" - }, - "size": 16 - }, - { - "source": { - "block": "8d4a8181-ec5c-4309-948f-ae351261da55", - "port": "out" - }, - "target": { - "block": "396814a2-9764-4311-96f8-10d766e29af3", - "port": "b" - }, - "size": 16 - } - ] - } - } - }, - "53e376e76eb0fbf461402cb00907f2bec8d9ff24": { - "package": { - "name": "div_int32_16", - "version": "1.0", - "description": "32 bits signed integer division, divide 32 bits numerator by a 16 bits int denominator, result in 16 bits int", - "author": "", - "image": "%3Csvg%20width=%22800%22%20height=%22600%22%20xmlns=%22http://www.w3.org/2000/svg%22%3E%3Ctitle%3ELayer%201%3C/title%3E%3Ctext%20transform=%22matrix(11.6228%200%200%2013.7183%20-1447.34%20-2037.34)%22%20stroke=%22#000%22%20font-family=%22sans-serif%22%20font-size=%2224%22%20y=%22173.397%22%20x=%22135.701%22%20stroke-width=%220%22%20fill=%22#46673D%22%20cursor=%22move%22%3EDIV%3C/text%3E%3Ctext%20transform=%22matrix(6.40974%200%200%205.3641%20-2559.75%20-1996.65)%22%20stroke=%22#000%22%20font-family=%22sans-serif%22%20font-size=%2224%22%20y=%22472.357%22%20x=%22410.655%22%20stroke-width=%220%22%20cursor=%22move%22%3Eint_32_16%3C/text%3E%3C/svg%3E" - }, - "design": { - "graph": { - "blocks": [ - { - "id": "b594bd8c-4263-4b91-9aa3-591541041457", - "type": "basic.output", - "data": { - "name": "done", - "virtual": true - }, - "position": { - "x": 1608, - "y": 136 - } - }, - { - "id": "c52eb53f-45ba-4dc2-a1ed-3471922053c3", - "type": "basic.input", - "data": { - "name": "clk", - "clock": false, - "virtual": true - }, - "position": { - "x": 304, - "y": 160 - } - }, - { - "id": "77545349-454a-4d5f-82e6-a8b1f6261f26", - "type": "basic.output", - "data": { - "name": "busy", - "virtual": true - }, - "position": { - "x": 1592, - "y": 256 - } - }, - { - "id": "008bc8ae-2c14-480d-ad2a-b595e21d6980", - "type": "basic.input", - "data": { - "name": "start", - "clock": false, - "virtual": true - }, - "position": { - "x": 296, - "y": 344 - } - }, - { - "id": "fb0d9a68-cf3f-4768-b540-483468429470", - "type": "basic.output", - "data": { - "name": "valid", - "virtual": true - }, - "position": { - "x": 1592, - "y": 376 - } - }, - { - "id": "2cf01ed6-9923-4eee-9fd0-1c9c9ca24346", - "type": "basic.output", - "data": { - "name": "dbz", - "virtual": true - }, - "position": { - "x": 1592, - "y": 496 - } - }, - { - "id": "de4d0ace-40c4-481b-b5f6-7a5fa629ee32", - "type": "basic.input", - "data": { - "name": "x", - "range": "[31:0]", - "clock": false, - "size": 32, - "virtual": true - }, - "position": { - "x": 296, - "y": 528 - } - }, - { - "id": "f82803bd-2218-4b79-bc5d-0b5fa6f00b59", - "type": "basic.output", - "data": { - "name": "q", - "range": "[15:0]", - "size": 16, - "virtual": true - }, - "position": { - "x": 1608, - "y": 616 - } - }, - { - "id": "4ed0fc5b-2081-4c05-98e5-5262bcb776e5", - "type": "basic.input", - "data": { - "name": "y", - "range": "[15:0]", - "clock": false, - "size": 16, - "virtual": true - }, - "position": { - "x": 296, - "y": 712 - } - }, - { - "id": "7d453a81-da0e-43df-be6e-ea315ff5a89b", - "type": "basic.output", - "data": { - "name": "r", - "range": "[31:0]", - "size": 32, - "virtual": true - }, - "position": { - "x": 1608, - "y": 736 - } - }, - { - "id": "396814a2-9764-4311-96f8-10d766e29af3", - "type": "basic.code", - "data": { - "code": "// q = a / b signed ints, a is 32 bits, b is 16 bits, q is 16 bits and coerced to [MININT..MAXINT]\r\n\r\nlocalparam N = 32;\r\nlocalparam NH = N >> 1;\r\nlocalparam NH_M1 = NH - 1;\r\n\r\nwire [N-1:0] xw;\r\nwire [N-1:0] yN;\r\n\r\nwire [N-1:0] yw;\r\n\r\nreg [N-1:0] y1;\r\nreg [N-1:0] q1;\r\nreg [N-1:0] q1_next;\r\nreg [N:0] ac;\r\nreg [N:0] ac_next;\r\nreg [$clog2(N)-1:0] i;\r\n\r\nreg pulse_done = 0;\r\nreg busy = 0;\r\nreg valid = 0;\r\nreg dbz = 0;\r\nreg signed [NH-1:0] q = 0;\r\nreg signed [N-1:0] r = 0;\r\nreg qs;\r\nreg xs;\r\n\r\nreg prev_start = 0;\r\n\r\nwire [N:0] ac_nextw;\r\n\r\nassign ac_nextw = ac - y1;\r\n\r\nassign xw = (a[N-1]) ? (~a + 1) : a;\r\nassign yN = b[NH_M1] ? {{NH{1'b1}}, b} : {{NH{1'b0}}, b};\r\nassign yw = yN[N-1] ? (~yN + 1) : yN;\r\n\r\nwire y_less_than_MININT;\r\nwire y_more_than_MAXINT;\r\n\r\nwire signed [NH_M1:0] MININT = {1'b1,{NH_M1{1'b0}}};\r\nwire signed [NH_M1:0] MAXINT = {1'b0,{NH_M1{1'b1}}};\r\n\r\nassign y_less_than_MININT = y[N-1] && (y[N-2:NH-1] != {NH{1'b1}});\r\nassign y_more_than_MAXINT = !y[N-1] && (y[N-2:NH-1] != {NH{1'b0}});\r\n\r\nwire signed [N-1:0] y = qs ? (~q1_next + 1) : q1_next;\r\nwire [NH-1:0] y_coerced = y_less_than_MININT ? MININT : y_more_than_MAXINT ? MAXINT : y[N-1:0];\r\n\r\nalways @(negedge clk) \r\nbegin\r\n if (ac >= {1'b0,y1}) \r\n {ac_next, q1_next} <= {ac_nextw[N-1:0], q1, 1'b1};\r\n else \r\n {ac_next, q1_next} <= {ac, q1} << 1;\r\nend\r\n\r\nalways @(posedge clk) \r\nbegin\r\n prev_start <= start;\r\n if (start && !prev_start) \r\n begin\r\n valid <= 0;\r\n i <= 0;\r\n if (b == 0) // divide by 0? \r\n begin\r\n if (a == 0)\r\n q <= 0;\r\n else\r\n q <= {NH{1'b1}};\r\n r <= 0;\r\n pulse_done <= 1;\r\n busy <= 0;\r\n dbz <= 1;\r\n end \r\n else \r\n begin\r\n busy <= 1;\r\n dbz <= 0;\r\n y1 <= yw;\r\n {ac, q1} <= {{N{1'b0}}, xw, 1'b0};\r\n qs <= a[N-1] ^ b[NH_M1];\r\n xs <= a[N-1];\r\n end\r\n end \r\n else \r\n if (busy) \r\n begin\r\n if (i == N-1) \r\n begin\r\n busy <= 0;\r\n valid <= 1;\r\n \r\n q <= y_coerced;\r\n\r\n if (xs)\r\n r <= ~ac_next[N:1] + 1;\r\n else\r\n r <= ac_next[N:1];\r\n pulse_done <= 1;\r\n end \r\n else \r\n begin\r\n i <= i + 1;\r\n ac <= ac_next;\r\n q1 <= q1_next;\r\n end\r\n end\r\n else\r\n begin\r\n pulse_done <= 0;\r\n end\r\nend\r\n", - "params": [], - "ports": { - "in": [ - { - "name": "clk" - }, - { - "name": "start" - }, - { - "name": "a", - "range": "[31:0]", - "size": 32 - }, - { - "name": "b", - "range": "[15:0]", - "size": 16 - } - ], - "out": [ - { - "name": "pulse_done" - }, - { - "name": "busy" - }, - { - "name": "valid" - }, - { - "name": "dbz" - }, - { - "name": "q", - "range": "[15:0]", - "size": 16 - }, - { - "name": "r", - "range": "[31:0]", - "size": 32 - } - ] - } - }, - "position": { - "x": 488, - "y": 104 - }, - "size": { - "width": 1032, - "height": 728 - } - } - ], - "wires": [ - { - "source": { - "block": "008bc8ae-2c14-480d-ad2a-b595e21d6980", - "port": "out" - }, - "target": { - "block": "396814a2-9764-4311-96f8-10d766e29af3", - "port": "start" - } - }, - { - "source": { - "block": "c52eb53f-45ba-4dc2-a1ed-3471922053c3", - "port": "out" - }, - "target": { - "block": "396814a2-9764-4311-96f8-10d766e29af3", - "port": "clk" - } - }, - { - "source": { - "block": "396814a2-9764-4311-96f8-10d766e29af3", - "port": "busy" - }, - "target": { - "block": "77545349-454a-4d5f-82e6-a8b1f6261f26", - "port": "in" - } - }, - { - "source": { - "block": "396814a2-9764-4311-96f8-10d766e29af3", - "port": "valid" - }, - "target": { - "block": "fb0d9a68-cf3f-4768-b540-483468429470", - "port": "in" - } - }, - { - "source": { - "block": "396814a2-9764-4311-96f8-10d766e29af3", - "port": "dbz" - }, - "target": { - "block": "2cf01ed6-9923-4eee-9fd0-1c9c9ca24346", - "port": "in" - } - }, - { - "source": { - "block": "396814a2-9764-4311-96f8-10d766e29af3", - "port": "pulse_done" - }, - "target": { - "block": "b594bd8c-4263-4b91-9aa3-591541041457", - "port": "in" - } - }, - { - "source": { - "block": "396814a2-9764-4311-96f8-10d766e29af3", - "port": "r" - }, - "target": { - "block": "7d453a81-da0e-43df-be6e-ea315ff5a89b", - "port": "in" - }, - "size": 32 - }, - { - "source": { - "block": "396814a2-9764-4311-96f8-10d766e29af3", - "port": "q" - }, - "target": { - "block": "f82803bd-2218-4b79-bc5d-0b5fa6f00b59", - "port": "in" - }, - "size": 16 - }, - { - "source": { - "block": "de4d0ace-40c4-481b-b5f6-7a5fa629ee32", - "port": "out" - }, - "target": { - "block": "396814a2-9764-4311-96f8-10d766e29af3", - "port": "a" - }, - "size": 32 - }, - { - "source": { - "block": "4ed0fc5b-2081-4c05-98e5-5262bcb776e5", - "port": "out" - }, - "target": { - "block": "396814a2-9764-4311-96f8-10d766e29af3", - "port": "b" - }, - "size": 16 - } - ] - } - } - } - } -} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..6d31eec --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "arithmetic", + "version": "0.1.0", + "description": "Signed arithmetic collections", + "keywords": ["integer", "signed", "arithmetic"], + "license": "LGPL-3.0", + "authors": [{ + "name": "SiccoDwars", + "email": "", + "url": "https://github.com/SiccoDwars" + }], + "repository": { + "type": "git", + "branch": "main", + "url": "https://github.com/FPGAwars/Icestudio-ArithmeticBlocks" + } +} From f5c2341b76667bf366a9eb5f54c3b4f1ecfcb76e Mon Sep 17 00:00:00 2001 From: obijuan Date: Wed, 11 Aug 2021 11:37:05 +0200 Subject: [PATCH 2/2] Readme updated --- README.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2222f1c..29b32b3 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Licensed under [LGPL-3.0](https://opensource.org/licenses/LGPL-3.0). For installing and using this colection in Icestudio follow these steps: -* Download the collection: [stable](https://github.com/FPGAwars/Icestudio-ArithmeticBlocks/archive/refs/tags/v0.1.0.zip) or [development](https://github.com/FPGAwars/Icestudio-ArithmeticBlocks/archive/refs/heads/main.zip) +* Download the collection: [stable](https://github.com/SiccoDwars/Icestudio-ArithmeticBlocks/archive/refs/tags/v0.1.0.zip) or [development](https://github.com/SiccoDwars/Icestudio-ArithmeticBlocks/archive/refs/heads/main.zip) * Install the collection: *Tools > Collections > Add* * Select the collection: *Select > Collection* diff --git a/package.json b/package.json index 6d31eec..95ec9a6 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,6 @@ "repository": { "type": "git", "branch": "main", - "url": "https://github.com/FPGAwars/Icestudio-ArithmeticBlocks" + "url": "https://github.com/SiccoDwars/Icestudio-ArithmeticBlocks" } }