diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 0000000000..caa395a639 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 5ee66292091ff32fcf1050388dd8a28f +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/_sources/compatibility/board.rst.txt b/_sources/compatibility/board.rst.txt new file mode 100644 index 0000000000..664e9ff1a0 --- /dev/null +++ b/_sources/compatibility/board.rst.txt @@ -0,0 +1,20 @@ +.. _compatibility:boards: + +Boards +###### + +.. NOTE:: + `arty` can be any of the board names from the first column. + +.. code-block:: bash + + openFPGALoader -b arty bitstream.bit # Loading in SRAM (volatile) + openFPGALoader -b arty -f bitstream.bit # Writing in flash (non-volatile) + +.. include:: boards.inc + +* IF: Internal Flash +* EF: External Flash +* AS: Active Serial flash mode +* NA: Not Available +* NT: Not Tested diff --git a/_sources/compatibility/cable.rst.txt b/_sources/compatibility/cable.rst.txt new file mode 100644 index 0000000000..9defcbef0a --- /dev/null +++ b/_sources/compatibility/cable.rst.txt @@ -0,0 +1,6 @@ +.. _compatibility:cables: + +Cables +###### + +.. include:: cable.inc diff --git a/_sources/compatibility/fpga.rst.txt b/_sources/compatibility/fpga.rst.txt new file mode 100644 index 0000000000..cb61eddf18 --- /dev/null +++ b/_sources/compatibility/fpga.rst.txt @@ -0,0 +1,11 @@ +.. _compatibility:fpgas: + +FPGAs +##### + +.. include:: fpga.inc + +* IF: Internal Flash +* AS: Active Serial flash mode +* NA: Not Available +* NT: Not Tested diff --git a/_sources/guide/advanced.rst.txt b/_sources/guide/advanced.rst.txt new file mode 100644 index 0000000000..c375a86e36 --- /dev/null +++ b/_sources/guide/advanced.rst.txt @@ -0,0 +1,101 @@ +.. _advanced-usage: + +Advanced usage of openFPGALoader +################################ + +Resetting an FPGA +================= + +.. code-block:: bash + + openFPGALoader [options] -r + +Using negative edge for TDO's sampling +====================================== + +If transaction are unstable you can try to change read edge by using + +.. code-block:: bash + + openFPGALoader [options] --invert-read-edge + +Reading the bitstream from STDIN +================================ + +.. code-block:: bash + + cat /path/to/bitstream.ext | openFPGALoader --file-type ext [options] + +``--file-type`` is required to detect file type. + +.. NOTE:: + It's possible to load a bitstream through network: + + .. code-block:: bash + + # FPGA side + nc -lp port | openFPGALoader --file-type xxx [option + + # Bitstream side + nc -q 0 host port < /path/to/bitstream.ext + +Automatic file type detection bypass +==================================== + +Default behavior is to use file extension to determine file parser. +To avoid this mechanism ``--file-type type`` must be used. + +FT231/FT232 bitbang mode and pins configuration +=============================================== + +FT232R and ft231X may be used as JTAG programmer. +JTAG communications are emulated in bitbang mode. + +To use these devices user needs to provides both the cable and the pin mapping: + +.. code-block:: bash + + openFPGALoader [options] -cft23XXX --pins=TDI:TDO:TCK:TMS /path/to/bitstream.ext + +where: + +* ft23XXX may be ``ft232RL`` or ``ft231X``. +* TDI:TDO:TCK:TMS may be the pin ID (0 <= id <= 7) or string value. + +allowed values are: + +===== == +value ID +===== == + TXD 0 + RXD 1 + RTS 2 + CTS 3 + DTR 4 + DSR 5 + DCD 6 + RI 7 +===== == + +Writing to an arbitrary address in flash memory +=============================================== + +With FPGA using an external SPI flash (*xilinx*, *lattice ECP5/nexus/ice40*, *anlogic*, *efinix*) option ``-o`` allows +one to write raw binary file to an arbitrary adress in FLASH. + +Using an alternative directory for *spiOverJtag* +================================================ + +By setting ``OPENFPGALOADER_SOJ_DIR`` it's possible to override default +*spiOverJtag* bitstreams directory: + +.. code-block:: bash + + export OPENFPGALOADER_SOJ_DIR=/somewhere + openFPGALoader xxxx + +or + +.. code-block:: bash + + OPENFPGALOADER_SOJ_DIR=/somewhere openFPGALoader xxxx diff --git a/_sources/guide/first-steps.rst.txt b/_sources/guide/first-steps.rst.txt new file mode 100644 index 0000000000..5586db5f5a --- /dev/null +++ b/_sources/guide/first-steps.rst.txt @@ -0,0 +1,65 @@ +.. _first-steps: + +First steps with openFPGALoader +############################### + +Install +======= + +Packages are available for Linux distributions, Windows (MSYS2) and macOS: + +* *Arch Linux*: ``sudo pacman -S openfpgaloader`` + +* *Fedora*: ``sudo dnf copr enable mobicarte/openFPGALoader; sudo dnf install openFPGALoader`` + +* *MSYS2*: ``pacman -S mingw-w64-ucrt-x86_64-openFPGALoader`` + +* *macOS*: ``brew install openfpgaloader`` + +More instructions for other installation scenarios are available in :ref:`install`. + +Programming a development board +=============================== + +Just simply replace ``my_fpga_board`` with any FPGA board from :ref:`compatibility:boards` +(or ``openFPGALoader --list-boards``) in any of the two commands below, depending on if you want to program the volatile +part of your FPGA (faster but not persistent) or the flash part of your FPGA (slower but persistent): + +.. code-block:: bash + + openFPGALoader -b my_fpga_board my_bitstream.bit # Program to SRAM + openFPGALoader -b my_fpga_board -f my_bitstream.bit # Program to flash + +.. NOTE:: + When a bitstream file is compatible with both memory load and FLASH write, the default behavior is to load bitstream + in memory. + +Programming an "standalone" FPGA +================================ + +If your FPGA doesn't come with a built-in programmer or if you prefer to use an external cable, you can specify a cable +to use from :ref:`compatibility:cables` (or ``openFPGALoader --list-cables``): + +.. code-block:: bash + + openFPGALoader -c my_cable my_bitstream.bit # Program to SRAM + openFPGALoader -c my_cable -f my_bitstream.bit # Program to flash + +.. NOTE:: + For some cable (like digilent adapters) signals from the converter are not just directly to the FPGA. + For this case, the ``-c`` must be added. + +.. HINT:: + FTDI/FTDI-compatible cable users: the ``-d`` option lets you specify a specific FTDI device: + + .. code-block:: bash + + openFPGALoader -d /dev/ttyUSBX + + When the ``-d`` option is not provided, openFPGALoader will opens the first FTDI adapter it finds. + Therefore it is preferable to use this flag if your computer is connected to multiple FTDI devices. + +Troubleshooting +=============== + +Please refer to :ref:`troubleshooting`. diff --git a/_sources/guide/install.rst.txt b/_sources/guide/install.rst.txt new file mode 100644 index 0000000000..4d204461e1 --- /dev/null +++ b/_sources/guide/install.rst.txt @@ -0,0 +1,181 @@ +.. _install: + +Installing openFPGALoader +######################### + +Linux +===== + +Arch Linux +---------- + +openFPGALoader is available in the default repositories: + +.. code-block:: bash + + sudo pacman -S openfpgaloader + +Alternatively, you could build from source. First: install required libraries: + +.. code-block:: bash + + sudo pacman -S git cmake make gcc pkgconf libftdi libusb zlib hidapi gzip + +Build step is similar as Debian + +Fedora +------ + +openFPGALoader is available as a Copr repository: + +.. code-block:: bash + + sudo dnf copr enable mobicarte/openFPGALoader + sudo dnf install openFPGALoader + +From source (Debian, Ubuntu) +---------------------------- + +This application uses ``libftdi1``, so this library must be installed (and, depending on the distribution, headers too): + +.. code-block:: bash + + sudo apt install \ + git \ + gzip \ + libftdi1-2 \ + libftdi1-dev \ + libhidapi-hidraw0 \ + libhidapi-dev \ + libudev-dev \ + zlib1g-dev \ + cmake \ + pkg-config \ + make \ + g++ + +.. HINT:: + ``libudev-dev`` is optional, may be replaced by ``eudev-dev`` or just not installed. + +By default, ``(e)udev`` support is enabled (used to open a device by his ``/dev/xx`` node). +If you don't want this option, use: + +.. code-block:: bash + + -DENABLE_UDEV=OFF + +By default, ``cmsisdap`` support is enabled (used for colorlight I5, I9). +If you don't want this option, use: + +.. code-block:: bash + + -DENABLE_CMSISDAP=OFF + +Alternatively you can manually specify the location of ``libusb`` and ``libftdi1``: + +.. code-block:: bash + + -DUSE_PKGCONFIG=OFF \ + -DLIBUSB_LIBRARIES= \ + -DLIBFTDI_LIBRARIES= \ + -DLIBFTDI_VERSION= \ + -DCMAKE_CXX_FLAGS="-I -I" + +You may also need to add this if you see link errors between ``libusb`` and ``pthread``: + +.. code-block:: bash + + -DLINK_CMAKE_THREADS=ON + +By default, ``libgpiod`` support is enabled +If you don't want this option, use: + +.. code-block:: bash + + -DENABLE_LIBGPIOD=OFF + +Additionaly you have to install ``libgpiod`` + +To build the app: + +.. code-block:: bash + + git clone https://github.com/trabucayre/openFPGALoader + cd openFPGALoader + mkdir build + cd build + cmake .. # add -DBUILD_STATIC=ON to build a static version + # add -DENABLE_UDEV=OFF to disable udev support and -d /dev/xxx + # add -DENABLE_CMSISDAP=OFF to disable CMSIS DAP support + cmake --build . + # or + make -j$(nproc) + +To install + +.. code-block:: bash + + $ sudo make install + +The default install path is ``/usr/local``, to change it, use ``-DCMAKE_INSTALL_PREFIX=myInstallDir`` in cmake invokation. + +Udev rules +---------- + +By default, users have no access to converters. +A rule file (:ghsrc:`99-openfpgaloader.rules <99-openfpgaloader.rules>`) for ``udev`` is provided at the root directory +of this repository. +These rules set access right and group (``plugdev``) when a converter is plugged. + +.. code-block:: bash + + sudo cp 99-openfpgaloader.rules /etc/udev/rules.d/ + sudo udevadm control --reload-rules && sudo udevadm trigger # force udev to take new rule + sudo usermod -a $USER -G plugdev # add user to plugdev group + +After that you need to unplug and replug your device. + +.. HINT:: + ``usermod`` is used to add ``$USER`` as a member of ``plugdev`` group. + However this update is not taken into account immediately: it's required to + logout from current session and login again. + Check, by using ``id $USER``, if ``plugdev`` is mentioned after ``groups=``. + An alternate (and temporary) solution is to use ``sudo - $USER`` to have + your user seen as a member of ``plugdev`` group (works only for the current terminal). + +macOS +===== + +openFPGALoader is available as a `Homebrew `__ formula: + +.. code-block:: bash + + brew install openfpgaloader + +Alternatively, if you want to build it by hand: + +.. code-block:: bash + + brew install --only-dependencies openfpgaloader + brew install cmake pkg-config zlib gzip + git clone https://github.com/trabucayre/openFPGALoader + cd openFPGALoader + mkdir build + cd build + cmake .. + make -j + +Windows +======= + +Common +====== + +Bitstreams for *XC2C (coolrunner-II)* needs to be remapped using ``.map`` shipped with *ISE*. +*ISE* path is set at configure time using: + +.. code-block:: bash + + -DISE_PATH=/somewhere/Xilinx/ISE_VERS/ + +default: ``/opt/Xilinx/14.7``. diff --git a/_sources/guide/troubleshooting.rst.txt b/_sources/guide/troubleshooting.rst.txt new file mode 100644 index 0000000000..10767b15f0 --- /dev/null +++ b/_sources/guide/troubleshooting.rst.txt @@ -0,0 +1,45 @@ +.. _troubleshooting: + +Troubleshooting +############### + +I installed openFPGALoader but it says `command not found` when I try to launch it +================================================================================== + +The correct spelling of the program is *openFPGALoader* with FPGA and the "L" of "Loader" in uppercase. +Ensure the spelling of the program is correct. + +Gowin device could not communicate since last bitstream flashed. (issue `#206 `_) +========================================================================================================================================== + +Gowin's FPGA may fails to be detected if **JTAGSEL_N** (pin 08 for *GW1N-4K*) is used as a GPIO. +To recover you have to pull down this pin (before power up) to recover JTAG interface (*UG292 - JTAGSELL_N section*). + +JTAG init failed +================ + +Avoid using USB hubs and connect it directly to your PC USB port. + + +Tang Primer 20k program slow and stucked (issue `#250 `_) +================================================================================================================== + +Check your openFPGALoader version: + +.. code:: bash + + openFPGALoader -V + +If it is older than release then v0.9.0, install the most recent version (from commit `f5b89bff68a5e2147404a895c075773884077438 `_ or later). + +Cannot flash Tang Nano 9k (issue `#251 `_) +=================================================================================================== + +This is a device issue, erase its Embedded Flash using Official GoWin Programmer (preferentially in Windows) and SRAM too, then you can use openFPGALoader again. + +Unable to open FTDI device: -4 (usb_open() failed) (issue `#245 `_) +============================================================================================================================ + +Edit your `/etc/udev/rules.d/99-ftdi.rules` file exchanging your programming device permissions. + +For more information, check the udev section from `this guide `_ \ No newline at end of file diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 0000000000..7a937231d0 --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,59 @@ +openFPGALoader: universal utility for programming FPGA +###################################################### + +Welcome to the documentation of openFPGALoader! + +openFPGALoader is a universal utility for programming FPGAs. +Compatible with many boards, cables and FPGA from major manufacturers (Xilinx, Altera/Intel, Lattice, Gowin, Efinix, Anlogic, Cologne Chip). +openFPGALoader works on Linux, Windows and macOS. + +Not sure if your hardware is supported? Check the hardware compatibility lists: + +* :ref:`compatibility:fpgas` +* :ref:`compatibility:boards` +* :ref:`compatibility:cables` + +Also checkout the vendor-specific documentation: + +* `Anlogic `__ +* `Cologne Chip `__ +* `Efinix `__ +* `Gowin `__ +* `Intel/Altera `__ +* `Lattice `__ +* `Xilinx `__ + +.. toctree:: + :caption: User Guide + :hidden: + + guide/first-steps + guide/install + guide/troubleshooting + guide/advanced + +.. toctree:: + :caption: Compatibility + :hidden: + + compatibility/fpga + compatibility/board + compatibility/cable + +.. toctree:: + :caption: Vendors + :hidden: + + vendors/anlogic + vendors/colognechip + vendors/efinix + vendors/gowin + vendors/intel + vendors/lattice + vendors/xilinx + +.. toctree:: + :caption: Development + :hidden: + + todo diff --git a/_sources/todo.rst.txt b/_sources/todo.rst.txt new file mode 100644 index 0000000000..ea81bb95d9 --- /dev/null +++ b/_sources/todo.rst.txt @@ -0,0 +1,31 @@ +.. _todo: + +To Do +##### + +Global +====== + +* improve error message (be more precise) +* catch all exception +* documentation (code + API) + +Cable +===== + +* fix *ch552* (*Sipeed tangNano*): works with *SRAM*, fails with *Flash* +* *busblaster* support +* *anlogic* cable support + +Devices/boards +============== + +* improve frequency configuration. Use FPGA, cable or --freq args maximum frequency +* rework *cyclone10* eeprom access to avoid using FT2232 interfaceB Spi emulation (only supported by trenz board) +* fix checksum computation with *gowin GW2A* +* add support for *tangPrimer* (*anlogic EG4S20*) + +Misc +==== + +* fix spiFlash class to be able to write everywhere (currently offset is hardcoded to 0) diff --git a/_sources/vendors/anlogic.rst.txt b/_sources/vendors/anlogic.rst.txt new file mode 100644 index 0000000000..99eb042e35 --- /dev/null +++ b/_sources/vendors/anlogic.rst.txt @@ -0,0 +1,53 @@ +.. _anlogic: + +Anlogic notes +############# + +Sipeed Lichee Tang +================== + +For this target, *openFPGALoader* supports *svf* and *bit*. + +bit file load (memory) +---------------------- + +.. code-block:: bash + + openFPGALoader -m -b licheeTang /somewhere/project/prj/*.bit + +Since ``-m`` is the default, this argument is optional. + +bit file load (spi flash) +------------------------- + +.. code-block:: bash + + openFPGALoader -f -b licheeTang /somewhere/project/prj/*.bit + +svf file load +------------- + +It's possible to produce this file by using *TD*: + +* Tools->Device Chain +* Add your bit file +* Option : Create svf + +or by using `prjtang project `__: + +.. code-block:: bash + + mkdir build + cd build + cmake ../ + make + +Now a file called *tangbit* is present in current directory and has to be used as follows: + +.. code-block:: bash + + tangbit --input /somewhere.bit --svf bitstream.svf + +.. code-block:: bash + + openFPGALoader -b licheeTang /somewhere/*.svf diff --git a/_sources/vendors/colognechip.rst.txt b/_sources/vendors/colognechip.rst.txt new file mode 100644 index 0000000000..19ba453bd9 --- /dev/null +++ b/_sources/vendors/colognechip.rst.txt @@ -0,0 +1,95 @@ +.. _colognechip: + +Cologne Chip notes +################## + +Supported Boards/Cables +======================= + +* GateMate Evaluation Board using board parameters ``-b gatemate_evb_jtag`` or ``-b gatemate_evb_spi`` +* GateMate Programmer using cable parameter ``-c gatemate_pgm`` + +Programming Modes +================= + +Supported configuration files are bitfiles ``*.bit`` and it's ASCII equivalents ``*.cfg``. + +JTAG Configuration +------------------ + +Performs an active hardware reset and writes the configuration into the FPGA latches via JTAG. The configuration mode pins ``CFG_MD[3:0]`` must be set to 0xC (JTAG). + +1. Program using Evaluation Board: + +.. code-block:: bash + + openFPGALoader -b gatemate_evb_jtag .cfg.bit + +2. Program using Programmer Cable: + +.. code-block:: bash + + openFPGALoader -c gatemate_pgm .cfg.bit + +SPI Configuration +----------------- + +Performs an active hardware reset and writes the configuration into the FPGA latches via SPI. The configuration mode pins ``CFG_MD[3:0]`` must be set to 0x4 (SPI passive). + +1. Program using Evaluation Board: + +.. code-block:: bash + + openFPGALoader -b gatemate_evb_spi .cfg.bit + +2. Program using Programmer Cable: + +.. code-block:: bash + + openFPGALoader -b gatemate_pgm_spi .cfg.bit + +JTAG Flash Access +----------------- + +It is possible to access external flashes via the internal JTAG-SPI-bypass. The configuration mode pins ``CFG_MD[3:0]`` must be set to 0xC (JTAG). Note that the FPGA will not start automatically. + +1. Write to flash using Evaluation Board: + +.. code-block:: bash + + openFPGALoader -b gatemate_evb_jtag .cfg.bit + +2. Write to flash using Programmer Cable: + +.. code-block:: bash + + openFPGALoader -c gatemate_pgm -f .cfg.bit + +The `offset` parameter can be used to store data at any point in the flash, e.g.: + +.. code-block:: bash + + openFPGALoader -b gatemate_evb_jtag -o .cfg.bit + +SPI Flash Access +---------------- + +If the programming device and FPGA share the same SPI signals, it is possible to hold the FPGA in reset and write data to the flash. The configuration mode can be set as desired. If the FPGA should start from the external memory after reset, the configuration mode pins ``CFG_MD[3:0]`` set to 0x0 (SPI active). + +1. Write to flash using Evaluation Board: + +.. code-block:: bash + + openFPGALoader -b gatemate_evb_spi -f .cfg.bit + +2. Write to flash using Programmer Cable: + +.. code-block:: bash + + openFPGALoader -b gatemate_pgm_spi -f .cfg.bit + +The `offset` parameter can be used to store data at any point in the flash, e.g.: + +.. code-block:: bash + + openFPGALoader -b gatemate_evb_spi -o .cfg.bit diff --git a/_sources/vendors/efinix.rst.txt b/_sources/vendors/efinix.rst.txt new file mode 100644 index 0000000000..a47115b094 --- /dev/null +++ b/_sources/vendors/efinix.rst.txt @@ -0,0 +1,51 @@ +.. _efinix: + +Efinix notes +############ + +Firant and Xyloni boards (efinix trion T8) +========================================== + +``.hex`` file is the default format generated by *Efinity IDE*, so nothing special must be done to generates this file. + +*openFPGALoader* supports only active mode (SPI) (*JTAG* is WIP). + +hex file load +------------- + +.. code-block:: bash + + openFPGALoader -b fireant /somewhere/project/outflow/*.hex + +or, for xyloni board + +.. code-block:: bash + + openFPGALoader -b xyloni_spi /somewhere/project/outflow/*.hex + +Since openFPGALoader access the flash directly in SPI mode the ``-b fireant``, ``-b xyloni_spi`` is required (no +autodetection possible). + +Trion and Titanium JTAG usage +========================================== + +*openFPGALoader* supports loading to RAM and SPI Flash with JTAG + +Tested with J-Link BASE + +bin file load +------------- + +.. code-block:: bash + + openFPGALoader --cable jlink_base -m /somewhere/project/outflow/*.bin + +hex file flash +------------- + +Example for ti60f225. +NOTE: JTAG chains with more than one device (eg --index-chain) are currently not supported for writing to SPI flash + +.. code-block:: bash + + openFPGALoader --cable jlink_base --fpga-part ti60f225 -f /somewhere/project/outflow/*.hex \ No newline at end of file diff --git a/_sources/vendors/gowin.rst.txt b/_sources/vendors/gowin.rst.txt new file mode 100644 index 0000000000..63f4ac18ce --- /dev/null +++ b/_sources/vendors/gowin.rst.txt @@ -0,0 +1,64 @@ +.. _gowin: + +Gowin notes +########### + +GOWIN GW1N +========== + +.. NOTE:: + + * Trenz TEC0117 + * Sipeed Tang Nano + * Sipeed Tang Nano 4K + * Honeycomb + * RUNBER + +``.fs`` file is the default format generated by *Gowin IDE*, so nothing special must be done to generates this file. + +Since the same file is used for SRAM and Flash a CLI argument is used to specify the destination. + +Flash SRAM +---------- + +with ``-m``: + +.. code-block:: bash + + openFPGALoader -m -b BOARD_NAME impl/pnr/*.fs + +where ``BOARD_NAME`` is: + +* ``tec0117`` +* ``tangnano`` +* ``tangnano1k`` +* ``tangnano4k`` +* ``tangnano9k`` +* ``tangnano20k`` +* ``tangprimer20k`` +* ``runber`` + +Flash +----- + +.. ATTENTION:: + Only with Trenz TEC0117 and runber. + +with ``-f``, file load: + +.. code-block:: bash + + openFPGALoader -f -b BOARD_NAME impl/pnr/*.fs + +where ``BOARD_NAME`` is: + +* ``tec0117`` +* ``runber`` + +It's possible to flash external SPI Flash (connected to MSPI) in bscan mode by using ``--external-flash`` instead of +``-f``. + +.. NOTE:: + + Gowin's FPGA may fails to be detected if **JTAGSEL_N** (pin 08 for *GW1N-4K*) is used as a GPIO. + To recover you have to pull down this pin (before power up) to recover JTAG interface (*UG292 - JTAGSELL_N section*). diff --git a/_sources/vendors/intel.rst.txt b/_sources/vendors/intel.rst.txt new file mode 100644 index 0000000000..d87b997b55 --- /dev/null +++ b/_sources/vendors/intel.rst.txt @@ -0,0 +1,69 @@ +.. _intel: + +Intel notes +########### + +Intel/Altera +============ + +.. NOTE:: + + * CYC1000 + * C10LP-RefKit + * DE0 + * de0nano + +Loading a bitstream +------------------- + +SVF and RBF files are supported. + +``sof`` to ``svf`` generation: + +.. code-block:: bash + + quartus_cpf -c -q 12.0MHz -g 3.3 -n p project_name.sof project_name.svf + +``sof`` to ``rbf`` generation: + +.. code-block:: bash + + quartus_cpf --option=bitstream_compression=off -c project_name.sof project_name.rbf + +.. WARNING:: + As mentioned in ``cyclone`` handbooks, real-time decompression is not supported by FPGA in JTAG mode. + Keep in mind to disable this option. + +file load: + +.. code-block:: bash + + openFPGALoader -b boardname project_name.svf + # or + openFPGALoader -b boardname project_name.rbf + +with ``boardname`` = ``de0``, ``cyc1000``, ``c10lp-refkit``, ``de0nano``, ``de0nanoSoc`` or ``qmtechCycloneV``. + +SPI flash +--------- + +RPD and RBF are supported. + +``sof`` to ``rpd``: + +.. code-block:: bash + + # CYC1000 + quartus_cpf -o auto_create_rpd=on -c -d EPCQ16A -s 10CL025YU256C8G project_name.svf project_name.jic + # C10LP-RefKit + quartus_cpf -o auto_create_rpd=on -c -d EPCQ16A -s 10CL055YU484C8G project_name.svf project_name.jic + +file load: + +.. code-block:: bash + + openFPGALoader -b boardname -r project_name_auto.rpd + # or + openFPGALoader -b boardname -r project_name.rbf + +with ``boardname`` = ``cyc1000``, ``c10lp-refkit``. diff --git a/_sources/vendors/lattice.rst.txt b/_sources/vendors/lattice.rst.txt new file mode 100644 index 0000000000..85c881c50e --- /dev/null +++ b/_sources/vendors/lattice.rst.txt @@ -0,0 +1,104 @@ +.. _lattice: + +Lattice notes +############# + +MachXO2/MachXO3 +=============== + +Flash memory +------------ + +``.jed`` file is the default format generated by *Lattice Diamond*, so nothing special must be done to generates this +file. + +File load: + +.. code-block:: bash + + openFPGALoader [-b yourboard] [--flash-sector CFG0] impl1/*.jed + +where ``yourboard`` may be: + +* ``machX02EVN`` +* ``machX03EVN`` +* ``machXO3SK`` + +and where ``--flash-sector CFG0`` is needed for the MachXO3D Breakout Board. + +``.bit`` may also be used for *machXO2* + +SRAM +---- + +To generates ``.bit`` file *Bitstream file* must be checked under *Exports Files* in *Lattice Diamond* left panel. + +File load: + +.. code-block:: bash + + openFPGALoader [-b yourboard] impl1/*.bit + +where ``yourboard`` may be: + +* ``machX02EVN`` +* ``machX03EVN`` +* ``machXO3SK`` + +iCE40 +===== + +``.bin`` is the default format generated by *nextpnr*, so nothing special must be done. + +Since most ice40 boards uses the same pinout between *FTDI* and *SPI flash* a generic *ice40_generic* board is provided. + +For the specific case of the *iCE40HXXK-EVB* where no onboard programmer is present, please use this: + +============= =============== + FTDI iCE40HXXK-EVB +============= =============== +SI (ADBUS1) Pin 8 +SCK (ADBUS0) Pin 9 +SO (ADBUS2) Pin 7 +CS (ABDUS4) Pin 10 +RST (ADBUS6 Pin 6 +DONE (ADBUS7) Pin 5 +============= =============== + +Bin file load: + +.. code-block:: bash + + openFPGALoader -b ice40_generic /somewhere/*.bin + +Since it's a direct access to the flash (SPI) the ``-b`` option is required. + +ECP5/Crosslink-NX +================= + +SRAM +---- + +.. code-block:: bash + + openFPGALoader [-b yourBoard] [-c yourCable] -m project_name/*.bit + +.. HINT:: + By default, openFPGALoader loads bitstream in memory, so the ``-m`` argument is optional. + +SPI Flash +--------- + +BIT: + +.. code-block:: bash + + openFPGALoader [-b yourBoard] [-c yourCable] -f project_name/*.bit # or *.bin + +MCS: + +To generate ``.mcs`` file *PROM File* must be checked under *Exports Files* in *Lattice Diamond* left panel. + +.. code-block:: bash + + openFPGALoader [-b yourBoard] [-c yourCable] project_name/*.mcs diff --git a/_sources/vendors/xilinx.rst.txt b/_sources/vendors/xilinx.rst.txt new file mode 100644 index 0000000000..82a339211c --- /dev/null +++ b/_sources/vendors/xilinx.rst.txt @@ -0,0 +1,124 @@ +.. _xilinx: + +Xilinx notes +############ + +To simplify further explanations, we consider the project is generated in the current directory. + +.. NOTE:: + 1. Spartan Edge Accelerator Board has only pinheader, so the cable must be provided + + 2. A *JTAG* <-> *SPI* bridge (used to write bitstream in FLASH) is available for some device, see + :ghsrc:`spiOverJtag ` to check if your model is supported. + + 3. Board provides the device/package model, but if the targeted board is not officially supported but the FPGA yes, + you can use ``--fpga-part`` to provide the model. + + 4. With spartan3, the flash is an independent JTAG device. + User has to use ``--index-chain`` to access FPGA (RAM only) or flash (write/read only). + +.. WARNING:: + ``*.bin`` may be loaded in memory or in flash, but this extension is a classic extension for CPU firmware and, by + default, *openFPGALoader* loads file in memory. + Double check ``-m`` / ``-f`` when you want to use a firmware for a softcore (or anything, other than a bitstream) to + write somewhere in the FLASH device). + +``.bit`` file is the default format generated by *vivado*, so nothing special task must be done to generate this +bitstream. + +``.bin`` is not, by default, produced. +To have access to this file you need to configure the tool: + +- GUI: *Tools* -> *Settings* -> *Bitstreams* -> check ``-bin_file``. +- TCL: append your *TCL* file with ``set_property STEPS.WRITE_BITSTREAM.ARGS.BIN_FILE true [get_runs impl_1]``. + +.. WARNING:: + For alchitry board the bitstream must be configured with a buswidth of 1 or 2. + Quad mode can't be used with alchitry's FLASH. + +.. WARNING:: + For boards based on a Zynq (7000 or MPSoC), boot mode must be configured for JTAG (for Zedboard JP7->JP11 must be + to GND). + +Loading a bitstream +=================== + +``.bit`` and ``.bin`` are allowed to be loaded in memory. + +File load: + +.. code-block:: bash + + openFPGALoader [-m] -b arty *.runs/impl_1/*.bit (or *.bin) + +or + +.. code-block:: bash + + openFPGALoader [-m] -b spartanEdgeAccelBoard -c digilent_hs2 *.runs/impl_1/*.bit (or *.bin) + + +SPI flash +--------- + +.. NOTE:: + ``.bit``, ``.bin``, and ``.mcs`` are supported for FLASH. + +``.mcs`` must be generated through Vivado with a tcl script like: + +.. WARNING:: + For boards based on Zynq device (7000 and MPSoC) SPI flash is not accessible through PL. + +.. code-block:: tcl + + set project [lindex $argv 0] + + set bitfile "${project}.runs/impl_1/${project}.bit" + set mcsfile "${project}.runs/impl_1/${project}.mcs" + + write_cfgmem -format mcs -interface spix4 -size 16 \ + -loadbit "up 0x0 $bitfile" -loaddata "" \ + -file $mcsfile -force + +.. NOTE:: + ``-interface spix4`` and ``-size 16`` depends on SPI flash capability and size. + +The tcl script is used with: + +.. code-block:: bash + + vivado -nolog -nojournal -mode batch -source script.tcl -tclargs myproject + +File load: + +.. code-block:: bash + + openFPGALoader [--fpga-part xxxx] -f -b arty *.runs/impl_1/*.mcs (or .bit / .bin) + +.. NOTE:: + ``-f`` is required to write bitstream (without them ``.bit`` and ``.bin`` are loaded in memory). + +.. NOTE:: + ``--fpga-part`` is only required if this information is not provided at ``board.hpp`` level or if the board is not + officially supported. + device/package format is something like xc7a35tcsg324 (arty model). + See :ghsrc:`src/board.hpp `, or :ghsrc:`spiOverJtag ` directory for examples. + +Some boards with UltraScale FPGAs, like the VCU118 and KCU16, support the SPIx8 (Dual Quad SPI) configuration. +In this case, the ``spix8`` option ``write_cfgmem`` on the above example can be used to generate two ``.mcs`` files, +to fit bigger designs or for faster programming. Only ``.mcs`` files can be used to program the FPGA in this case. + +In this case, to load the two ``.mcs`` files: + +.. code-block:: bash + + openFPGALoader --board vcu118 -f --target-flash both --bitstream *.runs/impl_1/*_primary.mcs --secondary-bitstream *.runs/impl_1/*_secondary.mcs + +On these boards, each SPI flash can be programmed independently with the ``--target-flash`` option. +The default target is the ``primary`` flash. + +For example, to program only the secondary flash with arbitrary data not related to FPGA configuration: + +.. code-block:: bash + + openFPGALoader --board vcu118 -f --target-flash secondary --bitstream arbitrary_data diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 0000000000..30fee9d0f7 --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/css/badge_only.css b/_static/css/badge_only.css new file mode 100644 index 0000000000..ec0f9a8937 --- /dev/null +++ b/_static/css/badge_only.css @@ -0,0 +1 @@ +.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1f1f;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#262626;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #404040}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/_static/css/fonts/Roboto-Slab-Bold.woff b/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 0000000000..6cb6000018 Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/_static/css/fonts/Roboto-Slab-Bold.woff2 b/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 0000000000..7059e23142 Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/_static/css/fonts/Roboto-Slab-Regular.woff b/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 0000000000..f815f63f99 Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/_static/css/fonts/Roboto-Slab-Regular.woff2 b/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 0000000000..f2c76e5bda Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/_static/css/fonts/fontawesome-webfont.eot b/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000..e9f60ca953 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/_static/css/fonts/fontawesome-webfont.svg b/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000000..855c845e53 --- /dev/null +++ b/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/css/fonts/fontawesome-webfont.ttf b/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000..35acda2fa1 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/_static/css/fonts/fontawesome-webfont.woff b/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000..400014a4b0 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/_static/css/fonts/fontawesome-webfont.woff2 b/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000..4d13fc6040 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/_static/css/fonts/lato-bold-italic.woff b/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 0000000000..88ad05b9ff Binary files /dev/null and b/_static/css/fonts/lato-bold-italic.woff differ diff --git a/_static/css/fonts/lato-bold-italic.woff2 b/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 0000000000..c4e3d804b5 Binary files /dev/null and b/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/_static/css/fonts/lato-bold.woff b/_static/css/fonts/lato-bold.woff new file mode 100644 index 0000000000..c6dff51f06 Binary files /dev/null and b/_static/css/fonts/lato-bold.woff differ diff --git a/_static/css/fonts/lato-bold.woff2 b/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 0000000000..bb195043cf Binary files /dev/null and b/_static/css/fonts/lato-bold.woff2 differ diff --git a/_static/css/fonts/lato-normal-italic.woff b/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 0000000000..76114bc033 Binary files /dev/null and b/_static/css/fonts/lato-normal-italic.woff differ diff --git a/_static/css/fonts/lato-normal-italic.woff2 b/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 0000000000..3404f37e2e Binary files /dev/null and b/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/_static/css/fonts/lato-normal.woff b/_static/css/fonts/lato-normal.woff new file mode 100644 index 0000000000..ae1307ff5f Binary files /dev/null and b/_static/css/fonts/lato-normal.woff differ diff --git a/_static/css/fonts/lato-normal.woff2 b/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 0000000000..3bf9843328 Binary files /dev/null and b/_static/css/fonts/lato-normal.woff2 differ diff --git a/_static/css/theme.css b/_static/css/theme.css new file mode 100644 index 0000000000..2d181942da --- /dev/null +++ b/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:15px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{padding:5px;border:none;background:none}.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:15px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:30px;display:inline-block;line-height:30px;padding:0 15px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#9b9b9b;height:30px;line-height:30px;padding:0 .809em;margin:6px 0 0;border-top:1px solid #9b9b9b;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4d4d4d;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#333;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:0;z-index:200;background-color:#333;text-align:center}.wy-side-nav-search input[type=text]{width:100%;border-radius:0;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#333;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.4045em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin:0 0 .809em;font-weight:400}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#333;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#333;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#333;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#333;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:1024px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey;font-size:95%;text-align:center}footer p{margin-bottom:0;font-size:95%}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,p{margin-bottom:12px}h1{display:none}.rst-content .toctree-wrapper>p.caption,h2{border-bottom:1px solid #e1e4e5;padding:0 0 3px;font-size:130%}h3{font-size:115%;text-decoration:underline}.section p,.simple li,section>p{text-align:justify}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1f1f;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#262626;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #404040}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{content:":"}html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.footnote>dt>span.brackets{margin-right:.5rem}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{font-style:italic}html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#b3b3b3;color:#333;border-top:3px solid #666;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{color:#666}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #737373;background:#b3b3b3;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 0000000000..d06a71d751 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 0000000000..088868338d --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: 'latest', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 0000000000..a858a410e4 Binary files /dev/null and b/_static/file.png differ diff --git a/_static/js/badge_only.js b/_static/js/badge_only.js new file mode 100644 index 0000000000..526d7234b6 --- /dev/null +++ b/_static/js/badge_only.js @@ -0,0 +1 @@ +!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=4)}({4:function(e,t,r){}}); \ No newline at end of file diff --git a/_static/js/html5shiv-printshiv.min.js b/_static/js/html5shiv-printshiv.min.js new file mode 100644 index 0000000000..2b43bd062e --- /dev/null +++ b/_static/js/html5shiv-printshiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3-pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/_static/js/html5shiv.min.js b/_static/js/html5shiv.min.js new file mode 100644 index 0000000000..cd1c674f5e --- /dev/null +++ b/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/_static/js/theme.js b/_static/js/theme.js new file mode 100644 index 0000000000..1fddb6ee4a --- /dev/null +++ b/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 0000000000..d96755fdaf Binary files /dev/null and b/_static/minus.png differ diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 0000000000..7107cec93a Binary files /dev/null and b/_static/plus.png differ diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 0000000000..6bae782c52 --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,85 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #49483e } +.highlight { background: #232629; color: #cccccc } +.highlight .c { color: #777777; font-style: italic } /* Comment */ +.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +.highlight .esc { color: #cccccc } /* Escape */ +.highlight .g { color: #cccccc } /* Generic */ +.highlight .k { color: #7686bb; font-weight: bold } /* Keyword */ +.highlight .l { color: #cccccc } /* Literal */ +.highlight .n { color: #cccccc } /* Name */ +.highlight .o { color: #cccccc } /* Operator */ +.highlight .x { color: #cccccc } /* Other */ +.highlight .p { color: #cccccc } /* Punctuation */ +.highlight .ch { color: #777777; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #777777; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #777777; font-style: italic } /* Comment.Preproc */ +.highlight .cpf { color: #777777; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #777777; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #777777; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #cccccc } /* Generic.Deleted */ +.highlight .ge { color: #cccccc } /* Generic.Emph */ +.highlight .ges { color: #cccccc } /* Generic.EmphStrong */ +.highlight .gr { color: #cccccc } /* Generic.Error */ +.highlight .gh { color: #cccccc } /* Generic.Heading */ +.highlight .gi { color: #cccccc } /* Generic.Inserted */ +.highlight .go { color: #cccccc } /* Generic.Output */ +.highlight .gp { color: #ffffff } /* Generic.Prompt */ +.highlight .gs { color: #cccccc } /* Generic.Strong */ +.highlight .gu { color: #cccccc } /* Generic.Subheading */ +.highlight .gt { color: #cccccc } /* Generic.Traceback */ +.highlight .kc { color: #7686bb; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #7686bb; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #7686bb; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #7686bb; font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: #7686bb; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #7686bb; font-weight: bold } /* Keyword.Type */ +.highlight .ld { color: #cccccc } /* Literal.Date */ +.highlight .m { color: #4FB8CC } /* Literal.Number */ +.highlight .s { color: #51cc99 } /* Literal.String */ +.highlight .na { color: #cccccc } /* Name.Attribute */ +.highlight .nb { color: #cccccc } /* Name.Builtin */ +.highlight .nc { color: #cccccc } /* Name.Class */ +.highlight .no { color: #cccccc } /* Name.Constant */ +.highlight .nd { color: #cccccc } /* Name.Decorator */ +.highlight .ni { color: #cccccc } /* Name.Entity */ +.highlight .ne { color: #cccccc } /* Name.Exception */ +.highlight .nf { color: #6a6aff } /* Name.Function */ +.highlight .nl { color: #cccccc } /* Name.Label */ +.highlight .nn { color: #cccccc } /* Name.Namespace */ +.highlight .nx { color: #e2828e } /* Name.Other */ +.highlight .py { color: #cccccc } /* Name.Property */ +.highlight .nt { color: #cccccc } /* Name.Tag */ +.highlight .nv { color: #7AB4DB; font-weight: bold } /* Name.Variable */ +.highlight .ow { color: #cccccc } /* Operator.Word */ +.highlight .pm { color: #cccccc } /* Punctuation.Marker */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #4FB8CC } /* Literal.Number.Bin */ +.highlight .mf { color: #4FB8CC } /* Literal.Number.Float */ +.highlight .mh { color: #4FB8CC } /* Literal.Number.Hex */ +.highlight .mi { color: #4FB8CC } /* Literal.Number.Integer */ +.highlight .mo { color: #4FB8CC } /* Literal.Number.Oct */ +.highlight .sa { color: #51cc99 } /* Literal.String.Affix */ +.highlight .sb { color: #51cc99 } /* Literal.String.Backtick */ +.highlight .sc { color: #51cc99 } /* Literal.String.Char */ +.highlight .dl { color: #51cc99 } /* Literal.String.Delimiter */ +.highlight .sd { color: #51cc99 } /* Literal.String.Doc */ +.highlight .s2 { color: #51cc99 } /* Literal.String.Double */ +.highlight .se { color: #51cc99 } /* Literal.String.Escape */ +.highlight .sh { color: #51cc99 } /* Literal.String.Heredoc */ +.highlight .si { color: #51cc99 } /* Literal.String.Interpol */ +.highlight .sx { color: #51cc99 } /* Literal.String.Other */ +.highlight .sr { color: #51cc99 } /* Literal.String.Regex */ +.highlight .s1 { color: #51cc99 } /* Literal.String.Single */ +.highlight .ss { color: #51cc99 } /* Literal.String.Symbol */ +.highlight .bp { color: #cccccc } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #6a6aff } /* Name.Function.Magic */ +.highlight .vc { color: #7AB4DB; font-weight: bold } /* Name.Variable.Class */ +.highlight .vg { color: #BE646C; font-weight: bold } /* Name.Variable.Global */ +.highlight .vi { color: #7AB4DB; font-weight: bold } /* Name.Variable.Instance */ +.highlight .vm { color: #7AB4DB; font-weight: bold } /* Name.Variable.Magic */ +.highlight .il { color: #4FB8CC } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 0000000000..7918c3fab3 --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 0000000000..8a96c69a19 --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/compatibility/board.html b/compatibility/board.html new file mode 100644 index 0000000000..99716ce21c --- /dev/null +++ b/compatibility/board.html @@ -0,0 +1,1068 @@ + + + + + + + Boards — openFPGALoader: universal utility for programming FPGA latest documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+ +
+
+ +
+
+ +
+

Boards

+
+

Note

+

arty can be any of the board names from the first column.

+
+
openFPGALoader -b arty bitstream.bit # Loading in SRAM (volatile)
+openFPGALoader -b arty -f bitstream.bit # Writing in flash (non-volatile)
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Board name

Description

FPGA

Memory

Flash

Constraints

ac701

Xilinx Artix-7 FPGA AC701 Evaluation Kit

Artix xc7a200t2fbg676c

OK

NT

AC701 ➚

acornCle215

Acorn CLE 215+

Artix xc7a200tsbg484

OK

OK

litex-acorn-baseboard-mini

The LiteX-Acorn-Baseboards are baseboards developed around the SQRL’s Acorn board (or Nite/LiteFury)

Artix xc7a200tsbg484

OK

OK

alchitry_au

Alchitry Au

Artix xc7a35tftg256

OK

OK

alchitry_au_plus

Alchitry Au+ (Plus)

Artix xc7a100tftg256

OK

OK

alinx_ax516

ALINX AX516

Spartan6 xc6slx16csg324

OK

OK

alinx_ax7101

ALINX AX/7101

Artix xc7a100tfgg484

OK

OK

alinx_ax7102

ALINX AX/7102

Artix xc7a100tfgg484

OK

OK

analogMax

Trenz TEI0010 - AnalogMax

Max 10 10M08SAU169C8G

SVF

SVF

antmicro_ddr4_tester

Antmicro Data Center DRAM Tester

Kintex7 xc7k160t

OK

OK

antmicro_ddr5_tester

Antmicro DDR5 Tester

Kintex7 xc7k160t

OK

OK

antmicro_lpddr4_tester

Antmicro LPDDR4 Test Board

Kintex7 xc7k70t

OK

OK

arty_a7_35t

Digilent Arty A7

Artix xc7a35ticsg324

OK

OK

Arty-A7-35T ➚

arty_a7_100t

Digilent Arty A7

Artix xc7a100tcsg324

OK

OK

Arty-A7-100T ➚

arty_s7_25

Digilent Arty S7

Spartan7 xc7s25csga324

OK

OK

Arty-S7-25 ➚

arty_s7_50

Digilent Arty S7

Spartan7 xc7s50csga324

OK

OK

Arty-S7-50 ➚

arty_z7_10

Digilent Arty S7

Zynq7000 xc7z010csg400

OK

NA

arty_z7_20

Digilent Arty S7

Zynq7000 xc7z020csg400

OK

NA

arty

Digilent Analog Discovery 2

Spartan6 xc6slx25

OK

NT

arty

Digilent Digital Discovery

Spartan6 xc6slx25

OK

NT

axu2cga

Alinx AXU2CGA Zynq MPSoC Dev Board

ZynqMPSoC XCZU2CG

OK

NA

basys3

Digilent Basys3

Artix xc7a35tcpg236

OK

OK

cmod_s7

Digilent Cmod S7

Spartan7 xc7s25csga225

NA

OK

gatemate_evb_jtag

Cologne Chip GateMate FPGA Evaluation Board (JTAG mode)

Cologne Chip GateMate Series

OK

OK

gatemate_evb_spi

Cologne Chip GateMate FPGA Evaluation Board (SPI mode)

Cologne Chip GateMate Series

OK

OK

gatemate_pgm_spi

Cologne Chip GateMate FPGA Programmer (SPI mode)

Cologne Chip GateMate Series

OK

OK

certusnx_versa_evn

Certus-NX Versa Evaluation Board

Certus LFD2NX-40

OK

OK

certuspronx_evn

CertusPro-NX Evaluation Board

CertusPro-NX LFCPNX-100

OK

OK

certuspronx_versa_evn

CertusPro-NX Versa

CertusPro-NX LFCPNX-100

OK

OK

cmoda7_15t

Digilent CmodA7

Artix xc7a15tcpg236

OK

OK

cmoda7_35t

Digilent CmodA7

Artix xc7a35tcpg236

OK

OK

colorlight

Colorlight 5A-75B (version 7)

ECP5 LFE5U-25F-6BG256C

OK

OK

colorlight-i5

Colorlight I5

ECP5 LFE5U-25F-6BG381C

OK

OK

Colorlight-i5-v7.0 ➚

colorlight-i9

Colorlight I9

ECP5 LFE5U-45F-6BG381C

OK

OK

Colorlight-i9-v7.2 ➚

colorlight-i9+

Colorlight I9+

Artix xc7a50tfgg484

OK

OK

crosslinknx_evn

Lattice CrossLink-NX Evaluation Board

Nexus LIFCL-40

OK

OK

cyc1000

Trenz cyc1000

Cyclone 10 LP 10CL025YU256C8G

OK

OK

c10lp-refkit

Trenz c10lp-refkit

Cyclone 10 LP 10CL055YU484C8G

OK

OK

c5g

Terasic C5G (Cyclone V GX Starter Kit)

Cyclone V GX 5CGXFC5C6F27C7N

OK

NT

de0

Terasic DE0

Cyclone III EP3C16F484C6

OK

NT

de0nano

Terasic de0nano

Cyclone IV E EP4CE22F17C6

OK

OK

de0nanoSoc

Terasic de0nanoSoc

Cyclone V SoC 5CSEMA4U23C6

OK

de10lite

Terasic de10lite

MAX 10 10M50DAF484C7G

OK

de10nano

Terasic de10Nano

Cyclone V SoC 5CSEBA6U23I7

OK

de1Soc

Terasic DE1-SoC

Cyclone V SoC 5CSEMA5F31C6

OK

deca

Arrow/Terasic DECA

MAX 10 10M50DAF484C6GES

OK

ecp5_evn

Lattice ECP5 5G Evaluation Board

ECP5G LFE5UM5G-85F

OK

OK

ECP5-EVN ➚

ecpix5

LambdaConcept ECPIX-5 (FT2232)

ECP5 LFE5UM5G-85F

OK

OK

ECPIX-5-45F ➚ ECPIX-5-85F ➚

ecpix5_r03

LambdaConcept ECPIX-5 (FT4232)

ECP5 LFE5UM5G-85F

OK

OK

ECPIX-5-45F ➚ ECPIX-5-85F ➚

fireant

Fireant Trion T8

Trion T8F81

NA

AS

fomu

Fomu PVT

iCE40UltraPlus UP5K

NA

OK

Fomu-PVT ➚

gr740-mini

GR740-MINI

CertusPro-NX LFCPNX-100

OK

NA

honeycomb

honeycomb

littleBee GW1NS-2C

OK

IF

hseda-xc6slx16

XILINX SPARTAN6 XC6SLX16 Microblaze SDRAM USB2.0 FPGA

Spartan6 xc6slx16-ftg256

OK

OK

ice40_generic

iCEBreaker

iCE40UltraPlus UP5K

NA

AS

iCEBreaker ➚

icebreaker-bitsy

iCEBreaker-bitsy

iCE40UltraPlus UP5K

NA

OK

iCEBreaker-bitsy-v0 ➚ iCEBreaker-bitsy-v1 ➚

ice40_generic

icestick

iCE40 HX1k

NA

AS

IceStick ➚

ice40_generic

iCE40-HX8K

iCE40 HX8k

OK

AS

iCE40-HX8K ➚

ice40_generic

Olimex iCE40HX1K-EVB

iCE40 HX1k

NT

AS

iCE40HX1K-EVB ➚

ice40_generic

Olimex iCE40HX8K-EVB

iCE40 HX8k

NT

AS

iCE40HX8K-EVB ➚

ice40_generic

iCE40 UltraPlus Breakout Board (iCE40UP5K-B-EVN)

iCE40-UP5K

NT

AS

iCE40-UP ➚

ice40_generic

Icezum Alhambra II

iCE40 HX4k

NT

AS

IceZumAlhambraII ➚

kc705

Xilinx KC705

Kintex7 xc7k325t

OK

NT

KC705 ➚

kcu105

Xilinx KCU105

Kintex UltraScale xcku040-ffva1156

OK

OK

kcu116

Xilinx KCU116

Kintex UltraScale+ xcku5p-ffvb676

OK

OK

LD-KONFEKT

Lone Dynamics Corporation - Machdyne Konfekt computer

ECP5 LFE5U-12F-6BG256C

OK

OK

LD-SCHOKO

Lone Dynamics Corporation - Machdyne Schoko computer

ECP5 LFE5U-45F-6CABGA256

OK

OK

licheeTang

Sipeed Lichee Tang

eagle s20 EG4S20BG256

OK

OK

machXO2EVN

Lattice MachXO2 Breakout Board Evaluation Kit

MachXO2 LCMXO2-7000HE

OK

OK

machXO3EVN

Lattice MachXO3D Development Board

MachXO3D LCMXO3D-9400HC

OK

NT

machXO3SK

Lattice MachXO3LF Starter Kit

MachXO3 LCMX03LF-6900C

OK

OK

mini_itx

Avnet Mini-ITX Base Kit

AMD Xilinx XC7Z045/XC7Z100-2FFG900

OK

NA

nexys_a7_50

Digilent Nexys A7(Nexys 4 DDR)

Artix xc7a50tcsg324

OK

OK

Nexys4DDR ➚

nexys_a7_100

Digilent Nexys A7(Nexys 4 DDR)

Artix nexys_a7_100

OK

OK

Nexys4DDR ➚

nexysVideo

Digilent Nexys Video

Artix xc7a200tsbg484

OK

OK

xem8320

Opal Kelly XEM8320

Artix UltraScale+ xcau25p-2ffvb676e

OK

TBD

olimex_gatemateevb

Olimex CCGMA1 Cologne Chip GateMate FPGA Evaluation Board

Cologne Chip GateMate Series (GM1A1)

OK

NT

orbtrace_dfu

ORBTrace mini (dfu mode)

ECP5 LFE5U-25F-8BG256C

NA

OK (DFU)

orangeCrab

Orange Crab

ECP5 LFE5U-25F-8MG285C

OK (JTAG)

OK (DFU)

OrangeCrab-r0.2 ➚

papilio_one

Papilio One

Spartan3E xc3s500e-vq100

OK

OK

pipistrello

Saanlima Pipistrello LX45

Spartan6 xc6slx45-csg324

OK

OK

pynq_z1

PYNQ-Z1

Zynq7000 xc7z020clg400

OK

NA

pynq_z2

PYNQ-Z2

Zynq7000 xc7z020clg400

OK

NA

qmtechCyclone10

QMTech Cyclone 10 Starter Kit

Cyclone 10 LP 10CL016YU484C8G

OK

OK

qmtechCycloneIV

QMTech CycloneIV Core Board

Cyclone IV EP4CE15F23C8N

OK

OK

qmtechCycloneV

QMTech CycloneV Core Board

Cyclone V 5CEFA2F23I7

OK

OK

qmtechCycloneV_5ce523

QMTech CycloneV Core Board

Cyclone V 5CEFA5F23I7

OK

OK

qmtechKintex7

QMTech Kintex7 Core Board

Kintex xc7k325tffg676

OK

OK

genesys2

Digilent Kintex7 Evaluation Board

Kintex xc7k325tffg900

OK

OK

redpitaya14

Redpitaya/STEMlab xc7z7010 with 125MHz 14 bits ADC

Zynq7000 xc7z010clg400

OK

NA

runber

SeeedStudio Gowin RUNBER

littleBee GW1N-4

OK

IF/EF

runber

Scarab Hardware MiniSpartan6+

Spartan6 xc6slx25-3-ftg256

OK

NT

spartanEdgeAccelBoard

SeeedStudio Spartan Edge Accelerator Board

Spartan7 xc7s15ftgb196

OK

NA

SPEC150

CERN Simple PCIe FMC carrier SPEC

Spartan6 xc6slx150Tfgg484

OK

OK

stlv7325

Sitlinv STLV7325 Board

Kintex xc7k325tffg676

OK

OK

tangnano

Sipeed Tang Nano

littleBee GW1N-1

OK

tangnano1k

Sipeed Tang Nano 1K

littleBee GW1NZ-1

OK

IF

tangnano4k

Sipeed Tang Nano 4K

littleBee GW1NSR-4C

OK

IF/EF

tangnano9k

Sipeed Tang Nano 9K

littleBee GW1NR-9C

OK

IF/EF

tangnano20k

Sipeed Tang Nano 20k

Gowin Arora GW2A(R)-18(C)

OK

EF

tangprimer20k

Sipeed Tang Primer 20k

Gowin Arora GW2A(R)-18(C)

OK

EF

tangprimer25k

Sipeed Tang Primer 25k

Gowin Arora V GW5A-25A (GW5A-LV25MG121)

OK

TBD

tangmega138k

Sipeed Tang Mega 138k

Gowin Arora V GW5AST-138B (GW5AST-LV138FPG676A)

OK

TBD

te0712_8

Trenz Electronic TE0712 FPGA-Module mit AMD Artix™ 7(TE0712)

XC7A200TFBG484

OK

OK

tec0117

Trenz Gowin LittleBee (TEC0117)

littleBee GW1NR-9

OK

IF

trion_t20_bga256_jtag

Efinix Trion T20 BGA256 Dev Kit

Trion T20BGA256

OK

NT

tec0330

PCIe FMC Carrier with Xilinx Virtex-7 FPGA (TEC0330)

XC7VX330T-2FFG1157C

OK

OK

trion_t120_bga576

Efinix Trion T120 BGA576 Dev Kit (SPI mode)

Trion T120BGA576

NA

AS

trion_t120_bga576_jtag

Efinix Trion T120 BGA576 Dev Kit (JTAG mode)

Trion T120BGA576

OK

OK

trion_ti60_f225

Efinix Titanium F225 Dev Kit (SPI mode)

Titanium Ti60F225

NA

AS

trion_ti60_f225_jtag

Efinix Titanium F225 Dev Kit (JTAG mode)

Titanium Ti60F225

OK

OK

ulx3s

Radiona ULX3S

ECP5 LFE5U

OK

OK

ULX3S-12F ➚ ULX3S-25F ➚ ULX3S-45F ➚ ULX3S-85F ➚

ulx3s_dfu

Radiona ULX3S DFU mode

ECP5 LFE5U

NA

OK

vec_v6

Xilinx VCU118

xc6vlx130tff784

OK

OK

vcu118

Xilinx VCU118

Virtex UltraScale+ xcvu9p-flga2104

OK

OK

vcu128

Xilinx VCU128

Virtex UltraScale+ xcvu37p-fsvh2892

OK

OK

vcu1525

AMD Virtex UltraScale+ FPGA VCU1525 Acceleration Development Kit

Virtex UltraScale+ xcvu9p-fsgd2104

OK

NT

xtrx

FairWaves XTRXPro

Artix xc7a50tcpg236

OK

OK

xyloni_spi

Efinix Xyloni

Trion T8F81

NA

AS

usrpx300

Ettus Research USRP X300

Kintex xc7k325tffg900

OK

NA

usrpx310

Ettus Research USRP X300

Kintex xc7k410tffg900

OK

NA

xmf3

PLDkit XMF3

Xilinx xc3s200ft256, xcf01s

OK

OK

zc702

Xilinx ZC702

zynq7000 xc7z020clg484

OK

NA

zc706

Xilinx ZC706

zynq7000 xc7z045ffg900

OK

NA

ZC706 ➚

zcu102

Xilinx ZCU102

zynqMPSoC XCZU9EG

OK

NA

zcu106

Xilinx ZCU106

zynqMPSoC XCZU7EV

OK

NA

zedboard

Avnet ZedBoard

zynq7000 xc7z020clg484

OK

NA

ZedBoard ➚

zybo_z7_10

Digilent Zybo Z7-10

zynq7000 xc7z010clg400

OK

NA

zybo_z7_20

Digilent Zybo Z7-20

zynq7000 xc7z020clg400

OK

NA

VMM3

CERN board with VMM3

xc7s50csga324?

OK

OK

+
    +
  • IF: Internal Flash

  • +
  • EF: External Flash

  • +
  • AS: Active Serial flash mode

  • +
  • NA: Not Available

  • +
  • NT: Not Tested

  • +
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/compatibility/cable.html b/compatibility/cable.html new file mode 100644 index 0000000000..22b5b8276d --- /dev/null +++ b/compatibility/cable.html @@ -0,0 +1,336 @@ + + + + + + + Cables — openFPGALoader: universal utility for programming FPGA latest documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+ +
+
+ +
+
+ +
+

Cables

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

keyword

Name

Description

anlogicCable

anlogic JTAG adapter

JTAG adapter firmware for stm32

arm-usb-ocd-h

Olimex ARM-USB-OCD-H adapter

High-speed 3-IN-1 fast USB ARM JTAG, USB-to-RS232 virtual port and power supply 5VDC device

bus_blaster

Dangerousprototypes Bus Blaster

Jtag adapter based on ft2232

bus_blaster_b

Dangerousprototypes Bus Blaster

Jtag adapter based on ft2232 (interface B)

ch347_jtag

ch347 JTAG adapter

QinHeng Electronics USB To UART+JTAG (mode 3)

ch552_jtag

ch552 JTAG adapter

Tang Nano USB-JTAG interface. FT2232C clone firmware for CH552 microcontroler

cmsisdap

ARM CMSIS DAP protocol interface

ARM CMSIS DAP protocol interface (hid only)

gatemate_pgm

gatemate pgm

Cologne Chip GateMate FPGA Programmer. FT232H-based JTAG/SPI programmer cable

gatemate_evb_jtag

gatemate evb JTAG

Cologne Chip GateMate JTAG programmer

gatemate_evb_spi

gatemate evb spi

Cologne Chip GateMate SPI programmer

dfu

DFU interface

DFU (Device Firmware Upgrade) USB device compatible with DFU protocol

digilent

digilent cable

FT2232 JTAG / UART cable

diglent_b

digilent cable

digilent FT2232 JTAG / UART cable (interface B)

digilent_hs2

digilent hs2 cable

FT232H JTAG programmer cable from digilent

digilent_hs3

digilent hs3

JTAG programmer cable from digilent

dirtyJtag

dirty Jtag

JTAG probe firmware for STM32F1

efinix_spi_ft4232

efinix SPI (ft4232)

efinix SPI interface (FTDI4232 interface A)

efinix_jtag_ft4232

efinix JTAG (ft4232)

efinix JTAG interface (FTDI4232 interface B)

efinix_spi_ft2232

efinix SPI (ft2232)

efinix SPI interface (FTDI2232 interface A)

efinix_jtag_ft2232

efinix JTAG (ft2232)

efinix JTAG interface (FTDI2232 interface B)

ft2232

FT2232 C/D/H

generic programmer cable based on Ftdi FT2232 (interface A)

ft2232

Tang Nano (1k, 4k, 8k) USB-JTAG interface

USB-JTAG/UART debugger based on BL702 microcontroler.

ft2232

Sipeed RV-Debugger-BL702

RV-Debugger-BL702 is an opensource project that implement a JTAG+UART debugger with BL702C-A0.

ft2232

honeycomb USB-JTAG interface.

FT2232C clone based on STM32F042 microcontroler

ft2232_b

FT2232 C/D/H

generic programmer cable based on Ftdi FT2232 (interface B)

ft231X

FT231X

generic USB<->UART converters in bitbang mode (with some limitations and workaround)

ft232

FT232H

generic programmer cable based on Ftdi FT232Hx. One interface, MPSSE capable

ft232RL

FT232RL

generic USB<->UART converters in bitbang mode (with some limitations and workaround)

ft4232

FT4232

quad interface programmer cable. MPSSE capable.

ft4232hp

FT4232HP (interface A)

quad interface programmer cable. MPSSE capable. High Speed USB Bridge with Type-C/PD3.0 Controller

ft4232hp_b

FT4232HP (interface B)

quad interface programmer cable. MPSSE capable. High Speed USB Bridge with Type-C/PD3.0 Controller

ecpix5-debug

ecpix5-debug

LambdaConcept ECPIX5 (45k/85k) UART/JTAG interface

jlink

jlink

SEGGER J-Link Debug Probes

jlink

jlink_base

SEGGER J-Link BASE Debug Probes

jlink

jtrace_pro

SEGGER J-Trace PRO Debug Probes

jtag-smt2-nc

jtag-smt2-nc

JTAG-SMT2-NC Surface-mount Programming Module

lpc-link2

lpc-link2

LPC-Link2 (OM13054) cmsisDAP firmware

orbtrace

orbtrace interface

Open source FPGA-based debug and trace interface

papilio

papilio

Papilio FPGA Platform

steppenprobe

steppenprobe

Open Source Hardware JTAG/SWD/UART/SWO interface board based on FTDI FT2232H

remote-bitgang

OpenOCD remote bitbang

The remote_bitbang JTAG driver is used to drive JTAG from a remote (TCP) process

tigard

tigard

SWD/JTAG/UART/SPI programmer based on Ftdi FT2232HQ

usb-blaster

intel USB Blaster I interface

JTAG programmer cable from intel/altera (FT245 + EPM7064)

usb-blasterII

intel USB Blaster II interface

JTAG programmer cable from intel/altera (EZ-USB FX2 + EPM570)

xvc-client

Xilinx Virtual Cable

Xilinx Virtual Cable (XVC) is a TCP/IP-based protocol that acts like a JTAG cable.

xvc-server

Xilinx Virtual Cable (server side)

Xilinx Virtual Cable (XVC) is a TCP/IP-based protocol that acts like a JTAG cable.

libgpiod

Bitbang GPIO

Bitbang GPIO pins on Linux host.

jetson-nano-gpio

Bitbang GPIO

Bitbang GPIO pins on Jetson Nano Linux host. Use /dev/mem to have a faster clock.

ch347

CH347

CH347 is a USB HS bus converter with UART, I2C, SPI and JTAG interfaces

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/compatibility/fpga.html b/compatibility/fpga.html new file mode 100644 index 0000000000..56fb4d7cbb --- /dev/null +++ b/compatibility/fpga.html @@ -0,0 +1,358 @@ + + + + + + + FPGAs — openFPGALoader: universal utility for programming FPGA latest documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+ +
+
+ +
+
+ +
+

FPGAs

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Vendor

Description

Model

Memory

Flash

Anlogic

EG4

S20

OK

AS

Anlogic

SALELF 2

EF2M45

OK

OK

Cologne Chip

GateMate Series

CCGM1A1, CCGM1A2, CCGM1A4, CCGM1A9, CCGM1A16, CCGM1A25

OK

OK

Efinix

Trion

T8

NA

OK

Efinix

Titanium

Ti60

NA

OK

Gowin

GW1N

GW1N-1, GW1N-4, GW1NR-9, GW1NR-9C, GW1NS-2C, GW1NSR-4C, GW1NZ-1, GW2A-18C, GW5AST-138, GW5AT-138, GW5A-25

OK

IF / EF

Intel

Cyclone III

EP3C16

OK

OK

Intel

Cyclone IV CE

EP4CE22, EP4CE115

OK

OK

Intel

Cyclone V E

5CEA2, 5CEA5, 5CEBA4, 5CEBA9

OK

OK

Intel

Cyclone V SE SoC

5CSEBA6, 5CSEMA4, 5CSEMA5

OK

NT

Intel

Cyclone 10 LP

10CL025

OK

OK

Intel

Max 10

10M08

SVF

SVF

Lattice

Certus-NX

LFD2NX-40

OK

OK

Lattice

CertusPro-NX

LFCPNX-100

OK

OK

Lattice

CrossLink-NX

LIFCL-40

OK

OK

Lattice

ECP5

LFE5U-12, LFE5U-25, LFE5U-45, LFE5U-85, LFE5UM-25, LFE5UM-45, LFE5UM-85, LFE5UM5G-25, LFE5UM5G-45, LFE5UM5G-85

OK

OK

Lattice

iCE40

HX1K, HX4K, HX8K, UP5K

OK

AS

Lattice

MachXO2

256, 640, 640U, 1200, 1200U, 2000, 2000U, 4000, 7000

OK

OK

Lattice

MachXO3D

4300, 9400

OK

OK

Lattice

MachXO3LF

640, 1300, 2100, 4300, 6900, 9400

OK

OK

Xilinx

Artix 7

xc7a25t, xc7a35ti, xc7a50t, xc7a75t, xc7a100t, xc7a200t

OK

OK

Xilinx

Kintex 7

xc7k70t, xc7k160t, xc7k325t, xc7k410t, xc7k420t

OK

OK

Xilinx

Virtex 7

xc7v585t, xc7v2000t, xc7vx330t, xc7vx415t, xc7vx485t, xc7vx550t, xc7vx690t, xc7vx980t, xc7vx1140t, xc7vh580t, xc7vh870t

OK

OK

Xilinx

Artix UltraScale+

xcau25p

OK

TBD

Xilinx

Kintex UltraScale

xcku035, xcku040, xcku060, xcku115

OK

NA

Xilinx

Virtex 6

xc6vlx130t

OK

OK

Xilinx

Virtex UltraScale+

xcvu9p

OK

OK

Xilinx

Spartan 3

xc3s200, xc3s500e

OK

OK

Xilinx

Spartan 6

xc6slx9, xc6slx16, xc6slx25, xc6slx45, xc6slx150T

OK

OK

Xilinx

Spartan 7

xc7s15, xc7s25, xc7s50

OK

OK

Xilinx

XC9500XL

xc9536xl, xc9572xl, xc95144xl, xc95188xl

NA

OK

Xilinx

XC2C/XA2C (coolrunner II)

xc2c32a, xa2c64a

TBD

OK

Xilinx

XCF

xcf01s, xcf02s, xcf04s

NA

OK

Xilinx

Zynq7000

xc7z010, xc7z020

OK

NA

Xilinx

ZynqMPSoC

xczu2cg, xczu9eg, xczu11eg, xczu17eg

OK

NA

+
    +
  • IF: Internal Flash

  • +
  • AS: Active Serial flash mode

  • +
  • NA: Not Available

  • +
  • NT: Not Tested

  • +
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html new file mode 100644 index 0000000000..09a0f508f6 --- /dev/null +++ b/genindex.html @@ -0,0 +1,127 @@ + + + + + + Index — openFPGALoader: universal utility for programming FPGA latest documentation + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+ +
+
+ +
+
+ + +

Index

+ +
+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2019-2022, Gwenhael Goavec-Merou and contributors.

+
Built with Sphinx using a + theme + provided by Build the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/guide/advanced.html b/guide/advanced.html new file mode 100644 index 0000000000..c4d04e29bb --- /dev/null +++ b/guide/advanced.html @@ -0,0 +1,241 @@ + + + + + + + Advanced usage of openFPGALoader — openFPGALoader: universal utility for programming FPGA latest documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+ +
+
+ +
+
+ +
+

Advanced usage of openFPGALoader

+
+

Resetting an FPGA

+
openFPGALoader [options] -r
+
+
+
+
+

Using negative edge for TDO’s sampling

+

If transaction are unstable you can try to change read edge by using

+
openFPGALoader [options] --invert-read-edge
+
+
+
+
+

Reading the bitstream from STDIN

+
cat /path/to/bitstream.ext | openFPGALoader --file-type ext [options]
+
+
+

--file-type is required to detect file type.

+
+

Note

+

It’s possible to load a bitstream through network:

+
# FPGA side
+nc -lp port | openFPGALoader --file-type xxx [option
+
+# Bitstream side
+nc -q 0 host port < /path/to/bitstream.ext
+
+
+
+
+
+

Automatic file type detection bypass

+

Default behavior is to use file extension to determine file parser. +To avoid this mechanism --file-type type must be used.

+
+
+

FT231/FT232 bitbang mode and pins configuration

+

FT232R and ft231X may be used as JTAG programmer. +JTAG communications are emulated in bitbang mode.

+

To use these devices user needs to provides both the cable and the pin mapping:

+
openFPGALoader [options] -cft23XXX --pins=TDI:TDO:TCK:TMS /path/to/bitstream.ext
+
+
+

where:

+
    +
  • ft23XXX may be ft232RL or ft231X.

  • +
  • TDI:TDO:TCK:TMS may be the pin ID (0 <= id <= 7) or string value.

  • +
+

allowed values are:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

value

ID

TXD

0

RXD

1

RTS

2

CTS

3

DTR

4

DSR

5

DCD

6

RI

7

+
+
+

Writing to an arbitrary address in flash memory

+

With FPGA using an external SPI flash (xilinx, lattice ECP5/nexus/ice40, anlogic, efinix) option -o allows +one to write raw binary file to an arbitrary adress in FLASH.

+
+
+

Using an alternative directory for spiOverJtag

+

By setting OPENFPGALOADER_SOJ_DIR it’s possible to override default +spiOverJtag bitstreams directory:

+
export OPENFPGALOADER_SOJ_DIR=/somewhere
+openFPGALoader xxxx
+
+
+

or

+
OPENFPGALOADER_SOJ_DIR=/somewhere openFPGALoader xxxx
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/guide/first-steps.html b/guide/first-steps.html new file mode 100644 index 0000000000..bb5b4ebe3f --- /dev/null +++ b/guide/first-steps.html @@ -0,0 +1,189 @@ + + + + + + + First steps with openFPGALoader — openFPGALoader: universal utility for programming FPGA latest documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+ +
+
+ +
+
+ +
+

First steps with openFPGALoader

+
+

Install

+

Packages are available for Linux distributions, Windows (MSYS2) and macOS:

+
    +
  • Arch Linux: sudo pacman -S openfpgaloader

  • +
  • Fedora: sudo dnf copr enable mobicarte/openFPGALoader; sudo dnf install openFPGALoader

  • +
  • MSYS2: pacman -S mingw-w64-ucrt-x86_64-openFPGALoader

  • +
  • macOS: brew install openfpgaloader

  • +
+

More instructions for other installation scenarios are available in Installing openFPGALoader.

+
+
+

Programming a development board

+

Just simply replace my_fpga_board with any FPGA board from Boards +(or openFPGALoader --list-boards) in any of the two commands below, depending on if you want to program the volatile +part of your FPGA (faster but not persistent) or the flash part of your FPGA (slower but persistent):

+
openFPGALoader -b my_fpga_board my_bitstream.bit # Program to SRAM
+openFPGALoader -b my_fpga_board -f my_bitstream.bit # Program to flash
+
+
+
+

Note

+

When a bitstream file is compatible with both memory load and FLASH write, the default behavior is to load bitstream +in memory.

+
+
+
+

Programming an “standalone” FPGA

+

If your FPGA doesn’t come with a built-in programmer or if you prefer to use an external cable, you can specify a cable +to use from Cables (or openFPGALoader --list-cables):

+
openFPGALoader -c my_cable my_bitstream.bit # Program to SRAM
+openFPGALoader -c my_cable -f my_bitstream.bit # Program to flash
+
+
+
+

Note

+

For some cable (like digilent adapters) signals from the converter are not just directly to the FPGA. +For this case, the -c must be added.

+
+
+

Hint

+

FTDI/FTDI-compatible cable users: the -d option lets you specify a specific FTDI device:

+
openFPGALoader -d /dev/ttyUSBX
+
+
+

When the -d option is not provided, openFPGALoader will opens the first FTDI adapter it finds. +Therefore it is preferable to use this flag if your computer is connected to multiple FTDI devices.

+
+
+
+

Troubleshooting

+

Please refer to Troubleshooting.

+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/guide/install.html b/guide/install.html new file mode 100644 index 0000000000..9a84d8c8bd --- /dev/null +++ b/guide/install.html @@ -0,0 +1,286 @@ + + + + + + + Installing openFPGALoader — openFPGALoader: universal utility for programming FPGA latest documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+ +
+
+ +
+
+ +
+

Installing openFPGALoader

+
+

Linux

+
+

Arch Linux

+

openFPGALoader is available in the default repositories:

+
sudo pacman -S openfpgaloader
+
+
+

Alternatively, you could build from source. First: install required libraries:

+
sudo pacman -S git cmake make gcc pkgconf libftdi libusb zlib hidapi gzip
+
+
+

Build step is similar as Debian

+
+
+

Fedora

+

openFPGALoader is available as a Copr repository:

+
sudo dnf copr enable mobicarte/openFPGALoader
+sudo dnf install openFPGALoader
+
+
+
+
+

From source (Debian, Ubuntu)

+

This application uses libftdi1, so this library must be installed (and, depending on the distribution, headers too):

+
sudo apt install \
+  git \
+  gzip \
+  libftdi1-2 \
+  libftdi1-dev \
+  libhidapi-hidraw0 \
+  libhidapi-dev \
+  libudev-dev \
+  zlib1g-dev \
+  cmake \
+  pkg-config \
+  make \
+  g++
+
+
+
+

Hint

+

libudev-dev is optional, may be replaced by eudev-dev or just not installed.

+
+

By default, (e)udev support is enabled (used to open a device by his /dev/xx node). +If you don’t want this option, use:

+
-DENABLE_UDEV=OFF
+
+
+

By default, cmsisdap support is enabled (used for colorlight I5, I9). +If you don’t want this option, use:

+
-DENABLE_CMSISDAP=OFF
+
+
+

Alternatively you can manually specify the location of libusb and libftdi1:

+
-DUSE_PKGCONFIG=OFF \
+-DLIBUSB_LIBRARIES=<path_to_libusb> \
+-DLIBFTDI_LIBRARIES=<path_to_libftdi> \
+-DLIBFTDI_VERSION=<version> \
+-DCMAKE_CXX_FLAGS="-I<libusb_include_dir> -I<libftdi1_include_dir>"
+
+
+

You may also need to add this if you see link errors between libusb and pthread:

+
-DLINK_CMAKE_THREADS=ON
+
+
+

By default, libgpiod support is enabled +If you don’t want this option, use:

+
-DENABLE_LIBGPIOD=OFF
+
+
+

Additionaly you have to install libgpiod

+

To build the app:

+
git clone https://github.com/trabucayre/openFPGALoader
+cd openFPGALoader
+mkdir build
+cd build
+cmake .. # add -DBUILD_STATIC=ON to build a static version
+         # add -DENABLE_UDEV=OFF to disable udev support and -d /dev/xxx
+         # add -DENABLE_CMSISDAP=OFF to disable CMSIS DAP support
+cmake --build .
+# or
+make -j$(nproc)
+
+
+

To install

+
$ sudo make install
+
+
+

The default install path is /usr/local, to change it, use -DCMAKE_INSTALL_PREFIX=myInstallDir in cmake invokation.

+
+
+

Udev rules

+

By default, users have no access to converters. +A rule file (99-openfpgaloader.rules) for udev is provided at the root directory +of this repository. +These rules set access right and group (plugdev) when a converter is plugged.

+
sudo cp 99-openfpgaloader.rules /etc/udev/rules.d/
+sudo udevadm control --reload-rules && sudo udevadm trigger # force udev to take new rule
+sudo usermod -a $USER -G plugdev # add user to plugdev group
+
+
+

After that you need to unplug and replug your device.

+
+

Hint

+

usermod is used to add $USER as a member of plugdev group. +However this update is not taken into account immediately: it’s required to +logout from current session and login again. +Check, by using id $USER, if plugdev is mentioned after groups=. +An alternate (and temporary) solution is to use sudo - $USER to have +your user seen as a member of plugdev group (works only for the current terminal).

+
+
+
+
+

macOS

+

openFPGALoader is available as a Homebrew formula:

+
brew install openfpgaloader
+
+
+

Alternatively, if you want to build it by hand:

+
brew install --only-dependencies openfpgaloader
+brew install cmake pkg-config zlib gzip
+git clone https://github.com/trabucayre/openFPGALoader
+cd openFPGALoader
+mkdir build
+cd build
+cmake ..
+make -j
+
+
+
+
+

Windows

+
+
+

Common

+

Bitstreams for XC2C (coolrunner-II) needs to be remapped using .map shipped with ISE. +ISE path is set at configure time using:

+
-DISE_PATH=/somewhere/Xilinx/ISE_VERS/
+
+
+

default: /opt/Xilinx/14.7.

+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/guide/troubleshooting.html b/guide/troubleshooting.html new file mode 100644 index 0000000000..4dafe3848a --- /dev/null +++ b/guide/troubleshooting.html @@ -0,0 +1,169 @@ + + + + + + + Troubleshooting — openFPGALoader: universal utility for programming FPGA latest documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+ +
+
+ +
+
+ +
+

Troubleshooting

+
+

I installed openFPGALoader but it says command not found when I try to launch it

+

The correct spelling of the program is openFPGALoader with FPGA and the “L” of “Loader” in uppercase. +Ensure the spelling of the program is correct.

+
+
+

Gowin device could not communicate since last bitstream flashed. (issue #206)

+

Gowin’s FPGA may fails to be detected if JTAGSEL_N (pin 08 for GW1N-4K) is used as a GPIO. +To recover you have to pull down this pin (before power up) to recover JTAG interface (UG292 - JTAGSELL_N section).

+
+
+

JTAG init failed

+

Avoid using USB hubs and connect it directly to your PC USB port.

+
+
+

Tang Primer 20k program slow and stucked (issue #250)

+

Check your openFPGALoader version:

+
openFPGALoader -V
+
+
+

If it is older than release then v0.9.0, install the most recent version (from commit f5b89bff68a5e2147404a895c075773884077438 or later).

+
+
+

Cannot flash Tang Nano 9k (issue #251)

+

This is a device issue, erase its Embedded Flash using Official GoWin Programmer (preferentially in Windows) and SRAM too, then you can use openFPGALoader again.

+
+
+

Unable to open FTDI device: -4 (usb_open() failed) (issue #245)

+

Edit your /etc/udev/rules.d/99-ftdi.rules file exchanging your programming device permissions.

+

For more information, check the udev section from this guide

+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000000..7b2521cd3b --- /dev/null +++ b/index.html @@ -0,0 +1,145 @@ + + + + + + + openFPGALoader: universal utility for programming FPGA — openFPGALoader: universal utility for programming FPGA latest documentation + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+
+ +
+

openFPGALoader: universal utility for programming FPGA

+

Welcome to the documentation of openFPGALoader!

+

openFPGALoader is a universal utility for programming FPGAs. +Compatible with many boards, cables and FPGA from major manufacturers (Xilinx, Altera/Intel, Lattice, Gowin, Efinix, Anlogic, Cologne Chip). +openFPGALoader works on Linux, Windows and macOS.

+

Not sure if your hardware is supported? Check the hardware compatibility lists:

+ +

Also checkout the vendor-specific documentation:

+ +
+
+
+
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2019-2022, Gwenhael Goavec-Merou and contributors.

+
Built with Sphinx using a + theme + provided by Build the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 0000000000..2d58abc384 --- /dev/null +++ b/objects.inv @@ -0,0 +1,6 @@ +# Sphinx inventory version 2 +# Project: openFPGALoader: universal utility for programming FPGA +# Version: latest +# The remainder of this file is compressed using zlib. +xڅ ~ +ՍzmvWR+1F"epv5 O67a~ 7dy'ubIjVcݤwg=1CZ4/7B7:Ziv7kI[50lz5t(p<ȜIi宻Q9#A}%F?K:~Q>,;qoOY(U>,SٵB6T{_˧b Qqd?1;ުѺ:9XIx_C]4q'2BKYfgg2Chk'+qM[r o@kՋe#@Vq#L1=I"Uڏ&gQ9ZX #FF~>5*-LZܽ%*㤦Bkj$M½\$ _z ~1:4>W׃i+9sqf@@!?M1Ws0ś.zLjxs(IT-ٲ";&a2 R̙ )2g%c>s,#,Dds"hnsT*Y \ No newline at end of file diff --git a/search.html b/search.html new file mode 100644 index 0000000000..458e9b5bef --- /dev/null +++ b/search.html @@ -0,0 +1,141 @@ + + + + + + Search — openFPGALoader: universal utility for programming FPGA latest documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+
    +
  • »
  • +
  • Search
  • +
  • +
  • +
+
+
+ +
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2019-2022, Gwenhael Goavec-Merou and contributors.

+
Built with Sphinx using a + theme + provided by Build the Docs. + + +
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 0000000000..796a888cc4 --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["compatibility/board", "compatibility/cable", "compatibility/fpga", "guide/advanced", "guide/first-steps", "guide/install", "guide/troubleshooting", "index", "todo", "vendors/anlogic", "vendors/colognechip", "vendors/efinix", "vendors/gowin", "vendors/intel", "vendors/lattice", "vendors/xilinx"], "filenames": ["compatibility/board.rst", "compatibility/cable.rst", "compatibility/fpga.rst", "guide/advanced.rst", "guide/first-steps.rst", "guide/install.rst", "guide/troubleshooting.rst", "index.rst", "todo.rst", "vendors/anlogic.rst", "vendors/colognechip.rst", "vendors/efinix.rst", "vendors/gowin.rst", "vendors/intel.rst", "vendors/lattice.rst", "vendors/xilinx.rst"], "titles": ["Boards", "Cables", "FPGAs", "Advanced usage of openFPGALoader", "First steps with openFPGALoader", "Installing openFPGALoader", "Troubleshooting", "openFPGALoader: universal utility for programming FPGA", "To Do", "Anlogic notes", "Cologne Chip notes", "Efinix notes", "Gowin notes", "Intel notes", "Lattice notes", "Xilinx notes"], "terms": {"arti": [0, 15], "can": [0, 3, 4, 5, 6, 10, 15], "ani": [0, 4, 10], "name": [0, 1], "from": [0, 1, 4, 6, 7, 10], "first": [0, 5], "column": 0, "openfpgaload": [0, 9, 10, 11, 12, 13, 14, 15], "b": [0, 1, 4, 9, 10, 11, 12, 13, 14, 15], "bitstream": [0, 4, 5, 9, 14], "bit": [0, 4, 10, 14, 15], "load": [0, 3, 4, 12, 14], "sram": [0, 4, 6, 8], "volatil": [0, 4], "f": [0, 4, 9, 10, 11, 12, 14, 15], "write": [0, 4, 8, 10, 11, 15], "flash": [0, 2, 4, 8], "non": 0, "descript": [0, 1, 2], "fpga": [0, 1, 6, 8, 10, 11, 12, 13, 15], "memori": [0, 2, 4, 10, 15], "constraint": 0, "ac701": 0, "xilinx": [0, 1, 2, 3, 5, 7], "artix": [0, 2], "7": [0, 2, 3, 5, 14], "evalu": [0, 10], "kit": 0, "xc7a200t2fbg676c": 0, "ok": [0, 2], "nt": [0, 2], "acorncle215": 0, "acorn": 0, "cle": 0, "215": 0, "xc7a200tsbg484": 0, "litex": 0, "baseboard": 0, "mini": 0, "The": [0, 1, 5, 6, 10, 15], "ar": [0, 3, 4, 10, 11, 13, 15], "develop": 0, "around": 0, "sqrl": 0, "": [0, 4, 5, 6, 9, 10, 12, 13, 14, 15], "nite": 0, "litefuri": 0, "alchitry_au": 0, "alchitri": [0, 15], "au": 0, "xc7a35tftg256": 0, "alchitry_au_plu": 0, "plu": 0, "xc7a100tftg256": 0, "alinx_ax516": 0, "alinx": 0, "ax516": 0, "spartan6": 0, "xc6slx16csg324": 0, "alinx_ax7101": 0, "ax": 0, "7101": 0, "xc7a100tfgg484": 0, "alinx_ax7102": 0, "7102": 0, "analogmax": 0, "trenz": [0, 8, 12], "tei0010": 0, "max": [0, 2], "10": [0, 2, 14], "10m08sau169c8g": 0, "svf": [0, 2, 13], "antmicro_ddr4_test": 0, "antmicro": 0, "data": [0, 10, 15], "center": 0, "dram": 0, "tester": 0, "kintex7": 0, "xc7k160t": [0, 2], "antmicro_ddr5_test": 0, "ddr5": 0, "antmicro_lpddr4_test": 0, "lpddr4": 0, "test": [0, 2, 11], "xc7k70t": [0, 2], "arty_a7_35t": 0, "digil": [0, 1, 4], "a7": 0, "xc7a35ticsg324": 0, "35t": 0, "arty_a7_100t": 0, "xc7a100tcsg324": 0, "100t": 0, "arty_s7_25": 0, "s7": 0, "spartan7": 0, "xc7s25csga324": 0, "25": [0, 2], "arty_s7_50": 0, "xc7s50csga324": 0, "50": 0, "arty_z7_10": 0, "zynq7000": [0, 2], "xc7z010csg400": 0, "na": [0, 2], "arty_z7_20": 0, "xc7z020csg400": 0, "analog": 0, "discoveri": 0, "2": [0, 2, 3, 5, 15], "xc6slx25": [0, 2], "digit": 0, "axu2cga": 0, "zynq": [0, 15], "mpsoc": [0, 15], "dev": [0, 1, 4, 5], "zynqmpsoc": [0, 2], "xczu2cg": [0, 2], "basys3": 0, "xc7a35tcpg236": 0, "cmod_s7": 0, "cmod": 0, "xc7s25csga225": 0, "gatemate_evb_jtag": [0, 1, 10], "cologn": [0, 1, 2, 7], "chip": [0, 1, 2, 7], "gatem": [0, 1, 2, 10], "jtag": [0, 1, 3, 12, 13, 15], "mode": [0, 1, 2, 11, 12, 13, 15], "seri": [0, 2], "gatemate_evb_spi": [0, 1, 10], "spi": [0, 1, 3, 8, 11, 12], "gatemate_pgm_spi": [0, 10], "programm": [0, 1, 3, 4, 6, 10, 14], "certusnx_versa_evn": 0, "certu": [0, 2], "nx": [0, 2], "versa": 0, "lfd2nx": [0, 2], "40": [0, 2], "certuspronx_evn": 0, "certuspro": [0, 2], "lfcpnx": [0, 2], "100": [0, 2], "certuspronx_versa_evn": 0, "cmoda7_15t": 0, "cmoda7": 0, "xc7a15tcpg236": 0, "cmoda7_35t": 0, "colorlight": [0, 5], "5a": 0, "75b": 0, "version": [0, 5, 6], "ecp5": [0, 2, 3], "lfe5u": [0, 2], "25f": 0, "6bg256c": 0, "i5": [0, 5], "6bg381c": 0, "v7": 0, "0": [0, 1, 3, 6, 8, 10, 15], "i9": [0, 5], "45f": 0, "xc7a50tfgg484": 0, "crosslinknx_evn": 0, "lattic": [0, 2, 3, 7], "crosslink": [0, 2], "nexu": [0, 3], "lifcl": [0, 2], "cyc1000": [0, 13], "cyclon": [0, 2, 13], "lp": [0, 2, 3], "10cl025yu256c8g": [0, 13], "c10lp": [0, 13], "refkit": [0, 13], "10cl055yu484c8g": [0, 13], "c5g": 0, "teras": 0, "v": [0, 2, 6], "gx": 0, "starter": 0, "5cgxfc5c6f27c7n": 0, "de0": [0, 13], "iii": [0, 2], "ep3c16f484c6": 0, "de0nano": [0, 13], "iv": [0, 2], "e": [0, 2, 5, 10], "ep4ce22f17c6": 0, "de0nanosoc": [0, 13], "soc": [0, 2], "5csema4u23c6": 0, "de10lit": 0, "10m50daf484c7g": 0, "de10nano": 0, "5cseba6u23i7": 0, "de1soc": 0, "de1": 0, "5csema5f31c6": 0, "deca": 0, "arrow": 0, "10m50daf484c6g": 0, "ecp5_evn": 0, "5g": 0, "ecp5g": 0, "lfe5um5g": [0, 2], "85f": 0, "evn": 0, "ecpix5": [0, 1], "lambdaconcept": [0, 1], "ecpix": 0, "5": [0, 3, 14], "ft2232": [0, 1, 8], "ecpix5_r03": 0, "ft4232": [0, 1], "fireant": [0, 11], "trion": [0, 2], "t8": [0, 2], "t8f81": 0, "AS": [0, 2], "fomu": 0, "pvt": 0, "ice40ultraplu": 0, "up5k": [0, 2], "gr740": 0, "honeycomb": [0, 1, 12], "littlebe": 0, "gw1n": [0, 2, 6], "2c": [0, 2], "IF": [0, 2], "hseda": 0, "xc6slx16": [0, 2], "microblaz": 0, "sdram": 0, "usb2": 0, "ftg256": 0, "ice40_gener": [0, 14], "icebreak": 0, "bitsi": 0, "v0": [0, 6], "v1": 0, "icestick": 0, "ice40": [0, 2, 3], "hx1k": [0, 2], "hx8k": [0, 2], "olimex": [0, 1], "ice40hx1k": 0, "evb": [0, 1, 14], "ice40hx8k": 0, "ultraplu": 0, "breakout": [0, 14], "ice40up5k": 0, "up": [0, 6, 12, 15], "icezum": 0, "alhambra": 0, "ii": [0, 1, 2, 5], "hx4k": [0, 2], "icezumalhambraii": 0, "kc705": 0, "xc7k325t": [0, 2], "kcu105": 0, "kintex": [0, 2], "ultrascal": [0, 2, 15], "xcku040": [0, 2], "ffva1156": 0, "kcu116": 0, "xcku5p": 0, "ffvb676": 0, "ld": 0, "konfekt": 0, "lone": 0, "dynam": 0, "corpor": 0, "machdyn": 0, "comput": [0, 4, 8], "12f": 0, "schoko": 0, "6cabga256": 0, "licheetang": [0, 9], "sipe": [0, 1, 8, 12], "liche": 0, "tang": [0, 1, 12], "eagl": 0, "s20": [0, 2], "eg4s20bg256": 0, "machxo2evn": 0, "machxo2": [0, 2], "lcmxo2": 0, "7000he": 0, "machxo3evn": 0, "machxo3d": [0, 2, 14], "lcmxo3d": 0, "9400hc": 0, "machxo3sk": [0, 14], "machxo3lf": [0, 2], "machxo3": 0, "lcmx03lf": 0, "6900c": 0, "mini_itx": 0, "avnet": 0, "itx": 0, "base": [0, 1, 11, 15], "amd": 0, "xc7z045": 0, "xc7z100": 0, "2ffg900": 0, "nexys_a7_50": 0, "nexi": 0, "4": [0, 2, 3], "ddr": 0, "xc7a50tcsg324": 0, "nexys4ddr": 0, "nexys_a7_100": 0, "nexysvideo": 0, "video": 0, "xem8320": 0, "opal": 0, "kelli": 0, "xcau25p": [0, 2], "2ffvb676e": 0, "tbd": [0, 2], "olimex_gatemateevb": 0, "ccgma1": 0, "gm1a1": 0, "orbtrace_dfu": 0, "orbtrac": [0, 1], "dfu": [0, 1], "8bg256c": 0, "orangecrab": 0, "orang": 0, "crab": 0, "8mg285c": 0, "r0": 0, "papilio_on": 0, "papilio": [0, 1], "One": [0, 1], "spartan3": [0, 15], "xc3s500e": [0, 2], "vq100": 0, "pipistrello": 0, "saanlima": 0, "lx45": 0, "xc6slx45": [0, 2], "csg324": 0, "pynq_z1": 0, "pynq": 0, "z1": 0, "xc7z020clg400": 0, "pynq_z2": 0, "z2": 0, "qmtechcyclone10": 0, "qmtech": 0, "10cl016yu484c8g": 0, "qmtechcycloneiv": 0, "cycloneiv": 0, "core": 0, "ep4ce15f23c8n": 0, "qmtechcyclonev": [0, 13], "cyclonev": 0, "5cefa2f23i7": 0, "qmtechcyclonev_5ce523": 0, "5cefa5f23i7": 0, "qmtechkintex7": 0, "xc7k325tffg676": 0, "genesys2": 0, "xc7k325tffg900": 0, "redpitaya14": 0, "redpitaya": 0, "stemlab": 0, "xc7z7010": 0, "125mhz": 0, "14": [0, 5], "adc": 0, "xc7z010clg400": 0, "runber": [0, 12], "seeedstudio": 0, "gowin": [0, 2, 7, 8], "ef": [0, 2], "scarab": 0, "hardwar": [0, 1, 7, 10], "minispartan6": 0, "3": [0, 1, 2, 3, 10, 13], "spartanedgeaccelboard": [0, 15], "spartan": [0, 2, 15], "edg": [0, 15], "acceler": [0, 15], "xc7s15ftgb196": 0, "spec150": 0, "cern": 0, "simpl": 0, "pcie": 0, "fmc": 0, "carrier": 0, "spec": 0, "xc6slx150tfgg484": 0, "stlv7325": 0, "sitlinv": 0, "tangnano": [0, 8, 12], "nano": [0, 1, 12], "1": [0, 1, 2, 3, 15], "tangnano1k": [0, 12], "1k": [0, 1], "gw1nz": [0, 2], "tangnano4k": [0, 12], "4k": [0, 1, 6, 12], "gw1nsr": [0, 2], "4c": [0, 2], "tangnano9k": [0, 12], "9k": 0, "gw1nr": [0, 2], "9c": [0, 2], "tangnano20k": [0, 12], "20k": 0, "arora": 0, "gw2a": [0, 2, 8], "r": [0, 3, 13], "18": 0, "c": [0, 1, 4, 10, 13, 14, 15], "tangprimer20k": [0, 12], "primer": 0, "tangprimer25k": 0, "25k": 0, "gw5a": [0, 2], "25a": 0, "lv25mg121": 0, "tangmega138k": 0, "mega": 0, "138k": 0, "gw5ast": [0, 2], "138b": 0, "lv138fpg676a": 0, "te0712_8": 0, "electron": [0, 1], "te0712": 0, "modul": [0, 1], "mit": 0, "xc7a200tfbg484": 0, "tec0117": [0, 12], "9": [0, 2, 6, 14], "trion_t20_bga256_jtag": 0, "efinix": [0, 1, 2, 3, 7], "t20": 0, "bga256": 0, "t20bga256": 0, "tec0330": 0, "virtex": [0, 2], "xc7vx330t": [0, 2], "2ffg1157c": 0, "trion_t120_bga576": 0, "t120": 0, "bga576": 0, "t120bga576": 0, "trion_t120_bga576_jtag": 0, "trion_ti60_f225": 0, "titanium": [0, 2], "f225": 0, "ti60f225": [0, 11], "trion_ti60_f225_jtag": 0, "ulx3": 0, "radiona": 0, "ulx3s_dfu": 0, "vec_v6": 0, "vcu118": [0, 15], "xc6vlx130tff784": 0, "xcvu9p": [0, 2], "flga2104": 0, "vcu128": 0, "xcvu37p": 0, "fsvh2892": 0, "vcu1525": 0, "fsgd2104": 0, "xtrx": 0, "fairwav": 0, "xtrxpro": 0, "xc7a50tcpg236": 0, "xyloni_spi": [0, 11], "xyloni": 0, "usrpx300": 0, "ettu": 0, "research": 0, "usrp": 0, "x300": 0, "usrpx310": 0, "xc7k410tffg900": 0, "xmf3": 0, "pldkit": 0, "xc3s200ft256": 0, "xcf01": [0, 2], "zc702": 0, "xc7z020clg484": 0, "zc706": 0, "xc7z045ffg900": 0, "zcu102": 0, "xczu9eg": [0, 2], "zcu106": 0, "xczu7ev": 0, "zedboard": [0, 15], "zybo_z7_10": 0, "zybo": 0, "z7": 0, "zybo_z7_20": 0, "20": 0, "vmm3": 0, "intern": [0, 2, 10], "extern": [0, 3, 4, 10, 12], "activ": [0, 2, 10, 11], "serial": [0, 2], "Not": [0, 2, 7], "avail": [0, 2, 4, 5, 15], "keyword": 1, "anlogicc": 1, "anlog": [1, 2, 3, 7, 8], "adapt": [1, 4], "firmwar": [1, 15], "stm32": 1, "arm": 1, "usb": [1, 6], "ocd": 1, "h": 1, "high": 1, "speed": 1, "IN": 1, "fast": 1, "rs232": 1, "virtual": 1, "port": [1, 3, 6], "power": [1, 6, 12], "suppli": 1, "5vdc": 1, "devic": [1, 3, 4, 5, 9, 10, 11, 15], "bus_blast": 1, "dangerousprototyp": 1, "bu": 1, "blaster": 1, "bus_blaster_b": 1, "interfac": [1, 6, 12, 15], "ch347_jtag": 1, "ch347": 1, "qinheng": 1, "To": [1, 3, 5, 6, 12, 14, 15], "uart": 1, "ch552_jtag": 1, "ch552": [1, 8], "ft2232c": 1, "clone": [1, 5], "microcontrol": 1, "cmsisdap": [1, 5], "cmsi": [1, 5], "dap": [1, 5], "protocol": 1, "hid": 1, "onli": [1, 5, 8, 11, 12, 15], "gatemate_pgm": [1, 10], "pgm": 1, "ft232h": 1, "upgrad": 1, "compat": [1, 4, 7], "diglent_b": 1, "digilent_hs2": [1, 15], "hs2": 1, "digilent_hs3": 1, "hs3": 1, "dirtyjtag": 1, "dirti": 1, "probe": 1, "stm32f1": 1, "efinix_spi_ft4232": 1, "ftdi4232": 1, "A": [1, 5, 15], "efinix_jtag_ft4232": 1, "efinix_spi_ft2232": 1, "ftdi2232": 1, "efinix_jtag_ft2232": 1, "d": [1, 4, 5, 6, 13], "gener": [1, 11, 12, 13, 14, 15], "ftdi": [1, 4, 14], "8k": 1, "debugg": 1, "bl702": 1, "rv": 1, "i": [1, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15], "an": [1, 5, 10, 15], "opensourc": 1, "project": [1, 9, 11, 15], "implement": 1, "bl702c": 1, "a0": 1, "stm32f042": 1, "ft2232_b": 1, "ft231x": [1, 3], "convert": [1, 4, 5], "bitbang": 1, "some": [1, 4, 15], "limit": 1, "workaround": 1, "ft232": 1, "ft232hx": 1, "mpsse": 1, "capabl": [1, 15], "ft232rl": [1, 3], "quad": [1, 15], "ft4232hp": 1, "bridg": [1, 15], "type": 1, "pd3": 1, "control": [1, 5], "ft4232hp_b": 1, "debug": 1, "45k": 1, "85k": 1, "jlink": 1, "segger": 1, "j": [1, 5, 11], "link": [1, 5, 11], "jlink_bas": [1, 11], "jtrace_pro": 1, "trace": 1, "pro": 1, "smt2": 1, "nc": [1, 3], "surfac": 1, "mount": 1, "program": [1, 15], "lpc": 1, "link2": 1, "om13054": 1, "open": [1, 4, 5], "sourc": [1, 15], "platform": 1, "steppenprob": 1, "swd": 1, "swo": 1, "board": [1, 7, 14, 15], "ft2232h": 1, "remot": 1, "bitgang": 1, "openocd": 1, "remote_bitbang": 1, "driver": 1, "us": [1, 4, 5, 6, 8, 9, 10, 12, 14, 15], "drive": 1, "tcp": 1, "process": 1, "tigard": 1, "ft2232hq": 1, "intel": [1, 2, 7], "altera": [1, 7], "ft245": 1, "epm7064": 1, "blasterii": 1, "ez": 1, "fx2": 1, "epm570": 1, "xvc": 1, "client": 1, "ip": 1, "act": 1, "like": [1, 4, 15], "server": 1, "side": [1, 3], "libgpiod": [1, 5], "gpio": [1, 6, 12], "pin": [1, 6, 10, 12, 14], "linux": [1, 4, 7], "host": [1, 3], "jetson": 1, "mem": 1, "have": [1, 5, 6, 12, 15], "faster": [1, 4, 15], "clock": 1, "i2c": 1, "vendor": [2, 7], "model": [2, 15], "eg4": 2, "salelf": 2, "ef2m45": 2, "ccgm1a1": 2, "ccgm1a2": 2, "ccgm1a4": 2, "ccgm1a9": 2, "ccgm1a16": 2, "ccgm1a25": 2, "ti60": 2, "18c": 2, "138": 2, "gw5at": 2, "ep3c16": 2, "ce": 2, "ep4ce22": 2, "ep4ce115": 2, "5cea2": 2, "5cea5": 2, "5ceba4": 2, "5ceba9": 2, "se": 2, "5cseba6": 2, "5csema4": 2, "5csema5": 2, "10cl025": 2, "10m08": 2, "12": [2, 13], "45": 2, "85": 2, "lfe5um": 2, "256": 2, "640": 2, "640u": 2, "1200": 2, "1200u": 2, "2000": 2, "2000u": 2, "4000": 2, "7000": [2, 15], "4300": 2, "9400": 2, "1300": 2, "2100": 2, "6900": 2, "xc7a25t": 2, "xc7a35ti": 2, "xc7a50t": 2, "xc7a75t": 2, "xc7a100t": 2, "xc7a200t": 2, "xc7k410t": 2, "xc7k420t": 2, "xc7v585t": 2, "xc7v2000t": 2, "xc7vx415t": 2, "xc7vx485t": 2, "xc7vx550t": 2, "xc7vx690t": 2, "xc7vx980t": 2, "xc7vx1140t": 2, "xc7vh580t": 2, "xc7vh870t": 2, "xcku035": 2, "xcku060": 2, "xcku115": 2, "6": [2, 3, 14], "xc6vlx130t": 2, "xc3s200": 2, "xc6slx9": 2, "xc6slx150t": 2, "xc7s15": 2, "xc7s25": 2, "xc7s50": 2, "xc9500xl": 2, "xc9536xl": 2, "xc9572xl": 2, "xc95144xl": 2, "xc95188xl": 2, "xc2c": [2, 5], "xa2c": 2, "coolrunn": [2, 5], "xc2c32a": 2, "xa2c64a": 2, "xcf": 2, "xcf02": 2, "xcf04": 2, "xc7z010": 2, "xc7z020": 2, "xczu11eg": 2, "xczu17eg": 2, "option": [3, 4, 5, 9, 13, 14, 15], "If": [3, 4, 5, 6, 10], "transact": 3, "unstabl": 3, "you": [3, 4, 5, 6, 12, 15], "try": 3, "chang": [3, 5], "invert": 3, "cat": 3, "path": [3, 5], "ext": 3, "requir": [3, 5, 11, 14, 15], "It": [3, 9, 10, 12], "possibl": [3, 9, 10, 11, 12], "through": [3, 15], "network": 3, "xxx": [3, 5], "q": [3, 13], "default": [3, 4, 5, 9, 11, 12, 14, 15], "behavior": [3, 4], "extens": [3, 15], "determin": 3, "parser": 3, "avoid": [3, 6, 8], "thi": [3, 4, 5, 6, 9, 11, 12, 13, 14, 15], "mechan": 3, "must": [3, 4, 5, 10, 11, 12, 14, 15], "ft232r": 3, "mai": [3, 5, 6, 12, 14, 15], "commun": 3, "emul": [3, 8], "user": [3, 4, 5, 15], "need": [3, 5, 14, 15], "provid": [3, 4, 5, 14, 15], "both": [3, 4, 15], "cabl": [3, 4, 7, 11, 15], "map": [3, 5], "cft23xxx": 3, "tdi": 3, "tck": 3, "tm": 3, "where": [3, 12, 14], "ft23xxx": 3, "id": [3, 5, 11, 12], "string": 3, "valu": 3, "allow": [3, 15], "txd": 3, "rxd": 3, "rt": 3, "ct": 3, "dtr": 3, "dsr": 3, "dcd": 3, "ri": 3, "With": [3, 15], "o": [3, 10, 13], "one": [3, 11], "raw": 3, "binari": 3, "adress": 3, "By": [3, 5, 14], "set": [3, 5, 10, 15], "openfpgaloader_soj_dir": 3, "overrid": 3, "export": [3, 14], "somewher": [3, 5, 9, 11, 14, 15], "xxxx": [3, 15], "packag": [4, 15], "distribut": [4, 5], "window": [4, 6, 7], "msys2": 4, "maco": [4, 7], "arch": 4, "sudo": [4, 5], "pacman": [4, 5], "fedora": 4, "dnf": [4, 5], "copr": [4, 5], "enabl": [4, 5], "mobicart": [4, 5], "mingw": 4, "w64": 4, "ucrt": 4, "x86_64": 4, "brew": [4, 5], "more": [4, 6, 8, 11], "instruct": 4, "other": [4, 15], "scenario": 4, "just": [4, 5], "simpli": 4, "replac": [4, 5], "my_fpga_board": 4, "list": [4, 7], "two": [4, 15], "command": 4, "below": 4, "depend": [4, 5, 15], "want": [4, 5, 15], "part": [4, 11, 15], "your": [4, 5, 6, 7, 9, 15], "persist": 4, "slower": 4, "my_bitstream": 4, "when": [4, 5, 15], "file": [4, 5, 6, 10, 12, 13, 14, 15], "doesn": 4, "t": [4, 5, 15], "come": 4, "built": 4, "prefer": 4, "specifi": [4, 5, 12], "my_cabl": 4, "For": [4, 6, 9, 14, 15], "signal": [4, 10], "directli": [4, 6, 11], "case": [4, 14, 15], "ad": 4, "let": 4, "specif": [4, 7, 14], "ttyusbx": 4, "find": 4, "therefor": 4, "flag": 4, "connect": [4, 6, 12], "multipl": 4, "pleas": [4, 14], "refer": 4, "repositori": 5, "altern": 5, "could": 5, "build": [5, 9], "librari": 5, "git": 5, "cmake": [5, 9], "make": [5, 9], "gcc": 5, "pkgconf": 5, "libftdi": 5, "libusb": 5, "zlib": 5, "hidapi": 5, "gzip": 5, "step": [5, 15], "similar": 5, "applic": 5, "libftdi1": 5, "so": [5, 11, 12, 14, 15], "header": 5, "too": [5, 6], "apt": 5, "libhidapi": 5, "hidraw0": 5, "libudev": 5, "zlib1g": 5, "pkg": 5, "config": 5, "g": [5, 10, 13], "eudev": 5, "support": [5, 7, 8, 9, 11, 13, 15], "hi": 5, "xx": 5, "node": 5, "don": 5, "denable_udev": 5, "off": [5, 13], "denable_cmsisdap": 5, "manual": 5, "locat": 5, "duse_pkgconfig": 5, "dlibusb_librari": 5, "path_to_libusb": 5, "dlibftdi_librari": 5, "path_to_libftdi": 5, "dlibftdi_vers": 5, "dcmake_cxx_flag": 5, "libusb_include_dir": 5, "libftdi1_include_dir": 5, "also": [5, 7, 14], "add": [5, 8, 9], "see": [5, 15], "error": [5, 8], "between": [5, 14], "pthread": 5, "dlink_cmake_thread": 5, "ON": 5, "denable_libgpiod": 5, "additionali": 5, "app": 5, "http": 5, "github": 5, "com": 5, "trabucayr": 5, "cd": [5, 9], "mkdir": [5, 9], "dbuild_stat": 5, "static": 5, "disabl": [5, 13], "nproc": 5, "usr": 5, "local": 5, "dcmake_install_prefix": 5, "myinstalldir": 5, "invok": 5, "access": [5, 8, 11, 14, 15], "99": [5, 6], "root": 5, "directori": [5, 9, 15], "These": 5, "right": 5, "group": 5, "plugdev": 5, "plug": 5, "cp": 5, "etc": [5, 6], "udevadm": 5, "reload": 5, "trigger": 5, "forc": [5, 15], "take": 5, "new": 5, "usermod": 5, "after": [5, 10], "unplug": 5, "replug": 5, "member": 5, "howev": 5, "updat": 5, "taken": 5, "account": 5, "immedi": 5, "logout": 5, "current": [5, 8, 9, 11, 15], "session": 5, "login": 5, "again": [5, 6], "check": [5, 6, 7, 14, 15], "mention": [5, 13], "temporari": 5, "solut": 5, "seen": 5, "work": [5, 7, 8], "termin": 5, "homebrew": 5, "formula": 5, "hand": 5, "remap": 5, "ship": 5, "ISE": 5, "configur": [5, 8, 15], "time": [5, 13], "dise_path": 5, "ise_v": 5, "opt": 5, "correct": 6, "spell": 6, "l": 6, "loader": 6, "uppercas": 6, "ensur": 6, "detect": [6, 12], "jtagsel_n": [6, 12], "08": [6, 12], "recov": [6, 12], "pull": [6, 12], "down": [6, 12], "befor": [6, 12], "ug292": [6, 12], "jtagsell_n": [6, 12], "section": [6, 12], "hub": 6, "pc": 6, "older": 6, "than": [6, 11, 15], "releas": 6, "most": [6, 14], "recent": 6, "commit": 6, "f5b89bff68a5e2147404a895c075773884077438": 6, "later": 6, "eras": 6, "its": 6, "embed": 6, "offici": [6, 15], "preferenti": 6, "edit": 6, "udev": 6, "rule": 6, "exchang": 6, "permiss": 6, "inform": [6, 15], "guid": 6, "welcom": 7, "document": [7, 8], "mani": 7, "major": 7, "manufactur": 7, "sure": 7, "checkout": 7, "improv": 8, "messag": 8, "precis": 8, "catch": 8, "all": 8, "except": 8, "code": 8, "api": 8, "fix": 8, "fail": [8, 12], "busblast": 8, "frequenc": 8, "freq": 8, "arg": [8, 15], "maximum": 8, "rework": 8, "cyclone10": 8, "eeprom": 8, "interfaceb": 8, "checksum": 8, "tangprim": 8, "eg4s20": 8, "spiflash": 8, "class": 8, "abl": 8, "everywher": 8, "offset": [8, 10], "hardcod": 8, "target": [9, 15], "m": [9, 11, 12, 14, 15], "prj": 9, "sinc": [9, 11, 12, 14], "argument": [9, 12, 14], "produc": [9, 15], "td": 9, "tool": [9, 15], "chain": [9, 11, 15], "creat": 9, "prjtang": 9, "now": 9, "call": 9, "tangbit": 9, "present": [9, 14], "ha": [9, 15], "follow": 9, "input": 9, "paramet": 10, "bitfil": [10, 15], "ascii": 10, "equival": 10, "cfg": 10, "perform": 10, "reset": 10, "latch": 10, "via": 10, "cfg_md": 10, "0xc": 10, "0x4": 10, "passiv": 10, "bypass": 10, "start": 10, "automat": 10, "store": 10, "point": 10, "share": 10, "same": [10, 12, 14], "hold": 10, "desir": 10, "should": 10, "0x0": [10, 15], "format": [11, 12, 14, 15], "efin": 11, "noth": [11, 12, 14, 15], "special": [11, 12, 14, 15], "done": [11, 12, 14, 15], "wip": 11, "outflow": 11, "autodetect": 11, "ram": [11, 15], "exampl": [11, 15], "eg": 11, "index": [11, 15], "cli": 12, "destin": 12, "board_nam": 12, "impl": 12, "pnr": 12, "mspi": 12, "bscan": 12, "instead": 12, "rbf": 13, "sof": 13, "quartus_cpf": 13, "0mhz": 13, "n": 13, "p": 13, "project_nam": [13, 14], "bitstream_compress": 13, "As": 13, "handbook": 13, "real": 13, "decompress": 13, "keep": 13, "mind": 13, "boardnam": 13, "rpd": 13, "auto_create_rpd": 13, "epcq16a": 13, "jic": 13, "project_name_auto": 13, "jed": 14, "diamond": 14, "yourboard": 14, "sector": 14, "cfg0": 14, "impl1": 14, "machx02evn": 14, "machx03evn": 14, "under": 14, "left": 14, "panel": 14, "bin": [14, 15], "nextpnr": 14, "pinout": 14, "ice40hxxk": 14, "onboard": 14, "si": 14, "adbus1": 14, "8": 14, "sck": 14, "adbus0": 14, "adbus2": 14, "abdus4": 14, "rst": 14, "adbus6": 14, "adbus7": 14, "direct": 14, "yourcabl": 14, "mc": [14, 15], "prom": 14, "simplifi": 15, "further": 15, "explan": 15, "we": 15, "consid": 15, "pinhead": 15, "spioverjtag": 15, "ye": 15, "independ": 15, "read": 15, "classic": 15, "cpu": 15, "doubl": 15, "softcor": 15, "anyth": 15, "vivado": 15, "task": 15, "gui": 15, "bin_fil": 15, "tcl": 15, "append": 15, "set_properti": 15, "write_bitstream": 15, "true": 15, "get_run": 15, "impl_1": 15, "buswidth": 15, "boot": 15, "jp7": 15, "jp11": 15, "gnd": 15, "run": 15, "script": 15, "pl": 15, "lindex": 15, "argv": 15, "mcsfile": 15, "write_cfgmem": 15, "spix4": 15, "size": 15, "16": 15, "loadbit": 15, "loaddata": 15, "nolog": 15, "nojourn": 15, "batch": 15, "tclarg": 15, "myproject": 15, "without": 15, "them": 15, "hpp": 15, "level": 15, "someth": 15, "xc7a35tcsg324": 15, "src": 15, "kcu16": 15, "spix8": 15, "dual": 15, "In": 15, "abov": 15, "fit": 15, "bigger": 15, "design": 15, "_primari": 15, "secondari": 15, "_secondari": 15, "On": 15, "each": 15, "primari": 15, "arbitrari": 15, "relat": 15, "arbitrary_data": 15}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"board": [0, 4, 8, 10, 11], "cabl": [1, 8, 10], "fpga": [2, 3, 4, 7], "advanc": 3, "usag": [3, 11], "openfpgaload": [3, 4, 5, 6, 7], "reset": 3, "an": [3, 4], "us": 3, "neg": 3, "edg": 3, "tdo": 3, "": 3, "sampl": 3, "read": 3, "bitstream": [3, 6, 13, 15], "from": [3, 5], "stdin": 3, "automat": 3, "file": [3, 9, 11], "type": 3, "detect": 3, "bypass": 3, "ft231": 3, "ft232": 3, "bitbang": 3, "mode": [3, 10], "pin": 3, "configur": [3, 10], "write": 3, "arbitrari": 3, "address": 3, "flash": [3, 6, 9, 10, 11, 12, 13, 14, 15], "memori": [3, 9, 14], "altern": 3, "directori": 3, "spioverjtag": 3, "first": 4, "step": 4, "instal": [4, 5, 6], "program": [4, 6, 7, 10], "develop": 4, "standalon": 4, "troubleshoot": [4, 6], "linux": 5, "arch": 5, "fedora": 5, "sourc": 5, "debian": 5, "ubuntu": 5, "udev": 5, "rule": 5, "maco": 5, "window": 5, "common": 5, "i": 6, "sai": 6, "command": 6, "found": 6, "when": 6, "try": 6, "launch": 6, "gowin": [6, 12], "devic": [6, 8], "could": 6, "commun": 6, "sinc": 6, "last": 6, "issu": 6, "206": 6, "jtag": [6, 10, 11], "init": 6, "fail": 6, "tang": [6, 9], "primer": 6, "20k": 6, "slow": 6, "stuck": 6, "250": 6, "cannot": 6, "nano": 6, "9k": 6, "251": 6, "unabl": 6, "open": 6, "ftdi": 6, "4": 6, "usb_open": 6, "245": 6, "univers": 7, "util": 7, "To": 8, "do": 8, "global": 8, "misc": 8, "anlog": 9, "note": [9, 10, 11, 12, 13, 14, 15], "sipe": 9, "liche": 9, "bit": 9, "load": [9, 11, 13, 15], "spi": [9, 10, 13, 14, 15], "svf": 9, "cologn": 10, "chip": 10, "support": 10, "access": 10, "efinix": 11, "firant": 11, "xyloni": 11, "trion": 11, "t8": 11, "hex": 11, "titanium": 11, "bin": 11, "gw1n": 12, "sram": [12, 14], "intel": 13, "altera": 13, "lattic": 14, "machxo2": 14, "machxo3": 14, "ice40": 14, "ecp5": 14, "crosslink": 14, "nx": 14, "xilinx": 15}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx": 60}, "alltitles": {"Boards": [[0, "boards"]], "Cables": [[1, "cables"]], "FPGAs": [[2, "fpgas"]], "Advanced usage of openFPGALoader": [[3, "advanced-usage-of-openfpgaloader"]], "Resetting an FPGA": [[3, "resetting-an-fpga"]], "Using negative edge for TDO\u2019s sampling": [[3, "using-negative-edge-for-tdo-s-sampling"]], "Reading the bitstream from STDIN": [[3, "reading-the-bitstream-from-stdin"]], "Automatic file type detection bypass": [[3, "automatic-file-type-detection-bypass"]], "FT231/FT232 bitbang mode and pins configuration": [[3, "ft231-ft232-bitbang-mode-and-pins-configuration"]], "Writing to an arbitrary address in flash memory": [[3, "writing-to-an-arbitrary-address-in-flash-memory"]], "Using an alternative directory for spiOverJtag": [[3, "using-an-alternative-directory-for-spioverjtag"]], "First steps with openFPGALoader": [[4, "first-steps-with-openfpgaloader"]], "Install": [[4, "install"]], "Programming a development board": [[4, "programming-a-development-board"]], "Programming an \u201cstandalone\u201d FPGA": [[4, "programming-an-standalone-fpga"]], "Troubleshooting": [[4, "troubleshooting"], [6, "troubleshooting"]], "Installing openFPGALoader": [[5, "installing-openfpgaloader"]], "Linux": [[5, "linux"]], "Arch Linux": [[5, "arch-linux"]], "Fedora": [[5, "fedora"]], "From source (Debian, Ubuntu)": [[5, "from-source-debian-ubuntu"]], "Udev rules": [[5, "udev-rules"]], "macOS": [[5, "macos"]], "Windows": [[5, "windows"]], "Common": [[5, "common"]], "I installed openFPGALoader but it says command not found when I try to launch it": [[6, "i-installed-openfpgaloader-but-it-says-command-not-found-when-i-try-to-launch-it"]], "Gowin device could not communicate since last bitstream flashed. (issue #206)": [[6, "gowin-device-could-not-communicate-since-last-bitstream-flashed-issue-206"]], "JTAG init failed": [[6, "jtag-init-failed"]], "Tang Primer 20k program slow and stucked (issue #250)": [[6, "tang-primer-20k-program-slow-and-stucked-issue-250"]], "Cannot flash Tang Nano 9k (issue #251)": [[6, "cannot-flash-tang-nano-9k-issue-251"]], "Unable to open FTDI device: -4 (usb_open() failed) (issue #245)": [[6, "unable-to-open-ftdi-device-4-usb-open-failed-issue-245"]], "openFPGALoader: universal utility for programming FPGA": [[7, "openfpgaloader-universal-utility-for-programming-fpga"]], "To Do": [[8, "to-do"]], "Global": [[8, "global"]], "Cable": [[8, "cable"]], "Devices/boards": [[8, "devices-boards"]], "Misc": [[8, "misc"]], "Anlogic notes": [[9, "anlogic-notes"]], "Sipeed Lichee Tang": [[9, "sipeed-lichee-tang"]], "bit file load (memory)": [[9, "bit-file-load-memory"]], "bit file load (spi flash)": [[9, "bit-file-load-spi-flash"]], "svf file load": [[9, "svf-file-load"]], "Cologne Chip notes": [[10, "cologne-chip-notes"]], "Supported Boards/Cables": [[10, "supported-boards-cables"]], "Programming Modes": [[10, "programming-modes"]], "JTAG Configuration": [[10, "jtag-configuration"]], "SPI Configuration": [[10, "spi-configuration"]], "JTAG Flash Access": [[10, "jtag-flash-access"]], "SPI Flash Access": [[10, "spi-flash-access"]], "Efinix notes": [[11, "efinix-notes"]], "Firant and Xyloni boards (efinix trion T8)": [[11, "firant-and-xyloni-boards-efinix-trion-t8"]], "hex file load": [[11, "hex-file-load"]], "Trion and Titanium JTAG usage": [[11, "trion-and-titanium-jtag-usage"]], "bin file load": [[11, "bin-file-load"]], "hex file flash": [[11, "hex-file-flash"]], "Gowin notes": [[12, "gowin-notes"]], "GOWIN GW1N": [[12, "gowin-gw1n"]], "Flash SRAM": [[12, "flash-sram"]], "Flash": [[12, "flash"]], "Intel notes": [[13, "intel-notes"]], "Intel/Altera": [[13, "intel-altera"]], "Loading a bitstream": [[13, "loading-a-bitstream"], [15, "loading-a-bitstream"]], "SPI flash": [[13, "spi-flash"], [15, "spi-flash"]], "Lattice notes": [[14, "lattice-notes"]], "MachXO2/MachXO3": [[14, "machxo2-machxo3"]], "Flash memory": [[14, "flash-memory"]], "SRAM": [[14, "sram"], [14, "id1"]], "iCE40": [[14, "ice40"]], "ECP5/Crosslink-NX": [[14, "ecp5-crosslink-nx"]], "SPI Flash": [[14, "spi-flash"]], "Xilinx notes": [[15, "xilinx-notes"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/todo.html b/todo.html new file mode 100644 index 0000000000..c303c04cd8 --- /dev/null +++ b/todo.html @@ -0,0 +1,165 @@ + + + + + + + To Do — openFPGALoader: universal utility for programming FPGA latest documentation + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+ +
+
+ +
+
+ +
+

To Do

+
+

Global

+
    +
  • improve error message (be more precise)

  • +
  • catch all exception

  • +
  • documentation (code + API)

  • +
+
+
+

Cable

+
    +
  • fix ch552 (Sipeed tangNano): works with SRAM, fails with Flash

  • +
  • busblaster support

  • +
  • anlogic cable support

  • +
+
+
+

Devices/boards

+
    +
  • improve frequency configuration. Use FPGA, cable or –freq args maximum frequency

  • +
  • rework cyclone10 eeprom access to avoid using FT2232 interfaceB Spi emulation (only supported by trenz board)

  • +
  • fix checksum computation with gowin GW2A

  • +
  • add support for tangPrimer (anlogic EG4S20)

  • +
+
+
+

Misc

+
    +
  • fix spiFlash class to be able to write everywhere (currently offset is hardcoded to 0)

  • +
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/vendors/anlogic.html b/vendors/anlogic.html new file mode 100644 index 0000000000..2e70d824ca --- /dev/null +++ b/vendors/anlogic.html @@ -0,0 +1,178 @@ + + + + + + + Anlogic notes — openFPGALoader: universal utility for programming FPGA latest documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+ +
+
+ +
+
+ +
+

Anlogic notes

+
+

Sipeed Lichee Tang

+

For this target, openFPGALoader supports svf and bit.

+
+

bit file load (memory)

+
openFPGALoader -m -b licheeTang /somewhere/project/prj/*.bit
+
+
+

Since -m is the default, this argument is optional.

+
+
+

bit file load (spi flash)

+
openFPGALoader -f -b licheeTang /somewhere/project/prj/*.bit
+
+
+
+
+

svf file load

+

It’s possible to produce this file by using TD:

+
    +
  • Tools->Device Chain

  • +
  • Add your bit file

  • +
  • Option : Create svf

  • +
+

or by using prjtang project:

+
mkdir build
+cd build
+cmake ../
+make
+
+
+

Now a file called tangbit is present in current directory and has to be used as follows:

+
tangbit --input /somewhere.bit --svf bitstream.svf
+
+
+
openFPGALoader -b licheeTang /somewhere/*.svf
+
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/vendors/colognechip.html b/vendors/colognechip.html new file mode 100644 index 0000000000..d2f09add95 --- /dev/null +++ b/vendors/colognechip.html @@ -0,0 +1,223 @@ + + + + + + + Cologne Chip notes — openFPGALoader: universal utility for programming FPGA latest documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+ +
+
+ +
+
+ +
+

Cologne Chip notes

+
+

Supported Boards/Cables

+
    +
  • GateMate Evaluation Board using board parameters -b gatemate_evb_jtag or -b gatemate_evb_spi

  • +
  • GateMate Programmer using cable parameter -c gatemate_pgm

  • +
+
+
+

Programming Modes

+

Supported configuration files are bitfiles *.bit and it’s ASCII equivalents *.cfg.

+
+

JTAG Configuration

+

Performs an active hardware reset and writes the configuration into the FPGA latches via JTAG. The configuration mode pins CFG_MD[3:0] must be set to 0xC (JTAG).

+
    +
  1. Program using Evaluation Board:

  2. +
+
openFPGALoader -b gatemate_evb_jtag <bitfile>.cfg.bit
+
+
+
    +
  1. Program using Programmer Cable:

  2. +
+
openFPGALoader -c gatemate_pgm <bitfile>.cfg.bit
+
+
+
+
+

SPI Configuration

+

Performs an active hardware reset and writes the configuration into the FPGA latches via SPI. The configuration mode pins CFG_MD[3:0] must be set to 0x4 (SPI passive).

+
    +
  1. Program using Evaluation Board:

  2. +
+
openFPGALoader -b gatemate_evb_spi <bitfile>.cfg.bit
+
+
+
    +
  1. Program using Programmer Cable:

  2. +
+
openFPGALoader -b gatemate_pgm_spi <bitfile>.cfg.bit
+
+
+
+
+

JTAG Flash Access

+

It is possible to access external flashes via the internal JTAG-SPI-bypass. The configuration mode pins CFG_MD[3:0] must be set to 0xC (JTAG). Note that the FPGA will not start automatically.

+
    +
  1. Write to flash using Evaluation Board:

  2. +
+
openFPGALoader -b gatemate_evb_jtag <bitfile>.cfg.bit
+
+
+
    +
  1. Write to flash using Programmer Cable:

  2. +
+
openFPGALoader -c gatemate_pgm -f <bitfile>.cfg.bit
+
+
+

The offset parameter can be used to store data at any point in the flash, e.g.:

+
openFPGALoader -b gatemate_evb_jtag -o <offset> <bitfile>.cfg.bit
+
+
+
+
+

SPI Flash Access

+

If the programming device and FPGA share the same SPI signals, it is possible to hold the FPGA in reset and write data to the flash. The configuration mode can be set as desired. If the FPGA should start from the external memory after reset, the configuration mode pins CFG_MD[3:0] set to 0x0 (SPI active).

+
    +
  1. Write to flash using Evaluation Board:

  2. +
+
openFPGALoader -b gatemate_evb_spi -f <bitfile>.cfg.bit
+
+
+
    +
  1. Write to flash using Programmer Cable:

  2. +
+
openFPGALoader -b gatemate_pgm_spi -f <bitfile>.cfg.bit
+
+
+

The offset parameter can be used to store data at any point in the flash, e.g.:

+
openFPGALoader -b gatemate_evb_spi -o <offset> <bitfile>.cfg.bit
+
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/vendors/efinix.html b/vendors/efinix.html new file mode 100644 index 0000000000..1310b60e9e --- /dev/null +++ b/vendors/efinix.html @@ -0,0 +1,177 @@ + + + + + + + Efinix notes — openFPGALoader: universal utility for programming FPGA latest documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+ +
+
+ +
+
+ +
+

Efinix notes

+
+

Firant and Xyloni boards (efinix trion T8)

+

.hex file is the default format generated by Efinity IDE, so nothing special must be done to generates this file.

+

openFPGALoader supports only active mode (SPI) (JTAG is WIP).

+
+

hex file load

+
openFPGALoader -b fireant /somewhere/project/outflow/*.hex
+
+
+

or, for xyloni board

+
openFPGALoader -b xyloni_spi /somewhere/project/outflow/*.hex
+
+
+

Since openFPGALoader access the flash directly in SPI mode the -b fireant, -b xyloni_spi is required (no +autodetection possible).

+
+
+
+

Trion and Titanium JTAG usage

+

openFPGALoader supports loading to RAM and SPI Flash with JTAG

+

Tested with J-Link BASE

+
+

bin file load

+
openFPGALoader --cable jlink_base -m  /somewhere/project/outflow/*.bin
+
+
+
+
+

hex file flash

+

Example for ti60f225. +NOTE: JTAG chains with more than one device (eg –index-chain) are currently not supported for writing to SPI flash

+
openFPGALoader --cable jlink_base --fpga-part ti60f225 -f  /somewhere/project/outflow/*.hex
+
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/vendors/gowin.html b/vendors/gowin.html new file mode 100644 index 0000000000..78c6b47aa6 --- /dev/null +++ b/vendors/gowin.html @@ -0,0 +1,193 @@ + + + + + + + Gowin notes — openFPGALoader: universal utility for programming FPGA latest documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+ +
+
+ +
+
+ +
+

Gowin notes

+
+

GOWIN GW1N

+
+

Note

+
    +
  • Trenz TEC0117

  • +
  • Sipeed Tang Nano

  • +
  • Sipeed Tang Nano 4K

  • +
  • Honeycomb

  • +
  • RUNBER

  • +
+
+

.fs file is the default format generated by Gowin IDE, so nothing special must be done to generates this file.

+

Since the same file is used for SRAM and Flash a CLI argument is used to specify the destination.

+
+

Flash SRAM

+

with -m:

+
openFPGALoader -m -b BOARD_NAME impl/pnr/*.fs
+
+
+

where BOARD_NAME is:

+
    +
  • tec0117

  • +
  • tangnano

  • +
  • tangnano1k

  • +
  • tangnano4k

  • +
  • tangnano9k

  • +
  • tangnano20k

  • +
  • tangprimer20k

  • +
  • runber

  • +
+
+
+

Flash

+
+

Attention

+

Only with Trenz TEC0117 and runber.

+
+

with -f, file load:

+
openFPGALoader -f -b BOARD_NAME impl/pnr/*.fs
+
+
+

where BOARD_NAME is:

+
    +
  • tec0117

  • +
  • runber

  • +
+

It’s possible to flash external SPI Flash (connected to MSPI) in bscan mode by using --external-flash instead of +-f.

+
+

Note

+

Gowin’s FPGA may fails to be detected if JTAGSEL_N (pin 08 for GW1N-4K) is used as a GPIO. +To recover you have to pull down this pin (before power up) to recover JTAG interface (UG292 - JTAGSELL_N section).

+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/vendors/intel.html b/vendors/intel.html new file mode 100644 index 0000000000..2f0b1bcdde --- /dev/null +++ b/vendors/intel.html @@ -0,0 +1,191 @@ + + + + + + + Intel notes — openFPGALoader: universal utility for programming FPGA latest documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+ +
+
+ +
+
+ +
+

Intel notes

+
+

Intel/Altera

+
+

Note

+
    +
  • CYC1000

  • +
  • C10LP-RefKit

  • +
  • DE0

  • +
  • de0nano

  • +
+
+
+

Loading a bitstream

+

SVF and RBF files are supported.

+

sof to svf generation:

+
quartus_cpf -c -q 12.0MHz -g 3.3 -n p project_name.sof project_name.svf
+
+
+

sof to rbf generation:

+
quartus_cpf  --option=bitstream_compression=off -c project_name.sof project_name.rbf
+
+
+
+

Warning

+

As mentioned in cyclone handbooks, real-time decompression is not supported by FPGA in JTAG mode. +Keep in mind to disable this option.

+
+

file load:

+
openFPGALoader -b boardname project_name.svf
+# or
+openFPGALoader -b boardname project_name.rbf
+
+
+

with boardname = de0, cyc1000, c10lp-refkit, de0nano, de0nanoSoc or qmtechCycloneV.

+
+
+

SPI flash

+

RPD and RBF are supported.

+

sof to rpd:

+
# CYC1000
+quartus_cpf -o auto_create_rpd=on -c -d EPCQ16A -s 10CL025YU256C8G project_name.svf project_name.jic
+# C10LP-RefKit
+quartus_cpf -o auto_create_rpd=on -c -d EPCQ16A -s 10CL055YU484C8G project_name.svf project_name.jic
+
+
+

file load:

+
openFPGALoader -b boardname -r project_name_auto.rpd
+# or
+openFPGALoader -b boardname -r project_name.rbf
+
+
+

with boardname = cyc1000, c10lp-refkit.

+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/vendors/lattice.html b/vendors/lattice.html new file mode 100644 index 0000000000..5cbeba81ce --- /dev/null +++ b/vendors/lattice.html @@ -0,0 +1,240 @@ + + + + + + + Lattice notes — openFPGALoader: universal utility for programming FPGA latest documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+ +
+
+ +
+
+ +
+

Lattice notes

+
+

MachXO2/MachXO3

+
+

Flash memory

+

.jed file is the default format generated by Lattice Diamond, so nothing special must be done to generates this +file.

+

File load:

+
openFPGALoader [-b yourboard] [--flash-sector CFG0] impl1/*.jed
+
+
+

where yourboard may be:

+
    +
  • machX02EVN

  • +
  • machX03EVN

  • +
  • machXO3SK

  • +
+

and where --flash-sector CFG0 is needed for the MachXO3D Breakout Board.

+

.bit may also be used for machXO2

+
+
+

SRAM

+

To generates .bit file Bitstream file must be checked under Exports Files in Lattice Diamond left panel.

+

File load:

+
openFPGALoader [-b yourboard] impl1/*.bit
+
+
+

where yourboard may be:

+
    +
  • machX02EVN

  • +
  • machX03EVN

  • +
  • machXO3SK

  • +
+
+
+
+

iCE40

+

.bin is the default format generated by nextpnr, so nothing special must be done.

+

Since most ice40 boards uses the same pinout between FTDI and SPI flash a generic ice40_generic board is provided.

+

For the specific case of the iCE40HXXK-EVB where no onboard programmer is present, please use this:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +

FTDI

iCE40HXXK-EVB

SI (ADBUS1)

Pin 8

SCK (ADBUS0)

Pin 9

SO (ADBUS2)

Pin 7

CS (ABDUS4)

Pin 10

RST (ADBUS6

Pin 6

DONE (ADBUS7)

Pin 5

+

Bin file load:

+
openFPGALoader -b ice40_generic /somewhere/*.bin
+
+
+

Since it’s a direct access to the flash (SPI) the -b option is required.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/vendors/xilinx.html b/vendors/xilinx.html new file mode 100644 index 0000000000..fcd7a2529e --- /dev/null +++ b/vendors/xilinx.html @@ -0,0 +1,244 @@ + + + + + + + Xilinx notes — openFPGALoader: universal utility for programming FPGA latest documentation + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ + +
+ +
+
+ +
+
+ +
+

Xilinx notes

+

To simplify further explanations, we consider the project is generated in the current directory.

+
+

Note

+
    +
  1. Spartan Edge Accelerator Board has only pinheader, so the cable must be provided

  2. +
  3. A JTAG <-> SPI bridge (used to write bitstream in FLASH) is available for some device, see +spiOverJtag to check if your model is supported.

  4. +
  5. Board provides the device/package model, but if the targeted board is not officially supported but the FPGA yes, +you can use --fpga-part to provide the model.

  6. +
  7. With spartan3, the flash is an independent JTAG device. +User has to use --index-chain to access FPGA (RAM only) or flash (write/read only).

  8. +
+
+
+

Warning

+

*.bin may be loaded in memory or in flash, but this extension is a classic extension for CPU firmware and, by +default, openFPGALoader loads file in memory. +Double check -m / -f when you want to use a firmware for a softcore (or anything, other than a bitstream) to +write somewhere in the FLASH device).

+
+

.bit file is the default format generated by vivado, so nothing special task must be done to generate this +bitstream.

+

.bin is not, by default, produced. +To have access to this file you need to configure the tool:

+
    +
  • GUI: Tools -> Settings -> Bitstreams -> check -bin_file.

  • +
  • TCL: append your TCL file with set_property STEPS.WRITE_BITSTREAM.ARGS.BIN_FILE true [get_runs impl_1].

  • +
+
+

Warning

+

For alchitry board the bitstream must be configured with a buswidth of 1 or 2. +Quad mode can’t be used with alchitry’s FLASH.

+
+
+

Warning

+

For boards based on a Zynq (7000 or MPSoC), boot mode must be configured for JTAG (for Zedboard JP7->JP11 must be +to GND).

+
+
+

Loading a bitstream

+

.bit and .bin are allowed to be loaded in memory.

+

File load:

+
openFPGALoader [-m] -b arty *.runs/impl_1/*.bit (or *.bin)
+
+
+

or

+
openFPGALoader [-m] -b spartanEdgeAccelBoard -c digilent_hs2 *.runs/impl_1/*.bit (or *.bin)
+
+
+
+

SPI flash

+
+

Note

+

.bit, .bin, and .mcs are supported for FLASH.

+
+

.mcs must be generated through Vivado with a tcl script like:

+
+

Warning

+

For boards based on Zynq device (7000 and MPSoC) SPI flash is not accessible through PL.

+
+
set project [lindex $argv 0]
+
+set bitfile "${project}.runs/impl_1/${project}.bit"
+set mcsfile "${project}.runs/impl_1/${project}.mcs"
+
+write_cfgmem -format mcs -interface spix4 -size 16 \
+   -loadbit "up 0x0 $bitfile" -loaddata "" \
+   -file $mcsfile -force
+
+
+
+

Note

+

-interface spix4 and -size 16 depends on SPI flash capability and size.

+
+

The tcl script is used with:

+
vivado -nolog -nojournal -mode batch -source script.tcl -tclargs myproject
+
+
+

File load:

+
openFPGALoader [--fpga-part xxxx] -f -b arty *.runs/impl_1/*.mcs (or .bit / .bin)
+
+
+
+

Note

+

-f is required to write bitstream (without them .bit and .bin are loaded in memory).

+
+
+

Note

+

--fpga-part is only required if this information is not provided at board.hpp level or if the board is not +officially supported. +device/package format is something like xc7a35tcsg324 (arty model). +See src/board.hpp, or spiOverJtag directory for examples.

+
+

Some boards with UltraScale FPGAs, like the VCU118 and KCU16, support the SPIx8 (Dual Quad SPI) configuration. +In this case, the spix8 option write_cfgmem on the above example can be used to generate two .mcs files, +to fit bigger designs or for faster programming. Only .mcs files can be used to program the FPGA in this case.

+

In this case, to load the two .mcs files:

+
openFPGALoader --board vcu118 -f --target-flash both --bitstream *.runs/impl_1/*_primary.mcs --secondary-bitstream *.runs/impl_1/*_secondary.mcs
+
+
+

On these boards, each SPI flash can be programmed independently with the --target-flash option. +The default target is the primary flash.

+

For example, to program only the secondary flash with arbitrary data not related to FPGA configuration:

+
openFPGALoader --board vcu118 -f --target-flash secondary --bitstream arbitrary_data
+
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file