Skip to main content

A low-latency communication library for RTL simulation and emulation.

Project description

Switchboard

Actions Status Documentation Status PyPI version License

Switchboard (SB) is a framework for communication between distinct hardware models, such as RTL simulations, RTL implemented on FPGAs, and fast SW models. This makes it possible to simulate large hardware systems in a distributed fashion, using whatever models are available for the different components.

In such a simulation, each hardware model has one or more SB ports. Each is unidirectional: it may act as an input or an output, but not both. In addition, each SB connection is single-producer, single-consumer (SPSC): an output port may not drive more than one input port, and an input port may not be driven by more than one output port.

Here's an example of what a switchboard connection topology might look like:

image

The method for adding a switchboard port depends on the language that a HW model is implemented in. For RTL-based models, SB ports are instantiated as Verilog models, whereas for C++ and Python-based models, these ports are instantiated as objects. We provide both a low-level interface for moving data directly between SB ports, as well as a higher-level interface for running UMI transactions over SB connections.

Under the hood, communication happens through shared-memory queues, where an SB output port is driving packets into the queue, and an SB input port is reading from that queue. This standardization is what allows any two kinds of models to talk to each other. A shared-memory SPSC queue is an appealing common interface because it is one of the fastest interprocess communication techniques, with latencies on the order of hundreds of nanoseconds; no system calls are required to transmit and receive data. At the same time, this type of queue is straightforward to implement for FPGA platforms, with queue read and write operations only requiring a handful of memory transactions.

Switchboard also has mixed-signal features that make it easy to incorporate SPICE subcircuits into a system emulation; see the xyce example.

Installation

The fastest way to install this package is from PyPI:

pip install switchboard-hw

However, if you want to run the examples below (or if you're a switchboard developer), clone this repository and install the Python package in-place:

git clone https://github.com/zeroasiccorp/switchboard.git
cd switchboard
git submodule update --init
pip install --upgrade pip
pip install -e .

Examples

Various examples demonstrating the features of switchboard are in the examples folder. If you'd like to run them yourself, please run this command first:

pip install -r examples/requirements.txt

This clones some additional repositories that are needed by the examples.

A good starting point is the python example, where a Python script sends packets to and receives packets from a Verilator RTL simulation. The configuration is simple: there is a small RTL simulation that accepts an SB packet, increments the data payload, and transmits the result on its SB output port. On the other side, a Python script sends an SB packet to the simulation, and checks that the packet it gets back has been incremented.

image

To run this example, you'll need verilator (sudo apt install verilator for Ubuntu, brew install verilator for macOS). You can then run the example by changing directory to examples/python and then typing make. That should produce output similar to the following:

*** TX packet ***
dest: 123456789
last: 1
data: [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 24 25 26 27 28 29 30 31]

*** RX packet ***
dest: 123456789
last: 1
data: [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 25 26 27 28 29 30 31 32]

- ../verilog/testbench.sv:72: Verilog $finish
PASS!

To get a sense of how this works, open the Python script examples/python/test.py. The core logic is essentially:

from switchboard import PySbPacket, PySbTx, PySbRx

...

tx = PySbTx("to_rtl.q", fresh=True)
rx = PySbRx("from_rtl.q", fresh=True)

...

txp = PySbPacket(...)
tx.send(txp)

...

rxp = rx.recv()

In other words, we create an SB output port (tx) and an SB input port (rx). An SB packet is then created (txp) and sent via the output port. Finally, a new SB packet is received from the input port.

To get a sense of how switchboard is used in RTL, have a look at the Verilog part of this example in examples/python/testbench.sv. The core logic is the instantiation of queue_to_sb_sim (SB input port) and sb_to_queue_sim (SB output port), along with the initialization step to define the name of each SB connection. Notice that the Python output port is matched to the Verilog input port (to_rtl.q) and similarly the Python input port is matched to the Verilog output port (from_rtl.q).

`include "switchboard.vh"

...

`SB_WIRES(to_rtl, DW);
`QUEUE_TO_SB_SIM(to_rtl, DW, "to_rtl.q");

...

`SB_WIRES(from_rtl, DW);
`SB_TO_QUEUE_SIM(from_rtl, DW, "from_rtl.q");

Using the same name for two ports is what establishes a connection between them. You can use any name that you like for a SB connection, as long as it is a valid file name. The reason is that SB connections are visible as files on your file system. After this example runs, it will leave behind files called to_rtl.q and from_rtl.q. It's convenient to name SB connections in a way that is amenable to pattern matching, so that you can do things like rm *.q to clean up old connections.

We encourage you to explore the other examples, which demonstrate simulation with Icarus Verilog and switchboard's C++ library (minimal), bridging SB connections via TCP (tcp), and switchboard's UMI abstraction (umiram).

Build automation

We also provide build automation powered by SiliconCompiler that makes it easy to build RTL simulations with switchboard infrastructure (queue_to_sb_sim, sb_to_queue_sim, etc.). This is mainly important because Verilog DPI and VPI are used under the hood, requiring certain flags to be passed to the RTL simulator during the build. Using our build automation lets you focus on specifying RTL sources, without having to deal with these details.

As an example, we return to examples/python. The basic logic for a Verilator build is:

from switchboard import SbDut

dut = SbDut('name-of-top-level-module')

dut.input('path/to/file/1')
dut.input('path/to/file/2')
...

dut.build()

dut.simulate()

In other words, create an SbDut object, input() files, build() it to compile the Verilator simulator, and use simulate() to start the simulator. SbDut is a subclass of siliconcompiler.Chip, which allows you to invoke a range of features to control the simulator build, such as specifying include paths and `define macros. More information about siliconcompiler.Chip can be found here.

Packet format

An SB packet is a simple data structure with three parts, defined in switchboard/cpp/switchboard.hpp.

  1. A 32-bit destination.
  2. A 32-bit flags bit vector. Currently only bit "0" is used, providing the last flag.
  3. A 416-bit data payload. This width was chosen to accommodate a UMI packet with a 256 bit payload, 64-bit source and destination addresses, and a 32-bit command. In the future, we may support parameterizable data widths for switchboard connections.

destination and flags control how the packet is routed. destination indicates the intended recipient of the packet as a flat, unsigned 32-bit integer. This provides a mechanism where a packet can be routed through multiple hops before reaching its final destination.

For example, consider using switchboard to build a simple topology in which packets can be sent from one HW block to one of two other blocks. One could indicate which block should receive the packet using the destination field, with a router transmitting the packet to the right one.

image

The last indicator (part of the flags bit vector) indicates whether there is more to come as part of a transaction. The rule is that a transmission cannot be interrupted as long as as last is zero. As an example, consider the system below, where Block A and Block B are both sending SB packets to the same port on Block C, using a router to multiplex between the two. Following the rule of unbroken transmissions, if the router starts sending a sequence of packets from Block A to Block C, it cannot switch to sending packets from Block B to Block C until it gets a packet from Block A that has last set to one. It is legal to have last=1 set in all packets, meaning that packets can be interspersed at any time.

image

The purpose of last is two-fold. For one, it simplifies the process of transmitting "burstable" protocols such as UMI through switchboard. It also provides opportunities for performance optimization. For example, if a long sequence of SB packets is being sent over TCP, the TCP bridge knows it can wait to fill up its transmission buffer as long as last=0. Without the last bit, the bridge would have to send each packet one at a time (or speculatively wait for more packets), since any given packet may be the last one.

UMI interface

In addition to supporting data movement directly through SB packets, we provide a higher-level interface for running UMI transactions over switchboard connections. The mechanisms for this can be seen in the examples/umi* examples. Here's a sketch of what UMI transactions look like, adapted from the definition of python_intf() in examples/umiram/test.py:

from switchboard import UmiTxRx

umi = UmiTxRx(from_client, to_client, fresh=True)

wrbuf = np.array([elem1, elem2, ...], dtype)
umi.write(wraddr, wrbuf)

rdbuf = umi.read(rdaddr, num, dtype)  # also a numpy array

We are no longer creating PySbTx and PySbRx objects, but rather a single UmiTxRx object with two SB ports: from_client, and to_client. Transactions are sent by the Python script through the from_client port, and responses are received back through the to_client port.

UMI write transactions are generated with the umi.write() method, which accepts an address and numpy array or scalar as arguments. This sends out one or more SUMI packets to implement the write request, packing the data, source address, destination address, and command into SB packets. Since an SB packet is 416 bits, and the two addresses + command take up 160 bits, each SB packet contains up to 256b data. Switchboard automatically splits up larger transactions into multiple SUMI packets as needed, incrementing the source and destination addresses automatically. Optional arguments to write() control where a ack'd or non-ack'd (posted) write is used and the maximum amount of data to send in a single SUMI packet. If an ack'd write is used, write() blocks until the response is received.

In a similar fashion, umi.read() reads a certain number of words from a given address. For example, umi.read(0x1234, 4, np.uint16) will send out a UMI read request with dstaddr=0x1234, LEN=3, SIZE=1 from the SB port from_client. When it gets the response to that query on to_client, it will return an array of 4 np.uint16 words to the Python script. A umi.atomic() method is also provided to generate UMI atomic transactions.

Sometimes it is convenient to work directly with SUMI packets, for example when testing a UMI FIFO or UMI router. For that situation, we provide send() and recv() methods for UmiTxRx, highlighted in examples/umi_fifo/test.py. In that exampe, we are sending SUMI packets into a UMI FIFO, and want to make sure that the sequence of packets read out of the FIFO is the same as the sequence of packets written in.

The main while loop is essentially:

txq = []

while ...:
    txp = random_umi_packet()
    if umi.send(txp, blocking=False):
        txq.append(txp)

    rxp = umi.recv(blocking=False)
    if rxp is not None:
        assert rxp == txq[0]
        txq.pop(0)

In other words, first try to write a random packet into the FIFO. If successful, add it to the back of a list of outstanding packets. Then, try to read a packet from the FIFO. If successful, make sure that the packet is equal to the oldest outstanding packet (since this is a first-in, first-out queue) and remove that outstanding packet from our records. Continue in a loop until a sufficient number of transactions have been checked.

This code example demonstrates several features:

  1. send() and recv() for working with SUMI packets, represented using PyUmiPacket objects.
  2. blocking=False for non-blocking transactions. send() returns True if successful and False otherwise; recv() returns a PyUmiPacket if successful, and None otherwise. A transaction might be unsuccessful if the underlying UMI FIFO is full or empty. For example, if we don't call umi.recv(), eventually the FIFO will fill, and subsequent send() invocations will fail (returning False). Similarly, if we keep calling umi.recv() without calling umi.send(), eventually the FIFO will be empty, and umi.recv() will fail (returning None).
  3. The ability to generate random SUMI packets with random_umi_packet(). Various optional arguments can constrain the opcodes, addresses, and data.
  4. PyUmiPacket objects can be compared using Python == and != operators. This checks if two packets have equal commands, addresses, and data.

Queue format

Under the hood, SB ports are implemented using shared memory queues. The data structure used is made simple enough that RTL running on FPGAs can directly read and write to these queues, without the need for bridge programs. In fact, if two FPGAs have access to the same memory space, they can communicate through a shared memory queue without any involvement from the host operating system, after the initial setup.

The layout of the queue is:

  • Bytes 0-3: head (int32)
  • Bytes 64-67: tail (int32)
  • Bytes 128-179: SB packet
  • Bytes 256-307: SB packet
  • Bytes 320-371: SB packet
  • ...
  • Bytes 4,032-4,095: SB packet

To write an SB packet to the queue, compute next_head = head + 1. If next_head equals 62 (the end of the queue), then set next_head to 0. If next_head equals tail, then the write fails - the queue is full. Otherwise, write the SB packet to address 128 + (64 * head), and then set head to next_head.

Reading an SB packet works in a similar fashion. If tail equals head, the read fails - the queue is empty. Otherwise, read the SB packet from address 128 + (64 * tail), and then increment tail. If tail equals 62 (the end of the queue), then set tail to 0.

The queue implementation in C is in switchboard/cpp/spsc_queue.h, with care taken to avoid memory ordering hazards, and various cache-oriented optimizations. The queue implementation in Verilog (intended for FPGA-based emulation) can be found in switchboard/verilog/fpga/sb_rx_fpga.sv and switchboard/verilog/fpga/sb_tx_fpga.sv.

License

Apache 2.0

Contributing

switchboard is an open-source project and welcomes contributions. To find out how to contribute to the project, see our Contributing Guidelines.

Issues / Bugs

We use GitHub Issues for tracking requests and bugs.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

switchboard_hw-0.2.19-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (343.7 kB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ x86-64

switchboard_hw-0.2.19-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (333.9 kB view details)

Uploaded CPython 3.13 manylinux: glibc 2.17+ ARM64

switchboard_hw-0.2.19-cp313-cp313-macosx_11_0_arm64.whl (302.6 kB view details)

Uploaded CPython 3.13 macOS 11.0+ ARM64

switchboard_hw-0.2.19-cp313-cp313-macosx_10_13_x86_64.whl (307.1 kB view details)

Uploaded CPython 3.13 macOS 10.13+ x86-64

switchboard_hw-0.2.19-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (343.7 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

switchboard_hw-0.2.19-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (334.1 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

switchboard_hw-0.2.19-cp312-cp312-macosx_11_0_arm64.whl (302.5 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

switchboard_hw-0.2.19-cp312-cp312-macosx_10_13_x86_64.whl (307.0 kB view details)

Uploaded CPython 3.12 macOS 10.13+ x86-64

switchboard_hw-0.2.19-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (345.6 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

switchboard_hw-0.2.19-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (336.6 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

switchboard_hw-0.2.19-cp311-cp311-macosx_11_0_arm64.whl (301.7 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

switchboard_hw-0.2.19-cp311-cp311-macosx_10_13_x86_64.whl (305.0 kB view details)

Uploaded CPython 3.11 macOS 10.13+ x86-64

switchboard_hw-0.2.19-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (343.5 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

switchboard_hw-0.2.19-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (335.2 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

switchboard_hw-0.2.19-cp310-cp310-macosx_11_0_arm64.whl (300.3 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

switchboard_hw-0.2.19-cp310-cp310-macosx_10_13_x86_64.whl (303.8 kB view details)

Uploaded CPython 3.10 macOS 10.13+ x86-64

switchboard_hw-0.2.19-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (343.7 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

switchboard_hw-0.2.19-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (335.3 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

switchboard_hw-0.2.19-cp39-cp39-macosx_11_0_arm64.whl (300.4 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

switchboard_hw-0.2.19-cp39-cp39-macosx_10_13_x86_64.whl (303.8 kB view details)

Uploaded CPython 3.9 macOS 10.13+ x86-64

switchboard_hw-0.2.19-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (343.4 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

switchboard_hw-0.2.19-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (335.1 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

switchboard_hw-0.2.19-cp38-cp38-macosx_11_0_arm64.whl (300.2 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

switchboard_hw-0.2.19-cp38-cp38-macosx_10_13_x86_64.whl (303.6 kB view details)

Uploaded CPython 3.8 macOS 10.13+ x86-64

switchboard_hw-0.2.19-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (347.4 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

switchboard_hw-0.2.19-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (340.1 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ARM64

switchboard_hw-0.2.19-cp37-cp37m-macosx_10_13_x86_64.whl (300.6 kB view details)

Uploaded CPython 3.7m macOS 10.13+ x86-64

File details

Details for the file switchboard_hw-0.2.19-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b1b08e101be2e37f0b22dbfe95667f16f0f1245cbf640cc82a8da43735874e49
MD5 138d7a5f5436595050882ff55b270e43
BLAKE2b-256 945c2b41c69412d3272300b11346e78a32cb462dd0ac5d56a142136a4d1906c3

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1aded7445c7fa7163a4c8c1ce8302d96cfe612df42e98b131b23b3909956df48
MD5 23cac1d99939505522fd1b3622e3b10d
BLAKE2b-256 579d6ab8e0e0090a93760f6741eef8cba2b0f9fc51bcb14da7de946dd8971ec1

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5a5c7321b87b1f41b5da8822b22f037038c5f3978ed76031fc2fcf5f3d8be053
MD5 e565dfaf6c49557b348b3fc0f79a34c6
BLAKE2b-256 c8a117efada5de6c638f08ebfe9c1fc95cf01d9073d933a6f17e81b4e5a0d2dc

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 bafcd574a9dbd731e8e19a12d592a2975984e690f377746096aa9102e2c6001b
MD5 b6c906331bd76e43a34def764585e271
BLAKE2b-256 70f5767c55b851b5e2f2e2ed3cfa4c94d3b19009fec85fc7d0dc9f6d31876830

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d891d24754b62c4e091e2797bc9c784405db543dd76c4516d9f705cba2aaf77a
MD5 81dd7698bdc958c4483c742c582044a5
BLAKE2b-256 bda96b8d873c31d5100cf378840dc36a34905677325b6c8c5190d053acc5a1f2

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 40fea6d37477e632b1148df662e4f56a7c6cf7292b2ef0d91755a32433127cb1
MD5 8484f8a8f925291a51bd51927b4884ed
BLAKE2b-256 c4d7fb4bba0b986d42dfc16f3c4b7e3e8e9e4ceed4b0a5fbe2f6c4bc2d6524a9

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5f4db2da5ecfb92764bf1e15a01ceca9f6638eeef219705b64d4a61ad895834b
MD5 bc26de2c763936c21891792912eec0b1
BLAKE2b-256 7a593162d5b128e25f5993b839bfe030676212cb41978b504ef75c917903afc8

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 7ae9e86239d6e5aaa1ad28e889c6e809a42ab0435fb6eb3550d299d53f170bb3
MD5 e0ad98cfa824050421d298db3de942e6
BLAKE2b-256 a26fba0a1e9d70a241de816eeb3b406e823df9bca1342d8d939d37751e7c2811

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1fd71bb35563fa6290bdefea72ba01fb5a88aef973148a8b5dc86652e611de2d
MD5 01d50edbdc31042088f027dc87aba2b9
BLAKE2b-256 632927c05fd3fe14a2d7b00ba400895f92b4fa2a3a61fbe1d92217bd2ef8fa2e

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9e6e7c2848c3bd567d9bbf6ef69e21110f987401d62ca382a9a49545a1ca5eb1
MD5 97dc34598e0e0d66321c01a5e1766e0c
BLAKE2b-256 56b94388e7af89a4bb3db71df3bd9004e872d83f113740d6a10dae9a6ffcc404

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a21145941e0a6dc55ea79a44c3245e1492358d9c66a6ba91e162330fba0c8b58
MD5 a05fc9a6bc1895d94ded7dbe2a82d1c3
BLAKE2b-256 6df2b32decb242a6d3a71e59b0cc4a6431f390223f0b4e9215fa95efc6802f65

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp311-cp311-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp311-cp311-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 13f736886afc85bcbec0fb79a51e09a5bef3f892ece999d13d04cdc36d25f0d0
MD5 5ced079e1d189c2905b3c4f8770c1aab
BLAKE2b-256 24246f47712d9cd15398f40af697fc1285cd54d9601721135ea3c1c3662113e3

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e7b77c38d633b80fcf477dc210ca3cfc1651486c076f3d62282b02a7c5dc53f8
MD5 33beeb1fb0c79aa5fd9c30861975712c
BLAKE2b-256 49076cf08e5da40913679a5270987ec450e25620fbe62305fb5916d65a693e60

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8bfece860d129da0f9abc67ea2e1e0b9a8e9862af02f3819f6f940ca2e974f2c
MD5 f234a00f17f63dd398a8c9cca824e957
BLAKE2b-256 500341523b145a19e49f277c8d292a27fbf5ef88fecdada3a4bb40b006b3a05c

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a5a00a4a8909c3e66cc2e49ecee7e46aa895f03eb4d327ca4275e69f3447308f
MD5 4c50ac9fcdccc616c040bda32e274ae8
BLAKE2b-256 2aeeae45d7e8a122b41ba173edf302b2bfbe9f53d81474f25825b484f70e245e

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp310-cp310-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp310-cp310-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 2dffcfb2f31f774fcea54578bb0a5e96526d87659914a04eaf7bd0856d6bdbb1
MD5 55b421b4124d39d7225593ed37fd9cde
BLAKE2b-256 e99c29a9b0160f4a415d6cd2fa99de08076a368e935e879e7ba2fa3772f6f8e6

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 829fb84238a5c0fc1df146d4a1c100eebb38705993ef2f3adb674e7e3bf2ef17
MD5 39e5abc6448eca49cc9fe6736a534f8f
BLAKE2b-256 e0a00c42a675f3a88a4f590d747de40e32a1150b2c9b0eea3f1425bb259c2002

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d9125a415b7632601571148f6dae23b54d55dd3d8c6bcf138a7be261f912b9ad
MD5 80251d297cbf8be19f1b1f46e306334b
BLAKE2b-256 15c34dd60c8e3be2645651c4275f804af3caa13a84dfafb4d5a5f247b2fe7c39

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 490560cb58dab53d2b4dd1f8ed91ae673f66a96b17ab9a6550aa71221ed7cf8e
MD5 9a9f45f9b2eba1cf6471f77eefdbd171
BLAKE2b-256 c7f5e636b79eae418439e1f4bed6a89ab22edb63db2604eb7a0776c09ed0d6af

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp39-cp39-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp39-cp39-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 faca0ac75692f86d3ee94c53452a422c05855ee3839fe8ce07a031e3e20def41
MD5 a28010af212dd9c803c9b2c7ee45d237
BLAKE2b-256 c43b5d1c1a3878ea705c3d20e15daade2f89d316d8317141e01bceaa00b784d9

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cf1bddb37bb25abd0a22dd626a7743403dd3ec703f975035966f53561c2be5f5
MD5 a1b37a34c30f1ab70ac84703cc4802f4
BLAKE2b-256 7a1de9ebf46c31563599b43c265a544143e529b61ff4759e8164e2dfaee545bd

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f51ce60f4024995d7fe836bad8ae68506e1c69e4722f27a70792bc5bad66f0d8
MD5 32530f0de4148b8553c5b8c8efc91cc8
BLAKE2b-256 8082f6e9c0796bd97d7af48f1905e31c303e9ac9d44746b5b92b1a33670eea93

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 561272b3fb453195d71903efd54fc5ee2ba9cd84371ff35312b1890b854ec205
MD5 87e8688ac2713f3c78befbc5e730a359
BLAKE2b-256 54b4b7f1732c55745f940ab4d8903f28e70f205f19ef6cb8b24f3eb74ce8c4d6

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp38-cp38-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp38-cp38-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 91970a258f57f7e82b69c76c0a5210c156176e9d12f387c00c96c04351830214
MD5 1851eea4cc9c861482589bba08be6194
BLAKE2b-256 ec80ab94334a8a2b76275fe606ab5dc91de451421635d0e07747759dae245ea3

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fafba570c30b1a4fa27b93911da7abf8d7ffaee80aaf7b3ddbc26b655fb070b0
MD5 59863af0f372da0f2f499fc3c2a9c567
BLAKE2b-256 ef78b65e46c098b0e6fe9f65daab9de44105d1424291fd4d43e8ef3e33b65437

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1e95c0de5f94281ae8638bd0230957c32bcb4d7e5ff400c0580927b37f436a9e
MD5 22a7dd088ee4ee309107b3c0ecf222b4
BLAKE2b-256 7c6307fcd5177201bf7a3b584231fbbb063d05b7a10dee0835a411ec5a7c8392

See more details on using hashes here.

File details

Details for the file switchboard_hw-0.2.19-cp37-cp37m-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for switchboard_hw-0.2.19-cp37-cp37m-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 2da43ff706c02e8080dbe8bbe455222458f4d845af0c537b87c0d51f416585ab
MD5 28e2276c98f4e7b0d712df6911726eaf
BLAKE2b-256 84ca8d5065a9a0885969bc59eb7edb9da5b67b8e3c0d42e5363e7ffc016af245

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