From 59dc677970aa6b1178ee6f2883d2941def8c3076 Mon Sep 17 00:00:00 2001
From: Dolu1990
Date: Thu, 21 Dec 2023 10:01:03 +0100
Subject: [PATCH] Push base doc
---
.github/workflows/build-and-deploy.yml | 588 ++++++++++++
.github/workflows/push-doc.yml | 60 ++
.github/workflows/test-build.yml | 29 +
.gitignore | 16 +
Dockerfile | 18 +
LICENSE | 121 +++
Makefile | 19 +
README.md | 1 -
README.rst | 77 ++
bin/convert-wrapper | 29 +
bin/setup_env.sh | 35 +
examples/.gitignore | 43 +
examples/build.sbt | 16 +
pdf.Dockerfile | 24 +
requirements.txt | 5 +
source/VexiiRiscv/Introduction/VexiiRiscv.rst | 5 +
source/VexiiRiscv/Introduction/index.rst | 10 +
source/_static/default.js | 1 +
source/_static/dialog.js | 109 +++
source/_static/gh-fork-ribbon.css | 124 +++
source/_static/gh-fork-ribbon.txt | 27 +
source/_static/github-corner-right.css | 16 +
source/_static/github-corner-right.svg | 11 +
source/_static/github-corner-right.txt | 24 +
source/_static/theme_overrides.css | 18 +
source/_static/vexiiriscv.css | 81 ++
source/_static/wavedrom.min.js | 3 +
source/_templates/footer.html | 20 +
source/_templates/layout.html | 38 +
source/_templates/page.html | 42 +
source/_templates/versions.html | 43 +
source/asset/image/bundle/CommonDataBus.png | Bin 0 -> 173471 bytes
source/asset/image/fixpoint/fixPoint.png | Bin 0 -> 30322 bytes
.../asset/image/fixpoint/highBitOperation.png | Bin 0 -> 9344 bytes
.../image/fixpoint/lowerBitOperation.png | Bin 0 -> 9381 bytes
source/asset/image/intc/MS.svg | 1 +
source/asset/image/intc/RFMS.svg | 1 +
source/asset/image/intc/intc.jpeg | Bin 0 -> 206576 bytes
source/asset/image/regif/easy-intr.png | Bin 0 -> 224976 bytes
.../asset/image/regif/field-auto-allocate.gif | Bin 0 -> 237479 bytes
.../asset/image/regif/reg-auto-allocate.gif | Bin 0 -> 277828 bytes
source/asset/image/regif/regif-html.png | Bin 0 -> 99372 bytes
source/asset/logo/logo3.PNG | Bin 0 -> 25616 bytes
source/asset/logo/logo3.svg | 108 +++
source/asset/logo/logo3_32x32.png | Bin 0 -> 1601 bytes
source/asset/picture/MuxList.png | Bin 0 -> 26459 bytes
source/asset/picture/astGlobal.png | Bin 0 -> 79697 bytes
source/asset/picture/astStatement.png | Bin 0 -> 89093 bytes
.../picture/bus_slave_factory_classes.svg | 276 ++++++
source/asset/picture/fsm_simple.svg | 214 +++++
source/asset/picture/fsm_stateb.svg | 184 ++++
source/asset/picture/logo_spiral_small.png | Bin 0 -> 30519 bytes
source/asset/picture/memory_mapped_uart.svg | 818 +++++++++++++++++
source/asset/picture/pinsec_hardware.svg | 855 ++++++++++++++++++
source/asset/picture/process_rtl.svg | 400 ++++++++
source/asset/picture/register.svg | 528 +++++++++++
source/asset/picture/simEngine.png | Bin 0 -> 28122 bytes
source/asset/picture/stream.json | 6 +
source/asset/picture/stream.png | Bin 0 -> 12203 bytes
source/asset/picture/stream_throw_m2spipe.svg | 492 ++++++++++
source/asset/picture/types.svg | 265 ++++++
source/asset/picture/uart.png | Bin 0 -> 6329 bytes
source/conf.py | 368 ++++++++
source/index.rst | 10 +
64 files changed, 6178 insertions(+), 1 deletion(-)
create mode 100644 .github/workflows/build-and-deploy.yml
create mode 100644 .github/workflows/push-doc.yml
create mode 100644 .github/workflows/test-build.yml
create mode 100644 .gitignore
create mode 100644 Dockerfile
create mode 100644 LICENSE
create mode 100644 Makefile
delete mode 100644 README.md
create mode 100644 README.rst
create mode 100755 bin/convert-wrapper
create mode 100644 bin/setup_env.sh
create mode 100644 examples/.gitignore
create mode 100644 examples/build.sbt
create mode 100644 pdf.Dockerfile
create mode 100644 requirements.txt
create mode 100644 source/VexiiRiscv/Introduction/VexiiRiscv.rst
create mode 100644 source/VexiiRiscv/Introduction/index.rst
create mode 100644 source/_static/default.js
create mode 100644 source/_static/dialog.js
create mode 100644 source/_static/gh-fork-ribbon.css
create mode 100644 source/_static/gh-fork-ribbon.txt
create mode 100644 source/_static/github-corner-right.css
create mode 100644 source/_static/github-corner-right.svg
create mode 100644 source/_static/github-corner-right.txt
create mode 100644 source/_static/theme_overrides.css
create mode 100644 source/_static/vexiiriscv.css
create mode 100644 source/_static/wavedrom.min.js
create mode 100644 source/_templates/footer.html
create mode 100644 source/_templates/layout.html
create mode 100644 source/_templates/page.html
create mode 100644 source/_templates/versions.html
create mode 100644 source/asset/image/bundle/CommonDataBus.png
create mode 100644 source/asset/image/fixpoint/fixPoint.png
create mode 100644 source/asset/image/fixpoint/highBitOperation.png
create mode 100644 source/asset/image/fixpoint/lowerBitOperation.png
create mode 100644 source/asset/image/intc/MS.svg
create mode 100644 source/asset/image/intc/RFMS.svg
create mode 100644 source/asset/image/intc/intc.jpeg
create mode 100644 source/asset/image/regif/easy-intr.png
create mode 100644 source/asset/image/regif/field-auto-allocate.gif
create mode 100644 source/asset/image/regif/reg-auto-allocate.gif
create mode 100644 source/asset/image/regif/regif-html.png
create mode 100644 source/asset/logo/logo3.PNG
create mode 100644 source/asset/logo/logo3.svg
create mode 100644 source/asset/logo/logo3_32x32.png
create mode 100644 source/asset/picture/MuxList.png
create mode 100644 source/asset/picture/astGlobal.png
create mode 100644 source/asset/picture/astStatement.png
create mode 100644 source/asset/picture/bus_slave_factory_classes.svg
create mode 100644 source/asset/picture/fsm_simple.svg
create mode 100644 source/asset/picture/fsm_stateb.svg
create mode 100644 source/asset/picture/logo_spiral_small.png
create mode 100644 source/asset/picture/memory_mapped_uart.svg
create mode 100644 source/asset/picture/pinsec_hardware.svg
create mode 100644 source/asset/picture/process_rtl.svg
create mode 100644 source/asset/picture/register.svg
create mode 100644 source/asset/picture/simEngine.png
create mode 100644 source/asset/picture/stream.json
create mode 100644 source/asset/picture/stream.png
create mode 100644 source/asset/picture/stream_throw_m2spipe.svg
create mode 100644 source/asset/picture/types.svg
create mode 100644 source/asset/picture/uart.png
create mode 100644 source/conf.py
create mode 100644 source/index.rst
diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml
new file mode 100644
index 0000000..36113d9
--- /dev/null
+++ b/.github/workflows/build-and-deploy.yml
@@ -0,0 +1,588 @@
+name: "build_and_deploy"
+
+on:
+ workflow_dispatch:
+ inputs:
+ BUILD_SINGLE_DOC:
+ description: 'Build single version ?'
+ required: false
+ type: boolean
+ default: false
+ BUILD_MULTI_DOC:
+ description: 'Build multi version (live) ?'
+ required: false
+ type: boolean
+ default: true
+ FAILON_LINKCHECK:
+ description: 'Enforce make linkcheck (live) ?'
+ required: false
+ type: boolean
+ default: true
+ SKIP_LINKCHECK:
+ description: 'Skip make linkcheck ?'
+ required: false
+ type: boolean
+ default: false
+ DEPLOY_ENV_TEST:
+ description: 'Deploy to test ?'
+ required: false
+ type: boolean
+ default: false
+ DEPLOY_ENV_LIVE:
+ description: 'Deploy to live ?'
+ required: false
+ type: boolean
+ default: false
+ pull_request:
+ env: # This doesn't error but doesn't work like you might expect, see the steps below
+ BUILD_SINGLE_DOC: true
+ BUILD_MULTI_DOC: false
+ FAILON_LINKCHECK: false
+ SKIP_LINKCHECK: true
+ push:
+ branches:
+ - 'test'
+ env: # This doesn't error but doesn't work like you might expect, see the steps below
+ BUILD_SINGLE_DOC: true
+ BUILD_MULTI_DOC: true
+ FAILON_LINKCHECK: false
+ SKIP_LINKCHECK: true
+ DEPLOY_ENV_TEST: true
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ # The purpose of these outputs is to allow the separate 'deploy' job to pickup the same values
+ outputs:
+ DEPLOY_ENV_TEST: ${{ steps.confenv.outputs.DEPLOY_ENV_TEST }}
+ DEPLOY_ENV_LIVE: ${{ steps.confenv.outputs.DEPLOY_ENV_LIVE }}
+ deploy: ${{ steps.github-pages.outputs.deploy }}
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+ with:
+ fetch-depth: 0 ## all branches all tags
+
+ - name: 'CI-ENV on: workflow_dispatch'
+ if: github.event_name == 'workflow_dispatch'
+ env:
+ inputs_BUILD_SINGLE_DOC: ${{ inputs.BUILD_SINGLE_DOC }}
+ inputs_BUILD_MULTI_DOC: ${{ inputs.BUILD_MULTI_DOC }}
+ inputs_SKIP_LINKCHECK: ${{ inputs.SKIP_LINKCHECK }}
+ inputs_FAILON_LINKCHECK: ${{ inputs.FAILON_LINKCHECK }}
+ inputs_DEPLOY_ENV_TEST: ${{ inputs.DEPLOY_ENV_TEST }}
+ inputs_DEPLOY_ENV_LIVE: ${{ inputs.DEPLOY_ENV_LIVE }}
+ run: |
+ # Canonicalize variable values "true" or "false" or default (not set)
+ for ename in BUILD_SINGLE_DOC BUILD_MULTI_DOC SKIP_LINKCHECK FAILON_LINKCHECK DEPLOY_ENV_TEST DEPLOY_ENV_LIVE
+ do
+ iname="inputs_${ename}"
+ value="${!iname}"
+ # inputs context has lower precedence than existing env (which is usually notset)
+ # set ename (env) from iname (inputs) if ename notset and value being set is not blank
+ if [ "${!ename-notset}" = "notset" ] && [ "X${value}" != "X" ]
+ then
+ declare "${ename}=${value}"
+ echo "${ename}=${!ename}" >> $GITHUB_ENV
+ fi
+ done
+
+ cat $GITHUB_ENV
+
+ - name: 'CI-ENV on: release'
+ if: github.event_name == 'release'
+ run: |
+ # Actions don't support env setup from on: specification so we have to do it inside a step
+ for namevalue in {BUILD_SINGLE_DOC=false,BUILD_MULTI_DOC=true,FAILON_LINKCHECK=true,DEPLOY_ENV_LIVE=true}
+ do
+ name="${namevalue%=*}"
+ value="${namevalue#*=}"
+ if [ "${!name-notset}" = "notset" ]
+ then
+ declare "${name}=${value}"
+ echo "${name}=${!name}" >> $GITHUB_ENV
+ fi
+ done
+
+ cat $GITHUB_ENV
+
+ - name: 'CI-ENV on: schedule'
+ if: github.event_name == 'schedule'
+ run: |
+ # Actions don't support env setup from on: specification so we have to do it inside a step
+ for namevalue in {BUILD_SINGLE_DOC=false,BUILD_MULTI_DOC=true,FAILON_LINKCHECK=false,DEPLOY_ENV_LIVE=true}
+ do
+ name="${namevalue%=*}"
+ value="${namevalue#*=}"
+ if [ "${!name-notset}" = "notset" ]
+ then
+ declare "${name}=${value}"
+ echo "${name}=${!name}" >> $GITHUB_ENV
+ fi
+ done
+
+ cat $GITHUB_ENV
+
+ - name: 'CI-ENV on: push' # if you use a branch called 'test' see on: push
+ if: github.event_name == 'push'
+ run: |
+ # Actions don't support env setup from on: specification so we have to do it inside a step
+ for namevalue in {BUILD_SINGLE_DOC=true,BUILD_MULTI_DOC=true,SKIP_LINKCHECK=true,DEPLOY_ENV_TEST=true}
+ do
+ name="${namevalue%=*}"
+ value="${namevalue#*=}"
+ if [ "${!name-notset}" = "notset" ]
+ then
+ declare "${name}=${value}"
+ echo "${name}=${!name}" >> $GITHUB_ENV
+ fi
+ done
+
+ cat $GITHUB_ENV
+
+ - name: 'CI-ENV on: pull_request'
+ if: github.event_name == 'pull_request'
+ run: |
+ # Actions don't support env setup from on: specification so we have to do it inside a step
+ for namevalue in {BUILD_SINGLE_DOC=true,SKIP_LINKCHECK=true}
+ do
+ name="${namevalue%=*}"
+ value="${namevalue#*=}"
+ if [ "${!name-notset}" = "notset" ]
+ then
+ declare "${name}=${value}"
+ echo "${name}=${!name}" >> $GITHUB_ENV
+ fi
+ done
+
+ cat $GITHUB_ENV
+
+ - name: 'CI-ENV Canonicalize'
+ run: |
+ # Canonicalize variable values "true" or "false" or default (not set)
+ for ename in BUILD_SINGLE_DOC BUILD_MULTI_DOC SKIP_LINKCHECK FAILON_LINKCHECK DEPLOY_ENV_TEST DEPLOY_ENV_LIVE
+ do
+ if [ "${!ename+set}" = "set" ]
+ then
+ # The ,, is bash for lowercase the value
+ if [ "${!ename,,}" != "true" ] && [ "${!ename,,}" != "false" ]
+ then
+ echo "ENV ${ename} invalid value: '${!ename}'" 1>&2
+ exit 1
+ fi
+ echo "${ename}=${!ename}" >> $GITHUB_ENV
+ fi
+ done
+
+ cat $GITHUB_ENV
+
+ - name: 'CI-ENV Validate'
+ run: |
+ # Only one DEPLOY mode is allowed, if any
+ if [ "$DEPLOY_ENV_TEST" = "true" ] && [ "$DEPLOY_ENV_LIVE" = "true" ]
+ then
+ echo "ENV invalid params DEPLOY_ENV_TEST=$DEPLOY_ENV_TEST and DEPLOY_ENV_LIVE=$DEPLOY_ENV_LIVE" 1>&2
+ exit 1
+ fi
+
+ if [ "$DEPLOY_ENV_LIVE" = "true" ]
+ then
+ # When deploying LIVE only one BUILD mode is allowed (this is to prevent accidents)
+ # disallow deployment of multiple versions
+ if [ "$BUILD_SINGLE_DOC" = "true" ] && [ "$BUILD_MULTI_DOC" = "true" ]
+ then
+ echo "ENV invalid params BUILD_SINGLE_DOC=$BUILD_SINGLE_DOC and BUILD_MULTI_DOC=$BUILD_MULTI_DOC" 1>&2
+ exit 1
+ fi
+
+ # Maybe this should be the rule for the policy at this time (this is to prevent accidents)
+ # force only BUILD_MULTI_DOC
+ if [ "$BUILD_MULTI_DOC" != "true" ]
+ then
+ echo "ENV invalid params BUILD_MULTI_DOC=$BUILD_MULTI_DOC" 1>&2
+ exit 1
+ fi
+ fi
+
+ echo "Validation: SUCCESS"
+ exit 0
+
+ - name: Configure ENV
+ id: confenv
+ run: |
+ ## transform: mayexist/username/reponame => reponame
+ export GITHUB_REPOSITORY_NAME=$(echo -n "${GITHUB_REPOSITORY}" | sed -e 's#^.*/\([^/]*\)$#\1#')
+ echo "GITHUB_REPOSITORY_NAME=${GITHUB_REPOSITORY_NAME}" >> $GITHUB_ENV
+ export sphinx_extra_version="latest"
+ echo "sphinx_extra_version=${sphinx_extra_version}" >> $GITHUB_ENV
+
+ # Needs trailing slash on these, as final value needs trailing slash
+ # Default is assume multi for production
+ _baseurl_prefix="${sphinx_extra_version}/"
+ if [ "$DEPLOY_ENV_TEST" = "true" ] && [ "$BUILD_MULTI_DOC" = "true" ] && [ "$BUILD_SINGLE_DOC" = "true" ]
+ then
+ # TEST: Prioritize multi when building both
+ _baseurl_prefix="docs_multi/html/${sphinx_extra_version}/"
+ elif [ "$DEPLOY_ENV_TEST" = "true" ] && [ "$BUILD_MULTI_DOC" = "true" ]
+ then
+ # TEST: Looks same as default
+ _baseurl_prefix="${sphinx_extra_version}/"
+ elif [ "$DEPLOY_ENV_TEST" = "true" ] && [ "$BUILD_SINGLE_DOC" = "true" ]
+ then
+ # TEST: This is moved toplevel now (no trailing slash as there is one already when this is empty)
+ #_baseurl_prefix="docs_single/html/${sphinx_extra_version}"
+ _baseurl_prefix=""
+ fi
+ echo "sphinx_html_baseurl=https://${GITHUB_REPOSITORY_OWNER}.github.io/${GITHUB_REPOSITORY_NAME}/${_baseurl_prefix}" >> $GITHUB_ENV
+
+ echo "sphinx_github_url=https://github.com/${GITHUB_REPOSITORY}" >> $GITHUB_ENV
+
+ # Latest version selection
+ echo "### git show-ref:"
+ git show-ref
+
+ echo "### git for-each-ref:"
+ git for-each-ref --format "%(refname)"
+
+ set +e
+ sphinx_latest_version=$(git for-each-ref --format "%(refname)" | sed 's/^refs\///g' | grep "tags/" | sed -e 's/^tags\///' | sort -g | tail -n1)
+ set -e
+ echo "sphinx_latest_version=${sphinx_latest_version}" >> $GITHUB_ENV
+ if [ "$DEPLOY_ENV_LIVE" != "true" ]
+ then
+ echo "sphinx_html_context_head_meta_robots=noindex,nofollow" >> $GITHUB_ENV
+ fi
+
+ # See if a tags/latest exists
+ if git show-ref -q latest
+ then
+ echo "$(git show-ref ${sphinx_extra_version}) ## ALREADY EXISTS, KEEPING"
+ else
+ gitref=$(git show-ref ${sphinx_latest_version} | cut -d ' ' -f1)
+ git tag "${sphinx_extra_version}" "${gitref}"
+ echo "$(git show-ref ${sphinx_extra_version}) ## CREATED LOCAL ALIAS TO ${sphinx_latest_version}"
+ fi
+
+ # Now we are all configured lets make these settings global
+ for varname in DEPLOY_ENV_TEST DEPLOY_ENV_LIVE
+ do
+ echo "$varname=${!varname}" >> $GITHUB_OUTPUT
+ done
+
+ echo "### $GITHUB_OUTPUT:"
+ cat $GITHUB_OUTPUT
+
+ echo "### $GITHUB_ENV:"
+ cat $GITHUB_ENV
+
+ - name: Setup python 3.9
+ uses: actions/setup-python@v4
+ with:
+ python-version: 3.9
+
+ - name: Install dependencies
+ run: |
+ # FIXME use the same docker container, that already has all the trimmings
+ # https://hub.docker.com/r/sphinxdoc/sphinx-latexpdf/tags 5.3.0
+ # Hmm... it does not look like the docker is being updated anymore, stuck at version 5.3.0
+ # this is the version we use today but tomorrow it looks like we are going to have to
+ # manually install like this anyway.
+ export DEBIAN_FRONTEND=noninteractive
+ sudo apt-get update -y || true
+
+ # Dep list taken from docker image
+ sudo apt-get install --no-install-recommends -y graphviz imagemagick make latexmk \
+ lmodern fonts-freefont-otf texlive-latex-recommended texlive-latex-extra \
+ texlive-fonts-recommended texlive-fonts-extra texlive-lang-cjk \
+ texlive-lang-chinese texlive-lang-japanese texlive-luatex texlive-xetex \
+ xindy tex-gyre
+ sudo apt-get install -y git # github-action image already has this
+ #apt-get autoremove && apt-get clean && rm -rf /var/lib/apt/lists/* # buildkit
+
+ python3 -m pip install --no-cache-dir -U pip # buildkit
+ python3 -m pip install --no-cache-dir Pillow # buildkit (removed Sphinx, this comes from requirements.txt)
+
+ source bin/setup_env.sh
+ echo "sphinx_latest_version=${sphinx_latest_version}" >> $GITHUB_ENV
+
+ pip install -r requirements.txt
+
+ - uses: ammaraskar/sphinx-problem-matcher@master
+
+ - name: make linkcheck - check links
+ if: ${{ env.SKIP_LINKCHECK != 'true' }}
+ run: |
+ source bin/setup_env.sh
+
+ set +e
+ # This can fail if 3rd party website is down (that maybe one of the points it is checking here)
+ make linkcheck >linkcheck.log 2>&1
+ retval=$?
+ set -e
+ cat linkcheck.log
+
+ if [ $retval -ne 0 ]
+ then
+ # GHA must have slow blocking stdout stream but large buffer
+ # This sleeps ensures the 'cat' above flushed the stream before we might writing to stderr here
+ sleep 3
+
+ # Repeat to STDERR to attract attention
+ echo "### ERROR $retval :" 1>&2
+ egrep "\s(broken)\s" linkcheck.log 1>&2 || true
+
+ if [ "$FAILON_LINKCHECK" = "true" ]
+ then
+ echo "ENV param FAILON_LINKCHECK=$FAILON_LINKCHECK so CI build halted due to: make linkcheck (exit-status=$retval)" 1>&2
+ exit $retval
+ fi
+ fi
+ # Force success if we get here
+ exit 0
+
+ - name: make html - single doc builder
+ if: ${{ env.BUILD_SINGLE_DOC == 'true' }}
+ run: |
+ source bin/setup_env.sh
+
+ rm -f /tmp/convert-wrapper.log
+
+ make html
+ rv=$?
+
+ # Report convert-wrapper failures for CI visibility
+ if grep -q "^FAIL" /tmp/convert-wrapper.log 2>/dev/null
+ then
+ echo "### /tmp/convert-wrapper.log:"
+ grep "^FAIL" /tmp/convert-wrapper.log
+ #rv=1 #this would force this into a step failure
+ fi
+
+ exit $rv
+
+ - name: "move dist/gh-pages/docs_single"
+ if: ${{ env.BUILD_SINGLE_DOC == 'true' }}
+ run: |
+ test -d dist/gh-pages || mkdir -p dist/gh-pages
+ mv -f docs/ dist/gh-pages/docs_single
+
+ if [ "$BUILD_MULTI_DOC" != "true" ]
+ then
+ # only building SINGLE so make it toplevel
+ mv -f dist/gh-pages/docs_single/* dist/gh-pages/
+ find dist/gh-pages/docs_single -exec ls -lad {} \;
+ rmdir dist/gh-pages/docs_single # ensures dir empty
+ # this exposes doctree/** linkcheck/** (that seems ok)
+ mv -f dist/gh-pages/html/* dist/gh-pages/
+ fi
+
+ - name: sphinx-multiversion - multidoc builder
+ if: ${{ env.BUILD_MULTI_DOC == 'true' }}
+ run: |
+ source bin/setup_env.sh
+
+ test -d dist/gh-pages || mkdir -p dist/gh-pages
+ sphinx-multiversion -D "smv_latest_version=$sphinx_latest_version" --dump-metadata source docs/html > dist/gh-pages/sphinx_metadata.json
+ cat dist/gh-pages/sphinx_metadata.json
+
+ rm -f /tmp/convert-wrapper.log
+
+ # Make the docs
+ sphinx-multiversion -D "smv_latest_version=$sphinx_latest_version" source docs/html
+ rv=$?
+
+ # Report convert-wrapper failures for CI visibility
+ if grep -q "^FAIL" /tmp/convert-wrapper.log 2>/dev/null
+ then
+ echo "### /tmp/convert-wrapper.log:"
+ grep "^FAIL" /tmp/convert-wrapper.log
+ #rv=1 #this would force this into a step failure
+ fi
+
+ exit $rv
+
+ - name: "move dist/gh-pages/docs_multi"
+ if: ${{ env.BUILD_MULTI_DOC == 'true' }}
+ run: |
+ test -d dist/gh-pages || mkdir -p dist/gh-pages
+ mv -f docs/ dist/gh-pages/docs_multi
+
+ if [ "$BUILD_SINGLE_DOC" != "true" ]
+ then
+ # only building MULTI so make it toplevel
+ mv -f dist/gh-pages/docs_multi/* dist/gh-pages/
+ find dist/gh-pages/docs_multi -exec ls -lad {} \;
+ rmdir dist/gh-pages/docs_multi # ensures dir empty
+ # this exposes doctree/** linkcheck/** (that seems ok)
+ mv -f dist/gh-pages/html/* dist/gh-pages/
+ fi
+
+ - name: "Prepare artifact"
+ run: |
+ set +e
+ # Provide a view of deployment structure to help with any diagnostic
+ for f in "dist/gh-pages/${sphinx_extra_version}/index.html" \
+ "dist/gh-pages/docs_multi/html/${sphinx_extra_version}/index.html" \
+ "dist/gh-pages/docs_multi/html/${sphinx_latest_version}/index.html" \
+ "dist/gh-pages/docs_single/html/index.html" \
+ "dist/gh-pages/" \
+ "dist/gh-pages/docs_single/" \
+ "dist/gh-pages/docs_single/html" \
+ "dist/gh-pages/docs_multi/" \
+ "dist/gh-pages/docs_multi/html"
+ do
+ if [ -d "$f" ]
+ then
+ echo "### $f (dir) :"
+ ls -la "$f" || true
+ else
+ echo "### $f (file) :"
+ ls -lad "$f" || true
+ fi
+ done
+ set -e
+
+ if [ -f "dist/gh-pages/${sphinx_extra_version}/index.html" ]
+ then
+ redirect_url="./${sphinx_extra_version}/index.html"
+ elif [ -f "dist/gh-pages/docs_multi/html/${sphinx_extra_version}/index.html" ]
+ then
+ redirect_url="./docs_multi/html/${sphinx_extra_version}/index.html"
+ elif [ -f "dist/gh-pages/docs_multi/html/${sphinx_latest_version}/index.html" ]
+ then
+ redirect_url="./docs_multi/html/${sphinx_latest_version}/index.html"
+ elif [ -f "dist/gh-pages/docs_single/html/index.html" ]
+ then
+ redirect_url="./docs_single/html/index.html"
+ else
+ redirect_url="./${sphinx_extra_version}/index.html"
+ fi
+
+ if [ "X${sphinx_html_context_head_meta_robots}" != "X" ] # this is already configure in env
+ then
+ meta_robots=""
+ echo "sphinx_html_context_head_meta_robots=$sphinx_html_context_head_meta_robots"
+ fi
+
+ if [ "$DEPLOY_ENV_TEST" = "true" ] && [ ! -f "dist/gh-pages/${sphinx_extra_version}/index.html" ]
+ then
+ # This is added because the page latest/index.html is considered the canonical top level page
+ # But when we deploy multiple to test it is one level down:
+ # Redirect: latest/index.html => docs_multi/latest/index.html
+
+ echo "### dist/gh-pages/${sphinx_extra_version}/index.html: "
+ echo "redirect_url=$redirect_url"
+ test -d "dist/gh-pages/${sphinx_extra_version}" || mkdir -p "dist/gh-pages/${sphinx_extra_version}"
+ sudo tee "dist/gh-pages/${sphinx_extra_version}/index.html" << EOF
+
+
+
+ ${sphinx_extra_version} :: Redirecting to ${sphinx_extra_version}
+
+
+ ${meta_robots}
+
+
+
+ EOF
+ # This EOF is indented left one to ensure no leading space exists in shell code
+ fi
+
+ # Never overwrite index.html if it already exists by this stage (because we moved files to toplevel)
+ if [ ! -f "dist/gh-pages/index.html" ]
+ then
+ echo "### dist/gh-pages/index.html: "
+ echo "redirect_url=$redirect_url"
+ test -d "dist/gh-pages" || mkdir -p "dist/gh-pages"
+ sudo tee dist/gh-pages/index.html << EOF
+
+
+
+ ${GITHUB_REPOSITORY_NAME} :: Redirecting to ${sphinx_extra_version}
+
+
+ ${meta_robots}
+
+
+
+ EOF
+ # This EOF is indented left one to ensure no leading space exists in shell code
+ fi
+
+ echo "### dist/gh-pages.tar.gz :"
+ echo "DU: $(du -s dist/gh-pages)"
+ echo "DIRS: $(find dist/gh-pages -type d | wc -l)"
+ echo "FILES: $(find dist/gh-pages -type f | wc -l)"
+ echo ""
+ tar -zcf dist/gh-pages.tar.gz -C dist/gh-pages .
+ ls -lad dist/gh-pages.tar.gz
+ sha1sum dist/gh-pages.tar.gz
+
+ - name: Upload artifact
+ uses: actions/upload-artifact@v3
+ with:
+ name: sphinx-docs
+ path: dist/gh-pages.tar.gz
+
+ - name: Upload github-pages
+ if: ${{ env.DEPLOY_ENV_TEST == 'true' || env.DEPLOY_ENV_LIVE == 'true' }}
+ uses: actions/upload-pages-artifact@main
+ with:
+ name: github-pages
+ path: dist/gh-pages
+ retention-days: 90
+
+ - id: github-pages
+ name: Upload github-pages - set outputs
+ if: ${{ env.DEPLOY_ENV_TEST == 'true' || env.DEPLOY_ENV_LIVE == 'true' }}
+ run: |
+ # This really should be built into the upload-artifact actions with just a one-line option
+ if [ "$DEPLOY_ENV_LIVE" = "true" ]
+ then
+ echo "deploy=live" >> $GITHUB_OUTPUT
+ fi
+ if [ "$DEPLOY_ENV_TEST" = "true" ]
+ then
+ echo "deploy=test" >> $GITHUB_OUTPUT
+ fi
+
+ cat $GITHUB_OUTPUT
+
+ deploy:
+ needs: build
+
+ if: needs.build.outputs.DEPLOY_ENV_TEST == 'true' || needs.build.outputs.DEPLOY_ENV_LIVE == 'true'
+
+ permissions:
+ pages: write
+ id-token: write
+
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+
+ env:
+ DEPLOY_ENV_TEST: ${{ needs.build.outputs.DEPLOY_ENV_TEST }}
+ DEPLOY_ENV_LIVE: ${{ needs.build.outputs.DEPLOY_ENV_LIVE }}
+ DEPLOY: ${{ needs.build.outputs.deploy }}
+
+ runs-on: ubuntu-latest
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ if: ${{ env.DEPLOY_ENV_TEST == 'true' || env.DEPLOY_ENV_LIVE == 'true' }}
+ uses: actions/deploy-pages@v2
+
+ - name: Summary
+ run: |
+ if [ "$DEPLOY_ENV_TEST" = "true" ]
+ then
+ echo ":white_check_mark: $DEPLOY DEPLOYMENT" >> $GITHUB_STEP_SUMMARY
+ elif [ "$DEPLOY_ENV_LIVE" = "true" ]
+ then
+ echo ":ballot_box_with_check: $DEPLOY DEPLOYMENT" >> $GITHUB_STEP_SUMMARY
+ else
+ echo ":large_orange_diamond: skip DEPLOYMENT" >> $GITHUB_STEP_SUMMARY
+ fi
diff --git a/.github/workflows/push-doc.yml b/.github/workflows/push-doc.yml
new file mode 100644
index 0000000..bb05dd3
--- /dev/null
+++ b/.github/workflows/push-doc.yml
@@ -0,0 +1,60 @@
+name: "Push RTD on gh-pages"
+
+on:
+ push:
+ branches:
+ - master
+ - dev
+ schedule:
+ # * is a special character in YAML
+ # setup monthly background build
+ - cron: '45 4 20 * *'
+ # gh-pages have a lifetime ? 90 days ? so we do this once a month to refresh
+
+jobs:
+ docs:
+ runs-on: ubuntu-latest
+ env:
+ sphinx_html_baseurl: 'https://spinalhdl.github.io/VexiiRiscv-RTD/master/'
+ sphinx_github_url: 'https://github.com/SpinalHDL/VexiiRiscv-RTD'
+ sphinx_extra_version: 'master'
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v2
+ - name: Build docker image
+ uses: docker/build-push-action@v3
+ with:
+ context: .
+ load: true
+ push: false
+ cache-to: type=gha
+ cache-from: type=gha
+ tags: vexiiriscv-pdf
+ file: pdf.Dockerfile
+ - name: Check links
+ run: docker run --rm -u $(id -u $USER):$(id -g $USER) -v $PWD:/docs -e sphinx_html_baseurl -e sphinx_github_url vexiiriscv-pdf make linkcheck
+ - name: Build multiversioned doc
+ run: docker run --rm -u $(id -u $USER):$(id -g $USER) -v $PWD:/docs -e sphinx_html_baseurl -e sphinx_github_url vexiiriscv-pdf sphinx-multiversion source docs/html
+ - name: Add .nojekill
+ run: sudo touch docs/html/.nojekyll
+ - name: Add redirection to master
+ run: |
+ sudo tee docs/html/index.html << EOF
+
+
+
+ Redirecting to ${sphinx_extra_version}
+
+
+
+
+
+ EOF
+ - name: Deploy 🚀
+ uses: JamesIves/github-pages-deploy-action@v4
+ with:
+ branch: gh-pages
+ folder: docs/html
diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml
new file mode 100644
index 0000000..bb113fa
--- /dev/null
+++ b/.github/workflows/test-build.yml
@@ -0,0 +1,29 @@
+name: "Linkcheck and buildtest on PR"
+
+on:
+ - pull_request
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+ - name: "setup python"
+ uses: actions/setup-python@v4
+ with:
+ python-version: 3.9
+ - name: "install dependencies"
+ run: |
+ apt-get update -y && apt-get install -y git
+ pip install -r requirements.txt
+ - uses: ammaraskar/sphinx-problem-matcher@master
+ - name: "check links"
+ run: |
+ source bin/setup_env.sh
+ make linkcheck
+ - name: "Test doc building"
+ run: |
+ source bin/setup_env.sh
+ make html
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..50e0bc7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,16 @@
+*.doctree
+*.pickle
+docs/*
+.vscode
+.idea
+*.iml
+.venv
+*.bin
+.cache/
+.venv*/
+
+# artifacts from compiling the examples
+examples/project
+.metals
+.scala-build
+.bsp
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..c116ab9
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,18 @@
+FROM sphinxdoc/sphinx
+
+WORKDIR /docs
+
+ENV DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get update \
+ && apt-get install --no-install-recommends -y \
+ git \
+ && apt-get autoremove \
+ && apt-get clean \
+ && rm -rf /var/lib/apb/lists/*
+
+# source /docs/bin/setup_env.sh
+ENV PATH="$PATH:/docs/bin"
+
+ADD requirements.txt /docs
+RUN pip3 install -r requirements.txt
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..a471520
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,121 @@
+Creative Commons Legal Code
+
+CC0 1.0 Universal
+
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+ LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
+ ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+ INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+ REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
+ PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+ THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
+ HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator
+and subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for
+the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without fear
+of later claims of infringement build upon, modify, incorporate in other
+works, reuse and redistribute as freely as possible in any form whatsoever
+and for any purposes, including without limitation commercial purposes.
+These owners may contribute to the Commons to promote the ideal of a free
+culture and the further production of creative, cultural and scientific
+works, or to gain reputation or greater distribution for their Work in
+part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or she
+is an owner of Copyright and Related Rights in the Work, voluntarily
+elects to apply CC0 to the Work and publicly distribute the Work under its
+terms, with knowledge of his or her Copyright and Related Rights in the
+Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not
+limited to, the following:
+
+ i. the right to reproduce, adapt, distribute, perform, display,
+ communicate, and translate a Work;
+ ii. moral rights retained by the original author(s) and/or performer(s);
+iii. publicity and privacy rights pertaining to a person's image or
+ likeness depicted in a Work;
+ iv. rights protecting against unfair competition in regards to a Work,
+ subject to the limitations in paragraph 4(a), below;
+ v. rights protecting the extraction, dissemination, use and reuse of data
+ in a Work;
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+ European Parliament and of the Council of 11 March 1996 on the legal
+ protection of databases, and under any national implementation
+ thereof, including any amended or successor version of such
+ directive); and
+vii. other similar, equivalent or corresponding rights throughout the
+ world based on applicable law or treaty, and any national
+ implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention
+of, applicable law, Affirmer hereby overtly, fully, permanently,
+irrevocably and unconditionally waives, abandons, and surrenders all of
+Affirmer's Copyright and Related Rights and associated claims and causes
+of action, whether now known or unknown (including existing as well as
+future claims and causes of action), in the Work (i) in all territories
+worldwide, (ii) for the maximum duration provided by applicable law or
+treaty (including future time extensions), (iii) in any current or future
+medium and for any number of copies, and (iv) for any purpose whatsoever,
+including without limitation commercial, advertising or promotional
+purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
+member of the public at large and to the detriment of Affirmer's heirs and
+successors, fully intending that such Waiver shall not be subject to
+revocation, rescission, cancellation, termination, or any other legal or
+equitable action to disrupt the quiet enjoyment of the Work by the public
+as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason
+be judged legally invalid or ineffective under applicable law, then the
+Waiver shall be preserved to the maximum extent permitted taking into
+account Affirmer's express Statement of Purpose. In addition, to the
+extent the Waiver is so judged Affirmer hereby grants to each affected
+person a royalty-free, non transferable, non sublicensable, non exclusive,
+irrevocable and unconditional license to exercise Affirmer's Copyright and
+Related Rights in the Work (i) in all territories worldwide, (ii) for the
+maximum duration provided by applicable law or treaty (including future
+time extensions), (iii) in any current or future medium and for any number
+of copies, and (iv) for any purpose whatsoever, including without
+limitation commercial, advertising or promotional purposes (the
+"License"). The License shall be deemed effective as of the date CC0 was
+applied by Affirmer to the Work. Should any part of the License for any
+reason be judged legally invalid or ineffective under applicable law, such
+partial invalidity or ineffectiveness shall not invalidate the remainder
+of the License, and in such case Affirmer hereby affirms that he or she
+will not (i) exercise any of his or her remaining Copyright and Related
+Rights in the Work or (ii) assert any associated claims and causes of
+action with respect to the Work, in either case contrary to Affirmer's
+express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+ surrendered, licensed or otherwise affected by this document.
+ b. Affirmer offers the Work as-is and makes no representations or
+ warranties of any kind concerning the Work, express, implied,
+ statutory or otherwise, including without limitation warranties of
+ title, merchantability, fitness for a particular purpose, non
+ infringement, or the absence of latent or other defects, accuracy, or
+ the present or absence of errors, whether or not discoverable, all to
+ the greatest extent permissible under applicable law.
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+ that may apply to the Work or any use thereof, including without
+ limitation any person's Copyright and Related Rights in the Work.
+ Further, Affirmer disclaims responsibility for obtaining any necessary
+ consents, permissions or other rights required for any use of the
+ Work.
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+ party to this document and has no duty or obligation with respect to
+ this CC0 or use of the Work.
\ No newline at end of file
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..cc5b315
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,19 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS +=
+SPHINXBUILD = sphinx-build
+SOURCEDIR = source
+BUILDDIR = docs
+
+# Put it first so that "make" without argument is like "make help".
+help:
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/README.md b/README.md
deleted file mode 100644
index cd9ade6..0000000
--- a/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# VexiiRiscv-RTD
diff --git a/README.rst b/README.rst
new file mode 100644
index 0000000..eee113e
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,77 @@
+=========
+SpinalDoc
+=========
+
+This is the documentation repository for
+`SpinalHDL `_.
+
+It is published on
+`spinalhdl.github.io/SpinalDoc-RTD `_.
+
+How to build this documentation
+===============================
+
+With venv
+---------
+
+Requirements (system)
+
+* make
+* git
+
+Create a virtual environment with pipenv (will use the Pipfile for installing the necessary packages)
+
+.. code:: shell
+
+ python3 -m venv .venv
+
+then you can activate the virtual enviroment (in bash) and install the dependencies
+
+.. code:: shell
+
+ source .venv/bin/activate
+ pip install -r requirements.txt
+
+and then you can use ``make`` the usual way
+
+.. code:: shell
+
+ make html # for html
+ make latex # for latex
+ make latexpdf # for latex (will require latexpdf installed)
+ make # list all the available output format
+
+all the outputs will be in docs folder (for html: docs/html)
+
+
+Native
+------
+
+Requirements (system):
+
+* make
+* git
+
+Requirements (Python 3):
+
+* sphinx
+* sphinx-rtd-theme
+* sphinxcontrib-wavedrom
+* sphinx-multiversion
+
+After installing the requirements you can run
+
+.. code:: shell
+
+ make html # for html
+ make latex # for latex
+ make latexpdf # for latex (will require latexpdf installed)
+ make # list all the available output format
+
+you can create build multiple version of the doc via
+
+.. code:: shell
+
+ sphinx-multiversion source docs/html
+
+in the docs/html there will be a folder with the builded doc for each branch and tag
diff --git a/bin/convert-wrapper b/bin/convert-wrapper
new file mode 100755
index 0000000..09a89d3
--- /dev/null
+++ b/bin/convert-wrapper
@@ -0,0 +1,29 @@
+#!/bin/bash
+#
+# Sphinx uses extension: sphinx.ext.imgconverter
+#
+# This calls out to ImageMagicK convert.
+#
+# The older docs tags we build have links to 3rd party websites (travis-ci) for SVG badges.
+# This returns HTTP/404 but the HTML response is kept and processed as if it returned HTTP/200. (bug in spinix?)
+# When 'convert' tries to convert foobar.svg (which is a .html format file error page) it has a parse error.
+# This terminates the document building process completely.
+#
+# This script is a wrapper for convert, if it fails it logs and provides an empty file instead.
+#
+#
+echo $0 $* >> /tmp/convert-wrapper.log
+
+convert "$@"
+rv=$?
+
+if [ $rv -ne 0 ]
+then
+ echo FAIL $rv $0 $* >> /tmp/convert-wrapper.log
+
+ touch "$2"
+
+ rv=0
+fi
+
+exit $rv
diff --git a/bin/setup_env.sh b/bin/setup_env.sh
new file mode 100644
index 0000000..f820da7
--- /dev/null
+++ b/bin/setup_env.sh
@@ -0,0 +1,35 @@
+#
+# Use: source bin/setup_env.sh
+#
+unset _addPATH
+for i in "$0" "$PWD/$BASH_SOURCE" "$PWD/$_"
+do
+ basedir=$(dirname "$i")
+ if [ -f "${basedir}/convert-wrapper" ]
+ then
+ _addPATH="${basedir}"
+ break
+ elif [ -f "${basedir}/bin/convert-wrapper" ]
+ then
+ _addPATH="${basedir}/bin"
+ break
+ fi
+done
+
+if [ "X${_addPATH}" != "X" ]
+then
+ echo "Adding ${_addPATH} to \$PATH"
+ export PATH="${_addPATH}:$PATH"
+fi
+
+if [ "X$sphinx_latest_version" = "X" ]
+then
+ # Pick the version considered to be the latest.
+ echo "### git:"
+ git for-each-ref --format "%(refname)" | sed 's/^refs\///g' | grep "tags/" | sed -e 's/^tags\///' | sort -g | tail -n1
+ export sphinx_latest_version=$(git for-each-ref --format "%(refname)" | sed 's/^refs\///g' | grep "tags/" | sed -e 's/^tags\///' | sort -g | tail -n1)
+ #echo sphinx_latest_version=$sphinx_latest_version
+fi
+
+echo "### ENV:"
+declare -p | egrep "x sphinx_" | sed -e 's#declare -x \+##'
diff --git a/examples/.gitignore b/examples/.gitignore
new file mode 100644
index 0000000..53159fe
--- /dev/null
+++ b/examples/.gitignore
@@ -0,0 +1,43 @@
+*.class
+*.log
+*.bak
+
+# sbt specific
+.cache/
+.history/
+.lib/
+dist/*
+target
+lib_managed/
+src_managed/
+project/boot/
+project/plugins/project/
+
+# Scala-IDE specific
+.scala_dependencies
+.worksheet
+
+.idea
+out
+
+# Metals
+.metals
+
+# Eclipse
+bin/
+.classpath
+.project
+.settings
+.cache-main
+
+#User
+/*.vhd
+/*.v
+*.cf
+*.json
+*.vcd
+!tester/src/test/resources/*.vhd
+
+
+simWorkspace/
+tmp/
\ No newline at end of file
diff --git a/examples/build.sbt b/examples/build.sbt
new file mode 100644
index 0000000..9f89491
--- /dev/null
+++ b/examples/build.sbt
@@ -0,0 +1,16 @@
+ThisBuild / version := "1.0"
+ThisBuild / scalaVersion := "2.12.16"
+ThisBuild / organization := "org.example"
+
+val spinalVersion = "1.8.0b"
+val spinalCore = "com.github.spinalhdl" %% "spinalhdl-core" % spinalVersion
+val spinalLib = "com.github.spinalhdl" %% "spinalhdl-lib" % spinalVersion
+val spinalIdslPlugin = compilerPlugin("com.github.spinalhdl" %% "spinalhdl-idsl-plugin" % spinalVersion)
+
+lazy val mylib = (project in file("."))
+ .settings(
+ name := "SpinalDoc-RTD-examples",
+ libraryDependencies ++= Seq(spinalCore, spinalLib, spinalIdslPlugin)
+ )
+
+fork := true
\ No newline at end of file
diff --git a/pdf.Dockerfile b/pdf.Dockerfile
new file mode 100644
index 0000000..295d8c6
--- /dev/null
+++ b/pdf.Dockerfile
@@ -0,0 +1,24 @@
+FROM sphinxdoc/sphinx-latexpdf
+
+WORKDIR /docs
+
+ENV DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get update \
+ && apt-get install --no-install-recommends -y \
+ git \
+ librsvg2-bin \
+ npm \
+ && apt-get autoremove \
+ && apt-get clean \
+ && rm -rf /var/lib/apb/lists/*
+
+RUN git config --global safe.directory '*'
+
+RUN npm i wavedrom-cli -g
+
+# source /docs/bin/setup_env.sh
+ENV PATH="$PATH:/docs/bin"
+
+ADD requirements.txt /docs
+RUN pip3 install -r requirements.txt
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..6e281fd
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,5 @@
+sphinx==5.3.0
+sphinx-rtd-theme==1.2.1
+sphinxcontrib-wavedrom==3.0.4
+sphinx-multiversion @ git+https://github.com/samuel-emrys/sphinx-multiversion.git@cd723351f687c98d32834226ae7b3ec9e63bcba5
+sphinx-copybutton==0.5.2
diff --git a/source/VexiiRiscv/Introduction/VexiiRiscv.rst b/source/VexiiRiscv/Introduction/VexiiRiscv.rst
new file mode 100644
index 0000000..65fae0d
--- /dev/null
+++ b/source/VexiiRiscv/Introduction/VexiiRiscv.rst
@@ -0,0 +1,5 @@
+
+
+About VexiiRiscv
+------------------------------
+
diff --git a/source/VexiiRiscv/Introduction/index.rst b/source/VexiiRiscv/Introduction/index.rst
new file mode 100644
index 0000000..702e30c
--- /dev/null
+++ b/source/VexiiRiscv/Introduction/index.rst
@@ -0,0 +1,10 @@
+Introduction
+============
+
+Miaouuu
+
+.. toctree::
+ :maxdepth: 1
+
+ VexiiRiscv
+
diff --git a/source/_static/default.js b/source/_static/default.js
new file mode 100644
index 0000000..c6a2ca0
--- /dev/null
+++ b/source/_static/default.js
@@ -0,0 +1 @@
+var WaveSkin=WaveSkin||{};WaveSkin.default=["svg",{"id":"svg","xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","height":"0"},["style",{"type":"text/css"},"text{font-size:11pt;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;fill-opacity:1;font-family:Helvetica}.muted{fill:#aaa}.warning{fill:#f6b900}.error{fill:#f60000}.info{fill:#0041c4}.success{fill:#00ab00}.h1{font-size:33pt;font-weight:bold}.h2{font-size:27pt;font-weight:bold}.h3{font-size:20pt;font-weight:bold}.h4{font-size:14pt;font-weight:bold}.h5{font-size:11pt;font-weight:bold}.h6{font-size:8pt;font-weight:bold}.s1{fill:none;stroke:#000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none}.s2{fill:none;stroke:#000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none}.s3{color:#000;fill:none;stroke:#000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate}.s4{color:#000;fill:none;stroke:#000;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible}.s5{fill:#fff;stroke:none}.s6{color:#000;fill:#ffffb4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate}.s7{color:#000;fill:#ffe0b9;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate}.s8{color:#000;fill:#b9e0ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate}.s9{fill:#000;fill-opacity:1;stroke:none}.s10{color:#000;fill:#fff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate}.s11{fill:#0041c4;fill-opacity:1;stroke:none}.s12{fill:none;stroke:#0041c4;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none}"],["defs",["g",{"id":"socket"},["rect",{"y":"15","x":"6","height":"20","width":"20"}]],["g",{"id":"pclk"},["path",{"d":"M0,20 0,0 20,0","class":"s1"}]],["g",{"id":"nclk"},["path",{"d":"m0,0 0,20 20,0","class":"s1"}]],["g",{"id":"000"},["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"0m0"},["path",{"d":"m0,20 3,0 3,-10 3,10 11,0","class":"s1"}]],["g",{"id":"0m1"},["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"0mx"},["path",{"d":"M3,20 9,0 20,0","class":"s1"}],["path",{"d":"m20,15 -5,5","class":"s2"}],["path",{"d":"M20,10 10,20","class":"s2"}],["path",{"d":"M20,5 5,20","class":"s2"}],["path",{"d":"M20,0 4,16","class":"s2"}],["path",{"d":"M15,0 6,9","class":"s2"}],["path",{"d":"M10,0 9,1","class":"s2"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"0md"},["path",{"d":"m8,20 10,0","class":"s3"}],["path",{"d":"m0,20 5,0","class":"s1"}]],["g",{"id":"0mu"},["path",{"d":"m0,20 3,0 C 7,10 10.107603,0 20,0","class":"s1"}]],["g",{"id":"0mz"},["path",{"d":"m0,20 3,0 C 10,10 15,10 20,10","class":"s1"}]],["g",{"id":"111"},["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"1m0"},["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}]],["g",{"id":"1m1"},["path",{"d":"M0,0 3,0 6,10 9,0 20,0","class":"s1"}]],["g",{"id":"1mx"},["path",{"d":"m3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}],["path",{"d":"m20,15 -5,5","class":"s2"}],["path",{"d":"M20,10 10,20","class":"s2"}],["path",{"d":"M20,5 8,17","class":"s2"}],["path",{"d":"M20,0 7,13","class":"s2"}],["path",{"d":"M15,0 6,9","class":"s2"}],["path",{"d":"M10,0 5,5","class":"s2"}],["path",{"d":"M3.5,1.5 5,0","class":"s2"}]],["g",{"id":"1md"},["path",{"d":"m0,0 3,0 c 4,10 7,20 17,20","class":"s1"}]],["g",{"id":"1mu"},["path",{"d":"M0,0 5,0","class":"s1"}],["path",{"d":"M8,0 18,0","class":"s3"}]],["g",{"id":"1mz"},["path",{"d":"m0,0 3,0 c 7,10 12,10 17,10","class":"s1"}]],["g",{"id":"xxx"},["path",{"d":"m0,20 20,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}],["path",{"d":"M0,5 5,0","class":"s2"}],["path",{"d":"M0,10 10,0","class":"s2"}],["path",{"d":"M0,15 15,0","class":"s2"}],["path",{"d":"M0,20 20,0","class":"s2"}],["path",{"d":"M5,20 20,5","class":"s2"}],["path",{"d":"M10,20 20,10","class":"s2"}],["path",{"d":"m15,20 5,-5","class":"s2"}]],["g",{"id":"xm0"},["path",{"d":"M0,0 4,0 9,20","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}],["path",{"d":"M0,5 4,1","class":"s2"}],["path",{"d":"M0,10 5,5","class":"s2"}],["path",{"d":"M0,15 6,9","class":"s2"}],["path",{"d":"M0,20 7,13","class":"s2"}],["path",{"d":"M5,20 8,17","class":"s2"}]],["g",{"id":"xm1"},["path",{"d":"M0,0 20,0","class":"s1"}],["path",{"d":"M0,20 4,20 9,0","class":"s1"}],["path",{"d":"M0,5 5,0","class":"s2"}],["path",{"d":"M0,10 9,1","class":"s2"}],["path",{"d":"M0,15 7,8","class":"s2"}],["path",{"d":"M0,20 5,15","class":"s2"}]],["g",{"id":"xmx"},["path",{"d":"m0,20 20,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}],["path",{"d":"M0,5 5,0","class":"s2"}],["path",{"d":"M0,10 10,0","class":"s2"}],["path",{"d":"M0,15 15,0","class":"s2"}],["path",{"d":"M0,20 20,0","class":"s2"}],["path",{"d":"M5,20 20,5","class":"s2"}],["path",{"d":"M10,20 20,10","class":"s2"}],["path",{"d":"m15,20 5,-5","class":"s2"}]],["g",{"id":"xmd"},["path",{"d":"m0,0 4,0 c 3,10 6,20 16,20","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}],["path",{"d":"M0,5 4,1","class":"s2"}],["path",{"d":"M0,10 5.5,4.5","class":"s2"}],["path",{"d":"M0,15 6.5,8.5","class":"s2"}],["path",{"d":"M0,20 8,12","class":"s2"}],["path",{"d":"m5,20 5,-5","class":"s2"}],["path",{"d":"m10,20 2.5,-2.5","class":"s2"}]],["g",{"id":"xmu"},["path",{"d":"M0,0 20,0","class":"s1"}],["path",{"d":"m0,20 4,0 C 7,10 10,0 20,0","class":"s1"}],["path",{"d":"M0,5 5,0","class":"s2"}],["path",{"d":"M0,10 10,0","class":"s2"}],["path",{"d":"M0,15 10,5","class":"s2"}],["path",{"d":"M0,20 6,14","class":"s2"}]],["g",{"id":"xmz"},["path",{"d":"m0,0 4,0 c 6,10 11,10 16,10","class":"s1"}],["path",{"d":"m0,20 4,0 C 10,10 15,10 20,10","class":"s1"}],["path",{"d":"M0,5 4.5,0.5","class":"s2"}],["path",{"d":"M0,10 6.5,3.5","class":"s2"}],["path",{"d":"M0,15 8.5,6.5","class":"s2"}],["path",{"d":"M0,20 11.5,8.5","class":"s2"}]],["g",{"id":"ddd"},["path",{"d":"m0,20 20,0","class":"s3"}]],["g",{"id":"dm0"},["path",{"d":"m0,20 10,0","class":"s3"}],["path",{"d":"m12,20 8,0","class":"s1"}]],["g",{"id":"dm1"},["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"dmx"},["path",{"d":"M3,20 9,0 20,0","class":"s1"}],["path",{"d":"m20,15 -5,5","class":"s2"}],["path",{"d":"M20,10 10,20","class":"s2"}],["path",{"d":"M20,5 5,20","class":"s2"}],["path",{"d":"M20,0 4,16","class":"s2"}],["path",{"d":"M15,0 6,9","class":"s2"}],["path",{"d":"M10,0 9,1","class":"s2"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"dmd"},["path",{"d":"m0,20 20,0","class":"s3"}]],["g",{"id":"dmu"},["path",{"d":"m0,20 3,0 C 7,10 10.107603,0 20,0","class":"s1"}]],["g",{"id":"dmz"},["path",{"d":"m0,20 3,0 C 10,10 15,10 20,10","class":"s1"}]],["g",{"id":"uuu"},["path",{"d":"M0,0 20,0","class":"s3"}]],["g",{"id":"um0"},["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}]],["g",{"id":"um1"},["path",{"d":"M0,0 10,0","class":"s3"}],["path",{"d":"m12,0 8,0","class":"s1"}]],["g",{"id":"umx"},["path",{"d":"m3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}],["path",{"d":"m20,15 -5,5","class":"s2"}],["path",{"d":"M20,10 10,20","class":"s2"}],["path",{"d":"M20,5 8,17","class":"s2"}],["path",{"d":"M20,0 7,13","class":"s2"}],["path",{"d":"M15,0 6,9","class":"s2"}],["path",{"d":"M10,0 5,5","class":"s2"}],["path",{"d":"M3.5,1.5 5,0","class":"s2"}]],["g",{"id":"umd"},["path",{"d":"m0,0 3,0 c 4,10 7,20 17,20","class":"s1"}]],["g",{"id":"umu"},["path",{"d":"M0,0 20,0","class":"s3"}]],["g",{"id":"umz"},["path",{"d":"m0,0 3,0 c 7,10 12,10 17,10","class":"s4"}]],["g",{"id":"zzz"},["path",{"d":"m0,10 20,0","class":"s1"}]],["g",{"id":"zm0"},["path",{"d":"m0,10 6,0 3,10 11,0","class":"s1"}]],["g",{"id":"zm1"},["path",{"d":"M0,10 6,10 9,0 20,0","class":"s1"}]],["g",{"id":"zmx"},["path",{"d":"m6,10 3,10 11,0","class":"s1"}],["path",{"d":"M0,10 6,10 9,0 20,0","class":"s1"}],["path",{"d":"m20,15 -5,5","class":"s2"}],["path",{"d":"M20,10 10,20","class":"s2"}],["path",{"d":"M20,5 8,17","class":"s2"}],["path",{"d":"M20,0 7,13","class":"s2"}],["path",{"d":"M15,0 6.5,8.5","class":"s2"}],["path",{"d":"M10,0 9,1","class":"s2"}]],["g",{"id":"zmd"},["path",{"d":"m0,10 7,0 c 3,5 8,10 13,10","class":"s1"}]],["g",{"id":"zmu"},["path",{"d":"m0,10 7,0 C 10,5 15,0 20,0","class":"s1"}]],["g",{"id":"zmz"},["path",{"d":"m0,10 20,0","class":"s1"}]],["g",{"id":"gap"},["path",{"d":"m7,-2 -4,0 c -5,0 -5,24 -10,24 l 4,0 C 2,22 2,-2 7,-2 z","class":"s5"}],["path",{"d":"M-7,22 C -2,22 -2,-2 3,-2","class":"s1"}],["path",{"d":"M-3,22 C 2,22 2,-2 7,-2","class":"s1"}]],["g",{"id":"0mv-3"},["path",{"d":"M9,0 20,0 20,20 3,20 z","class":"s6"}],["path",{"d":"M3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"1mv-3"},["path",{"d":"M2.875,0 20,0 20,20 9,20 z","class":"s6"}],["path",{"d":"m3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"xmv-3"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s6"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,5 3.5,1.5","class":"s2"}],["path",{"d":"M0,10 4.5,5.5","class":"s2"}],["path",{"d":"M0,15 6,9","class":"s2"}],["path",{"d":"M0,20 4,16","class":"s2"}]],["g",{"id":"dmv-3"},["path",{"d":"M9,0 20,0 20,20 3,20 z","class":"s6"}],["path",{"d":"M3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"umv-3"},["path",{"d":"M3,0 20,0 20,20 9,20 z","class":"s6"}],["path",{"d":"m3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"zmv-3"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s6"}],["path",{"d":"m6,10 3,10 11,0","class":"s1"}],["path",{"d":"M0,10 6,10 9,0 20,0","class":"s1"}]],["g",{"id":"vvv-3"},["path",{"d":"M20,20 0,20 0,0 20,0","class":"s6"}],["path",{"d":"m0,20 20,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"vm0-3"},["path",{"d":"M0,20 0,0 3,0 9,20","class":"s6"}],["path",{"d":"M0,0 3,0 9,20","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"vm1-3"},["path",{"d":"M0,0 0,20 3,20 9,0","class":"s6"}],["path",{"d":"M0,0 20,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0","class":"s1"}]],["g",{"id":"vmx-3"},["path",{"d":"M0,0 0,20 3,20 6,10 3,0","class":"s6"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}],["path",{"d":"m20,15 -5,5","class":"s2"}],["path",{"d":"M20,10 10,20","class":"s2"}],["path",{"d":"M20,5 8,17","class":"s2"}],["path",{"d":"M20,0 7,13","class":"s2"}],["path",{"d":"M15,0 7,8","class":"s2"}],["path",{"d":"M10,0 9,1","class":"s2"}]],["g",{"id":"vmd-3"},["path",{"d":"m0,0 0,20 20,0 C 10,20 7,10 3,0","class":"s6"}],["path",{"d":"m0,0 3,0 c 4,10 7,20 17,20","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"vmu-3"},["path",{"d":"m0,0 0,20 3,0 C 7,10 10,0 20,0","class":"s6"}],["path",{"d":"m0,20 3,0 C 7,10 10,0 20,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"vmz-3"},["path",{"d":"M0,0 3,0 C 10,10 15,10 20,10 15,10 10,10 3,20 L 0,20","class":"s6"}],["path",{"d":"m0,0 3,0 c 7,10 12,10 17,10","class":"s1"}],["path",{"d":"m0,20 3,0 C 10,10 15,10 20,10","class":"s1"}]],["g",{"id":"vmv-3-3"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s6"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s6"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-3-4"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s7"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s6"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-3-5"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s8"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s6"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-4-3"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s6"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s7"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-4-4"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s7"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s7"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-4-5"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s8"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s7"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-5-3"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s6"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s8"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-5-4"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s7"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s8"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-5-5"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s8"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s8"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"0mv-4"},["path",{"d":"M9,0 20,0 20,20 3,20 z","class":"s7"}],["path",{"d":"M3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"1mv-4"},["path",{"d":"M2.875,0 20,0 20,20 9,20 z","class":"s7"}],["path",{"d":"m3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"xmv-4"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s7"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,5 3.5,1.5","class":"s2"}],["path",{"d":"M0,10 4.5,5.5","class":"s2"}],["path",{"d":"M0,15 6,9","class":"s2"}],["path",{"d":"M0,20 4,16","class":"s2"}]],["g",{"id":"dmv-4"},["path",{"d":"M9,0 20,0 20,20 3,20 z","class":"s7"}],["path",{"d":"M3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"umv-4"},["path",{"d":"M3,0 20,0 20,20 9,20 z","class":"s7"}],["path",{"d":"m3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"zmv-4"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s7"}],["path",{"d":"m6,10 3,10 11,0","class":"s1"}],["path",{"d":"M0,10 6,10 9,0 20,0","class":"s1"}]],["g",{"id":"0mv-5"},["path",{"d":"M9,0 20,0 20,20 3,20 z","class":"s8"}],["path",{"d":"M3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"1mv-5"},["path",{"d":"M2.875,0 20,0 20,20 9,20 z","class":"s8"}],["path",{"d":"m3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"xmv-5"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s8"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,5 3.5,1.5","class":"s2"}],["path",{"d":"M0,10 4.5,5.5","class":"s2"}],["path",{"d":"M0,15 6,9","class":"s2"}],["path",{"d":"M0,20 4,16","class":"s2"}]],["g",{"id":"dmv-5"},["path",{"d":"M9,0 20,0 20,20 3,20 z","class":"s8"}],["path",{"d":"M3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"umv-5"},["path",{"d":"M3,0 20,0 20,20 9,20 z","class":"s8"}],["path",{"d":"m3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"zmv-5"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s8"}],["path",{"d":"m6,10 3,10 11,0","class":"s1"}],["path",{"d":"M0,10 6,10 9,0 20,0","class":"s1"}]],["g",{"id":"vvv-4"},["path",{"d":"M20,20 0,20 0,0 20,0","class":"s7"}],["path",{"d":"m0,20 20,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"vm0-4"},["path",{"d":"M0,20 0,0 3,0 9,20","class":"s7"}],["path",{"d":"M0,0 3,0 9,20","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"vm1-4"},["path",{"d":"M0,0 0,20 3,20 9,0","class":"s7"}],["path",{"d":"M0,0 20,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0","class":"s1"}]],["g",{"id":"vmx-4"},["path",{"d":"M0,0 0,20 3,20 6,10 3,0","class":"s7"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}],["path",{"d":"m20,15 -5,5","class":"s2"}],["path",{"d":"M20,10 10,20","class":"s2"}],["path",{"d":"M20,5 8,17","class":"s2"}],["path",{"d":"M20,0 7,13","class":"s2"}],["path",{"d":"M15,0 7,8","class":"s2"}],["path",{"d":"M10,0 9,1","class":"s2"}]],["g",{"id":"vmd-4"},["path",{"d":"m0,0 0,20 20,0 C 10,20 7,10 3,0","class":"s7"}],["path",{"d":"m0,0 3,0 c 4,10 7,20 17,20","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"vmu-4"},["path",{"d":"m0,0 0,20 3,0 C 7,10 10,0 20,0","class":"s7"}],["path",{"d":"m0,20 3,0 C 7,10 10,0 20,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"vmz-4"},["path",{"d":"M0,0 3,0 C 10,10 15,10 20,10 15,10 10,10 3,20 L 0,20","class":"s7"}],["path",{"d":"m0,0 3,0 c 7,10 12,10 17,10","class":"s1"}],["path",{"d":"m0,20 3,0 C 10,10 15,10 20,10","class":"s1"}]],["g",{"id":"vvv-5"},["path",{"d":"M20,20 0,20 0,0 20,0","class":"s8"}],["path",{"d":"m0,20 20,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"vm0-5"},["path",{"d":"M0,20 0,0 3,0 9,20","class":"s8"}],["path",{"d":"M0,0 3,0 9,20","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"vm1-5"},["path",{"d":"M0,0 0,20 3,20 9,0","class":"s8"}],["path",{"d":"M0,0 20,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0","class":"s1"}]],["g",{"id":"vmx-5"},["path",{"d":"M0,0 0,20 3,20 6,10 3,0","class":"s8"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}],["path",{"d":"m20,15 -5,5","class":"s2"}],["path",{"d":"M20,10 10,20","class":"s2"}],["path",{"d":"M20,5 8,17","class":"s2"}],["path",{"d":"M20,0 7,13","class":"s2"}],["path",{"d":"M15,0 7,8","class":"s2"}],["path",{"d":"M10,0 9,1","class":"s2"}]],["g",{"id":"vmd-5"},["path",{"d":"m0,0 0,20 20,0 C 10,20 7,10 3,0","class":"s8"}],["path",{"d":"m0,0 3,0 c 4,10 7,20 17,20","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"vmu-5"},["path",{"d":"m0,0 0,20 3,0 C 7,10 10,0 20,0","class":"s8"}],["path",{"d":"m0,20 3,0 C 7,10 10,0 20,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"vmz-5"},["path",{"d":"M0,0 3,0 C 10,10 15,10 20,10 15,10 10,10 3,20 L 0,20","class":"s8"}],["path",{"d":"m0,0 3,0 c 7,10 12,10 17,10","class":"s1"}],["path",{"d":"m0,20 3,0 C 10,10 15,10 20,10","class":"s1"}]],["g",{"id":"Pclk"},["path",{"d":"M-3,12 0,3 3,12 C 1,11 -1,11 -3,12 z","class":"s9"}],["path",{"d":"M0,20 0,0 20,0","class":"s1"}]],["g",{"id":"Nclk"},["path",{"d":"M-3,8 0,17 3,8 C 1,9 -1,9 -3,8 z","class":"s9"}],["path",{"d":"m0,0 0,20 20,0","class":"s1"}]],["g",{"id":"vvv-2"},["path",{"d":"M20,20 0,20 0,0 20,0","class":"s10"}],["path",{"d":"m0,20 20,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"vm0-2"},["path",{"d":"M0,20 0,0 3,0 9,20","class":"s10"}],["path",{"d":"M0,0 3,0 9,20","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"vm1-2"},["path",{"d":"M0,0 0,20 3,20 9,0","class":"s10"}],["path",{"d":"M0,0 20,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0","class":"s1"}]],["g",{"id":"vmx-2"},["path",{"d":"M0,0 0,20 3,20 6,10 3,0","class":"s10"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}],["path",{"d":"m20,15 -5,5","class":"s2"}],["path",{"d":"M20,10 10,20","class":"s2"}],["path",{"d":"M20,5 8,17","class":"s2"}],["path",{"d":"M20,0 7,13","class":"s2"}],["path",{"d":"M15,0 7,8","class":"s2"}],["path",{"d":"M10,0 9,1","class":"s2"}]],["g",{"id":"vmd-2"},["path",{"d":"m0,0 0,20 20,0 C 10,20 7,10 3,0","class":"s10"}],["path",{"d":"m0,0 3,0 c 4,10 7,20 17,20","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"vmu-2"},["path",{"d":"m0,0 0,20 3,0 C 7,10 10,0 20,0","class":"s10"}],["path",{"d":"m0,20 3,0 C 7,10 10,0 20,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"vmz-2"},["path",{"d":"M0,0 3,0 C 10,10 15,10 20,10 15,10 10,10 3,20 L 0,20","class":"s10"}],["path",{"d":"m0,0 3,0 c 7,10 12,10 17,10","class":"s1"}],["path",{"d":"m0,20 3,0 C 10,10 15,10 20,10","class":"s1"}]],["g",{"id":"0mv-2"},["path",{"d":"M9,0 20,0 20,20 3,20 z","class":"s10"}],["path",{"d":"M3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"1mv-2"},["path",{"d":"M2.875,0 20,0 20,20 9,20 z","class":"s10"}],["path",{"d":"m3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"xmv-2"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s10"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,5 3.5,1.5","class":"s2"}],["path",{"d":"M0,10 4.5,5.5","class":"s2"}],["path",{"d":"M0,15 6,9","class":"s2"}],["path",{"d":"M0,20 4,16","class":"s2"}]],["g",{"id":"dmv-2"},["path",{"d":"M9,0 20,0 20,20 3,20 z","class":"s10"}],["path",{"d":"M3,20 9,0 20,0","class":"s1"}],["path",{"d":"m0,20 20,0","class":"s1"}]],["g",{"id":"umv-2"},["path",{"d":"M3,0 20,0 20,20 9,20 z","class":"s10"}],["path",{"d":"m3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,0 20,0","class":"s1"}]],["g",{"id":"zmv-2"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s10"}],["path",{"d":"m6,10 3,10 11,0","class":"s1"}],["path",{"d":"M0,10 6,10 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-3-2"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s10"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s6"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-4-2"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s10"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s7"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-5-2"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s10"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s8"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-2-3"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s6"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s10"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-2-4"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s7"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s10"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-2-5"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s8"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s10"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"vmv-2-2"},["path",{"d":"M9,0 20,0 20,20 9,20 6,10 z","class":"s10"}],["path",{"d":"M3,0 0,0 0,20 3,20 6,10 z","class":"s10"}],["path",{"d":"m0,0 3,0 6,20 11,0","class":"s1"}],["path",{"d":"M0,20 3,20 9,0 20,0","class":"s1"}]],["g",{"id":"arrow0"},["path",{"d":"m-12,-3 9,3 -9,3 c 1,-2 1,-4 0,-6 z","class":"s11"}],["path",{"d":"M0,0 -15,0","class":"s12"}]],["marker",{"id":"arrowhead","style":"fill:#0041c4","markerHeight":"7","markerWidth":"10","markerUnits":"strokeWidth","viewBox":"0 -4 11 8","refX":"15","refY":"0","orient":"auto"},["path",{"d":"M0 -4 11 0 0 4z"}]],["marker",{"id":"arrowtail","style":"fill:#0041c4","markerHeight":"7","markerWidth":"10","markerUnits":"strokeWidth","viewBox":"-11 -4 11 8","refX":"-15","refY":"0","orient":"auto"},["path",{"d":"M0 -4 -11 0 0 4z"}]]],["g",{"id":"waves"},["g",{"id":"lanes"}],["g",{"id":"groups"}]]];
diff --git a/source/_static/dialog.js b/source/_static/dialog.js
new file mode 100644
index 0000000..e4eb10e
--- /dev/null
+++ b/source/_static/dialog.js
@@ -0,0 +1,109 @@
+// dialog
+var versionWarningDialog = (function () {
+ const SELECTOR_DIALOG = 'DIALOG#doc-dialog-version'
+ const SELECTOR_BUTTON = 'DIALOG#doc-dialog-version BUTTON.doc-dialog-dismiss'
+ const KEY = 'vexiiriscvrtd_dialog_dismiss'
+
+ const dialog = function() {
+ return document.querySelector(SELECTOR_DIALOG)
+ }
+ const button = function() {
+ return document.querySelector(SELECTOR_BUTTON)
+ }
+
+ const close = function() {
+ const dialogEle = dialog()
+ if(dialogEle) {
+ dialogEle.close()
+ dialogEle.classList.add('collapse') // This should not be needed
+ }
+ return dialogEle
+ }
+
+ const show = function() {
+ const dialogEle = dialog()
+ if(dialogEle) {
+ dialogEle.show()
+ dialogEle.classList.remove('collapse')
+ }
+ return dialogEle
+ }
+
+ const onReady = function() {
+ const dialogEle = dialog()
+ const dialogButton = button()
+
+ if(dialogButton) {
+ $(dialogButton).click(function($evt) {
+ $evt.preventDefault()
+
+ close()
+
+ if(window.localStorage) {
+ localStorage.setItem(KEY, new Date().getTime())
+ }
+ })
+ }
+
+ if(dialogEle) {
+ var dialogShow = false
+
+ var defaultState = $(dialogEle).data('default-state')
+ //console.log('defaultState=', defaultState)
+ if(defaultState === 'show')
+ dialogShow = true
+
+ // Check page data
+ if(window.localStorage) {
+ let ts = localStorage.getItem(KEY)
+ try {
+ ts = parseInt(ts)
+ } catch(e) {
+ ts = undefined
+ }
+ if(ts) {
+ let now = new Date().getTime()
+ if(ts && now < ts + (86400*1000)) {
+ //console.log('dialog-dismiss=close as localStorage', ts, ts + (86400*1000), now)
+ dialogShow = false
+ } else {
+ //console.log('dialog-dismiss=default as localStorage', ts, ts + (86400*1000), now)
+ // default
+ }
+ }
+ }
+
+ // Check URL
+ const loc = window.location.href
+ if(loc.includes('dialog=show')) {
+ //console.log('dialog=show in window.location.href')
+ dialogShow = true
+ } else if(loc.includes('dialog=close')) {
+ //console.log('dialog=close in window.location.href')
+ dialogShow = false
+ }
+
+ //console.log('dialogShow=', dialogShow)
+ if(dialogShow)
+ show() // Opens a non-modal dialog
+ else
+ close()
+
+ dialogEle.classList.remove('hide-once')
+ dialogEle.classList.remove('collapse-once')
+ }
+ }
+
+ return {
+ onReady: onReady,
+ dialog: dialog,
+ button: button,
+ close: close,
+ show: show
+ }
+
+})()
+
+$(document).ready(function() {
+ versionWarningDialog.onReady()
+})
diff --git a/source/_static/gh-fork-ribbon.css b/source/_static/gh-fork-ribbon.css
new file mode 100644
index 0000000..ee89b57
--- /dev/null
+++ b/source/_static/gh-fork-ribbon.css
@@ -0,0 +1,124 @@
+/*!
+ * "Fork me on GitHub" CSS ribbon v0.2.3 | MIT License
+ * https://github.com/simonwhitaker/github-fork-ribbon-css
+*/
+
+.github-fork-ribbon {
+ width: 12.1em;
+ height: 12.1em;
+ position: absolute;
+ overflow: hidden;
+ top: 0;
+ right: 0;
+ z-index: 9999;
+ pointer-events: none;
+ font-size: 13px;
+ text-decoration: none;
+ text-indent: -999999px;
+}
+
+.github-fork-ribbon.fixed {
+ position: fixed;
+}
+
+.github-fork-ribbon:hover, .github-fork-ribbon:active {
+ background-color: rgba(0, 0, 0, 0.0);
+}
+
+.github-fork-ribbon:before, .github-fork-ribbon:after {
+ /* The right and left classes determine the side we attach our banner to */
+ position: absolute;
+ display: block;
+ width: 15.38em;
+ height: 1.54em;
+
+ top: 3.23em;
+ right: -3.23em;
+
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+
+ -webkit-transform: rotate(45deg);
+ -moz-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ -o-transform: rotate(45deg);
+ transform: rotate(45deg);
+}
+
+.github-fork-ribbon:before {
+ content: "";
+
+ /* Add a bit of padding to give some substance outside the "stitching" */
+ padding: .38em 0;
+
+ /* Set the base colour */
+ background-color: #a00;
+
+ /* Set a gradient: transparent black at the top to almost-transparent black at the bottom */
+ background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(rgba(0, 0, 0, 0.15)));
+ background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
+ background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
+ background-image: -ms-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
+ background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
+ background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15));
+
+ /* Add a drop shadow */
+ -webkit-box-shadow: 0 .15em .23em 0 rgba(0, 0, 0, 0.5);
+ -moz-box-shadow: 0 .15em .23em 0 rgba(0, 0, 0, 0.5);
+ box-shadow: 0 .15em .23em 0 rgba(0, 0, 0, 0.5);
+
+ pointer-events: auto;
+}
+
+.github-fork-ribbon:after {
+ /* Set the text from the data-ribbon attribute */
+ content: attr(data-ribbon);
+
+ /* Set the text properties */
+ color: #fff;
+ font: 700 1em "Helvetica Neue", Helvetica, Arial, sans-serif;
+ line-height: 1.54em;
+ text-decoration: none;
+ text-shadow: 0 -.08em rgba(0, 0, 0, 0.5);
+ text-align: center;
+ text-indent: 0;
+
+ /* Set the layout properties */
+ padding: .15em 0;
+ margin: .15em 0;
+
+ /* Add "stitching" effect */
+ border-width: .08em 0;
+ border-style: dotted;
+ border-color: #fff;
+ border-color: rgba(255, 255, 255, 0.7);
+}
+
+.github-fork-ribbon.left-top, .github-fork-ribbon.left-bottom {
+ right: auto;
+ left: 0;
+}
+
+.github-fork-ribbon.left-bottom, .github-fork-ribbon.right-bottom {
+ top: auto;
+ bottom: 0;
+}
+
+.github-fork-ribbon.left-top:before, .github-fork-ribbon.left-top:after, .github-fork-ribbon.left-bottom:before, .github-fork-ribbon.left-bottom:after {
+ right: auto;
+ left: -3.23em;
+}
+
+.github-fork-ribbon.left-bottom:before, .github-fork-ribbon.left-bottom:after, .github-fork-ribbon.right-bottom:before, .github-fork-ribbon.right-bottom:after {
+ top: auto;
+ bottom: 3.23em;
+}
+
+.github-fork-ribbon.left-top:before, .github-fork-ribbon.left-top:after, .github-fork-ribbon.right-bottom:before, .github-fork-ribbon.right-bottom:after {
+ -webkit-transform: rotate(-45deg);
+ -moz-transform: rotate(-45deg);
+ -ms-transform: rotate(-45deg);
+ -o-transform: rotate(-45deg);
+ transform: rotate(-45deg);
+}
diff --git a/source/_static/gh-fork-ribbon.txt b/source/_static/gh-fork-ribbon.txt
new file mode 100644
index 0000000..dea943f
--- /dev/null
+++ b/source/_static/gh-fork-ribbon.txt
@@ -0,0 +1,27 @@
+
+sha1:9a5785913fdaa8bcd6722dec0d4b4c03022e3ea9 gh-fork-ribbon.css
+
+wget https://raw.githubusercontent.com/simonwhitaker/github-fork-ribbon-css/0.2.3/gh-fork-ribbon.css
+
+
+The MIT License (MIT)
+
+Copyright (c) 2013 Simon Whitaker
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/source/_static/github-corner-right.css b/source/_static/github-corner-right.css
new file mode 100644
index 0000000..3280d75
--- /dev/null
+++ b/source/_static/github-corner-right.css
@@ -0,0 +1,16 @@
+.github-corner:hover .octo-arm {
+ animation:octocat-wave 560ms ease-in-out
+}
+@keyframes octocat-wave {
+ 0%,100% { transform:rotate(0) }
+ 20%,60% { transform:rotate(-25deg) }
+ 40%,80% { transform:rotate(10deg) }
+}
+@media (max-width:500px) {
+ .github-corner:hover .octo-arm {
+ animation:none
+ }
+ .github-corner .octo-arm {
+ animation:octocat-wave 560ms ease-in-out
+ }
+}
diff --git a/source/_static/github-corner-right.svg b/source/_static/github-corner-right.svg
new file mode 100644
index 0000000..e50370e
--- /dev/null
+++ b/source/_static/github-corner-right.svg
@@ -0,0 +1,11 @@
+
+
+
+
diff --git a/source/_static/github-corner-right.txt b/source/_static/github-corner-right.txt
new file mode 100644
index 0000000..fc62edb
--- /dev/null
+++ b/source/_static/github-corner-right.txt
@@ -0,0 +1,24 @@
+
+
diff --git a/source/_static/theme_overrides.css b/source/_static/theme_overrides.css
new file mode 100644
index 0000000..a80980b
--- /dev/null
+++ b/source/_static/theme_overrides.css
@@ -0,0 +1,18 @@
+/* override table width restrictions */
+@media screen and (min-width: 767px) {
+
+ .wy-table-responsive table td {
+ /* !important prevents the common CSS stylesheets from overriding
+ this as on RTD they are loaded after this stylesheet */
+ white-space: normal !important;
+ }
+
+ .wy-table-responsive {
+ overflow: visible !important;
+ }
+}
+
+/* too much empty space at bottom of cell */
+.rst-content td .line-block {
+ margin-bottom: 0.15em;
+}
diff --git a/source/_static/vexiiriscv.css b/source/_static/vexiiriscv.css
new file mode 100644
index 0000000..4464af6
--- /dev/null
+++ b/source/_static/vexiiriscv.css
@@ -0,0 +1,81 @@
+
+.doc-version-warning-banner {
+ background: #b0b0b0;
+ border: black 1px solid;
+ padding: 0.2em;
+ border-radius: 5px;
+ color: black;
+}
+
+/*
+.doc-version-warning-banner > a:visited {
+ color: #9b59b6;
+}
+*/
+
+footer p {
+ /* overrides theme.css:6 setting this to 12px */
+ margin-bottom: 0.5em;
+}
+
+.doc-footer-current-version {
+ /* balances the 'footer P{margin-bottom: 0.5em;}' use because the Sphinx version
+ * info from the template is not in a P block */
+ margin-top: 0.5em;
+}
+
+dialog#doc-dialog-version {
+ display: block;
+ position: fixed;
+ left: 1em;
+ right: auto;
+ bottom: 5em;
+ height: -webkit-fit-content;
+ width: -webkit-fit-content;
+ color: -internal-light-dark(black, white);
+ margin: auto;
+ border-width: initial;
+ border-style: solid;
+ border-color: initial;
+ border-image: initial;
+ border-radius: 1em;
+ padding: 1em;
+ background: -internal-light-dark(white, black);
+ width: 20em;
+ /* z-index below nav sidebar version selector */
+ z-index: 300;
+}
+
+/* .hide-once prevents unwanted flicker on page reload */
+.hide, .hide-once {
+ visibility: hidden;
+}
+
+/* .hide-once prevents unwanted flicker on page reload */
+.collapse, .collapse-once {
+ visibility: collapse;
+}
+
+object.svg-github-corner > svg {
+}
+
+.img-github-corner {
+ max-width: 149px;
+}
+
+.github-corner-abs {
+ position: fixed;
+ right: 0;
+ top: 0;
+ z-index: 150;
+}
+
+/* follows nav sidebar removal */
+@media (max-width:768px) {
+ .github-corner-abs {
+ visibility: hidden;
+ }
+ dialog#doc-dialog-version {
+ visibility: hidden;
+ }
+}
diff --git a/source/_static/wavedrom.min.js b/source/_static/wavedrom.min.js
new file mode 100644
index 0000000..23f0f03
--- /dev/null
+++ b/source/_static/wavedrom.min.js
@@ -0,0 +1,3 @@
+/*! wavedrom 2018-02-02 */
+
+!function e(t,r,n){function s(a,i){if(!r[a]){if(!t[a]){var l="function"==typeof require&&require;if(!i&&l)return l(a,!0);if(o)return o(a,!0);var c=new Error("Cannot find module '"+a+"'");throw c.code="MODULE_NOT_FOUND",c}var u=r[a]={exports:{}};t[a][0].call(u.exports,function(e){var r=t[a][1][e];return s(r||e)},u,u.exports,e,t,r,n)}return r[a].exports}for(var o="function"==typeof require&&require,a=0;at+n.offsetWidth||e.yr+n.offsetHeight)&&(n.parentNode.removeChild(n),document.body.removeEventListener("mousedown",s,!1))}(r=document.getElementById(t+e)).childNodes[0].addEventListener("contextmenu",function(o){var a,i,l;(n=document.createElement("div")).className="wavedromMenu",n.style.top=o.y+"px",n.style.left=o.x+"px",a=document.createElement("ul"),(i=document.createElement("li")).innerHTML="Save as PNG",a.appendChild(i),(l=document.createElement("li")).innerHTML="Save as SVG",a.appendChild(l),n.appendChild(a),document.body.appendChild(n),i.addEventListener("click",function(){var o,a,i,l,c,u,d;o="",0!==e&&(o+=(a=document.getElementById(t+0)).innerHTML.substring(166,a.innerHTML.indexOf(''))),o=[r.innerHTML.slice(0,166),o,r.innerHTML.slice(166)].join(""),i="data:image/svg+xml;base64,"+btoa(o),(l=new Image).src=i,(c=document.createElement("canvas")).width=l.width,c.height=l.height,c.getContext("2d").drawImage(l,0,0),u=c.toDataURL("image/png"),(d=document.createElement("a")).href=u,d.download="wavedrom.png",d.click(),n.parentNode.removeChild(n),document.body.removeEventListener("mousedown",s,!1)},!1),l.addEventListener("click",function(){var o,a,i,l;o="",0!==e&&(o+=(a=document.getElementById(t+0)).innerHTML.substring(166,a.innerHTML.indexOf(''))),o=[r.innerHTML.slice(0,166),o,r.innerHTML.slice(166)].join(""),i="data:image/svg+xml;base64,"+btoa(o),(l=document.createElement("a")).href=i,l.download="wavedrom.svg",l.click(),n.parentNode.removeChild(n),document.body.removeEventListener("mousedown",s,!1)},!1),n.addEventListener("contextmenu",function(e){e.preventDefault()},!1),document.body.addEventListener("mousedown",s,!1),o.preventDefault()},!1)}},{}],2:[function(e,t,r){"use strict";var n=e("./jsonml-parse");t.exports=n},{"./jsonml-parse":15}],3:[function(e,t,r){"use strict";var n=e("./eva"),s=e("./render-wave-form");t.exports=function(){s(0,n("InputJSON_0"),"WaveDrom_Display_")}},{"./eva":4,"./render-wave-form":29}],4:[function(require,module,exports){"use strict";function eva(id){var TheTextBox,source;function erra(e){return{signal:[{name:["tspan",["tspan",{class:"error h5"},"Error: "],e.message]}]}}if(TheTextBox=document.getElementById(id),TheTextBox.type&&"textarea"===TheTextBox.type)try{source=eval("("+TheTextBox.value+")")}catch(e){return erra(e)}else try{source=eval("("+TheTextBox.innerHTML+")")}catch(e){return erra(e)}if("[object Object]"!==Object.prototype.toString.call(source))return erra({message:'[Semantic]: The root has to be an Object: "{signal:[...]}"'});if(source.signal){if("[object Array]"!==Object.prototype.toString.call(source.signal))return erra({message:'[Semantic]: "signal" object has to be an Array "signal:[]"'})}else if(source.assign){if("[object Array]"!==Object.prototype.toString.call(source.assign))return erra({message:'[Semantic]: "assign" object hasto be an Array "assign:[]"'})}else if(!source.reg)return erra({message:'[Semantic]: "signal:[...]" or "assign:[...]" property is missing inside the root Object'});return source}module.exports=eva},{}],5:[function(e,t,r){"use strict";t.exports=function(e){var t=0,r=0,n=[];return e.forEach(function(e){"vvv-2"===e||"vvv-3"===e||"vvv-4"===e||"vvv-5"===e?r+=1:0!==r&&(n.push(t-(r+1)/2),r=0),t+=1}),0!==r&&n.push(t-(r+1)/2),n}},{}],6:[function(e,t,r){"use strict";t.exports=function(e,t,r){var n,s,o=[];if(4===e.length){for(s=0;s");e.tagName===r.tagName&&(e=r)}catch(e){console.log(e)}for(var i in t)if(t.hasOwnProperty(i)){var l=t[i];i&&null!==l&&void 0!==l&&("style"===(i=n[i.toLowerCase()]||i)?void 0!==e.style.cssText?e.style.cssText=l:e.style=l:o[i]?(a(e,i,l),s[i]&&a(e,s[i],l)):"string"==typeof l||"number"==typeof l||"boolean"==typeof l?(e.setAttribute(i,l),s[i]&&e.setAttribute(s[i],l)):(e[i]=l,s[i]&&(e[s[i]]=l)))}return e}},{}],13:[function(e,t,r){"use strict";t.exports=function(e,t){t&&(e.tagName&&"style"===e.tagName.toLowerCase()&&document.createStyleSheet?e.cssText=t:!1!==e.canHaveChildren&&e.appendChild(t))}},{}],14:[function(e,t,r){"use strict";var n=e("./jsonml-trim-whitespace");t.exports=function(e){var t=document.createElement("div");if(t.innerHTML=e,n(t),1===t.childNodes.length)return t.firstChild;for(var r=document.createDocumentFragment?document.createDocumentFragment():document.createElement("");t.firstChild;)r.appendChild(t.firstChild);return r}},{"./jsonml-trim-whitespace":16}],15:[function(e,t,r){"use strict";var n,s,o=e("./jsonml-hydrate"),a=e("./w3"),i=e("./jsonml-append-child"),l=e("./jsonml-add-attributes"),c=e("./jsonml-trim-whitespace");function u(e,t,r){return document.createTextNode("["+e+"-"+r+"]")}n=function(e,t,r){for(var n=1;n0?Math.round(n):1))>0&&(r>100&&(r=100),t.hscale=r),t.yh0=0,t.yh1=0,t.head=e.head,t.xmin_cfg=0,t.xmax_cfg=1e12,e&&e.config&&e.config.hbounds&&2==e.config.hbounds.length&&(e.config.hbounds[0]=Math.floor(e.config.hbounds[0]),e.config.hbounds[1]=Math.ceil(e.config.hbounds[1]),e.config.hbounds[0]"===l&&(u=!1,l=f.shift()),a=1;"."===f[0]||"|"===f[0];)f.shift(),a+=1;h=u?h.concat(s(i+l,0,a-r.period)):h.concat(s(i+l,t,a))}for(c=0;c0?(d=o(m).length,1==o([m[m.length-1]]).length&&1==o([h[0]]).length&&(d-=1)):d=0,[h,d]}},{"./find-lane-markers":5,"./gen-first-wave-brick":7,"./gen-wave-brick":8}],20:[function(e,t,r){"use strict";var n=e("./parse-wave-lane");t.exports=function(e,t){var r,s,o,a,i,l,c,u=[],d=[];for(r in e)s=e[r],t.period=s.period?s.period:1,t.phase=(s.phase?2*s.phase:0)+t.xmin_cfg,u.push([]),d[0]=s.name||" ",d[1]=(s.phase||0)+t.xmin_cfg/2,s.wave?(o=(a=n(s.wave,t.period*t.hscale-1,t))[0],i=a[1]):o=null,u[u.length-1][0]=d.slice(0),u[u.length-1][1]=o,u[u.length-1][2]=(l=i,c=void 0,void 0===(c=s.data)?null:("string"==typeof c&&(c=c.split(" ")),c=c.slice(l)));return u}},{"./parse-wave-lane":19}],21:[function(e,t,r){"use strict";var n=e("./eva"),s=e("./append-save-as-dialog"),o=e("./render-wave-form");t.exports=function(){var e,t,r,a;for(r=0,e=document.querySelectorAll("*"),t=0;tdiv.wavedromMenu{position:fixed;border:solid 1pt#CCCCCC;background-color:white;box-shadow:0px 10px 20px #808080;cursor:default;margin:0px;padding:0px;}div.wavedromMenu>ul{margin:0px;padding:0px;}div.wavedromMenu>ul>li{padding:2px 10px;list-style:none;}div.wavedromMenu>ul>li:hover{background-color:#b5d5ff;}'}},{"./append-save-as-dialog":1,"./eva":4,"./render-wave-form":29}],22:[function(e,t,r){"use strict";t.exports=function e(t,r){var n,s,o={},a={x:10};for("string"!=typeof t[0]&&"number"!=typeof t[0]||(s=t[0],a.x=25),r.x+=a.x,n=0;n":k.setAttribute("style","marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none");break;case"~>":k.setAttribute("style","marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none"),k.setAttribute("d","M "+x.x+","+x.y+" c "+.7*v+", 0 "+.3*v+", "+y+" "+v+", "+y);break;case"-~>":k.setAttribute("style","marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none"),k.setAttribute("d","M "+x.x+","+x.y+" c "+.7*v+", 0 "+v+", "+y+" "+v+", "+y),_.label&&(b=x.x+.75*(g.x-x.x));break;case"~->":k.setAttribute("style","marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none"),k.setAttribute("d","M "+x.x+","+x.y+" c 0, 0 "+.3*v+", "+y+" "+v+", "+y),_.label&&(b=x.x+.25*(g.x-x.x));break;case"-|>":k.setAttribute("style","marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none"),k.setAttribute("d","m "+x.x+","+x.y+" "+v+",0 0,"+y),_.label&&(b=g.x);break;case"|->":k.setAttribute("style","marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none"),k.setAttribute("d","m "+x.x+","+x.y+" 0,"+y+" "+v+",0"),_.label&&(b=x.x);break;case"-|->":k.setAttribute("style","marker-end:url(#arrowhead);stroke:#0041c4;stroke-width:1;fill:none"),k.setAttribute("d","m "+x.x+","+x.y+" "+v/2+",0 0,"+y+" "+v/2+",0");break;case"<->":k.setAttribute("style","marker-end:url(#arrowhead);marker-start:url(#arrowtail);stroke:#0041c4;stroke-width:1;fill:none");break;case"<~>":k.setAttribute("style","marker-end:url(#arrowhead);marker-start:url(#arrowtail);stroke:#0041c4;stroke-width:1;fill:none"),k.setAttribute("d","M "+x.x+","+x.y+" c "+.7*v+", 0 "+.3*v+", "+y+" "+v+", "+y);break;case"<-~>":k.setAttribute("style","marker-end:url(#arrowhead);marker-start:url(#arrowtail);stroke:#0041c4;stroke-width:1;fill:none"),k.setAttribute("d","M "+x.x+","+x.y+" c "+.7*v+", 0 "+v+", "+y+" "+v+", "+y),_.label&&(b=x.x+.75*(g.x-x.x));break;case"<-|>":k.setAttribute("style","marker-end:url(#arrowhead);marker-start:url(#arrowtail);stroke:#0041c4;stroke-width:1;fill:none"),k.setAttribute("d","m "+x.x+","+x.y+" "+v+",0 0,"+y),_.label&&(b=g.x);break;case"<-|->":k.setAttribute("style","marker-end:url(#arrowhead);marker-start:url(#arrowtail);stroke:#0041c4;stroke-width:1;fill:none"),k.setAttribute("d","m "+x.x+","+x.y+" "+v/2+",0 0,"+y+" "+v/2+",0");break;default:k.setAttribute("style","fill:none;stroke:#F00;stroke-width:1")}_.label&&(m.setAttribute("x",b),m.setAttribute("y",w+3),p.setAttribute("x",b-N/2),p.setAttribute("y",w-5))}for(u in E)u===u.toLowerCase()&&E[u].x>0&&(p=s(["rect",{y:E[u].y-4,height:8,style:"fill:#FFF;"}]),m=s(["text",{style:"font-size:8px;",x:E[u].x,y:E[u].y+2,"text-anchor":"middle"},u+""]),l.insertBefore(p,null),l.insertBefore(m,null),N=m.getBBox().width+2,p.setAttribute("x",E[u].x-N/2),p.setAttribute("width",N))}}},{"./create-element":2,"./w3":31,tspan:35}],24:[function(e,t,r){"use strict";var n=e("./create-element");function s(e,t){var r,n,o;for(t.xmax=Math.max(t.xmax,t.x),r=t.y,o=e.length,n=1;n"===f&&(d=!1,f=h.shift()),c+=d?1:2*s.period,"|"===f&&((l=document.createElementNS(n.svg,"use")).setAttributeNS(n.xlink,"xlink:href","#gap"),l.setAttribute("transform","translate("+s.xs*((c-(d?0:s.period))*s.hscale-s.phase)+")"),i.insertBefore(l,null))}},{"./w3":31}],26:[function(e,t,r){"use strict";var n=e("tspan");t.exports=function(e,t,r){var s,o,a,i=["g"];return e.forEach(function(e,l){i.push(["path",{id:"group_"+l+"_"+t,d:"m "+(e.x+.5)+","+(e.y*r.yo+3.5+r.yh0+r.yh1)+" c -3,0 -5,2 -5,5 l 0,"+(e.height*r.yo-16)+" c 0,3 2,5 5,5",style:"stroke:#0041c4;stroke-width:1;fill:none"}]),void 0!==e.name&&(s=e.x-10,o=r.yo*(e.y+e.height/2)+r.yh0+r.yh1,(a=n.parse(e.name)).unshift("text",{"text-anchor":"middle",class:"info","xml:space":"preserve"}),i.push(["g",{transform:"translate("+s+","+o+")"},["g",{transform:"rotate(270)"},a]]))}),i}},{tspan:35}],27:[function(e,t,r){"use strict";var n=e("tspan"),s=e("./create-element");t.exports=function(e,t,r,o){var a,i,l,c,u,d;function f(e,t,r){var o;e[t]&&e[t].text&&((o=n.parse(e[t].text)).unshift("text",{x:e.xmax*e.xs/2,y:r,"text-anchor":"middle",fill:"#000","xml:space":"preserve"}),o=s(o),i.insertBefore(o,null))}function h(e,t,r,o,l,c,u){var d,f,h,m,p=1,x=0,g=[];if(void 0!==e[t]&&void 0!==e[t][r]){if("string"==typeof(h=e[t][r]))h=h.split(" ");else if("number"==typeof h||"boolean"==typeof h)for(f=Number(h),h=[],a=0;a0?Math.ceil(2*x)-2*x:-2*x,f=s(["g",{id:"wavelane_draw_"+c+"_"+r,transform:"translate("+x*i.xs+", 0)"}]),d.insertBefore(f,null),t[c][1])){for(l=0;lv&&(v=t[c][1].length)}return i.xmax=Math.min(v,i.xmax_cfg-i.xmin_cfg),i.xg=20,y}},{"./create-element":2,"./find-lane-markers":5,"./w3":31,tspan:35}],31:[function(e,t,r){"use strict";t.exports={svg:"http://www.w3.org/2000/svg",xlink:"http://www.w3.org/1999/xlink",xmlns:"http://www.w3.org/XML/1998/namespace"}},{}],32:[function(e,t,r){"use strict";window.WaveDrom=window.WaveDrom||{};var n=e("./");window.WaveDrom.ProcessAll=n.processAll,window.WaveDrom.RenderWaveForm=n.renderWaveForm,window.WaveDrom.EditorRefresh=n.editorRefresh,window.WaveDrom.eva=n.eva},{"./":9}],33:[function(e,t,r){"use strict";t.exports=window.WaveSkin},{}],34:[function(e,t,r){"use strict";var n=e("tspan");function s(e,t){return"translate("+e+","+t+")"}function o(e,t,r){var n=["line"],s={};return t?(s.x1=t,s.x2=t+e):s.x2=e,r&&(s.y1=r,s.y2=r),n.push(s),n}function a(e,t,r){var n=["line"],s={};return t&&(s.x1=t,s.x2=t),r?(s.y1=r,s.y2=r+e):s.y2=e,n.push(s),n}function i(e,t){return["g",{"text-anchor":"middle"},(r=e,o=t,a=o.hspace/o.mod,i=["g",{transform:s(a/2,o.vspace/5)}],l=["g",{transform:s(a/2,o.vspace/2+4)}],c=["g",{transform:s(a/2,o.vspace)}],u=["g",{transform:s(0,o.vspace/4)}],d=o.fontsize,f=o.fontfamily,h=o.fontweight,r.forEach(function(e){var t,r,s,m,p,x;if(s=0,m=o.mod-1,p=o.index*o.mod,x=(o.index+1)*o.mod-1,e.lsb/o.mod>>0===o.index)s=e.lsbm,p=e.lsb,e.msb/o.mod>>0===o.index&&(x=e.msb,m=e.msbm);else{if(e.msb/o.mod>>0!==o.index)return;x=e.msb,m=e.msbm}i.push(["text",{x:a*(o.mod-s-1),"font-size":d,"font-family":f,"font-weight":h},p.toString()]),s!==m&&i.push(["text",{x:a*(o.mod-m-1),"font-size":d,"font-family":f,"font-weight":h},x.toString()]),e.name?((t=n.parse(e.name)).unshift({x:a*(o.mod-(m+s)/2-1),"font-size":d,"font-family":f,"font-weight":h}),t.unshift("text"),l.push(t)):u.push(["rect",{style:"fill-opacity:0.1",x:a*(o.mod-m-1),y:0,width:a*(m-s+1),height:o.vspace/2}]),e.attr&&((r=n.parse(e.attr)).unshift({x:a*(o.mod-(m+s)/2-1),"font-size":d,"font-family":f,"font-weight":h}),r.unshift("text"),c.push(r))}),["g",u,i,l,c])];var r,o,a,i,l,c,u,d,f,h}function l(e,t){var r=["g",{transform:s(4.5,(t.lanes-t.index-1)*t.vspace+.5)}];return r.push(function(e,t){var r=t.hspace,n=t.vspace,i=t.mod,l=["g",{stroke:"black","stroke-width":1,"stroke-linecap":"round",transform:s(0,n/4)}];l.push(o(r)),l.push(a(n/2)),l.push(o(r,0,n/2));var c=t.index*t.mod,u=t.mod;do{u===t.mod||e.some(function(e){return e.lsb===c})?l.push(a(n/2,u*(r/i))):(l.push(a(n/16,u*(r/i))),l.push(a(n/16,u*(r/i),7*n/16))),c++,u--}while(u);return l}(e,t)),r.push(i(e,t)),r}function c(e,t,r){return"number"==typeof e&&e>t?0|e:r}t.exports=function(e,t){(t="object"==typeof t?t:{}).vspace=c(t.vspace,19,80),t.hspace=c(t.hspace,39,640),t.lanes=c(t.lanes,0,2),t.bits=c(t.bits,4,32),t.fontsize=c(t.fontsize,5,14),t.bigendian=t.bigendian||!1,t.fontfamily=t.fontfamily||"sans-serif",t.fontweight=t.fontweight||"normal";var r,n=["svg",{xmlns:"http://www.w3.org/2000/svg",width:t.hspace+9,height:t.vspace*t.lanes+5,viewBox:[0,0,t.hspace+9,t.vspace*t.lanes+5].join(" ")}],s=0,o=t.bits/t.lanes;for(t.mod=0|o,e.forEach(function(e){e.lsb=s,e.lsbm=s%o,s+=e.bits,e.msb=s-1,e.msbm=e.msb%o}),r=0;r||||||||<\/o>|<\/ins>|<\/s>|<\/sub>|<\/sup>|<\/b>|<\/i>|<\/tt>/;function s(e,t){t.add&&t.add.split(";").forEach(function(t){var r=t.split(" ");e[r[0]][r[1]]=!0}),t.del&&t.del.split(";").forEach(function(t){var r=t.split(" ");delete e[r[0]][r[1]]})}var o={"":{add:"text-decoration overline"},"":{del:"text-decoration overline"},"":{add:"text-decoration underline"},"":{del:"text-decoration underline"},"":{add:"text-decoration line-through"},"":{del:"text-decoration line-through"},"":{add:"font-weight bold"},"":{del:"font-weight bold"},"":{add:"font-style italic"},"":{del:"font-style italic"},"":{add:"baseline-shift sub;font-size .7em"},"":{del:"baseline-shift sub;font-size .7em"},"":{add:"baseline-shift super;font-size .7em"},"":{del:"baseline-shift super;font-size .7em"},"":{add:"font-family monospace"},"":{del:"font-family monospace"}};function a(e){return Object.keys(e).reduce(function(t,r){var n=Object.keys(e[r]);return n.length>0&&(t[r]=n.join(" ")),t},{})}t.exports=function(e){var t,r,i,l,c;if(void 0===e)return[];if("number"==typeof e)return[e+""];if("string"!=typeof e)return[e];for(r=[],t={"text-decoration":{},"font-weight":{},"font-style":{},"baseline-shift":{},"font-size":{},"font-family":{}};;){if(-1===(i=e.search(n)))return r.push(["tspan",a(t),e]),r;if(i>0&&(c=e.slice(0,i),r.push(["tspan",a(t),c])),l=e.match(n)[0],s(t,o[l]),0===(e=e.slice(i+l.length)).length)return r}}},{}],37:[function(e,t,r){"use strict";var n=e("./parse");t.exports=function(e){var t=e.createElement;function r(e,r){var n=e[0],s=e[1],o=Object.keys(s).reduce(function(e,t){var r,n;return e[null===(n=(r=t).match(/(\w+)-(\w)(\w+)/))?r:n[1]+n[2].toUpperCase()+n[3]]=s[t],e},{}),a=e[2];return s.key=r,t(n,o,a)}return function(e){return n(e).map(r)}}},{"./parse":36}]},{},[32]);
\ No newline at end of file
diff --git a/source/_templates/footer.html b/source/_templates/footer.html
new file mode 100644
index 0000000..63a18a6
--- /dev/null
+++ b/source/_templates/footer.html
@@ -0,0 +1,20 @@
+{% extends "!footer.html" %}
+{% block extrafooter %}
+ {{ super() }}
+
+ {%- if current_version %}
+ {# Version: latest (v1.8.0) git~abcdef01 2023-02-01 all from git information #}
+
+ {% endif %}
+{% endblock %}
diff --git a/source/_templates/layout.html b/source/_templates/layout.html
new file mode 100644
index 0000000..7520b98
--- /dev/null
+++ b/source/_templates/layout.html
@@ -0,0 +1,38 @@
+{% extends "!layout.html" %}
+
+{% if page_source_suffix %}
+{% set suffix = page_source_suffix %}
+{% else %}
+{% set suffix = source_suffix %}
+{% endif %}
+
+{% block extrahead %}
+ {{ super() }}
+
+ {% for key,value in head_meta.items() %}
+ {% if value %}
+
+ {% endif %}
+ {% endfor %}
+{% endblock %}
+{% block extrabody %}
+ {{ super() }}
+ {% if hasdoc(pagename) %}
+ {% if display_github %}
+ {% if check_meta and 'github_url' in meta %}
+
+ {% else %}
+
+ {% endif %}
+ {% endif %}
+ {% endif %}
+{% endblock %}
diff --git a/source/_templates/page.html b/source/_templates/page.html
new file mode 100644
index 0000000..03a9810
--- /dev/null
+++ b/source/_templates/page.html
@@ -0,0 +1,42 @@
+{% extends "!page.html" %}
+{% block body %}
+
+{%- if current_version and latest_version -%}
+
+{%- set dialog_default_state = 'close' -%}
+{%- if current_version and latest_version and current_version != latest_version and current_version.name != 'latest' -%}
+{%- set dialog_default_state = 'show' -%}
+{%- endif -%}
+
+
+
+
+{% endif %}
+
+{{ super() }}
+{% endblock %}%
\ No newline at end of file
diff --git a/source/_templates/versions.html b/source/_templates/versions.html
new file mode 100644
index 0000000..215bfa6
--- /dev/null
+++ b/source/_templates/versions.html
@@ -0,0 +1,43 @@
+{%- if current_version %}
+
+
+ Other Versions
+ v: {{ current_version.name }}
+
+
+
+ {%- if True %}
+
+ - Languages
+ -
+ en
+
+
+ {%- endif %}
+ {%- if versions.tags %}
+
+ - Tags
+ {%- for item in versions.tags %}
+ - {{ item.name }}
+ {%- endfor %}
+
+ {%- endif %}
+ {%- if versions.branches %}
+
+ - Branches
+ {%- for item in versions.branches %}
+ - {{ item.name }}
+ {%- endfor %}
+
+ {%- endif %}
+ {%- if current_version.artefacts %}
+
+ - Downloads
+ {%- for artefact in current_version.artefacts %}
+ - {{ artefact.name }}
+ {%- endfor %}
+
+ {%- endif %}
+
+
+{%- endif %}
diff --git a/source/asset/image/bundle/CommonDataBus.png b/source/asset/image/bundle/CommonDataBus.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e98ff2a5a395a81df544707cb405b6d42206c67
GIT binary patch
literal 173471
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