diff --git a/.gitignore b/.gitignore index 5e13cc5..0e9d26b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ !*.* /build/ /export/ +/docs/ *.user *.o *.log diff --git a/web/Makefile b/web/Makefile new file mode 100644 index 0000000..ae9c786 --- /dev/null +++ b/web/Makefile @@ -0,0 +1,44 @@ +MAKE ?= make + +MKDIR := mkdocs +DOCDIR := ../docs + +#################################################################### +help: + @echo "=======================================================" + @echo " Syfala Documentation" + @echo "This Makefile is intended to generate the Syfala documentation" + @echo "=======================================================" + @echo "Available targets are:" + @echo " build : build the web site" + @echo " serve : launch the mkdoc server" + @echo "Making the current version publicly available:" + @echo " just commit and push the /docs folder (master branch)" + + +#################################################################### +build: + cd $(MKDIR) && mkdocs build +# git checkout ../docs/CNAME + +serve: + cd $(MKDIR) && mkdocs serve + +all: + $(MAKE) build + +clean: + rm -f $(DOCDIR) +# git checkout ../docs/CNAME + +#################################################################### +install: + pip install mkdocs + pip install markdown-include + pip install mkdocs-bootswatch + pip install python-markdown-math + +uninstall: + pip uninstall -y mkdocs-material + pip uninstall -y pymdown-extensions + pip uninstall -y markdown-blockdiag diff --git a/web/mkdocs/docs/index.md b/web/mkdocs/docs/index.md new file mode 100644 index 0000000..62d1cf2 --- /dev/null +++ b/web/mkdocs/docs/index.md @@ -0,0 +1,6 @@ +# Syfala Toolchain Documentation + +This is the Syfala documentation website. + +Please, refer to the "Manual" tab above for more information. + diff --git a/web/mkdocs/docs/manual/dependencies.md b/web/mkdocs/docs/manual/dependencies.md new file mode 100644 index 0000000..8e8301e --- /dev/null +++ b/web/mkdocs/docs/manual/dependencies.md @@ -0,0 +1,132 @@ +# Syfala Toolchain Dependencies + +The Syfala toolchain is a compilation toolchain of Faust programs onto AMD-Xilinx FPGA targets. This document explains how to install and run the **version 0.7.1** of the toolchain on a Linux machine. In practice, installing the Syfala toolchain means: + +- Installing the required **linux-packages**, depending on your Linux distribution. +- Installing the **Faust** compiler +- Creating a **AMD-Xilinx account** and downloading/installing the **2022.2 version** (2020.2 is also still supported) of the AMD-Xilinx toolchain (providing softwares such as Vivado, Vitis, Vitis HLS). +- Installing the additional **Vivado Board Files** for Digilent Boards. +- Installing *udev* rules in order to use the JTAG connection. +- Cloning the **Syfala repository**, and running a **simple example** to make sure everything is working properly. + +## Linux Targets + +We recommend using **Ubuntu** (>= 18.04 LTS) for installing and using the toolchain, since it is officially supported by AMD-Xilinx. While it is still possible to use other distributions, such as Archlinux, you may encounter unresolved bugs, which won't necessarily appear in our *Troubleshooting* section below. + +### Ubuntu Dependencies + +```shell +$ sudo apt-get update +$ sudo apt-get install git libncurses5 libtinfo-dev build-essential default-jre pkg-config g++-multilib gtk+2.0 locales +``` + +### Archlinux Dependencies + +```bash +# faust (required) +$ sudo pacman -S faust + +# for xilinx vivado/vitis etc. +$ yay -S ncurses5-compat-libs libxcrypt-compat libpng12 lib32-libpng12 xorg-xlsclients gtk2 +``` + +## Faust + +It is recommended to clone Faust from the official github repository: https://github.com/grame-cncm/faust + +```shell +$ git clone https://github.com/grame-cncm/faust.git +$ cd faust +$ make +$ sudo make install +``` + +## Vivado, Vitis & Vitis HLS (2022.2 version) + +- Open an account on https://www.xilinx.com/registration +- The AMD-Xilinx [download page](https://www.xilinx.com/support/download.html) contains links for downloading the **Vivado Design Suite - HLx Editions - Full Product**. It is available for both Linux and Windows. + - Download the Linux installer `Xilinx_Unified_2022.2_1014_8888_Lin64.bin` + +- Execute `chmod a+x Xilinx_Unified_2022.2_1014_8888_Lin64.bin` + +- Execute `./Xilinx_Unified_2022.2_1014_8888_Lin64.bin` + + - We suggest to use the "**Download Image (Install Separately)**" option. It creates a directory with a **xsetup** file to execute that you can reuse in case of failure during the installation + +- Execute `./xsetup` + + - Choose to install **Vitis** (it will still install **Vivado**, **Vitis**, and **Vitis HLS**). + - It will need **110GB of disk space**: if you uncheck *Ultrascale*, *Ultrascale+*, *Versal ACAP* and *Alveo acceleration platform*, it will use less space and still work. + - **Agree** with everything and choose a directory to install (e.g. ~/Xilinx) + - **Install and wait** (it may take quite a while) + +- **Setup a shell environment variable** allowing to use the tools when necessary (add this to your `~/.bashrc`, `~/.zshrc` or whatever you're currently using, replacing `$XILINX_ROOT_DIR` by the directory you chose to install all the tools) + + - ```shell + export XILINX_ROOT_DIR=$HOME/Xilinx + ``` + +### Installing Cable Drivers on Linux + +- Go to: `$XILINX_ROOT_DIR/Vivado/2022.2/data/xicom/cable_drivers/lin64/install_script/install_drivers` directory +- Run `./install_drivers` +- Run `sudo cp 52-xilinx-digilent-usb.rules /etc/udev/rules.d`, this allows **JTAG** connection through **USB**. + +### Installing Digilent Board Files + +- Download the board files from [github](https://github.com/Digilent/vivado-boards/archive/master.zip?_ga=2.76732885.1953828090.1655988025-1125947215.1655988024): +- Open the folder extracted from the archive and navigate to its `new/board_files` folder. You will be copying all of this folder's subfolders + - For the 2020.2 version, go to `$XILINX_ROOT_DIR/Vivado/2020.2/data/boards/board_files` + - For the 2022.2 version, go to `$XILINX_ROOT_DIR/Vivado/2022.2/data/xhub/boards/XilinxBoardStore/boards/Xilinx` + +- **Copy** all of the folders found in vivado-boards `new/board_files `folder and **paste** them into this folder + +### Installing the 2022 patch (AMD-Xilinx toolchain v2020.2 only) + +Vivado and Vitis tools that use HLS in the background are also affected by this issue. HLS tools set the ip_version in the format YYMMDDHHMM and this value is accessed as a signed integer (32-bit) that causes an overflow and generates the errors below (or something similar). + +- Follow this link: https://support.xilinx.com/s/article/76960?language=en_US + +- Download the file at the bottom of th page and unzip it in `$XILINX_ROOT_DIR` + +- run the following commands: + +- ```shell + $ cd $XILINX_ROOT_DIR + $ export LD_LIBRARY_PATH=$PWD/Vivado/2020.2/tps/lnx64/python-3.8.3/lib/ + $ Vivado/2020.2/tps/lnx64/python-3.8.3/bin/python3 y2k22_patch/patch.py + ``` + +## Cloning the Syfala Repository + +To clone and install the latest stable version of the Syfala toolchain, you can use the following commands: + +```shell +$ git clone https://github.com/inria-emeraude/syfala +$ cd syfala +$ ./syfala.tcl install +$ syfala --help +``` + +In order to use the Syfala toolchain to compile your first example, please report to the main [README](https://github.com/inria-emeraude/syfala/blob/main/README.md) file located in the repository's root directory. + +## Troubleshooting + +On **Archlinux**, if you see an error like this one + +``` +/lib/../lib64/crti.o: file not recognized: File format not recognized +``` + +you'll have to rename the `Vivado/2020.2/tps/lnx64/binutils-2.26` (Vitis will then search in the system libraries). + +#### Vitis/Java Issues + +On recent systems (or with **Archlinux**), you might have problems compiling the host-side (**ARM**) application. The problem is caused by system libraries requiring newer versions of GCC than the one provided by Vitis. Replacing GCC target in Vitis' path **by system GCC** works: + +```bash +$ cd $XILINX_ROOT_DIR/Vitis/2020.2/lib/lnx64.o/Default +$ mv libstdc++.so.6 libstdc++.so.6.old +$ rm -rf libstdc++.so (symlink) +$ sudo ln -s /usr/lib/libstdc++.so.6 libstdc++.so.6 +``` diff --git a/web/mkdocs/docs/manual/manual.md b/web/mkdocs/docs/manual/manual.md new file mode 100644 index 0000000..b1e4d4e --- /dev/null +++ b/web/mkdocs/docs/manual/manual.md @@ -0,0 +1,135 @@ +# Syfala Toolchain Documentation + +Automatic compilation of Faust audio DSP programs for AMD-Xilinx FPGAs. + +## Supported Board Models + +- [x] Digilent **Zybo Z7-10** - Zynq-7000 ARM/FPGA SoC Development Board +- [x] Digilent **Zybo Z7-20** - Zynq-7000 ARM/FPGA SoC Development Board +- [x] Digilent **Genesys ZU-3EG** - Zynq UltraScale+ MPSoC Development Board + +and more to come... + +## Dependencies + +Please follow the instructions in the file [dependencies.md](dependencies.md) in order to install the **AMD-Xilinx** **toolchain** and various other dependencies. + +## Installing + +the command `make install` will install a **symlink** in **/usr/bin**. After this you'll be able to just run: + +`$ syfala myfaustprogram.dsp` + +You'll also have to **edit** your shell **resource** **file** (~/.**bashrc** / ~/.**zshrc**) and set the following environment variable: + +```shell +export XILINX_ROOT_DIR=/my/path/to/Xilinx/root/directory +``` + +`XILINX_ROOT_DIR` is the root directory where all of the AMD-Xilinx tools (Vivado, Vitis, Vitis_HLS) are installed. + +## Getting Started + +### Hardware Setup (Digilent **Zybo-Z7-10/20** Boards) + +- [ ] Jumper **JP5** should be on *JTAG* +- [ ] **Power select** jumper should be on *USB* +- [ ] **Switches** SW0, SW1, SW2, SW3 should be **down** +- [ ] The **audio input** is **LINE IN** (blue), not MIC IN +- [ ] The **audio output** is the black **HPH OUT** jack + +### Software + +#### Faust Targets + +Building a simple example for the **default board** (Digilent Zybo **Z7-10)**: + +```shell +$ syfala examples/faust/virtualAnalog.dsp +``` + +This will run the **full syfala toolchain** on the virtualAnalog.dsp **Faust** file, which will then be ready to be flashed on the board. Y**ou can specify the targeted board** using the `-b (--board)` option: + +```shell +$ syfala examples/faust/virtualAnalog.dsp --board Z20 +$ syfala examples/faust/virtualAnalog.dsp --board GENESYS +``` + +You can now **connect the board** to your computer with the proper **USB/Serial port cable** and run the `flash` command: + +```shell +$ syfala flash +``` + +The board's **RGB LED** should then flash **green** after a few seconds, indicating that your program is running. You can now **start the Faust GUI application**, which will display a set of sliders/knobs/buttons and **update the DSP parameters in real-time through USB-UART**: + +```shell +$ syfala start-gui +``` + +#### C++ Targets + +For C++ targets, the process is exactly the same (excepted for the GUI part, which is not available): + +```shell +$ syfala examples/cpp/bypass.cpp --board Z20 +$ syfala flash +``` + +### Exporting and Re-Importing Your Builds + +When you're done playing with your program, you can **save and export it** as a `.zip` file with the following command: + +```shell +$ syfala export my-faust-virtual-analog-build +# the exported .zip file is tagged with date & time, e.g.: +>> "export/2022-02-17-my-faust-virtual-analog-build.zip" +``` + +The resulting `.zip` file is now available in the repository's `export` directory, you can **re-import** it by typing: + +```shell +$ syfala import export/2022-02-17-my-faust-virtual-analog-build.zip +``` + +### Making Another Build + +Before building another DSP program, please **make sure you have saved and exported your previous build** beforehand, otherwise **it will be overwritten** whenever you start a new build. + +```shell +$ syfala examples/my-new-dsp-build.dsp +``` + +## Embedded Linux + +Please report to the [linux-getting-started.md](doc/linux-getting-started.md) document in order to get you started with the Embedded Linux for Syfala. + +## Going Further + +Please report to the [reference](reference.md) for more information on available **commands**, **options** and documentation. + +## The Syfala Team + +Here is a list of person that have contributed to the Syfala project : + +- Tanguy Risset +- Yann Orlarey +- Romain Michon +- Stephane Letz +- Florent de Dinechin +- Alain Darte +- Yohan Uguen +- Gero Müller +- Adeyemi Gbadamosi +- Ousmane Touat +- Luc Forget +- Antonin Dudermel +- Maxime Popoff +- Thomas Delmas +- Oussama Bouksim +- Pierre Cochard +- Joseph Bizien +- Agathe Herrou +- Jurek Weber +- Aloïs Rautureau + diff --git a/web/mkdocs/docs/manual/reference.md b/web/mkdocs/docs/manual/reference.md new file mode 100644 index 0000000..ddb2fd7 --- /dev/null +++ b/web/mkdocs/docs/manual/reference.md @@ -0,0 +1,116 @@ +# Syfala Reference + +### General Option Flags + +| option | accepted values | description | +| ------------ | ----------------- | ------------------------------------------------------------ | +| `--xversion` | `2020.2 - 2022.2` | chooses Xilinx toolchain version (2020.2 & 2022.2 only supported for now) | +| `--reset` | / | resets current build directory before building (**careful**! all files from previous build will be lost) | +| `--mcd` | power of 2 | (defaults to 16) | + +### 'One-shot' Commands + +| name | description | arguments | +| -------------- | ------------------------------------------------------------ | ---------------------- | +| `install` | installs this script as a symlink in /usr/bin/ | none | +| `clean` | deletes current build directory | none | +| `import` | sets previously exported .zip build as the current build | path to the .zip build | +| `export` | exports current build in a .zip file located in the 'export' directory | name of the build | +| `report` | displays HLS or global report | HLS \| any | +| `demo` | fully builds demo based on default example (virtualAnalog.dsp) | none | +| `flash` | flashes current build onto target device | none | +| `gui` | executes the Faust-generated GUI application | none | +| `open-project` | opens the generated .xpr project with Vivado | none | +| `help` | prints list of available commands, options and run-time parameters | none | +| `version` | displays the current script's version | | + +### Run Steps + +**Note**: the `--all` is not necessary if you wish to run all steps, just run `syfala myfaustdsp.dsp ` + +| `--all` | runs all toolchain compilation steps (from `--arch` to `--gui`) | +| ----------- | ------------------------------------------------------------ | +| `--arch` | uses Faust to generate ip/host cpp files for HLS and Host application compilation | +| `--hls` | runs Vitis HLS on generated ip cpp file | +| `--project` | generates Vivado project | +| `--synth` | synthesizes full Vivado project | +| `--host` | compiles Host application, exports sources and .elf output to `build/sw_export` | +| `--gui` | compiles Faust GUI control application | +| `--flash` | flashes boot files on device at the end of the run | +| `--report` | prints HLS report at the end of the run | +| `--export` | `` exports build to export/ directory at the end of the run | + +### Run Parameters + +| parameter | accepted values | default value | +| :------------------ | ------------------------------------------ | ------------- | +| `--memory, -m` | `DDR - STATIC` | `DDR` | +| `--board, -b` | `Z10 - Z20 - GENESYS` | `Z10` | +| `--sample-rate` | `48000 - 96000 - 192000 - 384000 - 768000` | `48000` | +| `--sample-width` | `16 - 24 - 32` | `24` | +| `--controller-type` | `DEMO - PCB1 - PCB2 - PCB3 - PCB4` | `PCB1` | +| `--ssm-volume` | `FULL - HEADPHONE - DEFAULT` | `DEFAULT` | +| `--ssm-speed` | `FAST - DEFAULT` | `DEFAULT` | + +### Parameter Description + +| parameter | description | +| ------------------- | ------------------------------------------------------------ | +| `--memory, -m` | selects if **external** **DDR3** is used. Enable if you use some delay, disable if you do not want any memory access (should not be disabled) | +| `--board` | Defines target board. **Z10** ,**Z20** and **GENESYS** only. If you have a VGA port (rather than 2 HDMI ports), you have an old Zybo version, which is not supported. | +| `--sample-rate` | Changes **sample rate** value (Hz). Only 48kHz and 96kHz is available for **SSM** embeded codec. 192000 (**ADAU1777** and **ADAU1787** only) 384000 (**ADAU1787** only) 768000 (**ADAU1787** only and with `--sample--width 16` only) | +| `--sample-width` | Defines **sample bit depth** (16\|24\|32) | +| `--controller-type` | Defines the controller used to drive the controls when **SW3** is **UP**. (**SW3** **DOWN** for **software** control), **SEE BELOW** for details on each value | +| `--ssm-volume` | Chooses audio codec to use. For now, it only changes the scale factor. **FULL**: Maximum (**WARNING**: for speaker only, do not use with headphones). **HEADPHONE**: Lower volume for headphone use. **DEFAULT**: Default value +1dB because the true 0dB (`0b001111001`) decreases the signal a little bit. | +| `--ssm-speed` | Changes **SSM ADC/DAC** sample rate. **DEFAULT**: 48kHz sample rate. **FAST**: 96Khz sample rate | + +## Hardware Configuration (Zybo Z7-10/20) + +#### Syfala Hardware Controller Board (SW3 UP) + +If you use a Hardware Controller Board, please set the `--controller-type` command-line parameter to the proper value (see below) + +##### Controller-Type Values Description + +- **DEMO**: Popophone demo box +- **PCB1**: Emeraude PCB config 1: 4 knobs, 2 switches, 2 sliders (default) +- **PCB2**: Emeraude PCB config 2: 8 knobs +- **PCB3**: Emeraude PCB config 3: 4 knobs, 4 switches +- **PCB4**: Emeraude PCB config 4: 4 knobs above, 4 switches below + +You can **swap from hardware to software controller** during DSP execution by changing **SW3**. + +### Switch Description + +Default configuration in **bold** + +
+  SW3   SW2    SW1    SW0
++-----+-----+-------+------+
+| Hard| ADAU| BYPASS| MUTE |
+|     |     |       |      |
+|     |     |       |      |
+| GUI | SSM |USE DSP|UNMUTE|
++-----+-----+-------+------+
+
+- **SW3**: Controller type select: hardware (Controller board) or software (GUI). +- **SW2**: Audio codec input select (ADAU=external or SSM=onboard). Does not affect output. +- **SW1**: Bypass audio dsp. +- **SW0**: Mute. + +### Status LEDs + +The RGB led indicate the program state: + +* **BLUE**: waiting +* **GREEN**: all good! +* **ORANGE**: warning (bypass or mute enabled) +* **RED**: ERROR! (configuration failed or incompatible), could happen if you select the SSM codec with incompatible sample rate. + +The 4 LEDs above the switches indicate the switches state. If one of them blink, it indicates the source of the warning/error. + +### SD Card Files + +You can put the program on an SD card (if you want something reproducible and easily launchable, for the demos...). +After a `make` command, you should see a `BOOT.bin` file in SW_export (or you can build it with `make boot_file`). +Put the file on the root of SD card. And don't forget to put JP5 on 'SD' position ! diff --git a/web/mkdocs/mkdocs.yml b/web/mkdocs/mkdocs.yml new file mode 100644 index 0000000..acd8c00 --- /dev/null +++ b/web/mkdocs/mkdocs.yml @@ -0,0 +1,37 @@ +site_name: Syfala Documentation +site_description: A guide to the Syfala toolchain. +copyright: Copyright © 2023 Emeraude +nav: + - Home: index.md + - Manual: + - 'Overview': manual/manual.md + - 'Dependencies': manual/dependencies.md + - 'Reference': manual/reference.md + +theme: + name: mkdocs + custom_dir: 'theme' + navigation_depth: 4 + +site_dir: ../../docs + +extra: + social: + - type: github + link: https://github.com/inria-emeraude/syfala + - type: home + link: https://inria-emeraude.github.io/syfala/ + - type: envelope + link: mailto:romain.michon@inria.fr + +plugins: + - search + +extra_javascript: + - https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML + +markdown_extensions: + - mdx_math + - admonition + - markdown_include.include: + base_path: './docs' diff --git a/web/mkdocs/theme/base.html b/web/mkdocs/theme/base.html new file mode 100644 index 0000000..dfd87a7 --- /dev/null +++ b/web/mkdocs/theme/base.html @@ -0,0 +1,203 @@ + + + + {%- block site_meta %} + + + + {% if page and page.is_homepage %}{% endif %} + {% if config.site_author %}{% endif %} + {% if page and page.canonical_url %}{% endif %} + {% if config.site_favicon %} + {% else %}{% endif %} + {%- endblock %} + + {%- block htmltitle %} + {% if page and page.title and not page.is_homepage %}{{ page.title }} - {% endif %}{{ config.site_name }} + {%- endblock %} + + {%- block styles %} + + + + {%- if config.theme.highlightjs %} + + {%- endif %} + {%- for path in config['extra_css'] %} + + {%- endfor %} + {%- endblock %} + + {%- block libs %} + + + + {%- if config.theme.highlightjs %} + + {%- for lang in config.theme.hljs_languages %} + + {%- endfor %} + + {%- endif %} + {%- endblock %} + + {%- block analytics %} + {%- if config.google_analytics %} + + {%- endif %} + {%- endblock %} + + {%- block extrahead %} {% endblock %} + + + + + + {% if page and page.is_homepage and config.faust_banner %} + + {%- endif %} + +
+
+ {%- block content %} + {%- if page.meta.hide_toc %} +
{% include "content.html" %}
+ {%- else -%} +
{% include "toc.html" %}
+
{% include "content.html" %}
+ {%- endif %} + {%- endblock %} +
+
+ +
+ {%- block footer %} +
+ {%- if config.copyright %} +

{{ config.copyright }}

+ {%- endif %} + {%- endblock %} +
+ + {%- block scripts %} + + + {%- for path in config['extra_javascript'] %} + + {%- endfor %} + {%- endblock %} + + {% if 'search' in config['plugins'] %}{%- include "search-modal.html" %}{% endif %} + {%- include "keyboard-modal.html" %} + + + +{% if page and page.is_homepage %} + +{% endif %} diff --git a/web/mkdocs/theme/css/base.css b/web/mkdocs/theme/css/base.css new file mode 100644 index 0000000..1ed2ed6 --- /dev/null +++ b/web/mkdocs/theme/css/base.css @@ -0,0 +1,408 @@ +.navbar-brand{ + font-size: 16pt; + padding-right: 20px; +} + +.btn { + margin-bottom: 20px; +} + +pre { + background-color: #e9edf2 !important; + margin-top: 4px; + margin-bottom: 4px; +} + +.try_it { + border: 1px solid #666666; + border-radius: 5px; + background-color: #4CAF50; + color: white; + padding-left: 12px; + padding-right: 12px; + padding-top: 4px; + padding-bottom: 4px; +} + +.try_it:focus { outline: none; } + +.faust-tools { + background-color: #F8F8F8; + font-size: 90% +} +.faust-options { + background-color: #F8F8F8; + font-size: 90%; +} + +.faust-logo { + background-color: #F0F0F0; + width: 40%; +} + +.bs-sidebar { + overflow-y: auto; + max-height: 100%; + height: calc(100vh - 100px); + overflow-x: hidden; +} + +blockquote{ + padding-left: 20pt; + font-weight: bold; +} + +.btn-primary{ + background-image: none; + background-color: rgba(36, 59, 85, 90%) !important; +} + +.banner-home{ + height: 200px; + background-image: url("../img/faustCode.jpg"); + text-align: center; + color: white; + padding-top: 30px; +} + +.dropdown-item.active{ + background-color: black; +} + +.dropdown-item:hover{ + background-color: black; +} + +a{ + color: #69afff; +} + +.bg-primary{ + background-image: none; + background-color: rgba(36, 59, 85, 90%) !important; +} + +body{ + color: black !important; +} + +html { + /* csslint ignore:start */ + /* The nav header is 3.5rem high, plus 20px for the margin-top of the + main container. */ + scroll-padding-top: calc(3.5rem + 20px); + /* csslint ignore:end */ +} + +/* Replacement for `body { background-attachment: fixed; }`, which has + performance issues when scrolling on large displays. See #1394. */ +body::before { + content: ' '; + position: fixed; + width: 100%; + height: 100%; + top: 0; + left: 0; + background-color: #f8f8f8; + will-change: transform; + z-index: -1; +} + +body > .container { + margin-top: 20px; + min-height: 400px; +} + +.navbar.fixed-top { /* csslint allow: adjoining-classes */ + /* csslint ignore:start */ + position: -webkit-sticky; + position: sticky; + /* csslint ignore:end */ +} + +.source-links { + float: right; +} + +.col-md-9 img { + max-width: 100%; + display: inline-block; + padding: 4px; + line-height: 1.428571429; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + margin: 20px auto 30px auto; +} + +h1 { + color: #243b55; + font-weight: 600; + font-size: 42px; +} + +h2 { + color: #243b55; + font-weight: 500; + margin-top: 3rem; +} + +h3, h4, h5, h6 { + color:#243b55; + font-weight: 400; + margin-top: 3rem; +} + +hr { + margin-top: 3rem; + border-top: 2px solid #243b55; +} + +pre, .rst-content tt { + max-width: 100%; + background: #fff; + border: solid 1px #e1e4e5; + color: #333; + overflow-x: auto; +} + +code.code-large, .rst-content tt.code-large { + font-size: 90%; +} + +code { + padding: 2px 5px; + background-color: #e9edf2 !important; + border: solid 1px #e1e4e5; + color: #775177; + white-space: pre-wrap; + word-wrap: break-word; +} + +pre code { + display: block; + background: transparent; + border: none; + white-space: pre; + word-wrap: normal; + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 14px; +} + +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); + box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); +} + +a code { + color: #2FA4E7; +} + +a:hover code, a:focus code { + color: #157AB5; +} + +footer { + margin-top: 30px; + margin-bottom: 10px; + text-align: center; + font-weight: 200; +} + +.modal-dialog { + margin-top: 60px; +} + +/* + * Side navigation + * + * Scrollspy and affixed enhanced navigation to highlight sections and secondary + * sections of docs content. + */ + +.bs-sidebar.affix { /* csslint allow: adjoining-classes */ + /* csslint ignore:start */ + position: -webkit-sticky; + position: sticky; + /* csslint ignore:end */ + /* The nav header is 3.5rem high, plus 20px for the margin-top of the + main container. */ + top: calc(3.5rem + 20px); +} + +.bs-sidebar.card { /* csslint allow: adjoining-classes */ + padding: 0; + max-height: 90%; + overflow-y: auto; +} + +/* Toggle (vertically flip) sidebar collapse icon */ +.bs-sidebar .navbar-toggler span { + -moz-transform: scale(1, -1); + -webkit-transform: scale(1, -1); + -o-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} + +.bs-sidebar .navbar-toggler.collapsed span { /* csslint allow: adjoining-classes */ + -moz-transform: scale(1, 1); + -webkit-transform: scale(1, 1); + -o-transform: scale(1, 1); + -ms-transform: scale(1, 1); + transform: scale(1, 1); +} + +/* First level of nav */ +.bs-sidebar > .navbar-collapse > .nav { + padding-top: 10px; + padding-bottom: 10px; + border-radius: 5px; + width: 100%; +} + +/* All levels of nav */ +.bs-sidebar .nav > li > a { + display: block; + padding: 5px 20px; + z-index: 1; +} +.bs-sidebar .nav > li > a:hover, +.bs-sidebar .nav > li > a:focus { + text-decoration: none; + border-right: 1px solid; +} +.bs-sidebar .nav > li > a.active, +.bs-sidebar .nav > li > a.active:hover, +.bs-sidebar .nav > li > a.active:focus { + font-weight: bold; + background-color: transparent; + border-right: 1px solid; +} + +.bs-sidebar .nav .nav .nav { + margin-left: 1em; +} + +.bs-sidebar .nav > li > a { + font-weight: bold; +} + +.bs-sidebar .nav .nav > li > a { + font-weight: normal; +} + +.headerlink { + font-family: FontAwesome; + font-size: 14px; + display: none; + padding-left: .5em; +} + +h1:hover .headerlink, h2:hover .headerlink, h3:hover .headerlink, h4:hover .headerlink, h5:hover .headerlink, h6:hover .headerlink{ + display:inline-block; +} + + + +.admonition { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; + text-align: left; +} + +.admonition.note { /* csslint allow: adjoining-classes */ + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.admonition.warning { /* csslint allow: adjoining-classes */ + color: #c09853; + background-color: #fcf8e3; + border-color: #fbeed5; +} + +.admonition.danger { /* csslint allow: adjoining-classes */ + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.admonition-title { + font-weight: bold; + text-align: left; +} + +@media (max-width: 991.98px) { + .navbar-collapse.show { /* csslint allow: adjoining-classes */ + overflow-y: auto; + max-height: calc(100vh - 3.5rem); + } +} + +.dropdown-item.open { /* csslint allow: adjoining-classes */ + color: #fff; + background-color: #2FA4E7; +} + +.dropdown-submenu > .dropdown-menu { + margin: 0 0 0 1.5rem; + padding: 0; + border-width: 0; +} + +.dropdown-submenu > a::after { + display: block; + content: " "; + float: right; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 5px 0 5px 5px; + border-left-color: #ccc; + margin-top: 5px; + margin-right: -10px; +} + +.dropdown-submenu:hover > a::after { + border-left-color: #fff; +} + +@media (min-width: 992px) { + .dropdown-menu { + overflow-y: auto; + max-height: calc(100vh - 3.5rem); + } + + .dropdown-submenu { + position: relative; + } + + .dropdown-submenu > .dropdown-menu { + /* csslint ignore:start */ + position: fixed !important; + /* csslint ignore:end */ + margin-top: -9px; + margin-left: -2px; + border-width: 1px; + padding: 0.5rem 0; + } + + .dropdown-submenu.pull-left { /* csslint allow: adjoining-classes */ + float: none; + } + + .dropdown-submenu.pull-left > .dropdown-menu { /* csslint allow: adjoining-classes */ + left: -100%; + margin-left: 10px; + } +} diff --git a/web/mkdocs/theme/img/faustCode.jpg b/web/mkdocs/theme/img/faustCode.jpg new file mode 100644 index 0000000..97ec937 Binary files /dev/null and b/web/mkdocs/theme/img/faustCode.jpg differ diff --git a/web/mkdocs/theme/img/faustText.svg b/web/mkdocs/theme/img/faustText.svg new file mode 100644 index 0000000..fd5f432 --- /dev/null +++ b/web/mkdocs/theme/img/faustText.svg @@ -0,0 +1,35 @@ + +image/svg+xml \ No newline at end of file