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.3.tar.gz (13.0 MB view details)

Uploaded Source

Built Distributions

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

Uploaded CPython 3.12 Windows x86-64

mnt.pyfiction-0.6.3-cp312-cp312-manylinux_2_28_x86_64.whl (15.8 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.28+ x86-64

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

Uploaded CPython 3.12 macOS 11.0+ ARM64

mnt.pyfiction-0.6.3-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.3-cp311-cp311-win_amd64.whl (10.1 MB view details)

Uploaded CPython 3.11 Windows x86-64

mnt.pyfiction-0.6.3-cp311-cp311-manylinux_2_28_x86_64.whl (15.8 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.28+ x86-64

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

Uploaded CPython 3.11 macOS 11.0+ ARM64

mnt.pyfiction-0.6.3-cp311-cp311-macosx_10_15_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.11 macOS 10.15+ x86-64

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

Uploaded CPython 3.10 Windows x86-64

mnt.pyfiction-0.6.3-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.3-cp310-cp310-macosx_11_0_arm64.whl (2.5 MB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

mnt.pyfiction-0.6.3-cp310-cp310-macosx_10_15_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.10 macOS 10.15+ x86-64

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

Uploaded CPython 3.9 Windows x86-64

mnt.pyfiction-0.6.3-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.3-cp39-cp39-macosx_11_0_arm64.whl (2.5 MB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

mnt.pyfiction-0.6.3-cp39-cp39-macosx_10_15_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.9 macOS 10.15+ x86-64

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

Uploaded CPython 3.8 Windows x86-64

mnt.pyfiction-0.6.3-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.3-cp38-cp38-macosx_11_0_arm64.whl (2.5 MB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

mnt.pyfiction-0.6.3-cp38-cp38-macosx_10_15_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.8 macOS 10.15+ x86-64

File details

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

File metadata

  • Download URL: mnt_pyfiction-0.6.3.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.3.tar.gz
Algorithm Hash digest
SHA256 4c4a74ce3222eaf19feb02d99a0b554a33b4ce2fcadac83fcde34ea96271b83e
MD5 f2ef9e4c0dc3c3d60ab59e08213382ae
BLAKE2b-256 26cf96c053b99bbcd64cced6ae39a3684163c7280db9311c8713a7855732764b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 7b27cb71304c4e08d06508e18908f98a55c89a6d2d11bc30f7ac14947b26ba19
MD5 b3d5284cbd431c17f1de196ef4d48e53
BLAKE2b-256 a31240c19d0a9a9b20f583be156d2620129fdb8f16110bf1ebbf9bffdecdefa3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.3-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 bbeed790c4dd53ab462cd7564951e695210ff0985a2c185251f0e672f04eab6c
MD5 e8c07c125eee10938d5435bcf4edd28d
BLAKE2b-256 aa0c6e7af30aa378e98138af5ef55cf89526c7c31f751d316346e2ab2f2379f7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0dca9fb3b5a5d86579f1392c72512d631c13a8ed83f538d648219662d7e93142
MD5 0709ede62beb9314ae86b63c194e34b3
BLAKE2b-256 9286502399aa8cef1f941309f548bff502ba9a0e1a1cbf504d1731aefa6ce4e8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.3-cp312-cp312-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 93d13e1fb829a908e80a29aa73f65d8a59ecbc93d2f5714f786c0ebd2d1f89f2
MD5 d01dcf293dde02b919b496a8357e938b
BLAKE2b-256 5d1ed5f4425d6a6e9ff89b233efb33b3ac0df68e855362d0f84e850340a64377

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 aca80c26c34e1da165ddca5ed7a5eab9be964039157571f6bfe2003c6a421d9c
MD5 76c738bc5fe1f2c63da30f27d607379f
BLAKE2b-256 3803a6fad1132938dab02d2b2eeb4f051d969f31049020cf45d1b6243243233c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.3-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3e3397cb6d84912b335285f292d26e531e17970db09daba197aee4c37549e0ce
MD5 8cac7bfd855bb53068ff8d67ede0a743
BLAKE2b-256 0524307263dbcd926262200cd2753e66d6aeceb691074f90facc1225251d1251

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 994466fe4e16a336a79a4dde54bd1e7904c2087f4871afd96f3418b09edd254e
MD5 3d68df4110a0dd9d0da1c2dc4d233f9c
BLAKE2b-256 221a3732f8f4d36438d833fde3f3f126bac30db5e3e88def26da88ad9d39436c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.3-cp311-cp311-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 18a32bc31cc76c47d1476746137ab5bf9a831c692392f95d65752972fdfa59a8
MD5 3010dd51a98aad4aca9aace6843efe66
BLAKE2b-256 9bd9feb61c2ed77b79af039efd49bb5c0824474e864e95c63991c4632b264c7c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 d71c09b545dbb0d26bad7c97bc04e42888aebf8ed7663ac24f2370cd47e8626b
MD5 983faaaed39944dde554abde27a99e6a
BLAKE2b-256 0e25ea3b5d7fc7efcaac54c06ca44d27519070c0227568243a60e6de5968d796

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.3-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f48f87dc670ad644b4d498d607bfebf86b57b52a7c082e3bf204fef4bb083f55
MD5 da7fa69e675aff9510319b4cff114ae2
BLAKE2b-256 5195624bd6660f3b80fea655466b96dcda97beeb7b3a59822d41f394be1b5531

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.3-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6f80761cef30bcf65d8466046102e7ed198bd7c3b0849c9eed5966bddf5704c8
MD5 efe79f79f5eef45b860784a82696357f
BLAKE2b-256 ce55b9034da65b1d89e2e4837af3e05bbaf1e5f6243f0deed52f67919f9f53fe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.3-cp310-cp310-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 5eb980933a867de5101f5e87d864874607493fbf3d66606e82138e0933115e50
MD5 789d09e65d098819c0acff2a60506213
BLAKE2b-256 131cb96efdfa990a56c8572c5d432da947023bdc8d4806b0471c0b0be6936bdb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 d8273584fdb8c149baae99edf50819cf4191e5bf425a5851c2cc50f20dc90540
MD5 725fc7fed08240e15bd226f3f0ed8b48
BLAKE2b-256 b7c7800a889cc9fa245016786aad56505742bdb1e434fc12ac3b24b13ba4596f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.3-cp39-cp39-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f48c9bde3d27b79870fb240cacb99dd7dbe8a0e8f8f1ac98a1324d832b793433
MD5 baf0df15db7e135ca9283b923b5dbdce
BLAKE2b-256 2e5ad2354c4067eeb52c173b66dc2e5495058984724b76aa888a378e37d7eb0e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.3-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 532f77835d442d9faf0ad53ec478a61ea079eb5b3c5573279fc2fe001f165824
MD5 4b934d796647b90b56962aa98030b091
BLAKE2b-256 eb6941748077a5509a1201b077880dd8e004c48f8102b28c61e61cfe6b739b0d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.3-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 51df78212870fa11a18bb78430cb326e1af40c3f4c2ce741515d2c07cd827006
MD5 d8dd126cb966fda8337ec5142a164eac
BLAKE2b-256 5c3d68e34c86baaf87c1ee24baf1ec276b6446700c14804aaca3952d7b4a7149

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.3-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 bad6b577503e66dc54decc2ae595447950d0990dd8eaf18c9828dd2bfbc49d0a
MD5 b24a7764e1d88ed67c9d652545c8bcfd
BLAKE2b-256 5a9b79e224846dbc13016e42250bbc1692f1e3f0f93abfd4827fd7e574f756ec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.3-cp38-cp38-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4b75bcea2b8ffece6b1753d4a503c6562a75f6cb6eeff022598f340d27978450
MD5 e211b3b72ea895f840328c0ea7663428
BLAKE2b-256 c1945e9e90bcb35f72001c3d9757178f0ffe60342ae00b8a751680cc7e339436

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.3-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ea779c3e50b439d44eef53742ce376bf659f1b0830c559b5626b73b9182506ed
MD5 7e9ccafd35ef1f0b5afd38b831b6ba5c
BLAKE2b-256 dcb2978eb1d4f9d2f5de83362c658729bf6524892981fbf7a7cf5855acacda36

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mnt.pyfiction-0.6.3-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 0a439188b654f428a1dd72bbb9a4d29ce54d26860b4e9cace8ebbae769a507bd
MD5 006fead88cee8cf610295ede3aa118ab
BLAKE2b-256 a3b8bc7049c859200ffdf4d2e546fadeeecce9f6dc10db23aeec3082191ef622

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