Skip to main content

Design Automation for Field-coupled Nanotechnologies

Project description

fiction – Design Automation for Field-coupled Nanotechnologies

Ubuntu CI macOS CI Windows CI Python Bindings Docker Image CodeQL Documentation Status codecov License PyPI Release arXiv

This code base provides a C++17 framework for field-coupled technology-independent open nanocomputing developed as part of the Munich Nanotech Toolkit (MNT) by the Chair for Design Automation at the Technical University of Munich. Within fiction, algorithms for logic synthesis, placement, routing, clocking, verification, and simulation for Field-coupled Nanocomputing (FCN) technologies are implemented.

To this end, most physical design tasks can be performed on generic data structures that abstract from particular technology or cell design. Using an extensible set of gate libraries, technologies, and cell types, these can easily be compiled down to any desired FCN technology for physical simulation.

For these use cases, fiction provides a C++ header-only library as well as Python bindings that provide data types and algorithms for recurring tasks, e.g., logic network and layout types on different abstraction levels, clocking schemes, gate libraries, design automation algorithms, etc. Additionally, fiction comes with an ABC-like CLI tool that allows quick access to its core functionality.

Documentation

If you have any questions, feel free to contact us via nanotech.cda@xcit.tum.de or by creating an issue on GitHub.

Quick Start (C++)

Clone the repository and its submodules:

git clone --recursive https://github.com/cda-tum/fiction.git

The CLI

Inside the newly cloned fiction folder, trigger the build process:

cmake . -B build
cd build
cmake --build . -j4

Run the CLI tool:

cli/fiction

Here is an example of running fiction to perform a full physical design flow on a QCA circuit layout that can afterward be simulated in QCADesigner:

CLI example

The Header-only Library

Add fiction as a sub-directory to your CMake project and link against libfiction (assuming your project is called fanfiction):

add_subdirectory(fiction/)
target_link_libraries(fanfiction libfiction)

Include the headers you need:

#include <fiction/layouts/cell_level_layout.hpp>
#include <fiction/layouts/clocking_scheme.hpp>
#include <fiction/technology/qca_one_library.hpp>
#include <fiction/io/write_qca_layout.hpp>
#include <fiction/...>

Quick Start (Python)

Install the Python bindings from PyPI:

pip install mnt.pyfiction

Import the bindings:

from mnt import pyfiction

For a full getting started guide, please refer to the documentation.

Supported Technologies

Physical design in fiction can be performed technology-independent. Only if resulted layouts are to be physically, simulated, a specific technology implementation is required. To this end, fiction supports various potential FCN implementations together with gate libraries to compile gate-level layout abstractions down to the cell level. Additionally, output formats for external physical simulator engines are also supported.

Quantum-dot Cellular Automata (QCA)

QCA cells

Gate libraries:

File formats:

Many thanks to Frank Sill Torres for his support with the QCADesigner format, to Willem Lambooy for his support with the QCA-STACK format, and to Sophia Kuhn for implementing the SVG writer!

in-plane Nanomagnet Logic (iNML)

iNML cells

Gate libraries:

File formats:

Many thanks to Umberto Garlando, Fabrizio Riente, and Giuliana Beretta for their support!

Silicon Dangling Bonds (SiDBs)

SiDB cells

Gate libraries:

File formats:

Many thanks to Samuel Sze Hang Ng for his support!

Implemented Design Automation Algorithms

The fiction framework provides implementations of state-of-the-art design automation algorithms for FCN technologies. These algorithms can be used in evaluation scripts to perform logic synthesis, physical design, layout verification, and physical simulation.

Logic Synthesis

For logic synthesis, fiction relies on the mockturtle library that offers a multitude of logic network types and optimization algorithms. Logic synthesis can be performed in external tools and resulting Verilog/AIGER/BLIF/... files can be parsed by fiction. Alternatively, since mockturtle is included in fiction, synthesis can be applied in the same evaluation script.

Physical Design

For automatic FCN layout obtainment, fiction provides algorithms that receive mockturtle logic networks as input specification and output placed, routed, and clocked generic FCN circuits.

QCA Layout

Among these algorithms are

plus several path-finding algorithms that work on generic layouts:

On top, there is a hexagonalization algorithm to transform Cartesian layouts suitable for QCA into hexagonal layouts suitable for SiDBs, and multiple algorithms to optimize gate-level layouts post-placement:

Verification

Layout correctness can be validated using

Physical Simulation

SiDB simulation result

When a layout is compiled to the cell level via the application of a technology-dependent gate library, it can be simulated using a physical model. Currently, the following simulation algorithms are implemented in fiction:

Clocking Schemes

Regular clocking schemes have been proposed in the FCN literature, which can be used as a floor plans for physical design. However, sometimes it can make sense to have more freedom and assign clock numbers on the fly. That is why fiction supports both regular and irregular clocking schemes with variable amounts of clock numbers as QCA for instance uses four clock phases but iNML needs only three.

Built-in schemes are

Columnar Row 2DDWave
Columnar Row 2DDWave
USE RES ESR
USE RES ESR
CFE Ripple BANCS
CFE Ripple BANCS

plus the mentioned irregular open clocking that works via a clock map instead of a regular extrapolated cutout.

Wire Crossings

Second layer crossing

With many FCN technologies considered planar, wire crossings should be minimized if possible. However, there are some options in QCA where, using a second layer, crossings over short distances and co-planar rotated cells become possible. As both are just technical implementations of the same concept, fiction supports crossings as wires in a second grid layer in its data structures for all FCN technologies. They will also be represented as such in corresponding SVG and QCADesigner output. However, note that it is to be interpreted as the concept of crossings and could also be realized co-planar.

Wires are only allowed to cross other wires! Wires crossing gates is considered to lead to unstable signals.

Gate Pins vs. Designated I/Os

Input pin and cell output

In the literature, both are seen: having input cells (pins) directly located in the gate structure or using designated I/O elements that are located outside of gates. This distinction only makes sense on the gate level and fiction supports both approaches and offers usage in the implemented physical design algorithms.

Multi Wires

Multi wires

Gate-level abstraction has its limits. Often, chip area is wasted when only using a single wire per tile. In fiction, cell-level layouts allow for precise control over cell placement and can, thus, also create multiple wire segments per clock zone. Physical simulation can give an indication of whether the built structures are implementing the intended functionality.

Synchronization Elements

Synchronization element

A technology extension proposes to utilize the external clock signal generator in an unconventional way: by creating further asymmetric clock signals with extended Hold phases that are assigned to specific wire tiles, synchronization elements can be created that stall signals over multiple clock cycles. These artificial latches are able to feed information to any other clock number, but their usage reduces the overall throughput of the layout. In return, long wire detours for signal synchronization can be prevented.

Cost Metrics

Designed layouts can be evaluated with regard to several cost functions. The following metrics are currently implemented:

Gate-level layouts:

  • Circuit dimension in tiles
  • Number of gate tiles
  • Number of wire tiles
  • Number of wire crossings
  • Number of synchronization elements
  • Critical path
  • Throughput
  • Bounding box
  • Energy dissipation based on a physical model (QCA only)

Cell-level layouts:

  • Circuit dimension in cells
  • Number of cells
  • Bounding box
  • Area usage in nm²

Benchmark Library

To objectively evaluate and compare software and design automation tools, MNT Bench provides gate-level layouts for various gate libraries and clocking schemes, generated using the latest physical design and optimization algorithms, with fiction offering the corresponding read and write utilities to generate gate-level layouts from gate-level layout files (.fgl) and vice versa.

Additionally, the benchmarks folder contains the function descriptions of frequently used benchmark sets in Verilog format (.v) provided by MNT Bench.

Reference

Since fiction is academic software, we would be thankful if you referred to it by citing the following publication:

@misc{fiction,
      author = {Walter, Marcel and Wille, Robert and Sill Torres, Frank and Gro{\ss}e, Daniel and Drechsler, Rolf},
      title = {{fiction: An Open Source Framework for the Design of Field-coupled Nanocomputing Circuits}},
      archivePrefix = {arXiv},
      eprint = {1905.02477},
      note = {arXiv:1905.02477},
      year = {2019},
      month = {May}
}

Additionally, many algorithms implemented in fiction have been published individually. For a full list of publications, please refer to the documentation.

Acknowledgements

The Munich Nanotech Toolkit has been supported by the Bavarian State Ministry for Science and Arts through the Distinguished Professorship Program.

TUM Logo       Coat of Arms of Bavaria

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mnt_pyfiction-0.6.4.tar.gz (13.0 MB view details)

Uploaded Source

Built Distributions

mnt.pyfiction-0.6.4-cp312-cp312-win_amd64.whl (10.1 MB view details)

Uploaded CPython 3.12 Windows x86-64

mnt.pyfiction-0.6.4-cp312-cp312-manylinux_2_28_x86_64.whl (15.9 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.28+ x86-64

mnt.pyfiction-0.6.4-cp312-cp312-macosx_11_0_arm64.whl (2.5 MB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

mnt.pyfiction-0.6.4-cp312-cp312-macosx_10_15_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.12 macOS 10.15+ x86-64

mnt.pyfiction-0.6.4-cp311-cp311-win_amd64.whl (10.1 MB view details)

Uploaded CPython 3.11 Windows x86-64

mnt.pyfiction-0.6.4-cp311-cp311-manylinux_2_28_x86_64.whl (15.9 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.28+ x86-64

mnt.pyfiction-0.6.4-cp311-cp311-macosx_11_0_arm64.whl (2.5 MB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

mnt.pyfiction-0.6.4-cp311-cp311-macosx_10_15_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.11 macOS 10.15+ x86-64

mnt.pyfiction-0.6.4-cp310-cp310-win_amd64.whl (10.1 MB view details)

Uploaded CPython 3.10 Windows x86-64

mnt.pyfiction-0.6.4-cp310-cp310-manylinux_2_28_x86_64.whl (15.9 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.28+ x86-64

mnt.pyfiction-0.6.4-cp310-cp310-macosx_11_0_arm64.whl (2.5 MB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

mnt.pyfiction-0.6.4-cp310-cp310-macosx_10_15_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.10 macOS 10.15+ x86-64

mnt.pyfiction-0.6.4-cp39-cp39-win_amd64.whl (10.1 MB view details)

Uploaded CPython 3.9 Windows x86-64

mnt.pyfiction-0.6.4-cp39-cp39-manylinux_2_28_x86_64.whl (15.9 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.28+ x86-64

mnt.pyfiction-0.6.4-cp39-cp39-macosx_11_0_arm64.whl (2.5 MB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

mnt.pyfiction-0.6.4-cp39-cp39-macosx_10_15_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.9 macOS 10.15+ x86-64

mnt.pyfiction-0.6.4-cp38-cp38-win_amd64.whl (10.1 MB view details)

Uploaded CPython 3.8 Windows x86-64

mnt.pyfiction-0.6.4-cp38-cp38-manylinux_2_28_x86_64.whl (15.9 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.28+ x86-64

mnt.pyfiction-0.6.4-cp38-cp38-macosx_11_0_arm64.whl (2.5 MB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

mnt.pyfiction-0.6.4-cp38-cp38-macosx_10_15_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

File details

Details for the file mnt_pyfiction-0.6.4.tar.gz.

File metadata

  • Download URL: mnt_pyfiction-0.6.4.tar.gz
  • Upload date:
  • Size: 13.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for mnt_pyfiction-0.6.4.tar.gz
Algorithm Hash digest
SHA256 1a5603b90738a6cb165efdbb4d48dec2e0d397fd1e5194030b5320900e651699
MD5 b3ce7a220c0840ad0a85c09c66bc5aa7
BLAKE2b-256 f53fa760688d94dd6b1c2da6136280d8548eaa19dee9975a92d4df24896e3428

See more details on using hashes here.

File details

Details for the file mnt.pyfiction-0.6.4-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 65793d284c101a331ac8f7a26eac93bdaf5dc079b12231531b63599bef99d2b5
MD5 e180d1146f6e966e2414904bde839b9c
BLAKE2b-256 aca7fa5efc5b2fb7e334a2960e2d2ffdcf339a4e950c703fd4f531bd645dcc19

See more details on using hashes here.

File details

Details for the file mnt.pyfiction-0.6.4-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.4-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c08a666a940569b7668f5ecdec273f6fef021355ce3b152e0d1d538307c4979c
MD5 306c9027841ffda168d45aface6808a9
BLAKE2b-256 b2fa685a1eb3dc796d4afd99a41e0d238881c487f9cf10be93e2e7923a7d4d40

See more details on using hashes here.

File details

Details for the file mnt.pyfiction-0.6.4-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.4-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e873bd52c1b04f2285ceabfaffc80ff51744e752a46d9ea13e1323f5bc17d1e1
MD5 1c2ce33c83705ed1745a8578bf263a6f
BLAKE2b-256 2aa400b7a12903d8b46d2943fd6f02030d081aec400696093697d4ab1c0e7e3b

See more details on using hashes here.

File details

Details for the file mnt.pyfiction-0.6.4-cp312-cp312-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.4-cp312-cp312-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 215520be79bc88c703473775ce9038ef934293a649f3977503744eb7d5f2a27a
MD5 7025e4e3cebd32692d19ff992d269fba
BLAKE2b-256 f4f4ac9f61d84f697cef1514553519211508387b75518b9d59f22458bee15e37

See more details on using hashes here.

File details

Details for the file mnt.pyfiction-0.6.4-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 a6a7953eef723af146211b3d2f5511280e5508275ced383c4694e6003dbc29f5
MD5 1f710d7577d55ad8795248d13448b782
BLAKE2b-256 24ecad2e73a7ad9b4263c16d060f6761efae3d283fafc64b0f89e8fb56839ab2

See more details on using hashes here.

File details

Details for the file mnt.pyfiction-0.6.4-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.4-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 02c08a986ec6740be600e67a1a518d5bcf9ffc1d203c1d7c1e181a91e88fae37
MD5 1955a25712e18d411c003cb0d740ecec
BLAKE2b-256 09b32c238ba82faae93be63b51fc9c714bca6e19748342e2ea440b17b1d7fdc2

See more details on using hashes here.

File details

Details for the file mnt.pyfiction-0.6.4-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 abedf997bfcde3b93061d376bfdaafd3838b841b91569e53d6b77c31c31e7c8c
MD5 44c2d4feb720b8d1baeae6534d045afb
BLAKE2b-256 933ce92514ed4c454d8834dbbb584252748a80ad695525032066a5562aa5d210

See more details on using hashes here.

File details

Details for the file mnt.pyfiction-0.6.4-cp311-cp311-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.4-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 e86ceda6c107126b61c509e20e799708c8abe376c655e930a75a1c8ed6f3a859
MD5 1bd3efefbc4208cc6a6cb1a73648edea
BLAKE2b-256 3356a38dae352c4c508c419d41906df5ad216f423a6fbc539cf5831f3ebe7cc1

See more details on using hashes here.

File details

Details for the file mnt.pyfiction-0.6.4-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 eb9bdf97ee5cf77cd97de7b1848990d2ce324baeecb964dcbda7ffcbf6f1e1d4
MD5 a76f845fb3192a08a27adc45b01db160
BLAKE2b-256 2c1452cfcd584117c9f7de529e8526d9d0fe0f99d11ca2031160795db7e7f93b

See more details on using hashes here.

File details

Details for the file mnt.pyfiction-0.6.4-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.4-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 599fed54c61bbcae42d0528e695706936ab5e535df1883682762fc17ce204959
MD5 384cf5d16c9538a5d6c230bb255be70a
BLAKE2b-256 822bcea3eef5fa0192507fc8505b6f974728aef1c7a6200348aeda5200cd68dd

See more details on using hashes here.

File details

Details for the file mnt.pyfiction-0.6.4-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.4-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9fdd326dfaf0a1c596c50d87bc3eddf9f3ba962a396ed099ae68b35d58d0c471
MD5 05701787c231fc5091086455cff8368c
BLAKE2b-256 44421563557db286fe3596ea96c618a01ab68d0135ee539e753901d3df0e42bb

See more details on using hashes here.

File details

Details for the file mnt.pyfiction-0.6.4-cp310-cp310-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.4-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 6defd69c1b5b321be8b7d496ace29da6826176204ae2aadf0fa5c697e7c315c0
MD5 c70a4cdcf7ff5b16a493f5316fc3749f
BLAKE2b-256 cee568ba634af7c606f68b0352eb5dbf3d94f7faa2893de7438fb7fc106a2908

See more details on using hashes here.

File details

Details for the file mnt.pyfiction-0.6.4-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.4-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 4ae98fa5e46e7475547acba238e65a9cf67f05ef36caf9d16d778e3eacc0273b
MD5 6bc9bf39ccb1d42cbb219783eab4d074
BLAKE2b-256 945ed86495d398672f5512e7d7a590ea25b62d46e145c6f69650ee44ecc40c2d

See more details on using hashes here.

File details

Details for the file mnt.pyfiction-0.6.4-cp39-cp39-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.4-cp39-cp39-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 202ddc6da9948c05ff86278b37ac2de6ba558288b0367ad143d14f1abbf23841
MD5 388d76817a29f4fa47469089ff88dde1
BLAKE2b-256 ffcd77d037fc976664916e0c33964b7a6517d854ba61ef843c83b5fe84cc5d26

See more details on using hashes here.

File details

Details for the file mnt.pyfiction-0.6.4-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.4-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 229b151f9db4605e22edc2b101a9b43d14cb5d8e95044a0158d16cf5f8ee2c8e
MD5 78c5c195b540164a451037c2ffa7a8f1
BLAKE2b-256 cdced4615deac14ab8ec6bee2e0d030e3af2859216e582af0f59f768322db403

See more details on using hashes here.

File details

Details for the file mnt.pyfiction-0.6.4-cp39-cp39-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.4-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 0093b78dcb6865f11d31d9dd901e620dd77e3227132415b5f61e4b8329f8c5bc
MD5 bb70d68007f22c91311ae97aa6bdfb9f
BLAKE2b-256 2468f46175907ce5a89e75f3c6e7c851f3b2027d80eaae12c520decc51b6ed1d

See more details on using hashes here.

File details

Details for the file mnt.pyfiction-0.6.4-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.4-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 6a68533cf17083eb513e091706587ca8597293ad836a099e88ab406ae1ea6ab0
MD5 30ba574d821c5ecb605f640d112892fb
BLAKE2b-256 e399f5128d106d962bc85c7efa91151ef57919c6d5b9ccad958d3c117e0c7c6c

See more details on using hashes here.

File details

Details for the file mnt.pyfiction-0.6.4-cp38-cp38-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.4-cp38-cp38-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0daca71dd47df81682cb8604490e02ec6c30b5b6f5e43334213fff8ddae6f1e2
MD5 91e81f0493366ecb7dd5890def9b20be
BLAKE2b-256 cf8b800302a9b9f7f81c875be3b1657950f10a708009b016b8c3d7d19b8aa497

See more details on using hashes here.

File details

Details for the file mnt.pyfiction-0.6.4-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.4-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dbcc76a54834660e5edef9ca92ff15f0f434fae272f92afbbfe44e4a54f59b5f
MD5 df41b3b61a4ac226a5f694257bbd120e
BLAKE2b-256 54308897845ad3345ea06815eee94e32f6f5b48149a85eba8bf7868a60870cd2

See more details on using hashes here.

File details

Details for the file mnt.pyfiction-0.6.4-cp38-cp38-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.4-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 a1ea812f0339e505f60b7394ae0622ddfb102e32e0261c0a53ad0d243bd785ba
MD5 1007cf2e1dd9ee8b3bb56dcacf706f4c
BLAKE2b-256 f876598ebadde9459c72be7eec9c8a0b351e5b948e0e66d3cfd54273041165ec

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page