edg


Nameedg JSON
Version 0.2.0 PyPI version JSON
download
home_pageNone
SummaryHardware description language for circuit boards
upload_time2024-07-14 20:10:35
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseBSD 3-Clause License Copyright (c) 2018-2020, The Regents of the University of California (Regents) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
keywords pcb hardware description language
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Polymorphic Blocks

![](https://github.com/BerkeleyHCI/PolymorphicBlocks/actions/workflows/pr-python.yml/badge.svg?branch=master)
![](https://github.com/BerkeleyHCI/PolymorphicBlocks/actions/workflows/pr-scala.yml/badge.svg?branch=master)
![](https://img.shields.io/github/license/BerkeleyHCI/PolymorphicBlocks.svg)
![Python](https://img.shields.io/badge/python-3.9-blue.svg)


Polymorphic Blocks is an open-source, Python-based [hardware description language (HDL)](https://en.wikipedia.org/wiki/Hardware_description_language) for [printed circuit boards (PCBs)](https://en.wikipedia.org/wiki/Printed_circuit_board).
By making use of programming concepts and capabilities, this project aims to **make circuit design faster and easier through high-level subcircuit library blocks** much like what makes software development so productive and approachable.
Underlying language features enable these libraries to be general across many applications and provide a high degree of design automation.

We've been using this system to create a variety of boards of varying complexity, [examples](#examples) range from a charlieplexed LED matrix to a USB source-measure unit.

### A Keyboard Example

An example of all this in action is this design for a USB keyboard with a 3x2 switch matrix:

<table>
<tr>
<td><b>User input</b></td>
<td><b>What this tool does</b></td>
</tr>

<tr style="vertical-align:top">
<td>

The board is defined using high-level library subcircuits blocks, including parameterized ones like the switch matrix.
Choices for internal components can also be specified as refinements, for example generic switches (used in the switch matrix) are refined to Kailh mechanical keyswitch sockets.

```python
class Keyboard(SimpleBoardTop):
  def contents(self) -> None:
    super().contents()

    self.usb = self.Block(UsbCReceptacle())
    self.reg = self.Block(Ldl1117(3.3*Volt(tol=0.05)))
    self.connect(self.usb.gnd, self.reg.gnd)
    self.connect(self.usb.pwr, self.reg.pwr_in)

    with self.implicit_connect(
            ImplicitConnect(self.reg.pwr_out, [Power]),
            ImplicitConnect(self.reg.gnd, [Common]),
    ) as imp:
      self.mcu = imp.Block(Stm32f103_48())
      self.connect(self.usb.usb, self.mcu.usb.request())

      self.sw = self.Block(SwitchMatrix(nrows=3, ncols=2))
      self.connect(self.sw.cols, self.mcu.gpio.request_vector())
      self.connect(self.sw.rows, self.mcu.gpio.request_vector())

  def refinements(self) -> Refinements:
    return super().refinements() + Refinements(
      class_refinements=[
        (Switch, KailhSocket),
      ],
    )
```

These library blocks contain logic to adjust the subcircuit based on how it is used or its parameters.
For example, the USB-C port generates the required CC pulldown resistors if a power delivery controller is not attached, and the STM32 generates the required crystal oscillator if USB is used.
This helps eliminate gotchas for the system designer and makes the overall board more correct-by-construction.

</td>
<td>

Compiling the design produces a netlist that can be imported into KiCad for board layout and ultimately Gerber generation for manufacturing:
![](docs/keyboard.png)
_Placement and routing are out of scope of this project, components were manually placed._

Additionally, the compiler...
- generates stable netlists, allowing incremental updates to in-progress board layouts
- checks electrical properties like voltage and current limits
- automatically selects generic parts like resistors and diodes against a parts table
- generates a BoM for factory assembly 

</td>
</tr>
</table>

### Under the Hood

While degrees of library-based design are possible in graphical schematic tools, either informally with copy-paste or with hierarchical sheets, the main limitation is that these subcircuits are static and tuned for one particular application.
Baked-in choices like component values, footprint, and part number selection may not meet requirements for a different application that might, for example, call for through-hole components instead of surface-mount, or has different voltage rails.

The HDL provides two mechanisms to enable general subcircuit libraries: _generators_ and _abstract parts_.
Defining the subcircuit as code enables the library to contain logic to _generate_ the implementation to support many applications.
For instance, instead of a keyboard switch matrix with a fixed number of rows and columns, the library can take in user-specified `nrows` and `ncols` parameters and generate the matrix for that configuration.
A more complex example would be a buck converter generator, which automatically sizes its inductor and capacitors based on the current draw of connected components.

While generators enable the subcircuit to adapt to its environment, _abstract parts_ formalize and automate the concept of generic parts within subcircuits.
Instead of requiring baked in part numbers and footprints in subcircuits, library builders can instead place an abstract part like generic resistors, generic diodes, and even generic microcontrollers.
These only define the parts' interface but have no implementation; instead other library blocks can implement (subtype) the interface.
For example, the abstract interface can be implemented by a SMT resistor generator, a through-hole resistor generator, or a resistor that picks from a vendor part table.
_Refinements_ allow the system designer to choose how parts are replaced with subtypes.

An _electronics model_ performs basic checks on the design, including voltage limits, current limits, and signal level compatibility.
Advanced features like cross-hierarchy packing allows the use of multipack devices, like dual-pack op-amps and quad-pack resistors to optimize for space and cost.


## Getting Started
See the [setup documentation](setup.md), then work through building a blinky board in the [getting started tutorial](getting-started.md).

**Setup tl;dr**: install the Python package from pip: `pip install edg`, and optionally run the [IDE plugin with block diagram visualizer](setup.md#ide-setup).


## Additional Notes 

### Examples
Example boards, including layouts, are available in the [examples/](examples/) directory, structured as unit tests and including board layouts:

<table>
<tr>
<td>
<img src="docs/boards/ledmatrix.webp" width="240" align="center"/>

**[LED Matrix](examples/test_ledmatrix.py)**: a 6x5 LED matrix using a [charlieplexed](https://en.wikipedia.org/wiki/Charlieplexing) circuit generator that drives 30 LEDs off of just 7 IO pins.

</td>
<td>
<img src="docs/boards/simon.webp" width="240" align="center"/>

[Simon](examples/test_simon.py): a [Simon memory game](https://en.wikipedia.org/wiki/Simon_(game)) implementation with a speaker and [12v illuminated dome buttons](https://www.sparkfun.com/products/9181).

</td>
</tr>

<tr>
<td>
<img src="docs/boards/iotfandriver.webp" width="640" align="center"/>

**[IoT Fan Driver](examples/test_iot_fan.py)**: an [ESPHome](https://esphome.io/index.html)-based internet-of-things fan controller, controlling and monitoring up to two computer fans from a web page or [home automation dashboard](https://www.home-assistant.io/).

</td>
<td>
<img src="docs/boards/candapter.webp" width="480" align="center"/>

**[CAN Adapter](examples/test_can_adapter.py)**: an isolated [CANbus](https://en.wikipedia.org/wiki/CAN_bus) to USB-C adapter.

</td>
</tr>

<tr>
<td>
<img src="docs/boards/multimeter.webp" width="640" align="center"/>

**[BLE Multimeter](examples/test_multimeter.py)**: a BLE (Bluetooth Low Energy) compact (stick form factor) multimeter, supporting volts / ohms / diode / continuity test mode, for low voltage applications.

</td>
<td>
<img src="docs/boards/usb_smu.webp" width="640" align="center"/>

**[USB Source-Measure Unit](examples/test_usb_source_measure.py)**: a USB PD (type-C power delivery) source-measure unit -- which can both act as a DC power supply with configurable voltage and current, and as a DC load. More precisely, it's a digitally-controlled 2-quadrant (positive voltage, positive or negative current) power source.

</td>
</tr>

</table>

### Developing
**If you're interested in collaborating or contributing, please reach out to us**, and we do take pull requests.
Ultimately, we'd like to see an open-source PCB HDL that increases design automation, reduces tedious work, and makes electronics more accessible to everyone.

See [developing.md](developing.md) for developer documentation.

### Papers
This started as an academic project, though with the goal of broader adoption.
Check out our papers (all open-access), which have more details:
- [System overview, UIST'20](http://dx.doi.org/10.1145/3379337.3415860)
- [Mixed block-diagram / textual code IDE, UIST'21](https://dl.acm.org/doi/10.1145/3472749.3474804)
- [Array ports and multi-packed devices, SCF'22](https://doi.org/10.1145/3559400.3561997)

### Project Status and Scope
**This is functional and produces boards, but is still a continuing work-in-progress.**
APIs and libraries may continue to change, though the core has largely stabilized.

If you're looking for a mature PCB design tool that just works, this currently isn't it (yet).
For a mature and open-source graphical schematic capture and board layout tool, check out [KiCad](https://kicad-pcb.org/), though existing design tools generally have nowhere near the design automation capabilities our system provides.
**However, if you are interested in trying something new, we're happy to help you and answer questions.**

Current development focuses on supporting intermediate-level PCB projects, like those an advanced hobbyist would make.
Typical systems would involve power conditioning circuits, a microcontroller, and supporting peripherals (possibly including analog blocks).
There is no hard-coded architecture (a microcontroller is not needed), and pure analog boards are possible.
The system should also be able to handle projects that are much more or much less complex, especially if supporting libraries exist.

### Misc
- **_What is EDG?_**:
  [Embedded Device Generation](https://dl.acm.org/doi/10.1145/3083157.3083159) (or more generally Electronic Device Generation) was a prior version of this project that focused on algorithms and models for embedded device synthesis, though it lacked a user-facing component.
  This project is a continuation of that work focusing on an end-to-end system, and for most of its development cycle has been called `edg`.
  But, for the purposes of writing research papers, naming collisions are confusing and bad, and we chose to keep the repo and paper name consistent.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "edg",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "PCB, hardware description language",
    "author": null,
    "author_email": "Ducky <richard.lin@berkeley.edu>",
    "download_url": "https://files.pythonhosted.org/packages/10/13/4d2da1aa9e2aeb424407d94fa06bffbd14b9b18f97d49db8451645b19ea3/edg-0.2.0.tar.gz",
    "platform": null,
    "description": "# Polymorphic Blocks\r\n\r\n![](https://github.com/BerkeleyHCI/PolymorphicBlocks/actions/workflows/pr-python.yml/badge.svg?branch=master)\r\n![](https://github.com/BerkeleyHCI/PolymorphicBlocks/actions/workflows/pr-scala.yml/badge.svg?branch=master)\r\n![](https://img.shields.io/github/license/BerkeleyHCI/PolymorphicBlocks.svg)\r\n![Python](https://img.shields.io/badge/python-3.9-blue.svg)\r\n\r\n\r\nPolymorphic Blocks is an open-source, Python-based [hardware description language (HDL)](https://en.wikipedia.org/wiki/Hardware_description_language) for [printed circuit boards (PCBs)](https://en.wikipedia.org/wiki/Printed_circuit_board).\r\nBy making use of programming concepts and capabilities, this project aims to **make circuit design faster and easier through high-level subcircuit library blocks** much like what makes software development so productive and approachable.\r\nUnderlying language features enable these libraries to be general across many applications and provide a high degree of design automation.\r\n\r\nWe've been using this system to create a variety of boards of varying complexity, [examples](#examples) range from a charlieplexed LED matrix to a USB source-measure unit.\r\n\r\n### A Keyboard Example\r\n\r\nAn example of all this in action is this design for a USB keyboard with a 3x2 switch matrix:\r\n\r\n<table>\r\n<tr>\r\n<td><b>User input</b></td>\r\n<td><b>What this tool does</b></td>\r\n</tr>\r\n\r\n<tr style=\"vertical-align:top\">\r\n<td>\r\n\r\nThe board is defined using high-level library subcircuits blocks, including parameterized ones like the switch matrix.\r\nChoices for internal components can also be specified as refinements, for example generic switches (used in the switch matrix) are refined to Kailh mechanical keyswitch sockets.\r\n\r\n```python\r\nclass Keyboard(SimpleBoardTop):\r\n  def contents(self) -> None:\r\n    super().contents()\r\n\r\n    self.usb = self.Block(UsbCReceptacle())\r\n    self.reg = self.Block(Ldl1117(3.3*Volt(tol=0.05)))\r\n    self.connect(self.usb.gnd, self.reg.gnd)\r\n    self.connect(self.usb.pwr, self.reg.pwr_in)\r\n\r\n    with self.implicit_connect(\r\n            ImplicitConnect(self.reg.pwr_out, [Power]),\r\n            ImplicitConnect(self.reg.gnd, [Common]),\r\n    ) as imp:\r\n      self.mcu = imp.Block(Stm32f103_48())\r\n      self.connect(self.usb.usb, self.mcu.usb.request())\r\n\r\n      self.sw = self.Block(SwitchMatrix(nrows=3, ncols=2))\r\n      self.connect(self.sw.cols, self.mcu.gpio.request_vector())\r\n      self.connect(self.sw.rows, self.mcu.gpio.request_vector())\r\n\r\n  def refinements(self) -> Refinements:\r\n    return super().refinements() + Refinements(\r\n      class_refinements=[\r\n        (Switch, KailhSocket),\r\n      ],\r\n    )\r\n```\r\n\r\nThese library blocks contain logic to adjust the subcircuit based on how it is used or its parameters.\r\nFor example, the USB-C port generates the required CC pulldown resistors if a power delivery controller is not attached, and the STM32 generates the required crystal oscillator if USB is used.\r\nThis helps eliminate gotchas for the system designer and makes the overall board more correct-by-construction.\r\n\r\n</td>\r\n<td>\r\n\r\nCompiling the design produces a netlist that can be imported into KiCad for board layout and ultimately Gerber generation for manufacturing:\r\n![](docs/keyboard.png)\r\n_Placement and routing are out of scope of this project, components were manually placed._\r\n\r\nAdditionally, the compiler...\r\n- generates stable netlists, allowing incremental updates to in-progress board layouts\r\n- checks electrical properties like voltage and current limits\r\n- automatically selects generic parts like resistors and diodes against a parts table\r\n- generates a BoM for factory assembly \r\n\r\n</td>\r\n</tr>\r\n</table>\r\n\r\n### Under the Hood\r\n\r\nWhile degrees of library-based design are possible in graphical schematic tools, either informally with copy-paste or with hierarchical sheets, the main limitation is that these subcircuits are static and tuned for one particular application.\r\nBaked-in choices like component values, footprint, and part number selection may not meet requirements for a different application that might, for example, call for through-hole components instead of surface-mount, or has different voltage rails.\r\n\r\nThe HDL provides two mechanisms to enable general subcircuit libraries: _generators_ and _abstract parts_.\r\nDefining the subcircuit as code enables the library to contain logic to _generate_ the implementation to support many applications.\r\nFor instance, instead of a keyboard switch matrix with a fixed number of rows and columns, the library can take in user-specified `nrows` and `ncols` parameters and generate the matrix for that configuration.\r\nA more complex example would be a buck converter generator, which automatically sizes its inductor and capacitors based on the current draw of connected components.\r\n\r\nWhile generators enable the subcircuit to adapt to its environment, _abstract parts_ formalize and automate the concept of generic parts within subcircuits.\r\nInstead of requiring baked in part numbers and footprints in subcircuits, library builders can instead place an abstract part like generic resistors, generic diodes, and even generic microcontrollers.\r\nThese only define the parts' interface but have no implementation; instead other library blocks can implement (subtype) the interface.\r\nFor example, the abstract interface can be implemented by a SMT resistor generator, a through-hole resistor generator, or a resistor that picks from a vendor part table.\r\n_Refinements_ allow the system designer to choose how parts are replaced with subtypes.\r\n\r\nAn _electronics model_ performs basic checks on the design, including voltage limits, current limits, and signal level compatibility.\r\nAdvanced features like cross-hierarchy packing allows the use of multipack devices, like dual-pack op-amps and quad-pack resistors to optimize for space and cost.\r\n\r\n\r\n## Getting Started\r\nSee the [setup documentation](setup.md), then work through building a blinky board in the [getting started tutorial](getting-started.md).\r\n\r\n**Setup tl;dr**: install the Python package from pip: `pip install edg`, and optionally run the [IDE plugin with block diagram visualizer](setup.md#ide-setup).\r\n\r\n\r\n## Additional Notes \r\n\r\n### Examples\r\nExample boards, including layouts, are available in the [examples/](examples/) directory, structured as unit tests and including board layouts:\r\n\r\n<table>\r\n<tr>\r\n<td>\r\n<img src=\"docs/boards/ledmatrix.webp\" width=\"240\" align=\"center\"/>\r\n\r\n**[LED Matrix](examples/test_ledmatrix.py)**: a 6x5 LED matrix using a [charlieplexed](https://en.wikipedia.org/wiki/Charlieplexing) circuit generator that drives 30 LEDs off of just 7 IO pins.\r\n\r\n</td>\r\n<td>\r\n<img src=\"docs/boards/simon.webp\" width=\"240\" align=\"center\"/>\r\n\r\n[Simon](examples/test_simon.py): a [Simon memory game](https://en.wikipedia.org/wiki/Simon_(game)) implementation with a speaker and [12v illuminated dome buttons](https://www.sparkfun.com/products/9181).\r\n\r\n</td>\r\n</tr>\r\n\r\n<tr>\r\n<td>\r\n<img src=\"docs/boards/iotfandriver.webp\" width=\"640\" align=\"center\"/>\r\n\r\n**[IoT Fan Driver](examples/test_iot_fan.py)**: an [ESPHome](https://esphome.io/index.html)-based internet-of-things fan controller, controlling and monitoring up to two computer fans from a web page or [home automation dashboard](https://www.home-assistant.io/).\r\n\r\n</td>\r\n<td>\r\n<img src=\"docs/boards/candapter.webp\" width=\"480\" align=\"center\"/>\r\n\r\n**[CAN Adapter](examples/test_can_adapter.py)**: an isolated [CANbus](https://en.wikipedia.org/wiki/CAN_bus) to USB-C adapter.\r\n\r\n</td>\r\n</tr>\r\n\r\n<tr>\r\n<td>\r\n<img src=\"docs/boards/multimeter.webp\" width=\"640\" align=\"center\"/>\r\n\r\n**[BLE Multimeter](examples/test_multimeter.py)**: a BLE (Bluetooth Low Energy) compact (stick form factor) multimeter, supporting volts / ohms / diode / continuity test mode, for low voltage applications.\r\n\r\n</td>\r\n<td>\r\n<img src=\"docs/boards/usb_smu.webp\" width=\"640\" align=\"center\"/>\r\n\r\n**[USB Source-Measure Unit](examples/test_usb_source_measure.py)**: a USB PD (type-C power delivery) source-measure unit -- which can both act as a DC power supply with configurable voltage and current, and as a DC load. More precisely, it's a digitally-controlled 2-quadrant (positive voltage, positive or negative current) power source.\r\n\r\n</td>\r\n</tr>\r\n\r\n</table>\r\n\r\n### Developing\r\n**If you're interested in collaborating or contributing, please reach out to us**, and we do take pull requests.\r\nUltimately, we'd like to see an open-source PCB HDL that increases design automation, reduces tedious work, and makes electronics more accessible to everyone.\r\n\r\nSee [developing.md](developing.md) for developer documentation.\r\n\r\n### Papers\r\nThis started as an academic project, though with the goal of broader adoption.\r\nCheck out our papers (all open-access), which have more details:\r\n- [System overview, UIST'20](http://dx.doi.org/10.1145/3379337.3415860)\r\n- [Mixed block-diagram / textual code IDE, UIST'21](https://dl.acm.org/doi/10.1145/3472749.3474804)\r\n- [Array ports and multi-packed devices, SCF'22](https://doi.org/10.1145/3559400.3561997)\r\n\r\n### Project Status and Scope\r\n**This is functional and produces boards, but is still a continuing work-in-progress.**\r\nAPIs and libraries may continue to change, though the core has largely stabilized.\r\n\r\nIf you're looking for a mature PCB design tool that just works, this currently isn't it (yet).\r\nFor a mature and open-source graphical schematic capture and board layout tool, check out [KiCad](https://kicad-pcb.org/), though existing design tools generally have nowhere near the design automation capabilities our system provides.\r\n**However, if you are interested in trying something new, we're happy to help you and answer questions.**\r\n\r\nCurrent development focuses on supporting intermediate-level PCB projects, like those an advanced hobbyist would make.\r\nTypical systems would involve power conditioning circuits, a microcontroller, and supporting peripherals (possibly including analog blocks).\r\nThere is no hard-coded architecture (a microcontroller is not needed), and pure analog boards are possible.\r\nThe system should also be able to handle projects that are much more or much less complex, especially if supporting libraries exist.\r\n\r\n### Misc\r\n- **_What is EDG?_**:\r\n  [Embedded Device Generation](https://dl.acm.org/doi/10.1145/3083157.3083159) (or more generally Electronic Device Generation) was a prior version of this project that focused on algorithms and models for embedded device synthesis, though it lacked a user-facing component.\r\n  This project is a continuation of that work focusing on an end-to-end system, and for most of its development cycle has been called `edg`.\r\n  But, for the purposes of writing research papers, naming collisions are confusing and bad, and we chose to keep the repo and paper name consistent.\r\n",
    "bugtrack_url": null,
    "license": "BSD 3-Clause License  Copyright (c) 2018-2020, The Regents of the University of California (Regents) All rights reserved.  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.  3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ",
    "summary": "Hardware description language for circuit boards",
    "version": "0.2.0",
    "project_urls": {
        "Homepage": "https://github.com/BerkeleyHCI/PolymorphicBlocks"
    },
    "split_keywords": [
        "pcb",
        " hardware description language"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "59d7f583865ffc2f2c3c34080cf2f6c5cf0c6ccb9455ce526b8751d8a5ee55d7",
                "md5": "fe0f0129befc623bf108cdd87a90ff64",
                "sha256": "f62f9c4d588f2e3eec804a5a7098c0789eb8309c0c323f981ae5259de5811c8a"
            },
            "downloads": -1,
            "filename": "edg-0.2.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "fe0f0129befc623bf108cdd87a90ff64",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 18701812,
            "upload_time": "2024-07-14T20:10:19",
            "upload_time_iso_8601": "2024-07-14T20:10:19.338874Z",
            "url": "https://files.pythonhosted.org/packages/59/d7/f583865ffc2f2c3c34080cf2f6c5cf0c6ccb9455ce526b8751d8a5ee55d7/edg-0.2.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "10134d2da1aa9e2aeb424407d94fa06bffbd14b9b18f97d49db8451645b19ea3",
                "md5": "64e02255f2edc6b7038fd301d6810505",
                "sha256": "b42a8f92403bbaef2f996ef32eeafce2f5826709f847d7bf528c7d8059f0d34d"
            },
            "downloads": -1,
            "filename": "edg-0.2.0.tar.gz",
            "has_sig": false,
            "md5_digest": "64e02255f2edc6b7038fd301d6810505",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 18387326,
            "upload_time": "2024-07-14T20:10:35",
            "upload_time_iso_8601": "2024-07-14T20:10:35.708112Z",
            "url": "https://files.pythonhosted.org/packages/10/13/4d2da1aa9e2aeb424407d94fa06bffbd14b9b18f97d49db8451645b19ea3/edg-0.2.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-07-14 20:10:35",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "BerkeleyHCI",
    "github_project": "PolymorphicBlocks",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "lcname": "edg"
}
        
Elapsed time: 0.37241s