diff options
author | Yann Herklotz <git@yannherklotz.com> | 2022-03-26 21:08:23 +0000 |
---|---|---|
committer | Yann Herklotz <git@yannherklotz.com> | 2022-03-26 21:08:23 +0000 |
commit | 11d6215f265d0dbcfd0048819a614f318a0775a4 (patch) | |
tree | 16b0450e4df7caaed57400d503044ca92f1f3c38 /doc | |
parent | a5b8a41ef22618c69db62dfeb71d7f38bbba34e2 (diff) | |
download | vericert-11d6215f265d0dbcfd0048819a614f318a0775a4.tar.gz vericert-11d6215f265d0dbcfd0048819a614f318a0775a4.zip |
Add sphinx documentation
Diffstat (limited to 'doc')
-rw-r--r-- | doc/Makefile | 24 | ||||
-rw-r--r-- | doc/Makefile.extr | 39 | ||||
-rw-r--r-- | doc/README.org | 7 | ||||
-rw-r--r-- | doc/_static/css/custom.css | 11 | ||||
-rw-r--r-- | doc/_static/images/toolflow.pdf | bin | 0 -> 20490 bytes | |||
-rw-r--r-- | doc/_static/images/toolflow.png | bin | 0 -> 26864 bytes | |||
-rw-r--r-- | doc/_static/images/toolflow.svg | 1250 | ||||
-rw-r--r-- | doc/common.org | 15 | ||||
-rw-r--r-- | doc/conf.py | 85 | ||||
-rw-r--r-- | doc/documentation.org | 562 | ||||
-rw-r--r-- | doc/docutils.conf | 2 | ||||
-rw-r--r-- | doc/index.rst | 26 | ||||
-rw-r--r-- | doc/make.bat | 35 | ||||
-rw-r--r-- | doc/man.org | 89 | ||||
-rw-r--r-- | doc/res/coqdoc.css | 867 | ||||
-rw-r--r-- | doc/res/fdl.org | 489 | ||||
-rw-r--r-- | doc/res/install-deps.el | 11 | ||||
-rw-r--r-- | doc/res/publish.el | 23 | ||||
-rw-r--r-- | doc/vericert.rst | 530 |
19 files changed, 4065 insertions, 0 deletions
diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..5662645 --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,24 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build +SOURCE_DATE_EPOCH = $(shell git log -1 --format=%ct) + +VS_DOCS := ../src/Compiler.v ../src/hls/RTLBlockInstr.v + +# 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 + $(foreach d,$(VS_DOCS),cp $(d) $(patsubst ../%,%,$(d));) + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/doc/Makefile.extr b/doc/Makefile.extr new file mode 100644 index 0000000..9d4f361 --- /dev/null +++ b/doc/Makefile.extr @@ -0,0 +1,39 @@ +all: manual src man-html + +install-deps: + emacs --batch --load ./res/install-deps.el + +%.man: %.org + emacs --batch --file $< --load ./res/publish.el --funcall org-man-export-to-man + +%.html: %.org + emacs --batch --file $< --load ./res/publish.el --funcall org-html-export-to-html + +manual: + mkdir -p manual + emacs --batch --file documentation.org --load ./res/publish.el --funcall org-texinfo-export-to-texinfo + makeinfo --html --number-sections --no-split \ + --css-ref "https://www.gnu.org/software/emacs/manual.css" \ + vericert.texi -o ./manual/index.html + cp -r images ./manual/. + +man-html: man.html + mkdir -p man + cp man.html ./man/vericert.1.html + +vericert.1: man.man + cp $< $@ + +src: + $(MAKE) -C .. doc + cp -r ../html src + +upload: + tar caf docs.tar.xz manual man src + rsync docs.tar.xz "zk@leika.ymhg.org:~" + +.PHONY: all upload manual man src install-deps man-html + +clean: + rm -rf manual man src + rm -f docs.tar.xz diff --git a/doc/README.org b/doc/README.org new file mode 100644 index 0000000..4113ed9 --- /dev/null +++ b/doc/README.org @@ -0,0 +1,7 @@ +#+title: Vericert Documentation + +The documentation for [[https://github.com/ymherklotz/vericert][Vericert]], which is written in the [[/documentation.org][documentation.org]] file. + +* How to develop on documentation + +The documentation uses =hugo= to generate the website, diff --git a/doc/_static/css/custom.css b/doc/_static/css/custom.css new file mode 100644 index 0000000..66a1e35 --- /dev/null +++ b/doc/_static/css/custom.css @@ -0,0 +1,11 @@ +.alectryon-coqdoc .doc .code, +.alectryon-coqdoc .doc .comment, +.alectryon-coqdoc .doc .inlinecode, +.alectryon-mref, +.alectryon-block, .alectryon-io, +.alectryon-toggle-label, .alectryon-banner, pre, tt, code { + font-family: 'Iosevka Fixed Slab', 'Iosevka Slab Web', 'Iosevka Web', 'Iosevka Slab', + 'Iosevka', 'Fira Code', monospace; + font-feature-settings: "COQX" 1 /* Coq ligatures */, "XV00" 1 /* Legacy */, "calt" 1 /* Fallback */; + line-height: initial; +} diff --git a/doc/_static/images/toolflow.pdf b/doc/_static/images/toolflow.pdf Binary files differnew file mode 100644 index 0000000..5fcee67 --- /dev/null +++ b/doc/_static/images/toolflow.pdf diff --git a/doc/_static/images/toolflow.png b/doc/_static/images/toolflow.png Binary files differnew file mode 100644 index 0000000..601d6be --- /dev/null +++ b/doc/_static/images/toolflow.png diff --git a/doc/_static/images/toolflow.svg b/doc/_static/images/toolflow.svg new file mode 100644 index 0000000..0d8f39f --- /dev/null +++ b/doc/_static/images/toolflow.svg @@ -0,0 +1,1250 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + width="308.97266pt" + height="124.71875pt" + viewBox="0 0 308.97267 124.71875" + version="1.2" + id="svg466" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs183"> + <g + id="g172"> + <symbol + overflow="visible" + id="glyph0-0"> + <path + style="stroke:none" + d="" + id="path25" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-1"> + <path + style="stroke:none" + d="M 6.625,-2.328125 C 6.625,-2.421875 6.625,-2.5 6.5,-2.5 6.390625,-2.5 6.390625,-2.4375 6.375,-2.328125 6.296875,-0.90625 5.234375,-0.09375 4.140625,-0.09375 c -0.609375,0 -2.5625,-0.328125 -2.5625,-3.3125 0,-2.96875 1.953125,-3.3125 2.5625,-3.3125 1.078125,0 1.96875,0.90625 2.171875,2.359375 C 6.328125,-4.21875 6.328125,-4.1875 6.46875,-4.1875 6.625,-4.1875 6.625,-4.21875 6.625,-4.421875 V -6.78125 c 0,-0.171875 0,-0.25 -0.109375,-0.25 -0.03125,0 -0.078125,0 -0.15625,0.125 l -0.5,0.734375 C 5.5,-6.53125 4.984375,-7.03125 4.03125,-7.03125 c -1.875,0 -3.46875,1.59375 -3.46875,3.625 0,2.0625 1.609375,3.625 3.46875,3.625 1.625,0 2.59375,-1.390625 2.59375,-2.546875 z m 0,0" + id="path28" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-2"> + <path + style="stroke:none" + d="m 2.546875,0 v -0.3125 c -0.671875,0 -0.78125,0 -0.78125,-0.4375 V -6.921875 L 0.328125,-6.8125 V -6.5 c 0.703125,0 0.78125,0.0625 0.78125,0.5625 V -0.75 c 0,0.4375 -0.109375,0.4375 -0.78125,0.4375 V 0 L 1.4375,-0.03125 Z m 0,0" + id="path31" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-3"> + <path + style="stroke:none" + d="m 2.46875,0 v -0.3125 c -0.671875,0 -0.703125,-0.046875 -0.703125,-0.4375 V -4.40625 L 0.375,-4.296875 v 0.3125 c 0.640625,0 0.734375,0.0625 0.734375,0.546875 V -0.75 c 0,0.4375 -0.109375,0.4375 -0.78125,0.4375 V 0 l 1.09375,-0.03125 C 1.78125,-0.03125 2.125,-0.015625 2.46875,0 Z m -0.5625,-6.015625 c 0,-0.28125 -0.21875,-0.53125 -0.515625,-0.53125 -0.34375,0 -0.546875,0.28125 -0.546875,0.53125 C 0.84375,-5.75 1.078125,-5.5 1.375,-5.5 c 0.34375,0 0.53125,-0.265625 0.53125,-0.515625 z m 0,0" + id="path34" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-4"> + <path + style="stroke:none" + d="m 4.828125,-4.03125 c 0,-0.171875 -0.109375,-0.484375 -0.5,-0.484375 -0.203125,0 -0.640625,0.0625 -1.0625,0.46875 C 2.84375,-4.375 2.4375,-4.40625 2.21875,-4.40625 c -0.9375,0 -1.625,0.6875 -1.625,1.453125 0,0.4375 0.21875,0.8125 0.46875,1.03125 -0.125,0.140625 -0.3125,0.46875 -0.3125,0.828125 0,0.3125 0.140625,0.6875 0.453125,0.890625 -0.609375,0.15625 -0.921875,0.59375 -0.921875,0.984375 0,0.71875 0.984375,1.265625 2.203125,1.265625 1.171875,0 2.203125,-0.5 2.203125,-1.28125 0,-0.34375 -0.125,-0.859375 -0.640625,-1.140625 -0.53125,-0.265625 -1.109375,-0.265625 -1.71875,-0.265625 -0.25,0 -0.671875,0 -0.75,-0.015625 C 1.265625,-0.703125 1.0625,-1 1.0625,-1.328125 c 0,-0.03125 0,-0.265625 0.15625,-0.46875 0.390625,0.28125 0.8125,0.3125 1,0.3125 0.921875,0 1.609375,-0.6875 1.609375,-1.453125 0,-0.375 -0.15625,-0.734375 -0.40625,-0.96875 C 3.78125,-4.25 4.140625,-4.296875 4.3125,-4.296875 c 0,0 0.078125,0 0.109375,0.015625 C 4.3125,-4.25 4.25,-4.140625 4.25,-4.015625 c 0,0.171875 0.140625,0.28125 0.296875,0.28125 0.09375,0 0.28125,-0.0625 0.28125,-0.296875 z m -1.75,1.078125 c 0,0.265625 0,0.59375 -0.15625,0.84375 C 2.84375,-2 2.609375,-1.71875 2.21875,-1.71875 c -0.875,0 -0.875,-1 -0.875,-1.21875 0,-0.265625 0.015625,-0.59375 0.15625,-0.84375 0.078125,-0.109375 0.3125,-0.390625 0.71875,-0.390625 0.859375,0 0.859375,0.984375 0.859375,1.21875 z m 1.09375,3.734375 c 0,0.546875 -0.703125,1.046875 -1.671875,1.046875 -1.015625,0 -1.703125,-0.515625 -1.703125,-1.046875 0,-0.453125 0.375,-0.828125 0.8125,-0.84375 h 0.59375 c 0.859375,0 1.96875,0 1.96875,0.84375 z m 0,0" + id="path37" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-5"> + <path + style="stroke:none" + d="m 5.328125,0 v -0.3125 c -0.515625,0 -0.765625,0 -0.765625,-0.296875 v -1.90625 c 0,-0.859375 0,-1.15625 -0.3125,-1.515625 -0.140625,-0.171875 -0.46875,-0.375 -1.046875,-0.375 -0.84375,0 -1.28125,0.59375 -1.4375,0.953125 H 1.75 v -3.46875 L 0.3125,-6.8125 V -6.5 c 0.703125,0 0.78125,0.0625 0.78125,0.5625 V -0.75 c 0,0.4375 -0.109375,0.4375 -0.78125,0.4375 V 0 L 1.453125,-0.03125 2.5625,0 v -0.3125 c -0.671875,0 -0.78125,0 -0.78125,-0.4375 V -2.59375 C 1.78125,-3.625 2.5,-4.1875 3.125,-4.1875 c 0.640625,0 0.75,0.53125 0.75,1.109375 V -0.75 c 0,0.4375 -0.109375,0.4375 -0.78125,0.4375 V 0 l 1.125,-0.03125 z m 0,0" + id="path40" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-6"> + <path + style="stroke:none" + d="m 3.3125,-1.234375 v -0.5625 h -0.25 V -1.25 c 0,0.734375 -0.296875,1.109375 -0.671875,1.109375 -0.671875,0 -0.671875,-0.90625 -0.671875,-1.078125 v -2.765625 h 1.4375 v -0.3125 H 1.71875 V -6.125 h -0.25 c 0,0.8125 -0.296875,1.875 -1.28125,1.921875 v 0.21875 h 0.84375 v 2.75 c 0,1.21875 0.9375,1.34375 1.296875,1.34375 0.703125,0 0.984375,-0.703125 0.984375,-1.34375 z m 0,0" + id="path43" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-7"> + <path + style="stroke:none" + d="m 8.109375,0 v -0.3125 c -0.515625,0 -0.765625,0 -0.78125,-0.296875 v -1.90625 c 0,-0.859375 0,-1.15625 -0.3125,-1.515625 -0.140625,-0.171875 -0.46875,-0.375 -1.046875,-0.375 -0.828125,0 -1.28125,0.59375 -1.4375,0.984375 C 4.390625,-4.296875 3.65625,-4.40625 3.203125,-4.40625 2.46875,-4.40625 2,-3.984375 1.71875,-3.359375 V -4.40625 L 0.3125,-4.296875 v 0.3125 c 0.703125,0 0.78125,0.0625 0.78125,0.5625 V -0.75 c 0,0.4375 -0.109375,0.4375 -0.78125,0.4375 V 0 L 1.453125,-0.03125 2.5625,0 v -0.3125 c -0.671875,0 -0.78125,0 -0.78125,-0.4375 V -2.59375 C 1.78125,-3.625 2.5,-4.1875 3.125,-4.1875 c 0.640625,0 0.75,0.53125 0.75,1.109375 V -0.75 c 0,0.4375 -0.109375,0.4375 -0.78125,0.4375 V 0 L 4.21875,-0.03125 5.328125,0 v -0.3125 c -0.65625,0 -0.765625,0 -0.765625,-0.4375 v -1.84375 c 0,-1.03125 0.703125,-1.59375 1.34375,-1.59375 0.625,0 0.734375,0.53125 0.734375,1.109375 V -0.75 c 0,0.4375 -0.109375,0.4375 -0.78125,0.4375 V 0 l 1.125,-0.03125 z m 0,0" + id="path46" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-8"> + <path + style="stroke:none" + d="m 5.328125,0 v -0.3125 c -0.515625,0 -0.765625,0 -0.765625,-0.296875 v -1.90625 c 0,-0.859375 0,-1.15625 -0.3125,-1.515625 -0.140625,-0.171875 -0.46875,-0.375 -1.046875,-0.375 C 2.46875,-4.40625 2,-3.984375 1.71875,-3.359375 V -4.40625 L 0.3125,-4.296875 v 0.3125 c 0.703125,0 0.78125,0.0625 0.78125,0.5625 V -0.75 c 0,0.4375 -0.109375,0.4375 -0.78125,0.4375 V 0 L 1.453125,-0.03125 2.5625,0 v -0.3125 c -0.671875,0 -0.78125,0 -0.78125,-0.4375 V -2.59375 C 1.78125,-3.625 2.5,-4.1875 3.125,-4.1875 c 0.640625,0 0.75,0.53125 0.75,1.109375 V -0.75 c 0,0.4375 -0.109375,0.4375 -0.78125,0.4375 V 0 l 1.125,-0.03125 z m 0,0" + id="path49" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-9"> + <path + style="stroke:none" + d="M 4.6875,-2.140625 C 4.6875,-3.40625 3.703125,-4.46875 2.5,-4.46875 c -1.25,0 -2.21875,1.09375 -2.21875,2.328125 0,1.296875 1.03125,2.25 2.203125,2.25 1.203125,0 2.203125,-0.984375 2.203125,-2.25 z M 3.875,-2.21875 c 0,0.359375 0,0.90625 -0.21875,1.34375 -0.234375,0.453125 -0.671875,0.734375 -1.15625,0.734375 -0.4375,0 -0.875,-0.203125 -1.140625,-0.671875 -0.25,-0.4375 -0.25,-1.046875 -0.25,-1.40625 0,-0.390625 0,-0.921875 0.234375,-1.359375 C 1.609375,-4.03125 2.078125,-4.25 2.484375,-4.25 c 0.4375,0 0.859375,0.21875 1.125,0.65625 0.265625,0.421875 0.265625,1 0.265625,1.375 z m 0,0" + id="path52" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-10"> + <path + style="stroke:none" + d="m 3.625,-3.796875 c 0,-0.3125 -0.3125,-0.609375 -0.734375,-0.609375 -0.734375,0 -1.09375,0.671875 -1.21875,1.09375 V -4.40625 L 0.28125,-4.296875 v 0.3125 c 0.703125,0 0.78125,0.0625 0.78125,0.5625 V -0.75 c 0,0.4375 -0.109375,0.4375 -0.78125,0.4375 V 0 l 1.140625,-0.03125 c 0.390625,0 0.859375,0 1.265625,0.03125 V -0.3125 H 2.46875 c -0.734375,0 -0.75,-0.109375 -0.75,-0.46875 V -2.3125 c 0,-0.984375 0.421875,-1.875 1.171875,-1.875 0.0625,0 0.09375,0 0.109375,0.015625 -0.03125,0 -0.234375,0.125 -0.234375,0.390625 0,0.265625 0.21875,0.421875 0.4375,0.421875 0.171875,0 0.421875,-0.125 0.421875,-0.4375 z m 0,0" + id="path55" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-11"> + <path + style="stroke:none" + d="m 4.96875,-1.859375 c 0,-0.984375 -0.65625,-1.8125 -1.484375,-2.015625 l -1.28125,-0.296875 c -0.625,-0.15625 -1,-0.6875 -1,-1.265625 0,-0.703125 0.53125,-1.3125 1.3125,-1.3125 1.65625,0 1.875,1.640625 1.9375,2.078125 0.015625,0.0625 0.015625,0.125 0.125,0.125 0.125,0 0.125,-0.046875 0.125,-0.234375 v -2 c 0,-0.171875 0,-0.25 -0.109375,-0.25 -0.0625,0 -0.078125,0.015625 -0.140625,0.140625 l -0.359375,0.5625 C 3.796875,-6.625 3.390625,-7.03125 2.5,-7.03125 c -1.109375,0 -1.9375,0.875 -1.9375,1.9375 0,0.828125 0.53125,1.5625 1.296875,1.828125 0.109375,0.03125 0.625,0.15625 1.328125,0.328125 0.265625,0.0625 0.5625,0.140625 0.84375,0.5 0.203125,0.265625 0.3125,0.59375 0.3125,0.921875 0,0.703125 -0.5,1.421875 -1.34375,1.421875 -0.28125,0 -1.046875,-0.046875 -1.578125,-0.53125 C 0.84375,-1.171875 0.8125,-1.796875 0.8125,-2.15625 0.796875,-2.265625 0.71875,-2.265625 0.6875,-2.265625 c -0.125,0 -0.125,0.078125 -0.125,0.25 v 2 c 0,0.171875 0,0.234375 0.109375,0.234375 0.0625,0 0.078125,-0.015625 0.140625,-0.125 0,0 0.03125,-0.046875 0.359375,-0.578125 0.3125,0.34375 0.953125,0.703125 1.84375,0.703125 1.15625,0 1.953125,-0.96875 1.953125,-2.078125 z m 0,0" + id="path58" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-12"> + <path + style="stroke:none" + d="m 4.140625,-1.1875 c 0,-0.09375 -0.078125,-0.125 -0.140625,-0.125 -0.078125,0 -0.109375,0.0625 -0.125,0.140625 -0.34375,1.03125 -1.25,1.03125 -1.34375,1.03125 -0.5,0 -0.890625,-0.296875 -1.125,-0.671875 -0.296875,-0.46875 -0.296875,-1.125 -0.296875,-1.484375 h 2.78125 c 0.21875,0 0.25,0 0.25,-0.21875 0,-0.984375 -0.546875,-1.953125 -1.78125,-1.953125 -1.15625,0 -2.078125,1.03125 -2.078125,2.28125 0,1.328125 1.046875,2.296875 2.1875,2.296875 C 3.6875,0.109375 4.140625,-1 4.140625,-1.1875 Z m -0.65625,-1.328125 h -2.375 C 1.171875,-4 2.015625,-4.25 2.359375,-4.25 c 1.015625,0 1.125,1.34375 1.125,1.734375 z m 0,0" + id="path61" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-13"> + <path + style="stroke:none" + d="m 4.5625,-1.703125 c 0,-0.8125 -0.640625,-1.59375 -1.671875,-1.8125 0.8125,-0.265625 1.390625,-0.953125 1.390625,-1.75 0,-0.8125 -0.875,-1.375 -1.828125,-1.375 -1,0 -1.765625,0.59375 -1.765625,1.359375 0,0.328125 0.21875,0.515625 0.515625,0.515625 0.296875,0 0.5,-0.21875 0.5,-0.515625 0,-0.484375 -0.46875,-0.484375 -0.609375,-0.484375 0.296875,-0.5 0.953125,-0.625 1.3125,-0.625 0.421875,0 0.96875,0.21875 0.96875,1.109375 0,0.125 -0.03125,0.703125 -0.28125,1.140625 C 2.796875,-3.65625 2.453125,-3.625 2.203125,-3.625 2.125,-3.609375 1.890625,-3.59375 1.8125,-3.59375 c -0.078125,0.015625 -0.140625,0.03125 -0.140625,0.125 0,0.109375 0.0625,0.109375 0.234375,0.109375 h 0.4375 c 0.8125,0 1.1875,0.671875 1.1875,1.65625 0,1.359375 -0.6875,1.640625 -1.125,1.640625 -0.4375,0 -1.1875,-0.171875 -1.53125,-0.75 0.34375,0.046875 0.65625,-0.171875 0.65625,-0.546875 0,-0.359375 -0.265625,-0.5625 -0.546875,-0.5625 -0.25,0 -0.5625,0.140625 -0.5625,0.578125 0,0.90625 0.921875,1.5625 2.015625,1.5625 1.21875,0 2.125,-0.90625 2.125,-1.921875 z m 0,0" + id="path64" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-14"> + <path + style="stroke:none" + d="M 7.140625,0 V -0.3125 H 6.96875 C 6.375,-0.3125 6.234375,-0.375 6.125,-0.703125 L 3.96875,-6.9375 c -0.046875,-0.125 -0.078125,-0.203125 -0.234375,-0.203125 -0.15625,0 -0.1875,0.0625 -0.234375,0.203125 L 1.4375,-0.984375 C 1.25,-0.46875 0.859375,-0.3125 0.3125,-0.3125 V 0 L 1.328125,-0.03125 2.484375,0 v -0.3125 c -0.5,0 -0.75,-0.25 -0.75,-0.5 0,-0.03125 0.015625,-0.140625 0.015625,-0.15625 L 2.21875,-2.265625 H 4.671875 L 5.203125,-0.75 c 0.015625,0.046875 0.03125,0.109375 0.03125,0.140625 0,0.296875 -0.5625,0.296875 -0.828125,0.296875 V 0 c 0.359375,-0.03125 1.0625,-0.03125 1.4375,-0.03125 z M 4.5625,-2.578125 H 2.328125 l 1.109375,-3.25 z m 0,0" + id="path67" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-15"> + <path + style="stroke:none" + d="m 5.796875,-2.578125 h -0.25 c -0.109375,1.015625 -0.25,2.265625 -2,2.265625 h -0.8125 C 2.265625,-0.3125 2.25,-0.375 2.25,-0.703125 v -5.3125 C 2.25,-6.359375 2.25,-6.5 3.1875,-6.5 H 3.515625 V -6.8125 C 3.15625,-6.78125 2.25,-6.78125 1.84375,-6.78125 c -0.390625,0 -1.171875,0 -1.515625,-0.03125 V -6.5 H 0.5625 c 0.765625,0 0.796875,0.109375 0.796875,0.46875 v 5.25 c 0,0.359375 -0.03125,0.46875 -0.796875,0.46875 H 0.328125 V 0 h 5.1875 z m 0,0" + id="path70" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-16"> + <path + style="stroke:none" + d="m 6.828125,-4.5 -0.1875,-2.25 h -6.09375 l -0.1875,2.25 h 0.25 C 0.75,-6.109375 0.890625,-6.4375 2.40625,-6.4375 c 0.171875,0 0.4375,0 0.53125,0.015625 0.21875,0.046875 0.21875,0.15625 0.21875,0.375 v 5.265625 c 0,0.328125 0,0.46875 -1.046875,0.46875 H 1.703125 V 0 C 2.109375,-0.03125 3.125,-0.03125 3.59375,-0.03125 c 0.453125,0 1.484375,0 1.890625,0.03125 v -0.3125 h -0.40625 c -1.046875,0 -1.046875,-0.140625 -1.046875,-0.46875 v -5.265625 c 0,-0.1875 0,-0.328125 0.1875,-0.375 0.109375,-0.015625 0.375,-0.015625 0.5625,-0.015625 1.515625,0 1.65625,0.328125 1.796875,1.9375 z m 0,0" + id="path73" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-17"> + <path + style="stroke:none" + d="m 4.8125,-0.890625 v -0.5625 h -0.25 v 0.5625 C 4.5625,-0.3125 4.3125,-0.25 4.203125,-0.25 3.875,-0.25 3.84375,-0.703125 3.84375,-0.75 v -1.984375 c 0,-0.421875 0,-0.8125 -0.359375,-1.1875 C 3.09375,-4.3125 2.59375,-4.46875 2.109375,-4.46875 c -0.8125,0 -1.5,0.46875 -1.5,1.125 0,0.296875 0.203125,0.46875 0.453125,0.46875 0.28125,0 0.46875,-0.203125 0.46875,-0.453125 0,-0.125 -0.0625,-0.453125 -0.515625,-0.453125 C 1.28125,-4.140625 1.78125,-4.25 2.09375,-4.25 c 0.484375,0 1.0625,0.390625 1.0625,1.28125 v 0.359375 C 2.640625,-2.578125 1.9375,-2.546875 1.3125,-2.25 c -0.75,0.34375 -1,0.859375 -1,1.296875 0,0.8125 0.96875,1.0625 1.59375,1.0625 0.671875,0 1.125,-0.40625 1.3125,-0.859375 0.046875,0.390625 0.3125,0.8125 0.78125,0.8125 0.203125,0 0.8125,-0.140625 0.8125,-0.953125 z m -1.65625,-0.5 c 0,0.9375 -0.71875,1.28125 -1.171875,1.28125 -0.484375,0 -0.890625,-0.34375 -0.890625,-0.84375 0,-0.546875 0.40625,-1.375 2.0625,-1.4375 z m 0,0" + id="path76" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-18"> + <path + style="stroke:none" + d="M 4.140625,-1.1875 C 4.140625,-1.28125 4.03125,-1.28125 4,-1.28125 c -0.078125,0 -0.109375,0.03125 -0.125,0.09375 -0.28125,0.921875 -0.9375,1.046875 -1.296875,1.046875 -0.53125,0 -1.40625,-0.421875 -1.40625,-2.03125 0,-1.625 0.8125,-2.046875 1.34375,-2.046875 0.09375,0 0.71875,0.015625 1.0625,0.375 -0.40625,0.03125 -0.46875,0.328125 -0.46875,0.453125 0,0.265625 0.1875,0.453125 0.453125,0.453125 0.265625,0 0.46875,-0.15625 0.46875,-0.46875 0,-0.671875 -0.765625,-1.0625 -1.53125,-1.0625 -1.25,0 -2.15625,1.078125 -2.15625,2.3125 0,1.28125 0.984375,2.265625 2.140625,2.265625 1.328125,0 1.65625,-1.203125 1.65625,-1.296875 z m 0,0" + id="path79" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-19"> + <path + style="stroke:none" + d="m 4.5625,-2.03125 c 0,-1.265625 -0.890625,-2.21875 -2,-2.21875 -0.671875,0 -1.046875,0.5 -1.25,0.984375 v -0.25 c 0,-2.515625 1.234375,-2.875 1.75,-2.875 0.234375,0 0.65625,0.0625 0.875,0.40625 -0.15625,0 -0.546875,0 -0.546875,0.4375 0,0.3125 0.234375,0.46875 0.453125,0.46875 0.15625,0 0.46875,-0.09375 0.46875,-0.484375 0,-0.59375 -0.4375,-1.078125 -1.265625,-1.078125 -1.28125,0 -2.625,1.28125 -2.625,3.484375 0,2.671875 1.15625,3.375 2.078125,3.375 1.109375,0 2.0625,-0.9375 2.0625,-2.25 z M 3.65625,-2.046875 c 0,0.484375 0,0.984375 -0.171875,1.34375 C 3.1875,-0.109375 2.734375,-0.0625 2.5,-0.0625 c -0.625,0 -0.921875,-0.59375 -0.984375,-0.75 -0.1875,-0.46875 -0.1875,-1.265625 -0.1875,-1.4375 0,-0.78125 0.328125,-1.78125 1.21875,-1.78125 0.171875,0 0.625,0 0.9375,0.625 0.171875,0.359375 0.171875,0.875 0.171875,1.359375 z m 0,0" + id="path82" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-20"> + <path + style="stroke:none" + d="m 4.6875,-1.640625 v -0.3125 H 3.703125 v -4.53125 c 0,-0.203125 0,-0.265625 -0.171875,-0.265625 -0.078125,0 -0.109375,0 -0.1875,0.125 l -3.0625,4.671875 v 0.3125 H 2.9375 v 0.859375 c 0,0.359375 -0.03125,0.46875 -0.765625,0.46875 H 1.96875 V 0 C 2.375,-0.03125 2.890625,-0.03125 3.3125,-0.03125 c 0.421875,0 0.9375,0 1.359375,0.03125 v -0.3125 h -0.21875 c -0.734375,0 -0.75,-0.109375 -0.75,-0.46875 v -0.859375 z m -1.703125,-0.3125 H 0.5625 l 2.421875,-3.71875 z m 0,0" + id="path85" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-21"> + <path + style="stroke:none" + d="m 5.140625,0 v -0.3125 c -0.53125,0 -0.71875,-0.015625 -0.9375,-0.3125 L 2.859375,-2.34375 C 3.15625,-2.71875 3.53125,-3.203125 3.78125,-3.46875 4.09375,-3.828125 4.5,-3.984375 4.96875,-3.984375 v -0.3125 c -0.265625,0.015625 -0.5625,0.03125 -0.828125,0.03125 -0.296875,0 -0.828125,-0.015625 -0.953125,-0.03125 v 0.3125 c 0.21875,0.015625 0.296875,0.140625 0.296875,0.3125 0,0.15625 -0.109375,0.28125 -0.15625,0.34375 L 2.71875,-2.546875 1.9375,-3.5625 C 1.84375,-3.65625 1.84375,-3.671875 1.84375,-3.734375 c 0,-0.15625 0.15625,-0.25 0.34375,-0.25 v -0.3125 l -1.078125,0.03125 c -0.203125,0 -0.671875,-0.015625 -0.9375,-0.03125 v 0.3125 c 0.703125,0 0.703125,0 1.171875,0.609375 l 0.984375,1.28125 c -0.46875,0.59375 -0.46875,0.625 -0.9375,1.1875 C 0.921875,-0.328125 0.328125,-0.3125 0.125,-0.3125 V 0 c 0.25,-0.015625 0.5625,-0.03125 0.828125,-0.03125 L 1.890625,0 v -0.3125 c -0.21875,-0.03125 -0.28125,-0.15625 -0.28125,-0.3125 0,-0.21875 0.28125,-0.546875 0.890625,-1.265625 l 0.765625,1 C 3.34375,-0.78125 3.46875,-0.625 3.46875,-0.5625 c 0,0.09375 -0.09375,0.25 -0.359375,0.25 V 0 L 4.1875,-0.03125 c 0.265625,0 0.65625,0.015625 0.953125,0.03125 z m 0,0" + id="path88" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-22"> + <path + style="stroke:none" + d="m 4.5625,-1.671875 c 0,-0.359375 -0.109375,-0.8125 -0.5,-1.234375 C 3.875,-3.109375 3.71875,-3.203125 3.078125,-3.609375 3.796875,-3.984375 4.28125,-4.5 4.28125,-5.15625 c 0,-0.921875 -0.875,-1.484375 -1.78125,-1.484375 -1,0 -1.8125,0.734375 -1.8125,1.671875 0,0.171875 0.015625,0.625 0.4375,1.09375 0.109375,0.109375 0.484375,0.359375 0.734375,0.53125 C 1.28125,-3.046875 0.421875,-2.5 0.421875,-1.5 c 0,1.046875 1.015625,1.71875 2.0625,1.71875 1.125,0 2.078125,-0.828125 2.078125,-1.890625 z M 3.84375,-5.15625 c 0,0.578125 -0.390625,1.046875 -0.984375,1.390625 L 1.625,-4.5625 c -0.453125,-0.296875 -0.5,-0.625 -0.5,-0.796875 0,-0.609375 0.65625,-1.03125 1.359375,-1.03125 0.71875,0 1.359375,0.515625 1.359375,1.234375 z M 4.0625,-1.3125 c 0,0.734375 -0.75,1.25 -1.5625,1.25 -0.859375,0 -1.578125,-0.609375 -1.578125,-1.4375 0,-0.578125 0.3125,-1.21875 1.15625,-1.6875 L 3.3125,-2.40625 c 0.28125,0.1875 0.75,0.484375 0.75,1.09375 z m 0,0" + id="path91" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-23"> + <path + style="stroke:none" + d="m 7.140625,0 v -0.3125 h -0.25 c -0.765625,0 -0.78125,-0.109375 -0.78125,-0.46875 v -5.25 C 6.109375,-6.390625 6.125,-6.5 6.890625,-6.5 h 0.25 v -0.3125 c -0.359375,0.03125 -1.09375,0.03125 -1.46875,0.03125 -0.375,0 -1.125,0 -1.46875,-0.03125 V -6.5 H 4.4375 c 0.765625,0 0.78125,0.109375 0.78125,0.46875 v 2.328125 H 2.25 V -6.03125 C 2.25,-6.390625 2.265625,-6.5 3.03125,-6.5 h 0.234375 v -0.3125 c -0.34375,0.03125 -1.078125,0.03125 -1.46875,0.03125 -0.375,0 -1.125,0 -1.46875,-0.03125 V -6.5 H 0.5625 c 0.765625,0 0.796875,0.109375 0.796875,0.46875 v 5.25 c 0,0.359375 -0.03125,0.46875 -0.796875,0.46875 H 0.328125 V 0 c 0.34375,-0.03125 1.09375,-0.03125 1.46875,-0.03125 0.375,0 1.125,0 1.46875,0.03125 V -0.3125 H 3.03125 C 2.265625,-0.3125 2.25,-0.421875 2.25,-0.78125 v -2.609375 h 2.96875 v 2.609375 c 0,0.359375 -0.015625,0.46875 -0.78125,0.46875 H 4.203125 V 0 c 0.34375,-0.03125 1.078125,-0.03125 1.453125,-0.03125 0.390625,0 1.125,0 1.484375,0.03125 z m 0,0" + id="path94" /> + </symbol> + <symbol + overflow="visible" + id="glyph0-24"> + <path + style="stroke:none" + d="M 7.28125,-6.5 V -6.8125 C 6.96875,-6.78125 6.5625,-6.78125 6.3125,-6.78125 L 5.171875,-6.8125 V -6.5 C 5.6875,-6.484375 5.90625,-6.234375 5.90625,-6 c 0,0.078125 -0.03125,0.140625 -0.046875,0.203125 L 4.03125,-1 2.125,-6.03125 C 2.0625,-6.171875 2.0625,-6.203125 2.0625,-6.203125 2.0625,-6.5 2.625,-6.5 2.875,-6.5 V -6.8125 C 2.515625,-6.78125 1.828125,-6.78125 1.453125,-6.78125 L 0.1875,-6.8125 V -6.5 c 0.65625,0 0.84375,0 0.984375,0.375 L 3.484375,0 c 0.0625,0.1875 0.109375,0.21875 0.25,0.21875 0.15625,0 0.1875,-0.046875 0.234375,-0.1875 L 6.1875,-5.828125 C 6.328125,-6.203125 6.59375,-6.484375 7.28125,-6.5 Z m 0,0" + id="path97" /> + </symbol> + <symbol + overflow="visible" + id="glyph1-0"> + <path + style="stroke:none" + d="" + id="path100" /> + </symbol> + <symbol + overflow="visible" + id="glyph1-1"> + <path + style="stroke:none" + d="m 1.90625,-2.5 c 0,-0.28125 -0.234375,-0.515625 -0.515625,-0.515625 -0.296875,0 -0.53125,0.234375 -0.53125,0.515625 0,0.296875 0.234375,0.53125 0.53125,0.53125 0.28125,0 0.515625,-0.234375 0.515625,-0.53125 z m 0,0" + id="path103" /> + </symbol> + <symbol + overflow="visible" + id="glyph2-0"> + <path + style="stroke:none" + d="" + id="path106" /> + </symbol> + <symbol + overflow="visible" + id="glyph2-1"> + <path + style="stroke:none" + d="m 7.640625,-2.265625 c 0,-0.203125 -0.078125,-0.203125 -0.25,-0.203125 -0.125,0 -0.21875,0 -0.21875,0.171875 -0.078125,1.328125 -1.28125,1.9375 -2.28125,1.9375 -0.78125,0 -1.625,-0.234375 -2.140625,-0.84375 -0.46875,-0.578125 -0.59375,-1.3125 -0.59375,-2.21875 0,-0.5625 0.03125,-1.625 0.671875,-2.296875 0.640625,-0.65625 1.515625,-0.765625 2.03125,-0.765625 1.078125,0 2.015625,0.765625 2.234375,2.03125 C 7.125,-4.265625 7.140625,-4.25 7.359375,-4.25 c 0.265625,0 0.28125,-0.015625 0.28125,-0.28125 v -2.140625 c 0,-0.1875 0,-0.28125 -0.1875,-0.28125 -0.09375,0 -0.109375,0.03125 -0.1875,0.09375 l -0.65625,0.59375 c -0.625,-0.5 -1.28125,-0.6875 -1.96875,-0.6875 -2.484375,0 -4,1.484375 -4,3.53125 0,2.046875 1.515625,3.53125 4,3.53125 1.875,0 3,-1.21875 3,-2.375 z m 0,0" + id="path109" /> + </symbol> + <symbol + overflow="visible" + id="glyph2-2"> + <path + style="stroke:none" + d="m 5.40625,-2.171875 c 0,-1.34375 -0.921875,-2.34375 -2.546875,-2.34375 -1.640625,0 -2.546875,1.015625 -2.546875,2.34375 0,1.234375 0.890625,2.234375 2.546875,2.234375 1.671875,0 2.546875,-1.015625 2.546875,-2.234375 z M 4.125,-2.28125 c 0,0.859375 0,1.9375 -1.265625,1.9375 -1.265625,0 -1.265625,-1.078125 -1.265625,-1.9375 0,-0.453125 0,-0.953125 0.171875,-1.296875 0.1875,-0.375 0.609375,-0.578125 1.09375,-0.578125 0.421875,0 0.84375,0.15625 1.0625,0.5 C 4.125,-3.3125 4.125,-2.765625 4.125,-2.28125 Z m 0,0" + id="path112" /> + </symbol> + <symbol + overflow="visible" + id="glyph2-3"> + <path + style="stroke:none" + d="m 9.328125,0 v -0.46875 h -0.6875 v -2.578125 c 0,-1.03125 -0.515625,-1.4375 -1.546875,-1.4375 -0.90625,0 -1.421875,0.5 -1.6875,0.953125 -0.1875,-0.921875 -1.109375,-0.953125 -1.484375,-0.953125 -0.875,0 -1.4375,0.453125 -1.765625,1.078125 V -4.484375 L 0.453125,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 3.078125 h -0.6875 V 0 l 1.25,-0.03125 1.25,0.03125 v -0.46875 h -0.6875 v -2.078125 c 0,-1.09375 0.875,-1.578125 1.5,-1.578125 0.328125,0 0.546875,0.203125 0.546875,0.96875 v 2.6875 H 3.625 V 0 L 4.890625,-0.03125 6.140625,0 v -0.46875 h -0.6875 V -2.546875 C 5.453125,-3.640625 6.3125,-4.125 6.9375,-4.125 7.28125,-4.125 7.5,-3.921875 7.5,-3.15625 v 2.6875 H 6.8125 V 0 l 1.25,-0.03125 z m 0,0" + id="path115" /> + </symbol> + <symbol + overflow="visible" + id="glyph2-4"> + <path + style="stroke:none" + d="m 5.984375,-2.21875 c 0,-1.328125 -0.90625,-2.265625 -2.34375,-2.265625 -0.75,0 -1.28125,0.3125 -1.5,0.484375 V -4.484375 L 0.375,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.375 V 1.46875 H 0.375 V 1.9375 L 1.625,1.90625 2.875,1.9375 V 1.46875 H 2.1875 v -1.859375 c 0.4375,0.34375 0.875,0.453125 1.28125,0.453125 1.5,0 2.515625,-0.90625 2.515625,-2.28125 z m -1.28125,0 c 0,1.40625 -0.703125,1.921875 -1.34375,1.921875 -0.140625,0 -0.609375,0 -1.0625,-0.546875 C 2.1875,-0.96875 2.1875,-0.984375 2.1875,-1.171875 V -3.28125 c 0,-0.1875 0.015625,-0.203125 0.15625,-0.34375 0.390625,-0.40625 0.921875,-0.46875 1.140625,-0.46875 0.65625,0 1.21875,0.609375 1.21875,1.875 z m 0,0" + id="path118" /> + </symbol> + <symbol + overflow="visible" + id="glyph2-5"> + <path + style="stroke:none" + d="m 4.921875,-1.171875 c 0,-0.171875 -0.1875,-0.171875 -0.234375,-0.171875 -0.171875,0 -0.1875,0.046875 -0.25,0.203125 -0.203125,0.484375 -0.78125,0.796875 -1.421875,0.796875 -1.40625,0 -1.421875,-1.328125 -1.421875,-1.828125 h 3.015625 c 0.21875,0 0.3125,0 0.3125,-0.265625 0,-0.3125 -0.0625,-1.046875 -0.5625,-1.546875 C 4,-4.34375 3.46875,-4.515625 2.78125,-4.515625 c -1.59375,0 -2.46875,1.03125 -2.46875,2.265625 0,1.34375 1,2.3125 2.609375,2.3125 1.578125,0 2,-1.0625 2,-1.234375 z M 3.984375,-2.5 H 1.59375 C 1.609375,-2.890625 1.625,-3.3125 1.828125,-3.640625 2.09375,-4.03125 2.5,-4.15625 2.78125,-4.15625 c 1.171875,0 1.1875,1.3125 1.203125,1.65625 z m 0,0" + id="path121" /> + </symbol> + <symbol + overflow="visible" + id="glyph2-6"> + <path + style="stroke:none" + d="m 4.40625,-3.671875 c 0,-0.53125 -0.53125,-0.8125 -1.0625,-0.8125 -0.6875,0 -1.09375,0.5 -1.3125,1.125 v -1.125 L 0.375,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 V -0.46875 H 0.375 V 0 l 1.25,-0.03125 C 2,-0.03125 2.640625,-0.03125 3,0 V -0.46875 H 2.140625 v -1.75 c 0,-0.6875 0.234375,-1.90625 1.234375,-1.90625 0,0 -0.1875,0.171875 -0.1875,0.453125 0,0.40625 0.328125,0.609375 0.609375,0.609375 0.296875,0 0.609375,-0.203125 0.609375,-0.609375 z m 0,0" + id="path124" /> + </symbol> + <symbol + overflow="visible" + id="glyph2-7"> + <path + style="stroke:none" + d="m 3.8125,-1.234375 v -0.53125 H 3.34375 V -1.25 c 0,0.671875 -0.328125,0.90625 -0.609375,0.90625 -0.578125,0 -0.578125,-0.640625 -0.578125,-0.859375 v -2.75 H 3.625 v -0.46875 H 2.15625 v -1.90625 H 1.6875 c 0,1 -0.484375,1.984375 -1.484375,2.015625 v 0.359375 H 1.03125 v 2.734375 c 0,1.0625 0.859375,1.28125 1.578125,1.28125 0.75,0 1.203125,-0.578125 1.203125,-1.296875 z m 0,0" + id="path127" /> + </symbol> + <symbol + overflow="visible" + id="glyph2-8"> + <path + style="stroke:none" + d="m 8.390625,-6.375 v -0.46875 l -1.125,0.03125 c -0.390625,0 -0.921875,0 -1.296875,-0.03125 V -6.375 c 0.078125,0 0.875,0 0.875,0.125 0,0.046875 -0.03125,0.09375 -0.046875,0.125 L 4.78125,-1.59375 2.65625,-6.375 h 0.9375 v -0.46875 c -0.375,0.03125 -1.328125,0.03125 -1.765625,0.03125 -0.375,0 -1.21875,0 -1.5625,-0.03125 V -6.375 h 0.90625 l 2.75,6.203125 c 0.078125,0.171875 0.125,0.25 0.40625,0.25 0.15625,0 0.28125,0 0.390625,-0.234375 l 2.65625,-6 C 7.4375,-6.28125 7.484375,-6.375 8.203125,-6.375 Z m 0,0" + id="path130" /> + </symbol> + <symbol + overflow="visible" + id="glyph2-9"> + <path + style="stroke:none" + d="M 2.84375,0 V -0.46875 H 2.234375 V -4.484375 L 0.5,-4.40625 v 0.46875 c 0.59375,0 0.65625,0 0.65625,0.390625 V -0.46875 H 0.46875 V 0 L 1.6875,-0.03125 Z M 2.375,-6.046875 c 0,-0.4375 -0.34375,-0.78125 -0.78125,-0.78125 -0.421875,0 -0.78125,0.34375 -0.78125,0.78125 0,0.421875 0.359375,0.765625 0.78125,0.765625 0.4375,0 0.78125,-0.34375 0.78125,-0.765625 z m 0,0" + id="path133" /> + </symbol> + <symbol + overflow="visible" + id="glyph2-10"> + <path + style="stroke:none" + d="M 4.765625,-1.171875 C 4.765625,-1.3125 4.625,-1.3125 4.53125,-1.3125 c -0.1875,0 -0.1875,0.03125 -0.25,0.15625 -0.25,0.625 -0.734375,0.8125 -1.234375,0.8125 -1.390625,0 -1.390625,-1.453125 -1.390625,-1.921875 0,-0.5625 0,-1.84375 1.28125,-1.84375 0.359375,0 0.515625,0.015625 0.65625,0.046875 -0.1875,0.171875 -0.203125,0.375 -0.203125,0.46875 0,0.4375 0.34375,0.625 0.609375,0.625 0.3125,0 0.640625,-0.21875 0.640625,-0.625 0,-0.859375 -1.15625,-0.921875 -1.734375,-0.921875 -1.796875,0 -2.53125,1.140625 -2.53125,2.296875 0,1.328125 0.9375,2.28125 2.46875,2.28125 1.625,0 1.921875,-1.15625 1.921875,-1.234375 z m 0,0" + id="path136" /> + </symbol> + <symbol + overflow="visible" + id="glyph3-0"> + <path + style="stroke:none" + d="" + id="path139" /> + </symbol> + <symbol + overflow="visible" + id="glyph3-1"> + <path + style="stroke:none" + d="m 6.203125,-0.71875 c 0,-0.046875 0,-0.15625 -0.125,-0.15625 -0.125,0 -0.125,0.09375 -0.125,0.140625 -0.046875,0.5 -0.3125,0.671875 -0.546875,0.671875 -0.421875,0 -0.46875,-0.359375 -0.609375,-1.375 -0.0625,-0.453125 -0.140625,-1 -1.015625,-1.265625 0.625,-0.171875 1.375,-0.625 1.375,-1.3125 0,-0.78125 -1,-1.421875 -2.1875,-1.421875 H 0.359375 v 0.265625 h 0.1875 c 0.609375,0 0.625,0.078125 0.625,0.375 v 4.15625 c 0,0.296875 -0.015625,0.375 -0.625,0.375 h -0.1875 V 0 L 1.515625,-0.03125 2.6875,0 V -0.265625 H 2.515625 c -0.625,0 -0.640625,-0.078125 -0.640625,-0.375 v -1.96875 h 1.015625 c 0.578125,0 0.84375,0.296875 0.90625,0.359375 0.234375,0.25 0.234375,0.40625 0.234375,0.9375 0,0.5 0,0.84375 0.328125,1.140625 0.34375,0.296875 0.78125,0.34375 1.015625,0.34375 0.671875,0 0.828125,-0.65625 0.828125,-0.890625 z m -1.875,-3.296875 c 0,0.890625 -0.625,1.171875 -1.46875,1.171875 H 1.875 v -2.015625 c 0,-0.203125 0.015625,-0.28125 0.203125,-0.3125 0.078125,0 0.328125,0 0.484375,0 0.71875,0 1.765625,0 1.765625,1.15625 z m 0,0" + id="path142" /> + </symbol> + <symbol + overflow="visible" + id="glyph3-2"> + <path + style="stroke:none" + d="M 6.046875,0 V -0.265625 H 5.90625 c -0.5,0 -0.578125,-0.0625 -0.671875,-0.328125 L 3.375,-5.515625 C 3.328125,-5.625 3.3125,-5.6875 3.171875,-5.6875 3.03125,-5.6875 3,-5.625 2.96875,-5.515625 l -1.78125,4.6875 c -0.078125,0.21875 -0.25,0.5625 -0.90625,0.5625 V 0 c 0.265625,-0.03125 0.6875,-0.03125 0.828125,-0.03125 0.25,0 0.5,0 0.875,0.03125 v -0.265625 c -0.34375,0 -0.546875,-0.171875 -0.546875,-0.390625 0,-0.0625 0,-0.078125 0.03125,-0.171875 l 0.375,-1 h 2.171875 l 0.453125,1.1875 C 4.5,-0.546875 4.5,-0.5 4.5,-0.5 c 0,0.234375 -0.40625,0.234375 -0.640625,0.234375 V 0 L 5,-0.03125 c 0.4375,0 0.59375,0 1.046875,0.03125 z M 3.90625,-2.09375 H 1.9375 l 1,-2.59375 z m 0,0" + id="path145" /> + </symbol> + <symbol + overflow="visible" + id="glyph3-3"> + <path + style="stroke:none" + d="M 7.359375,0 V -0.265625 H 7.1875 c -0.625,0 -0.640625,-0.078125 -0.640625,-0.375 v -4.15625 c 0,-0.296875 0.015625,-0.375 0.640625,-0.375 H 7.359375 V -5.4375 h -1.34375 c -0.21875,0 -0.234375,0.015625 -0.296875,0.15625 L 3.875,-0.75 2.03125,-5.265625 C 1.953125,-5.421875 1.953125,-5.4375 1.734375,-5.4375 h -1.34375 v 0.265625 H 0.5625 c 0.609375,0 0.625,0.078125 0.625,0.375 v 3.9375 c 0,0.21875 0,0.59375 -0.796875,0.59375 V 0 C 0.75,-0.03125 1.125,-0.03125 1.328125,-0.03125 c 0.203125,0 0.578125,0 0.9375,0.03125 v -0.265625 c -0.796875,0 -0.796875,-0.375 -0.796875,-0.59375 V -5.09375 L 3.484375,-0.1875 C 3.53125,-0.09375 3.5625,0 3.671875,0 3.78125,0 3.8125,-0.09375 3.859375,-0.1875 l 2.03125,-4.96875 v 4.515625 c 0,0.296875 -0.015625,0.375 -0.625,0.375 H 5.09375 V 0 l 1.125,-0.03125 z m 0,0" + id="path148" /> + </symbol> + <symbol + overflow="visible" + id="glyph3-4"> + <path + style="stroke:none" + d="m 2.078125,0 v -0.265625 c -0.53125,0 -0.5625,-0.03125 -0.5625,-0.34375 v -2.90625 l -1.15625,0.09375 v 0.265625 c 0.515625,0 0.578125,0.046875 0.578125,0.4375 V -0.625 c 0,0.359375 -0.09375,0.359375 -0.609375,0.359375 V 0 c 0.3125,-0.03125 0.765625,-0.03125 0.890625,-0.03125 0.09375,0 0.578125,0 0.859375,0.03125 z M 1.625,-4.796875 C 1.625,-5.0625 1.40625,-5.25 1.171875,-5.25 c -0.21875,0 -0.4375,0.1875 -0.4375,0.453125 0,0.234375 0.1875,0.4375 0.4375,0.4375 0.25,0 0.453125,-0.203125 0.453125,-0.4375 z m 0,0" + id="path151" /> + </symbol> + <symbol + overflow="visible" + id="glyph3-5"> + <path + style="stroke:none" + d="m 4.484375,0 v -0.265625 c -0.515625,0 -0.609375,0 -0.609375,-0.359375 v -1.796875 c 0,-0.65625 -0.3125,-1.09375 -1.140625,-1.09375 -0.796875,0 -1.15625,0.578125 -1.25,0.765625 v -0.765625 l -1.15625,0.09375 v 0.265625 c 0.546875,0 0.609375,0.046875 0.609375,0.4375 V -0.625 c 0,0.359375 -0.09375,0.359375 -0.609375,0.359375 V 0 c 0.34375,-0.03125 0.6875,-0.03125 0.90625,-0.03125 0.234375,0 0.5625,0 0.90625,0.03125 v -0.265625 c -0.5,0 -0.609375,0 -0.609375,-0.359375 v -1.4375 c 0,-0.84375 0.640625,-1.234375 1.125,-1.234375 0.484375,0 0.609375,0.34375 0.609375,0.84375 V -0.625 c 0,0.359375 -0.09375,0.359375 -0.609375,0.359375 V 0 C 3,-0.03125 3.359375,-0.03125 3.5625,-0.03125 c 0.234375,0 0.578125,0 0.921875,0.03125 z m 0,0" + id="path154" /> + </symbol> + <symbol + overflow="visible" + id="glyph3-6"> + <path + style="stroke:none" + d="m 3.046875,-1.03125 c 0,-0.375 -0.21875,-0.9375 -1.171875,-1.109375 -0.0625,-0.015625 -0.515625,-0.09375 -0.546875,-0.09375 -0.25,-0.0625 -0.625,-0.234375 -0.625,-0.546875 0,-0.234375 0.1875,-0.578125 0.9375,-0.578125 0.890625,0 0.9375,0.65625 0.953125,0.875 0,0.0625 0.0625,0.09375 0.109375,0.09375 0.140625,0 0.140625,-0.0625 0.140625,-0.203125 v -0.75 c 0,-0.125 0,-0.203125 -0.109375,-0.203125 -0.046875,0 -0.0625,0 -0.1875,0.125 -0.015625,0 -0.09375,0.078125 -0.109375,0.078125 0,0 -0.03125,0 -0.078125,-0.03125 C 2.234375,-3.46875 2,-3.546875 1.640625,-3.546875 c -1.109375,0 -1.359375,0.59375 -1.359375,0.984375 0,0.390625 0.296875,0.625 0.3125,0.65625 0.328125,0.234375 0.5,0.265625 1.046875,0.359375 0.375,0.078125 0.984375,0.1875 0.984375,0.71875 0,0.3125 -0.203125,0.6875 -0.9375,0.6875 -0.8125,0 -1.046875,-0.625 -1.140625,-1.046875 C 0.515625,-1.296875 0.5,-1.328125 0.40625,-1.328125 c -0.125,0 -0.125,0.0625 -0.125,0.21875 V -0.125 c 0,0.125 0,0.203125 0.09375,0.203125 0.0625,0 0.0625,0 0.203125,-0.15625 C 0.625,-0.125 0.703125,-0.21875 0.75,-0.265625 1.109375,0.0625 1.484375,0.078125 1.6875,0.078125 2.703125,0.078125 3.046875,-0.5 3.046875,-1.03125 Z m 0,0" + id="path157" /> + </symbol> + <symbol + overflow="visible" + id="glyph3-7"> + <path + style="stroke:none" + d="m 3.515625,-0.953125 c 0,-0.03125 -0.03125,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.046875 -0.125,0.09375 -0.28125,0.78125 -0.96875,0.796875 -1.109375,0.796875 -0.359375,0 -0.734375,-0.15625 -0.96875,-0.53125 C 0.953125,-1.0625 0.953125,-1.578125 0.953125,-1.8125 h 2.34375 c 0.171875,0 0.21875,0 0.21875,-0.1875 C 3.515625,-2.703125 3.125,-3.546875 2,-3.546875 c -0.984375,0 -1.765625,0.8125 -1.765625,1.796875 0,1.03125 0.859375,1.828125 1.875,1.828125 1,0 1.40625,-0.84375 1.40625,-1.03125 z M 2.96875,-2.03125 H 0.953125 C 1.03125,-3.140625 1.703125,-3.328125 2,-3.328125 c 0.9375,0 0.96875,1.125 0.96875,1.296875 z m 0,0" + id="path160" /> + </symbol> + <symbol + overflow="visible" + id="glyph3-8"> + <path + style="stroke:none" + d="m 3.0625,-3.015625 c 0,-0.28125 -0.25,-0.5 -0.609375,-0.5 -0.515625,0 -0.875,0.390625 -1.03125,0.84375 H 1.40625 v -0.84375 l -1.125,0.09375 v 0.265625 c 0.546875,0 0.609375,0.046875 0.609375,0.4375 V -0.625 c 0,0.359375 -0.109375,0.359375 -0.609375,0.359375 V 0 c 0.3125,-0.03125 0.75,-0.03125 0.9375,-0.03125 0.46875,0 0.484375,0 1,0.03125 V -0.265625 H 2.0625 c -0.578125,0 -0.59375,-0.078125 -0.59375,-0.375 V -1.8125 c 0,-0.609375 0.25,-1.46875 1.015625,-1.484375 -0.046875,0.03125 -0.140625,0.09375 -0.140625,0.28125 0,0.25 0.203125,0.359375 0.359375,0.359375 0.1875,0 0.359375,-0.125 0.359375,-0.359375 z m 0,0" + id="path163" /> + </symbol> + <symbol + overflow="visible" + id="glyph3-9"> + <path + style="stroke:none" + d="m 2.8125,-1 v -0.4375 h -0.25 v 0.421875 c 0,0.546875 -0.25,0.84375 -0.546875,0.84375 -0.53125,0 -0.53125,-0.6875 -0.53125,-0.8125 v -2.1875 h 1.1875 V -3.4375 h -1.1875 v -1.46875 h -0.25 c 0,0.734375 -0.328125,1.484375 -1.078125,1.515625 v 0.21875 H 0.875 V -1 c 0,0.9375 0.71875,1.078125 1.078125,1.078125 C 2.5,0.078125 2.8125,-0.390625 2.8125,-1 Z m 0,0" + id="path166" /> + </symbol> + <symbol + overflow="visible" + id="glyph3-10"> + <path + style="stroke:none" + d="m 3.984375,-1.703125 c 0,-0.984375 -0.828125,-1.84375 -1.875,-1.84375 -1.046875,0 -1.875,0.859375 -1.875,1.84375 0,1 0.859375,1.78125 1.875,1.78125 1.03125,0 1.875,-0.78125 1.875,-1.78125 z m -0.703125,-0.0625 c 0,0.359375 -0.015625,0.796875 -0.25,1.140625 -0.203125,0.3125 -0.5625,0.453125 -0.921875,0.453125 -0.421875,0 -0.765625,-0.203125 -0.9375,-0.484375 -0.203125,-0.328125 -0.21875,-0.71875 -0.21875,-1.109375 0,-0.3125 0,-0.78125 0.234375,-1.125 0.21875,-0.28125 0.546875,-0.4375 0.921875,-0.4375 0.421875,0 0.765625,0.203125 0.9375,0.46875 0.21875,0.34375 0.234375,0.765625 0.234375,1.09375 z m 0,0" + id="path169" /> + </symbol> + </g> + <clipPath + id="clip1"> + <path + d="M 6,0 H 315.60937 V 71 H 6 Z m 0,0" + id="path174" /> + </clipPath> + <clipPath + id="clip2"> + <path + d="m 6,85 h 309.60937 v 39.71875 H 6 Z m 0,0" + id="path177" /> + </clipPath> + <clipPath + id="clip3"> + <path + d="m 133,87 h 47 v 37.71875 h -47 z m 0,0" + id="path180" /> + </clipPath> + </defs> + <g + id="surface10254" + transform="translate(-6.636719)"> + <g + clip-path="url(#clip1)" + clip-rule="nonzero" + id="g187"> + <path + style="fill:#bdb8d9;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="M 6.636719,67.875 V 2.984375 c 0,-1.652344 1.335937,-2.98828125 2.988281,-2.98828125 h 303 c 1.65234,0 2.98828,1.33593725 2.98828,2.98828125 V 67.875 c 0,1.648438 -1.33594,2.988281 -2.98828,2.988281 h -303 c -1.652344,0 -2.988281,-1.339843 -2.988281,-2.988281 z m 0,0" + id="path185" /> + </g> + <g + clip-path="url(#clip2)" + clip-rule="nonzero" + id="g191"> + <path + style="fill:#8cd1c5;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 6.636719,88.023438 v 33.707032 c 0,1.65234 1.335937,2.99219 2.988281,2.99219 h 303 c 1.65234,0 2.98828,-1.33985 2.98828,-2.99219 V 88.023438 c 0,-1.648438 -1.33594,-2.988282 -2.98828,-2.988282 h -303 c -1.652344,0 -2.988281,1.339844 -2.988281,2.988282 z m 0,0" + id="path189" /> + </g> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="M 40.234375,46.769531 H 12.722656 c -1.652344,0 -2.988281,1.335938 -2.988281,2.988281 v 13.863282 c 0,1.652344 1.335937,2.988281 2.988281,2.988281 h 27.511719 c 1.652344,0 2.988281,-1.335937 2.988281,-2.988281 V 49.757812 c 0,-1.652343 -1.335937,-2.988281 -2.988281,-2.988281 z m 0,0" + id="path193" /> + <g + style="fill:#000000;fill-opacity:1" + id="g205"> + <use + xlink:href="#glyph0-1" + x="13.053" + y="59.174999" + id="use195" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-2" + x="20.245996" + y="59.174999" + id="use197" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-3" + x="23.0156" + y="59.174999" + id="use199" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-4" + x="25.785204" + y="59.174999" + id="use201" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-5" + x="30.766502" + y="59.174999" + id="use203" + width="100%" + height="100%" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g209"> + <use + xlink:href="#glyph0-6" + x="36.026756" + y="59.174999" + id="use207" + width="100%" + height="100%" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g213"> + <use + xlink:href="#glyph1-1" + x="57.516998" + y="58.903" + id="use211" + width="100%" + height="100%" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g217"> + <use + xlink:href="#glyph1-1" + x="61.930431" + y="58.903" + id="use215" + width="100%" + height="100%" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g221"> + <use + xlink:href="#glyph1-1" + x="66.353828" + y="58.903" + id="use219" + width="100%" + height="100%" /> + </g> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="M 134.55859,46.769531 H 88.476562 c -1.652343,0 -2.988281,1.335938 -2.988281,2.988281 v 13.863282 c 0,1.652344 1.335938,2.988281 2.988281,2.988281 h 46.082028 c 1.65235,0 2.99219,-1.335937 2.99219,-2.988281 V 49.757812 c 0,-1.652343 -1.33984,-2.988281 -2.99219,-2.988281 z m 0,0" + id="path223" /> + <g + style="fill:#000000;fill-opacity:1" + id="g243"> + <use + xlink:href="#glyph0-1" + x="88.807999" + y="60.091" + id="use225" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-7" + x="96.000999" + y="60.091" + id="use227" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-3" + x="104.29984" + y="60.091" + id="use229" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-8" + x="107.06944" + y="60.091" + id="use231" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-9" + x="112.60865" + y="60.091" + id="use233" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-10" + x="117.58995" + y="60.091" + id="use235" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-11" + x="121.49529" + y="60.091" + id="use237" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-12" + x="127.03449" + y="60.091" + id="use239" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-2" + x="131.45789" + y="60.091" + id="use241" + width="100%" + height="100%" /> + </g> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 178.22656,46.769531 h -20.03125 c -1.64844,0 -2.98828,1.335938 -2.98828,2.988281 v 13.863282 c 0,1.652344 1.33984,2.988281 2.98828,2.988281 h 20.03125 c 1.65235,0 2.98828,-1.335937 2.98828,-2.988281 V 49.757812 c 0,-1.652343 -1.33593,-2.988281 -2.98828,-2.988281 z m 0,0" + id="path245" /> + <g + style="fill:#000000;fill-opacity:1" + id="g251"> + <use + xlink:href="#glyph0-13" + x="158.528" + y="60.146" + id="use247" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-14" + x="163.50929" + y="60.146" + id="use249" + width="100%" + height="100%" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g255"> + <use + xlink:href="#glyph0-1" + x="170.7023" + y="60.146" + id="use253" + width="100%" + height="100%" /> + </g> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 220.47266,46.769531 h -19.48047 c -1.65235,0 -2.99219,1.335938 -2.99219,2.988281 v 13.863282 c 0,1.652344 1.33984,2.988281 2.99219,2.988281 h 19.48047 c 1.65234,0 2.98828,-1.335937 2.98828,-2.988281 V 49.757812 c 0,-1.652343 -1.33594,-2.988281 -2.98828,-2.988281 z m 0,0" + id="path257" /> + <g + style="fill:#000000;fill-opacity:1" + id="g261"> + <use + xlink:href="#glyph0-15" + x="201.32201" + y="60.091" + id="use259" + width="100%" + height="100%" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g267"> + <use + xlink:href="#glyph0-16" + x="206.72173" + y="60.091" + id="use263" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-15" + x="213.91472" + y="60.091" + id="use265" + width="100%" + height="100%" /> + </g> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 310.46094,46.769531 h -34.17969 c -1.64844,0 -2.98828,1.335938 -2.98828,2.988281 v 13.863282 c 0,1.652344 1.33984,2.988281 2.98828,2.988281 h 34.17969 c 1.65234,0 2.98828,-1.335937 2.98828,-2.988281 V 49.757812 c 0,-1.652343 -1.33594,-2.988281 -2.98828,-2.988281 z m 0,0" + id="path269" /> + <g + style="fill:#000000;fill-opacity:1" + id="g279"> + <use + xlink:href="#glyph0-17" + x="276.61499" + y="60.036999" + id="use271" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-17" + x="281.59631" + y="60.036999" + id="use273" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-10" + x="286.57761" + y="60.036999" + id="use275" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-18" + x="290.48294" + y="60.036999" + id="use277" + width="100%" + height="100%" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g287"> + <use + xlink:href="#glyph0-5" + x="294.62738" + y="60.036999" + id="use281" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-19" + x="300.1666" + y="60.036999" + id="use283" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-20" + x="305.14789" + y="60.036999" + id="use285" + width="100%" + height="100%" /> + </g> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 292.16797,24.089844 h -15.88672 c -1.64844,0 -2.98828,1.339844 -2.98828,2.988281 v 13.867187 c 0,1.648438 1.33984,2.988282 2.98828,2.988282 h 15.88672 c 1.65234,0 2.99219,-1.339844 2.99219,-2.988282 V 27.078125 c 0,-1.648437 -1.33985,-2.988281 -2.99219,-2.988281 z m 0,0" + id="path289" /> + <g + style="fill:#000000;fill-opacity:1" + id="g297"> + <use + xlink:href="#glyph0-21" + x="276.61499" + y="37.220001" + id="use291" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-22" + x="281.87524" + y="37.220001" + id="use293" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-19" + x="286.85657" + y="37.220001" + id="use295" + width="100%" + height="100%" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g301"> + <use + xlink:href="#glyph1-1" + x="276.61499" + y="19.218" + id="use299" + width="100%" + height="100%" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g305"> + <use + xlink:href="#glyph1-1" + x="281.02844" + y="19.218" + id="use303" + width="100%" + height="100%" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g309"> + <use + xlink:href="#glyph1-1" + x="285.45181" + y="19.218" + id="use307" + width="100%" + height="100%" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g313"> + <use + xlink:href="#glyph1-1" + x="236.10201" + y="58.903" + id="use311" + width="100%" + height="100%" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g317"> + <use + xlink:href="#glyph1-1" + x="240.51543" + y="58.903" + id="use315" + width="100%" + height="100%" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g321"> + <use + xlink:href="#glyph1-1" + x="244.93883" + y="58.903" + id="use319" + width="100%" + height="100%" /> + </g> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 178.98828,89.289062 h -21.55469 c -1.64843,0 -2.98828,1.335938 -2.98828,2.988282 v 13.863286 c 0,1.65234 1.33985,2.98828 2.98828,2.98828 h 21.55469 c 1.65234,0 2.98828,-1.33594 2.98828,-2.98828 V 92.277344 c 0,-1.652344 -1.33594,-2.988282 -2.98828,-2.988282 z m 0,0" + id="path323" /> + <g + style="fill:#000000;fill-opacity:1" + id="g331"> + <use + xlink:href="#glyph0-23" + x="157.76601" + y="102.611" + id="use325" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-16" + x="165.23795" + y="102.611" + id="use327" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-15" + x="172.43095" + y="102.611" + id="use329" + width="100%" + height="100%" /> + </g> + <path + style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" + d="m 240.47656,89.289062 h -31.14062 c -1.65235,0 -2.98828,1.335938 -2.98828,2.988282 v 13.863286 c 0,1.65234 1.33593,2.98828 2.98828,2.98828 h 31.14062 c 1.64844,0 2.98828,-1.33594 2.98828,-2.98828 V 92.277344 c 0,-1.652344 -1.33984,-2.988282 -2.98828,-2.988282 z m 0,0" + id="path333" /> + <g + style="fill:#000000;fill-opacity:1" + id="g337"> + <use + xlink:href="#glyph0-24" + x="209.66701" + y="101.64" + id="use335" + width="100%" + height="100%" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g351"> + <use + xlink:href="#glyph0-12" + x="216.31206" + y="101.64" + id="use339" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-10" + x="220.73544" + y="101.64" + id="use341" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-3" + x="224.64079" + y="101.64" + id="use343" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-2" + x="227.41039" + y="101.64" + id="use345" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-9" + x="230.17999" + y="101.64" + id="use347" + width="100%" + height="100%" /> + <use + xlink:href="#glyph0-4" + x="235.16129" + y="101.64" + id="use349" + width="100%" + height="100%" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g369"> + <use + xlink:href="#glyph2-1" + x="12.99" + y="13.84" + id="use353" + width="100%" + height="100%" /> + <use + xlink:href="#glyph2-2" + x="21.268921" + y="13.84" + id="use355" + width="100%" + height="100%" /> + <use + xlink:href="#glyph2-3" + x="26.997416" + y="13.84" + id="use357" + width="100%" + height="100%" /> + <use + xlink:href="#glyph2-4" + x="36.541588" + y="13.84" + id="use359" + width="100%" + height="100%" /> + <use + xlink:href="#glyph2-1" + x="42.907688" + y="13.84" + id="use361" + width="100%" + height="100%" /> + <use + xlink:href="#glyph2-5" + x="51.186607" + y="13.84" + id="use363" + width="100%" + height="100%" /> + <use + xlink:href="#glyph2-6" + x="56.436897" + y="13.84" + id="use365" + width="100%" + height="100%" /> + <use + xlink:href="#glyph2-7" + x="61.159172" + y="13.84" + id="use367" + width="100%" + height="100%" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g373"> + <use + xlink:href="#glyph2-8" + x="12.99" + y="99.751999" + id="use371" + width="100%" + height="100%" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g389"> + <use + xlink:href="#glyph2-5" + x="20.69109" + y="99.751999" + id="use375" + width="100%" + height="100%" /> + <use + xlink:href="#glyph2-6" + x="25.94138" + y="99.751999" + id="use377" + width="100%" + height="100%" /> + <use + xlink:href="#glyph2-9" + x="30.663652" + y="99.751999" + id="use379" + width="100%" + height="100%" /> + <use + xlink:href="#glyph2-10" + x="33.841721" + y="99.751999" + id="use381" + width="100%" + height="100%" /> + <use + xlink:href="#glyph2-5" + x="38.93261" + y="99.751999" + id="use383" + width="100%" + height="100%" /> + <use + xlink:href="#glyph2-6" + x="44.182899" + y="99.751999" + id="use385" + width="100%" + height="100%" /> + <use + xlink:href="#glyph2-7" + x="48.905174" + y="99.751999" + id="use387" + width="100%" + height="100%" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g397"> + <use + xlink:href="#glyph3-1" + x="115.526" + y="112.701" + id="use391" + width="100%" + height="100%" /> + <use + xlink:href="#glyph3-2" + x="121.75862" + y="112.701" + id="use393" + width="100%" + height="100%" /> + <use + xlink:href="#glyph3-3" + x="128.10281" + y="112.701" + id="use395" + width="100%" + height="100%" /> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="g417"> + <use + xlink:href="#glyph3-4" + x="109.676" + y="119.675" + id="use399" + width="100%" + height="100%" /> + <use + xlink:href="#glyph3-5" + x="112.02718" + y="119.675" + id="use401" + width="100%" + height="100%" /> + <use + xlink:href="#glyph3-6" + x="116.72954" + y="119.675" + id="use403" + width="100%" + height="100%" /> + <use + xlink:href="#glyph3-7" + x="120.06901" + y="119.675" + id="use405" + width="100%" + height="100%" /> + <use + xlink:href="#glyph3-8" + x="123.83089" + y="119.675" + id="use407" + width="100%" + height="100%" /> + <use + xlink:href="#glyph3-9" + x="127.13052" + y="119.675" + id="use409" + width="100%" + height="100%" /> + <use + xlink:href="#glyph3-4" + x="130.42216" + y="119.675" + id="use411" + width="100%" + height="100%" /> + <use + xlink:href="#glyph3-10" + x="132.77335" + y="119.675" + id="use413" + width="100%" + height="100%" /> + <use + xlink:href="#glyph3-5" + x="137.00548" + y="119.675" + id="use415" + width="100%" + height="100%" /> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 8.439875,0.0015 h 9.777344" + transform="matrix(1,0,0,-1,34.982,56.689)" + id="path419" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" + d="M -2.552025,3.110875 C -2.083275,1.243687 -1.044213,0.364781 -0.00124375,0.0015 -1.044213,-0.361781 -2.083275,-1.244594 -2.552025,-3.111781" + transform="matrix(1,0,0,-1,53.5989,56.689)" + id="path421" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="M 37.678156,0.0015 H 49.510188" + transform="matrix(1,0,0,-1,34.982,56.689)" + id="path423" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" + d="M -2.549976,3.110875 C -2.085132,1.243687 -1.04607,0.364781 8.05e-4,0.0015 -1.04607,-0.361781 -2.085132,-1.244594 -2.549976,-3.111781" + transform="matrix(1,0,0,-1,84.88982,56.689)" + id="path425" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 102.768,0.0015 h 16.46094" + transform="matrix(1,0,0,-1,34.982,56.689)" + id="path427" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" + d="M -2.551166,3.110875 C -2.086322,1.243687 -1.04726,0.364781 -3.85e-4,0.0015 -1.04726,-0.361781 -2.086322,-1.244594 -2.551166,-3.111781" + transform="matrix(1,0,0,-1,154.60976,56.689)" + id="path429" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 146.43206,0.0015 h 15.58985" + transform="matrix(1,0,0,-1,34.982,56.689)" + id="path431" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" + d="M -2.552408,3.110875 C -2.083658,1.243687 -1.044595,0.364781 -0.00162625,0.0015 -1.044595,-0.361781 -2.083658,-1.244594 -2.552408,-3.111781" + transform="matrix(1,0,0,-1,197.40397,56.689)" + id="path433" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 188.67816,0.0015 h 8.125" + transform="matrix(1,0,0,-1,34.982,56.689)" + id="path435" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" + d="M -2.551057,3.110875 C -2.086214,1.243687 -1.047151,0.364781 -2.7625e-4,0.0015 -1.047151,-0.361781 -2.086214,-1.244594 -2.551057,-3.111781" + transform="matrix(1,0,0,-1,232.18387,56.689)" + id="path437" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 216.26409,0.0015 h 21.05078" + transform="matrix(1,0,0,-1,34.982,56.689)" + id="path439" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" + d="M -2.551979,3.110875 C -2.083229,1.243687 -1.048072,0.364781 -0.0011975,0.0015 -1.048072,-0.361781 -2.083229,-1.244594 -2.551979,-3.111781" + transform="matrix(1,0,0,-1,272.69651,56.689)" + id="path441" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 216.26409,0.0015 c 12.28516,0 10.30469,18.472656 21.10157,22.402344" + transform="matrix(1,0,0,-1,34.982,56.689)" + id="path443" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" + d="M -2.549132,3.109508 C -2.084774,1.244442 -1.046101,0.363405 -0.00193857,-4.77835e-6 -1.044977,-0.364479 -2.084828,-1.245581 -2.550933,-3.108709" + transform="matrix(0.93968,-0.34201,-0.34201,-0.93968,272.72057,34.14777)" + id="path445" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 216.26409,0.0015 c 17.67578,0 4.44141,36.613281 21.0625,39.546875" + transform="matrix(1,0,0,-1,34.982,56.689)" + id="path447" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" + d="M -2.549055,3.109583 C -2.084879,1.242801 -1.046318,0.361581 3.08915e-4,-0.00144434 -1.047336,-0.364117 -2.083134,-1.244529 -2.550801,-3.109646" + transform="matrix(0.9848,-0.17363,-0.17363,-0.9848,272.70257,17.07285)" + id="path449" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="M 133.22894,-10.119594 V -31.603969" + transform="matrix(1,0,0,-1,34.982,56.689)" + id="path451" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" + d="m -2.549445,3.112319 c 0.464844,-1.867188 1.503906,-2.75 2.55078125,-3.1132815 C -1.045539,-0.364244 -2.084601,-1.24315 -2.549445,-3.110337" + transform="matrix(0,1,1,0,168.2119,88.69007)" + id="path453" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 147.19378,-42.521938 h 23.17578" + transform="matrix(1,0,0,-1,34.982,56.689)" + id="path455" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" + d="M -2.549931,3.111544 C -2.085087,1.244356 -1.046025,0.361544 8.5e-4,-0.0017375 -1.046025,-0.361113 -2.085087,-1.243925 -2.549931,-3.111113" + transform="matrix(1,0,0,-1,205.74915,99.2092)" + id="path457" /> + <g + clip-path="url(#clip3)" + clip-rule="nonzero" + id="g461"> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1" + d="m 119.26409,-42.521938 c -8.08593,0 -12.8789,-15.800781 -5.875,-19.839843 7.48438,-4.324219 19.83985,1.074218 19.83985,8.925781" + transform="matrix(1,0,0,-1,34.982,56.689)" + id="path459" /> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-opacity:1" + d="M -2.549004,3.110337 C -2.08416,1.24315 -1.045097,0.364244 0.0017775,9.625e-4 -1.045097,-0.362319 -2.08416,-1.245131 -2.549004,-3.112319" + transform="matrix(0,-1,-1,0,168.2119,109.72834)" + id="path463" /> + </g> +</svg> diff --git a/doc/common.org b/doc/common.org new file mode 100644 index 0000000..aa27264 --- /dev/null +++ b/doc/common.org @@ -0,0 +1,15 @@ +#+author: Yann Herklotz +#+email: git@ymhg.org + +#+macro: version 1.2.2 +#+macro: modified 2022-02-24 + +#+macro: base_url https://vericert.ymhg.org + +#+macro: link src_emacs-lisp[:results raw]{(ymhg/link "$1" "$2")} + +#+macro: texinfo_head (eval (if (eq org-export-current-backend 'texinfo) "#+exclude_tags: noexport_texinfo" "#+exclude_tags: onlyexport_texinfo")) +#+macro: latex_head (eval (if (eq org-export-current-backend 'latex) "#+exclude_tags: noexport_latex" "#+exclude_tags: onlyexport_latex")) +#+macro: hugo_head (eval (if (eq org-export-current-backend 'hugo) "#+exclude_tags: noexport_hugo" "#+exclude_tags: onlyexport_hugo")) +{{{texinfo_head}}} +{{{latex_head}}} diff --git a/doc/conf.py b/doc/conf.py new file mode 100644 index 0000000..015f030 --- /dev/null +++ b/doc/conf.py @@ -0,0 +1,85 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- Project information ----------------------------------------------------- + +project = 'Vericert' +copyright = '2022 Yann Herklotz, John Wickerson' +author = 'Yann Herklotz, John Wickerson' + +# The full version, including alpha/beta/rc tags +release = 'v1.2.2' + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ "alectryon.sphinx" ] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +pygments_style = "emacs" + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'alabaster' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +html_css_files = [ + 'css/custom.css', +] + + +# -- LaTeX configuration ----------------------------------------------------- + +latex_engine = "xelatex" + + +# -- Alectryon configuration ------------------------------------------------- + +import alectryon.docutils +alectryon.docutils.CACHE_DIRECTORY = "_build/alectryon/" +alectryon.docutils.LONG_LINE_THRESHOLD = 80 + +alectryon.docutils.AlectryonTransform.DRIVER_ARGS["sertop"] = [ + "-R" "../src,vericert", + "-R" "../lib/CompCert/lib,compcert.lib", + "-R" "../lib/CompCert/common,compcert.common", + "-R" "../lib/CompCert/verilog,compcert.verilog", + "-R" "../lib/CompCert/backend,compcert.backend", + "-R" "../lib/CompCert/cfrontend,compcert.cfrontend", + "-R" "../lib/CompCert/driver,compcert.driver", + "-R" "../lib/CompCert/cparser,compcert.cparser", + "-R" "../lib/CompCert/flocq,Flocq", + "-R" "../lib/CompCert/MenhirLib,MenhirLib" +] diff --git a/doc/documentation.org b/doc/documentation.org new file mode 100644 index 0000000..85bc8fd --- /dev/null +++ b/doc/documentation.org @@ -0,0 +1,562 @@ +#+title: Vericert Manual +#+subtitle: Release {{{version}}} +#+author: Yann Herklotz +#+email: git@ymhg.org +#+language: en + +* Introduction +:PROPERTIES: +:EXPORT_FILE_NAME: _index +:EXPORT_HUGO_SECTION: docs +:CUSTOM_ID: docs +:END: + +Vericert translates C code into a hardware description language called Verilog, which can then be +synthesised into hardware, to be placed onto a field-programmable gate array (FPGA) or +application-specific integrated circuit (ASIC). + +#+attr_html: :width "600px" +#+caption: Current design of Vericert, where HTL is an intermediate language representing a finite state machine with data-path (FSMD) and Verilog is the target language. +#+name: fig:design +[[./images/toolflow.png]] + +The design shown in Figure [[fig:design]] shows how Vericert leverages an existing verified C compiler +called [[https://compcert.org/compcert-C.html][CompCert]] to perform this translation. + +#+texinfo: @insertcopying + +* COPYING +:PROPERTIES: +:COPYING: t +:END: + +Copyright (C) 2019-2022 Yann Herklotz. + +#+begin_quote +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 +or any later version published by the Free Software Foundation; +with no Invariant Sections, no Front-Cover Texts, and no Back-Cover +Texts. A copy of the license is included in the section entitled ``GNU +Free Documentation License''. +#+end_quote + +* Building Vericert +:PROPERTIES: +:EXPORT_FILE_NAME: building +:EXPORT_HUGO_SECTION: docs +:CUSTOM_ID: building +:END: + +#+transclude: [[file:~/projects/vericert/README.org::#building][file:../README.org::#building]] :only-contents :exclude-elements "headline property-drawer" +#+transclude: [[file:~/projects/vericert/README.org::#downloading-compcert][file:../README.org::#downloading-compcert]] :level 2 +#+transclude: [[file:~/projects/vericert/README.org::#setting-up-nix][file:../README.org::#setting-up-nix]] :level 2 +#+transclude: [[file:~/projects/vericert/README.org::#makefile-build][file:../README.org::#makefile-build]] :level 2 + +** Testing + +To test out ~vericert~ you can try the following examples which are in the test folder using the +following: + +#+begin_src shell +./bin/vericert test/loop.c -o loop.v +./bin/vericert test/conditional.c -o conditional.v +./bin/vericert test/add.c -o add.v +#+end_src + +Or by running the test suite using the following command: + +#+begin_src shell +make test +#+end_src + +* Using Vericert +:PROPERTIES: +:CUSTOM_ID: using-vericert +:END: + +Vericert can be used to translate a subset of C into Verilog. As a simple example, consider the +following C file (~main.c~): + +#+begin_src C +void matrix_multiply(int first[2][2], int second[2][2], int multiply[2][2]) { + int sum = 0; + for (int c = 0; c < 2; c++) { + for (int d = 0; d < 2; d++) { + for (int k = 0; k < 2; k++) { + sum = sum + first[c][k]*second[k][d]; + } + multiply[c][d] = sum; + sum = 0; + } + } +} + +int main() { + int f[2][2] = {{1, 2}, {3, 4}}; + int s[2][2] = {{5, 6}, {7, 8}}; + int m[2][2] = {{0, 0}, {0, 0}}; + + matrix_multiply(f, s, m); + return m[1][1]; +} +#+end_src + +It can be compiled using the following command, assuming that vericert is somewhere on the path. + +#+begin_src shell +vericert main.c -o main.v +#+end_src + +The Verilog file contains a top-level test-bench, which can be given to any Verilog simulator to +simulate the hardware, which should give the same result as executing the C code. Using [[http://iverilog.icarus.com/][Icarus +Verilog]] as an example: + +#+begin_src shell +iverilog -o main_v main.v +#+end_src + +When executing, it should therefore print the following: + +#+begin_src shell +$ ./main_v +finished: 50 +#+end_src + +This gives the same result as executing the C in the following way: + +#+begin_src shell +$ gcc -o main_c main.c +$ ./main_c +$ echo $? +50 +#+end_src + +** Man pages + +#+transclude: [[file:man.org][file:man.org]] :exclude-elements "keyword" :level 3 + +* Unreleased Features +:PROPERTIES: +:EXPORT_FILE_NAME: unreleased +:EXPORT_HUGO_SECTION: docs +:CUSTOM_ID: unreleased-features +:END: + +The following are unreleased features in Vericert that are currently being worked on and have not +been completely proven correct yet. Currently this includes features such as: + +- [[#scheduling][scheduling]], +- [[#operation-chaining][operation chaining]], +- [[#if-conversion][if-conversion]], and +- [[#functions][functions]]. + +This page gives some preliminary information on how the features are implemented and how the proofs +for the features are being done. Once these features are properly implemented, they will be added +to the proper documentation. + +** Scheduling +:PROPERTIES: +:CUSTOM_ID: scheduling +:END: +#+cindex: scheduling + +Scheduling is an optimisation which is used to run various instructions in parallel that are +independent to each other. + +** Operation Chaining +:PROPERTIES: +:CUSTOM_ID: operation-chaining +:END: + +Operation chaining is an optimisation that can be added on to scheduling and allows for the +sequential execution of instructions in a clock cycle, while executing other instructions in +parallel in the same clock cycle. + +** If-conversion +:PROPERTIES: +:CUSTOM_ID: if-conversion +:END: + +If-conversion is an optimisation which can turn code with simple control flow into a single block +(called a hyper-block), using predicated instructions. + +** Functions +:PROPERTIES: +:CUSTOM_ID: functions +:END: + +Functions are currently only inlined in Vericert, however, we are working on a proper interface to +integrate function calls into the hardware. + +* Coq Style Guide + :PROPERTIES: + :CUSTOM_ID: coq-style-guide + :EXPORT_FILE_NAME: coq-style-guide + :EXPORT_HUGO_SECTION: docs + :END: + +This style guide was taken from [[https://github.com/project-oak/silveroak][Silveroak]], it outlines code style for Coq code in this +repository. There are certainly other valid strategies and opinions on Coq code style; this is laid +out purely in the name of consistency. For a visual example of the style, see the [[#example][example]] at the +bottom of this file. + +** Code organization + :PROPERTIES: + :CUSTOM_ID: code-organization + :END: +*** Legal banner + :PROPERTIES: + :CUSTOM_ID: legal-banner + :END: + +- Files should begin with a copyright/license banner, as shown in the example above. + +*** Import statements + :PROPERTIES: + :CUSTOM_ID: import-statements + :END: + +- =Require Import= statements should all go at the top of the file, followed by file-wide =Import= + statements. + + - =Import=s often contain notations or typeclass instances that might override notations or + instances from another library, so it's nice to highlight them separately. + +- One =Require Import= statement per line; it's easier to scan that way. +- =Require Import= statements should use "fully-qualified" names (e.g. =Require Import + Coq.ZArith.ZArith= instead of =Require Import ZArith=). + + - Use the =Locate= command to find the fully-qualified name! + +- =Require Import='s should go in the following order: + + 1. Standard library dependencies (start with =Coq.=) + 2. External dependencies (anything outside the current project) + 3. Same-project dependencies + +- =Require Import='s with the same root library (the name before the first =.=) should be grouped + together. Within each root-library group, they should be in alphabetical order (so =Coq.Lists.List= + before =Coq.ZArith.ZArith=). + +*** Notations and scopes + :PROPERTIES: + :CUSTOM_ID: notations-and-scopes + :END: + +- Any file-wide =Local Open Scope='s should come immediately after the =Import=s (see example). + + - Always use =Local Open Scope=; just =Open Scope= will sneakily open the scope for those who import + your file. + +- Put notations in their own separate modules or files, so that those who import your file can + choose whether or not they want the notations. + + - Conflicting notations can cause a lot of headache, so it comes in very handy to leave this + flexibility! + +** Formatting + :PROPERTIES: + :CUSTOM_ID: formatting + :END: +*** Line length + :PROPERTIES: + :CUSTOM_ID: line-length + :END: + +- Maximum line length 80 characters. + + - Many Coq IDE setups divide the screen in half vertically and use only half to display source + code, so more than 80 characters can be genuinely hard to read on a laptop. + +*** Whitespace and indentation + :PROPERTIES: + :CUSTOM_ID: whitespace-and-indentation + :END: + +- No trailing whitespace. + +- Spaces, not tabs. + +- Files should end with a newline. + + - Many editors do this automatically on save. + +- Colons may be either "English-spaced", with no space before the colon and one space after (=x: nat=) + or "French-spaced", with one space before and after (=x : nat=). + +- Default indentation is 2 spaces. + + - Keeping this small prevents complex proofs from being indented ridiculously far, and matches IDE + defaults. + +- Use 2-space indents if inserting a line break immediately after: + + - =Proof.= + - =fun <...> =>= + - =forall <...>,= + - =exists <....>,= + +- The style for indenting arguments in function application depends on where you make a line + break. If you make the line break immediately after the function name, use a 2-space + indent. However, if you make it after one or more arguments, align the next line with the first + argument: + + #+begin_src coq + (Z.pow + 1 2) + (Z.pow 1 2 3 + 4 5 6) + #+end_src + +- =Inductive= cases should not be indented. Example: + + #+begin_src coq + Inductive Foo : Type := + | FooA : Foo + | FooB : Foo + . + #+end_src + +- =match= or =lazymatch= cases should line up with the "m" in =match= or "l" in =lazymatch=, as in the + following examples: + + #+begin_src coq + match x with + | 3 => true + | _ => false + end. + + lazymatch x with + | 3 => idtac + | _ => fail "Not equal to 3:" x + end. + + repeat match goal with + | _ => progress subst + | _ => reflexivity + end. + + do 2 lazymatch goal with + | |- context [eq] => idtac + end. + #+end_src + +** Definitions and Fixpoints + :PROPERTIES: + :CUSTOM_ID: definitions-and-fixpoints + :END: + +- It's okay to leave the return type of =Definition='s and =Fixpoint='s implicit (e.g. ~Definition x := 5~ + instead of ~Definition x : nat := 5~) when the type is very simple or obvious (for instance, the + definition is in a file which deals exclusively with operations on =Z=). + +** Inductives + :PROPERTIES: + :CUSTOM_ID: inductives + :END: + +- The =.= ending an =Inductive= can be either on the same line as the last case or on its own line + immediately below. That is, both of the following are acceptable: + + #+begin_src coq + Inductive Foo : Type := + | FooA : Foo + | FooB : Foo + . + Inductive Foo : Type := + | FooA : Foo + | FooB : Foo. + #+end_src + +** Lemma/Theorem statements + :PROPERTIES: + :CUSTOM_ID: lemmatheorem-statements + :END: + +- Generally, use =Theorem= for the most important, top-level facts you prove and =Lemma= for everything + else. +- Insert a line break after the colon in the lemma statement. +- Insert a line break after the comma for =forall= or =exist= quantifiers. +- Implication arrows (=->=) should share a line with the previous hypothesis, not the following one. +- There is no need to make a line break after every =->=; short preconditions may share a line. + +** Proofs and tactics + :PROPERTIES: + :CUSTOM_ID: proofs-and-tactics + :END: + +- Use the =Proof= command (lined up vertically with =Lemma= or =Theorem= it corresponds to) to open a + proof, and indent the first line after it 2 spaces. + +- Very small proofs (where =Proof. <tactics> Qed.= is <= 80 characters) can go all in one line. + +- When ending a proof, align the ending statement (=Qed=, =Admitted=, etc.) with =Proof=. + +- Avoid referring to autogenerated names (e.g. =H0=, =n0=). It's okay to let Coq generate these names, + but you should not explicitly refer to them in your proof. So =intros; my_solver= is fine, but + =intros; apply H1; my_solver= is not fine. + + - You can force a non-autogenerated name by either putting the variable before the colon in the + lemma statement (=Lemma foo x : ...= instead of =Lemma foo : forall x, ...=), or by passing + arguments to =intros= (e.g. =intros ? x= to name the second argument =x=) + +- This way, the proof won't break when new hypotheses are added or autogenerated variable names + change. + +- Use curly braces ={}= for subgoals, instead of bullets. + +- /Never write tactics with more than one subgoal focused./ This can make the proof very confusing to + step through! If you have more than one subgoal, use curly braces. + +- Consider adding a comment after the opening curly brace that explains what case you're in (see + example). + + - This is not necessary for small subgoals but can help show the major lines of reasoning in large + proofs. + +- If invoking a tactic that is expected to return multiple subgoals, use =[ | ... | ]= before the =.= to + explicitly specify how many subgoals you expect. + + - Examples: =split; [ | ].= =induction z; [ | | ].= + - This helps make code more maintainable, because it fails immediately if your tactic no longer + solves as many subgoals as expected (or unexpectedly solves more). + +- If invoking a string of tactics (composed by =;=) that will break the goal into multiple subgoals + and then solve all but one, still use =[ ]= to enforce that all but one goal is solved. + + - Example: =split; try lia; [ ]=. + +- Tactics that consist only of =repeat=-ing a procedure (e.g. =repeat match=, =repeat first=) should + factor out a single step of that procedure a separate tactic called =<tactic name>_step=, because + the single-step version is much easier to debug. For instance: + + #+begin_src coq + Ltac crush_step := + match goal with + | _ => progress subst + | _ => reflexivity + end. + Ltac crush := repeat crush_step. + #+end_src + +** Naming + :PROPERTIES: + :CUSTOM_ID: naming + :END: + +- Helper proofs about standard library datatypes should go in a module that is named to match the + standard library module (see example). + + - This makes the helper proofs look like standard-library ones, which is helpful for categorizing + them if they're genuinely at the standard-library level of abstraction. + +- Names of modules should start with capital letters. +- Names of inductives and their constructors should start with capital letters. +- Names of other definitions/lemmas should be snake case. + +** Example + :PROPERTIES: + :CUSTOM_ID: example + :END: +A small standalone Coq file that exhibits many of the style points. + +#+begin_src coq +(* + * Vericert: Verified high-level synthesis. + * Copyright (C) 2021 Name <email@example.com> + * + * <License...> + *) + + Require Import Coq.Lists.List. + Require Import Coq.micromega.Lia. + Require Import Coq.ZArith.ZArith. + Import ListNotations. + Local Open Scope Z_scope. + + (* Helper proofs about standard library integers (Z) go within [Module Z] so + that they match standard-library Z lemmas when used. *) + Module Z. + Lemma pow_3_r x : x ^ 3 = x * x * x. + Proof. lia. Qed. (* very short proofs can go all on one line *) + + Lemma pow_4_r x : x ^ 4 = x * x * x * x. + Proof. + change 4 with (Z.succ (Z.succ (Z.succ (Z.succ 0)))). + repeat match goal with + | _ => rewrite Z.pow_1_r + | _ => rewrite Z.pow_succ_r by lia + | |- context [x * (?a * ?b)] => + replace (x * (a * b)) with (a * b * x) by lia + | _ => reflexivity + end. + Qed. + End Z. + (* Now we can access the lemmas above as Z.pow_3_r and Z.pow_4_r, as if they + were in the ZArith library! *) + + Definition bar (x y : Z) := x ^ (y + 1). + + (* example with a painfully manual proof to show case formatting *) + Lemma bar_upper_bound : + forall x y a, + 0 <= x <= a -> 0 <= y -> + 0 <= bar x y <= a ^ (y + 1). + Proof. + (* avoid referencing autogenerated names by explicitly naming variables *) + intros x y a Hx Hy. revert y Hy x a Hx. + (* explicitly indicate # subgoals with [ | ... | ] if > 1 *) + cbv [bar]; refine (natlike_ind _ _ _); [ | ]. + { (* y = 0 *) + intros; lia. } + { (* y = Z.succ _ *) + intros. + rewrite Z.add_succ_l, Z.pow_succ_r by lia. + split. + { (* 0 <= bar x y *) + apply Z.mul_nonneg_nonneg; [ lia | ]. + apply Z.pow_nonneg; lia. } + { (* bar x y < a ^ y *) + rewrite Z.pow_succ_r by lia. + apply Z.mul_le_mono_nonneg; try lia; + [ apply Z.pow_nonneg; lia | ]. + (* For more flexible proofs, use match statements to find hypotheses + rather than referring to them by autogenerated names like H0. In this + case, we'll take any hypothesis that applies to and then solves the + goal. *) + match goal with H : _ |- _ => apply H; solve [auto] end. } } + Qed. + + (* Put notations in a separate module or file so that importers can + decide whether or not to use them. *) + Module BarNotations. + Infix "#" := bar (at level 40) : Z_scope. + Notation "x '##'" := (bar x x) (at level 40) : Z_scope. + End BarNotations. +#+end_src + +* Index - Features +:PROPERTIES: +:CUSTOM_ID: cindex +:APPENDIX: t +:INDEX: cp +:DESCRIPTION: Key concepts & features +:END: + +* Export Setup :noexport: + +#+setupfile: common.org + +#+export_file_name: vericert.texi + +#+texinfo_dir_category: High-level synthesis tool +#+texinfo_dir_title: Vericert +#+texinfo_dir_desc: Formally verified high-level synthesis tool + +* GNU Free Documentation License +:PROPERTIES: +:appendix: t +:END: + +#+include: res/fdl.org diff --git a/doc/docutils.conf b/doc/docutils.conf new file mode 100644 index 0000000..1bf4d83 --- /dev/null +++ b/doc/docutils.conf @@ -0,0 +1,2 @@ +[restructuredtext parser] +syntax_highlight = short diff --git a/doc/index.rst b/doc/index.rst new file mode 100644 index 0000000..ebb99df --- /dev/null +++ b/doc/index.rst @@ -0,0 +1,26 @@ +.. Vericert documentation master file, created by + sphinx-quickstart on Sat Mar 26 18:15:40 2022. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Vericert's Documentation +======================== + +.. toctree:: + :maxdepth: 2 + :caption: Content: + + vericert + +.. toctree:: + :maxdepth: 1 + :caption: Sources: + + src/Compiler + src/hls/RTLBlockInstr + +Indices +================== + +* :ref:`genindex` +* :ref:`search` diff --git a/doc/make.bat b/doc/make.bat new file mode 100644 index 0000000..153be5e --- /dev/null +++ b/doc/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=.
+set BUILDDIR=_build
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.https://www.sphinx-doc.org/
+ exit /b 1
+)
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd
diff --git a/doc/man.org b/doc/man.org new file mode 100644 index 0000000..cb6143f --- /dev/null +++ b/doc/man.org @@ -0,0 +1,89 @@ +#+title: vericert +#+man_class_options: :section-id "1" +#+options: toc:nil num:nil +#+html_head_extra: <style>body{font-family:monospace;max-width:60em}h1{text-align:center}dt{font-weight:700}dd{margin-bottom:1em}</style> + +* NAME + +vericert - A formally verified high-level synthesis tool. + +* SYNOPSYS + +*vericert* [ *OPTION* ]... [ *FILE* ]... + +* DESCRIPTION + +** HLS Options: + +- --no-hls :: Do not use HLS and generate standard flow +- --simulate :: Simulate the result with the Verilog semantics +- --debug-hls :: Add debug logic to the Verilog +- --initialise-stack :: initialise the stack to all 0s + +** HLS Optimisations: + +- -fschedule :: Schedule the resulting hardware [off] +- -fif-conversion :: If-conversion optimisation [off] + +** General options: + +- -stdlib <dir> :: Set the path of the Compcert run-time library +- -v :: Print external commands before invoking them +- -timings :: Show the time spent in various compiler passes +- -version :: Print the version string and exit +- -target <value> :: Generate code for the given target +- -conf <file> :: Read configuration from file +- @<file> :: Read command line options from <file> + +** Tracing Options: + +- -dprepro :: Save C file after preprocessing in <file>.i +- -dparse :: Save C file after parsing and elaboration in <file>.parsed.c +- -dc :: Save generated C in <file>.compcert.c +- -dclight :: Save generated Clight in <file>.light.c +- -dcminor :: Save generated Cminor in <file>.cm +- -drtl :: Save RTL at various optimization points in <file>.rtl.<n> +- -drtlblock :: Save RTLBlock <file>.rtlblock +- -dhtl :: Save HTL before Verilog generation <file>.htl +- -dltl :: Save LTL after register allocation in <file>.ltl +- -dmach :: Save generated Mach code in <file>.mach +- -dasm :: Save generated assembly in <file>.s +- -dall :: Save all generated intermediate files in <file>.<ext> +- -sdump :: Save info for post-linking validation in <file>.json +- -o <file> :: Generate output in <file> + +** Diagnostic options: + +- -Wall :: Enable all warnings +- -W<warning> :: Enable the specific <warning> +- -Wno-<warning> :: Disable the specific <warning> +- -Werror :: Make all warnings into errors +- -Werror=<warning> :: Turn <warning> into an error +- -Wno-error=<warning> :: Turn <warning> into a warning even if -Werror is specified +- -Wfatal-errors :: Turn all errors into fatal errors aborting the compilation +- -fdiagnostics-color :: Turn on colored diagnostics +- -fno-diagnostics-color :: Turn of colored diagnostics +- -fmax-errors=<n> :: Maximum number of errors to report +- -fdiagnostics-show-option :: Print the option name with mappable diagnostics +- -fno-diagnostics-show-option :: Turn of printing of options with mappable diagnostics + +* AUTHOR + +Written by Yann Herklotz, Michalis Pardalos, James Pollard, Nadesh Ramanathan and John Wickerson. + +* COPYRIGHT + +Copyright (C) 2019-2022 Yann Herklotz <yann@yannherklotz.com> + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <https://www.gnu.org/licenses/>. diff --git a/doc/res/coqdoc.css b/doc/res/coqdoc.css new file mode 100644 index 0000000..5572aaa --- /dev/null +++ b/doc/res/coqdoc.css @@ -0,0 +1,867 @@ +body { + padding: 0px 0px; + margin: 0px 0px; + padding-left: 1em; + background-color: white; + font-family: sans-serif; + background-repeat: no-repeat; + background-size: 100%; +} + +#page { + display: block; + padding: 0px; + margin: 0px; +} + +#header { + min-height: 100px; + max-width: 760px; + margin: 0 auto; + padding-left: 80px; + padding-right: 80px; + padding-top: 30px; +} + +#header h1 { + padding: 0; + margin: 0; +} + +/* Menu */ +ul#menu { + padding: 0; + display: block; + margin: auto; +} + +ul#menu li, div.button { + display: inline-block; + background-color: white; + padding: 5px; + font-size: .70em; + text-transform: uppercase; + width: 30%; + text-align: center; + font-weight: 600; +} + +div.button { + margin-top:5px; + width: 40%; +} + +#button_block {margin-top:50px;} + +ul#menu a.hover li { + background-color: red; +} + +/* Contents */ + +#main, #main_home { + display: block; + padding: 80px; + padding-top: 60px; /* BCP */ + font-size: 100%; + line-height: 100%; + max-width: 760px; + background-color: #ffffff; + margin: 0 auto; +} + +#main_home { + background-color: rgba(255, 255, 255, 0.5); +} + +#index_content div.intro p { + font-size: 12px; +} + +#main h1 { + /* line-height: 80%; */ + line-height: normal; + padding-top: 3px; + padding-bottom: 4px; + /* Demitri: font-size: 22pt; */ + font-size: 200%; /* BCP */ +} + +/* allow for multi-line headers */ +#main a.idref:visited {color : #416DFF; text-decoration : none; } +#main a.idref:link {color : #416DFF; text-decoration : none; } +#main a.idref:hover {text-decoration : none; } +#main a.idref:active {text-decoration : none; } + +#main a.modref:visited {color : #416DFF; text-decoration : none; } +#main a.modref:link {color : #416DFF; text-decoration : none; } +#main a.modref:hover {text-decoration : none; } +#main a.modref:active {text-decoration : none; } + +#main .keyword { color : #697f2f } +#main { color: black } + +/* General section class - applies to all .section IDs */ +.section { + padding-top: 12px; + padding-bottom: 11px; + padding-left: 8px; + margin-top: 5px; + margin-bottom: 3px; + margin-top: 18px; + font-size : 125%; + color: #ffffff; +} + +/* Book title in header */ +.booktitleinheader { + color: #000000; + text-transform: uppercase; + font-weight: 300; + letter-spacing: 1px; + font-size: 125%; + margin-left: 0px; + margin-bottom: 22px; + } + +/* Chapter titles */ +.libtitle { + max-width: 860px; + text-transform: uppercase; + margin: 5px auto; + font-weight: 500; + padding-bottom: 2px; + font-size: 120%; + letter-spacing: 3px; + } + +.subtitle { + display: block; + padding-top: 10px; + font-size: 70%; + line-height: normal; +} + +h2.section { + color: #2a2c71; + background-color: transparent; + padding-left: 0px; + padding-top: 0px; + padding-bottom: 0px; + /* margin-top: 0px; */ + margin-top: 9px; /* BCP 2/20 */ + font-size : 135%; } + +h3.section { + /* background-color: rgb(90%,90%,100%); */ + background-color: white; + /* padding-left: 8px; */ + padding-left: 0px; + /* padding-top: 7px; */ + padding-top: 0px; + /* padding-bottom: 0px; */ + padding-bottom: 0.5em; + /* margin-top: 9px; */ + /* margin-top: 4px; (BCP 2/20) */ + margin-top: 9px; /* BCP 2/20 */ + font-size : 115%; + color:black; +} + +h4.section { + margin-top: .2em; + background-color: white; + color: #2a2c71; + padding-left: 0px; + padding-top: 0px; + padding-bottom: 0.5em; /* 0px; */ + font-size : 100%; + font-style : bold; + text-decoration : underline; +} + +#header p { + font-size: 13px; +} + +/* Sets up Main ID and margins */ + +#main .doc { + margin: 0px auto; + font-size: 14px; + line-height: 22px; + /* max-width: 570px; */ + color: black; + /* text-align: justify; */ + border-style: plain; + /* This might work better after changing back to standard coqdoc: */ + padding-top: 10px; + /* padding-top: 18px; */ +} + +.quote { + margin-left: auto; + margin-right: auto; + width: 40em; + color: darkred; +} + +.loud { + color: darkred; +} + +pre { + margin-top: 0px; + margin-bottom: 0px; +} + +.inlinecode { + display: inline; + /* font-size: 125%; */ + color: #444444; + font-family: monospace } + +.doc .inlinecode { + display: inline; + font-size: 105%; + color: rgb(35%,35%,70%); + font-family: monospace } + +.doc .inlinecode .id { +/* I am changing this to white in style below: + color: rgb(35%,35%,70%); +*/ +} + +h1 .inlinecode .id, h1.section span.inlinecode { + color: #ffffff; +} + +.inlinecodenm { + display: inline; + /* font-size: 125%; */ + color: #444444; +} + +.doc .inlinecodenm { + display: inline; + color: rgb(35%,35%,70%); +} + +.doc .inlinecodenm .id { + color: rgb(35%,35%,70%); +} + +.doc .code { + display: inline; + font-size: 110%; + color: rgb(35%,35%,70%); + font-family: monospace; + padding-left: 0px; +} + +.comment { + display: inline; + font-family: monospace; + color: rgb(50%,50%,80%); +} + +.inlineref { + display: inline; + /* font-family: monospace; */ + color: rgb(50%,50%,80%); +} + +.show::before { + /* content: "more"; */ + content: "+"; +} + +.show { + background-color: rgb(93%,93%,93%); + display: inline; + font-family: monospace; + font-size: 60%; + padding-top: 1px; + padding-bottom: 2px; + padding-left: 4px; + padding-right: 4px; + color: rgb(60%,60%,60%); +} + +/* +.show { + display: inline; + font-family: monospace; + font-size: 60%; + padding-top: 0px; + padding-bottom: 0px; + padding-left: 10px; + border: 1px; + border-style: solid; + color: rgb(75%,75%,85%); +} +*/ + +.proofbox { + font-size: 90%; + color: rgb(75%,75%,75%); +} + +#main .less-space { + margin-top: -12px; +} + +/* Inline quizzes */ +.quiz:before { + color: rgb(40%,40%,40%); + /* content: "- Quick Check -" ; */ + display: block; + text-align: center; + margin-bottom: 5px; +} +.quiz { + border: 4px; + border-color: rgb(80%,80%,80%); + /* + margin-left: 40px; + margin-right: 100px; + */ + padding: 5px; + padding-left: 8px; + padding-right: 8px; + margin-top: 10px; + margin-bottom: 15px; + border-style: solid; +} + +/* For textual ones... */ +.show-old { + display: inline; + font-family: monospace; + font-size: 80%; + padding-top: 0px; + padding-bottom: 0px; + padding-left: 3px; + padding-right: 3px; + border: 1px; + margin-top: 5px; /* doesn't work?! */ + border-style: solid; + color: rgb(75%,75%,85%); +} + +.largebr { + margin-top: 10px; +} + +.code { + padding-left: 20px; + font-size: 14px; + font-family: monospace; + line-height: 17px; + margin-top: 9px; +} + +/* Working: +.code { + display: block; + padding-left: 0px; + font-size: 110%; + font-family: monospace; + } +*/ + +.code-space { + max-width: 50em; + margin-top: 0em; + /* margin-bottom: -.5em; */ + margin-left: auto; + margin-right: auto; +} + +.code-tight { + max-width: 50em; + margin-top: .6em; + /* margin-bottom: -.7em; */ + margin-left: auto; + margin-right: auto; +} + +hr.doublespaceincode { + height: 1pt; + visibility: hidden; + font-size: 10px; +} + +/* +code.br { + height: 5em; +} +*/ + +#main .citation { + color: rgb(70%,0%,0%); + text-decoration: underline; +} + +table.infrule { + border: 0px; + margin-left: 50px; + margin-top: .5em; + margin-bottom: 1.2em; +} + +td.infrule { + font-family: monospace; + text-align: center; + /* color: rgb(35%,35%,70%); */ + padding: 0px; + line-height: 100%; +} + +tr.infrulemiddle hr { + margin: 1px 0 1px 0; +} + +.infrulenamecol { + color: rgb(60%,60%,60%); + font-size: 80%; + padding-left: 1em; + padding-bottom: 0.1em +} + +#footer { + font-size: 65%; + font-family: sans-serif; +} + +.id { display: inline; } + +.id[title="constructor"] { + color: #697f2f; +} + +.id[title="var"], +.id[title="variable"] { + color: rgb(40%,0%,40%); +} + +.id[title="definition"] { + color: rgb(0%,40%,0%); +} + +.id[title="abbreviation"] { + color: rgb(0%,40%,0%); +} + +.id[title="lemma"] { + color: rgb(0%,40%,0%); +} + +.id[title="instance"] { + color: rgb(0%,40%,0%); +} + +.id[title="projection"] { + color: rgb(0%,40%,0%); +} + +.id[title="method"] { + color: rgb(0%,40%,0%); +} + +.id[title="inductive"] { + color: #034764; +} + +.id[title="record"] { + color: rgb(0%,0%,80%); +} + +.id[title="class"] { + color: rgb(0%,0%,80%); +} + +.id[title="keyword"] { + color : #697f2f; + /* color: black; */ +} + +.inlinecode .id { + color: rgb(0%,0%,0%); +} + +.nowrap { + white-space: nowrap; +} + +.HIDEFROMHTML { + display: none; +} + +/* TOC */ + +#toc h2 { +/* padding-top: 13px; */ + padding-bottom: 13px; + padding-left: 8px; + margin-top: 5px; + margin-top: 20px; + /* OLD: padding: 10px; + line-height: 120%; + background-color: rgb(60%,60%,100%); */ +} + +#toc h2.ui-accordion-header { + padding: .5em .5em .5em .7em; + outline: none; +} + +#toc .ui-accordion .ui-accordion-content { + padding: 0.5em 2.5em 0.8em .9em; + border-top: 0; + margin-bottom: 1em; + /* bottom rule */ + border: none; + border-bottom: 1px solid transparent; + transition: border-bottom-color 0.25s ease-in; + transition-delay: 0.15s; +} + +#toc .ui-accordion .ui-accordion-content-active { + border-bottom: 1px solid #9b9b9b; + transition-delay: 0s; +} + +#toc h2.ui-accordion-header-active { + background: silver !important; +} + +#toc h2:not(.ui-accordion-header-active):hover { + background: rgba(0,0,0,0.04) !important; +} + +#toc h2 a:hover { + text-decoration: underline; +} + +#toc h2:hover::after { + content: "expand ▾"; + font-size: 80%; + float: right; + margin-top: 0.2em; + color: silver; + opacity: 1; + transition: opacity .5s ease-in-out; +} + +#toc h2.ui-accordion-header-active:hover::after { + opacity: 0; +} + +#toc h2 .select { background-image: url('media/image/arrow_down.jpg'); } +div#sec1.hide { display: none; } + +#toc ul { + padding-top: 8px; + font-size: 14px; + padding-left: 0; +} + +#toc ul ul { + margin-bottom: -8px; +} + +#toc li { + font-weight: 600; + list-style-type: none; + padding-top: 12px; + padding-bottom: 8px; +} + +#toc li li { + font-weight: 300; + list-style-type: circle; + padding-bottom: 3px; + padding-top: 0px; + margin-left: 19px; +} + + + + +/* Accordion Overrides */ + +/* Widget Bar */ +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default, +.ui-button, +/* We use html here because we need a greater specificity to make sure disabled + works properly when clicked or hovered */ +html .ui-button.ui-state-disabled:hover, +html .ui-button.ui-state-disabled:active { + border: none!important; + /* BCP 3/17: I like it better without the rules... + border-bottom: 1px solid silver!important; */ + background: white !important; + font-weight: normal; + color: #454545!important; + font-weight: 400!important; + margin-top: 0px!important; + +} + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, +.ui-corner-top, +.ui-corner-left, +.ui-corner-tl { + border-top-left-radius: 0px!important; +} + +.ui-corner-all, +.ui-corner-top, +.ui-corner-right, +.ui-corner-tr { + border-top-right-radius: 0px!important; +} + +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-left, +.ui-corner-bl { + border-bottom-left-radius: 0px!important; +} + +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-br { + border-bottom-right-radius: 0px!important; +} + +html .ui-button.ui-state-disabled:focus { + color: red!important; +} + +/* Remove Icon */ +.ui-icon { display: none!important; } + +/* Widget */ +.ui-widget-content { + border: 1px solid #9e9e9e; + border-bottom-color: #b2b2b2; +} + +.ui-widget-content { + background: #ffffff; + color: #333333; +} + + +/* Index */ + +#index { + margin: 0; + padding: 0; + width: 100%; + font-style : normal; +} + +#index #frontispiece { + margin: auto; + padding: 1em; + width: 700px; +} + +.booktitle { + font-size : 300%; line-height: 100%; font-style:bold; + color: white; + padding-top: 70px; + padding-bottom: 20px; } +.authors { font-size : 200%; + line-height: 115%; } +.moreauthors { font-size : 170% } +.buttons { font-size : 170%; + margin-left: auto; + margin-right: auto; + font-style : bold; + } + +/* Link colors never changes */ + +A:link, A:visited, A:active, A:hover { + text-decoration: none; + color: #555555 +} + +/* Special color for the chapter header */ + +.booktitleinheader A:visited, .booktitleinheader A:active, .booktitleinheader A:hover, .booktitleinheader A:link { + text-decoration: none; + color: black; +} + +#index #entrance { + text-align: center; +} + +/* This was removed via CSS but the HTML is still generated */ +#index #footer { + display: none; +} + +.paragraph { + height: 0.6em; +} + +ul.doclist { + margin-top: 0em; + margin-bottom: 0em; +} + +/* Index styles */ + +/* Styles the author box (Intro class) and With (column class) */ + +.column { + float:left; + width: 43%; + margin:0 10px; + text-align: left; + font-size: 15px; + line-height: 25px; + padding-right: 20px; + min-height: 340px; +} + +.smallauthors { + font-size: 19px; + line-height: 25px; +} + +.mediumauthors { + font-size: 23px; + line-height: 33px; +} + +.largeauthors { + font-size: 28px; + line-height: 40px; +} + +.intro { + width: 35%; + font-size: 21px; + line-height: 27px; + font-weight: 600; + padding-right: 20px; +} + +.column.pub { + width: 40%; + margin-bottom: 20px; +} + +#index_content { + width: 100%!important; + display: block; + min-height: 400px; +} + +div.column.pub table tbody tr td { + text-align: center; padding: 10px; +} +div.column.pub table tbody tr td p { + text-align: left; + margin-top: 0; + font-weight: 600; + font-size: 13px!important; + line-height: 18px; +} + +/* Tables */ + +td.tab { + height: 16px; + font-weight: 600; + padding-left: 5px; + text-align: left!important; +} + +/* Styles tables on the index -- body class sf_home is used there */ + +body.sf_home table { + min-height: 450px; + vertical-align: top; +} + +body.sf_home table td { + vertical-align: top; + +} +body.sf_home table td p { + min-height: 100px; + +} + +table.logical { background-color: rgba(144, 160, 209, 0.5); } +table.logical tbody tr td.tab { background-color: #91a1d1; } + +table.language_found { background-color: rgba(178, 88, 88, 0.5); } +table.language_found tbody tr td.tab { background-color: #b25959; } + +table.algo { background-color: rgba(194, 194, 108, 0.5); } +table.algo tbody tr td.tab { background-color: #c2c26c; } + +table.qc { background-color: rgba(185, 170, 185, 0.5); } +table.qc tbody tr td.tab { background-color: #8b7d95; } + +table.vc { background-color: rgba(159, 125, 140, 0.5); } +table.vc tbody tr td.tab { background-color: rgb(159, 125, 140); } + +table.slf { background-color: rgba(219, 178, 127, 0.5); } +table.slf tbody tr td.tab { background-color: rgb(219, 178, 127); } + +/* Suggested background color for next volume */ +/* #c07d62 */ + +.ui-draggable, .ui-droppable { + background-position: top; +} + +/* Chapter dependencies (SVG) */ +.deps a polygon:hover { opacity: 0.6; stroke-width: 2; } +.deps a text { pointer-events: none; } + +/* A few specific things for the top-level SF landing page */ + +body.sf_home {background-color: #ededed; background-image: url(../media/image/core_mem_bg.jpg); } + +body.sf_home #header { + background-image: url(../media/image/core_mem_hdr_bg.jpg); + padding-bottom: 20px; +} + +body.sf_home #main_home { + background-color: transparent; +} + +/* A partial fix to a coqdoc bug... + See https://github.com/DeepSpec/sfdev/issues/236 */ +.inlinecode { white-space: pre; } +.inlinecode br { display: none; } + +#header { background-color: rgba(190, 170, 190, 0.5); } + +/* This volume's color */ +.section, ul#menu li.section_name, div.button { background-color: #8b7d95; } + +.slide img { + border: 2px solid gray; + margin: 1em; +} diff --git a/doc/res/fdl.org b/doc/res/fdl.org new file mode 100644 index 0000000..81e2cd9 --- /dev/null +++ b/doc/res/fdl.org @@ -0,0 +1,489 @@ +# The GNU Free Documentation License. +#+begin_center +Version 1.3, 3 November 2008 +#+end_center + +# This file is intended to be included within another document. + +#+begin_verse +Copyright \copy{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. +https://fsf.org/ + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +#+end_verse + +0. [@0] PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + functional and useful document @@texinfo:@dfn{@@free@@texinfo:}@@ + in the sense of freedom: to assure everyone the effective freedom + to copy and redistribute it, with or without modifying it, either + commercially or noncommercially. Secondarily, this License + preserves for the author and publisher a way to get credit for + their work, while not being considered responsible for + modifications made by others. + + This License is a kind of "copyleft", which means that derivative + works of the document must themselves be free in the same sense. + It complements the GNU General Public License, which is a copyleft + license designed for free software. + + We have designed this License in order to use it for manuals for + free software, because free software needs free documentation: + a free program should come with manuals providing the same freedoms + that the software does. But this License is not limited to + software manuals; it can be used for any textual work, regardless + of subject matter or whether it is published as a printed book. We + recommend this License principally for works whose purpose is + instruction or reference. + +1. APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work, in any medium, + that contains a notice placed by the copyright holder saying it can + be distributed under the terms of this License. Such a notice + grants a world-wide, royalty-free license, unlimited in duration, + to use that work under the conditions stated herein. The + "Document", below, refers to any such manual or work. Any member + of the public is a licensee, and is addressed as "you". You accept + the license if you copy, modify or distribute the work in a way + requiring permission under copyright law. + + A "Modified Version" of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + + A "Secondary Section" is a named appendix or a front-matter section + of the Document that deals exclusively with the relationship of the + publishers or authors of the Document to the Document's overall + subject (or to related matters) and contains nothing that could + fall directly within that overall subject. (Thus, if the Document + is in part a textbook of mathematics, a Secondary Section may not + explain any mathematics.) The relationship could be a matter of + historical connection with the subject or with related matters, or + of legal, commercial, philosophical, ethical or political position + regarding them. + + The "Invariant Sections" are certain Secondary Sections whose + titles are designated, as being those of Invariant Sections, in the + notice that says that the Document is released under this License. + If a section does not fit the above definition of Secondary then it + is not allowed to be designated as Invariant. The Document may + contain zero Invariant Sections. If the Document does not identify + any Invariant Sections then there are none. + + The "Cover Texts" are certain short passages of text that are + listed, as Front-Cover Texts or Back-Cover Texts, in the notice + that says that the Document is released under this License. + A Front-Cover Text may be at most 5 words, and a Back-Cover Text + may be at most 25 words. + + A "Transparent" copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, that is suitable for revising the document + straightforwardly with generic text editors or (for images composed + of pixels) generic paint programs or (for drawings) some widely + available drawing editor, and that is suitable for input to text + formatters or for automatic translation to a variety of formats + suitable for input to text formatters. A copy made in an otherwise + Transparent file format whose markup, or absence of markup, has + been arranged to thwart or discourage subsequent modification by + readers is not Transparent. An image format is not Transparent if + used for any substantial amount of text. A copy that is not + "Transparent" is called "Opaque". + + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, + SGML or XML using a publicly available DTD, and standard-conforming + simple HTML, PostScript or PDF designed for human modification. + Examples of transparent image formats include PNG, XCF and JPG. + Opaque formats include proprietary formats that can be read and + edited only by proprietary word processors, SGML or XML for which + the DTD and/or processing tools are not generally available, and + the machine-generated HTML, PostScript or PDF produced by some word + processors for output purposes only. + + The "Title Page" means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the + material this License requires to appear in the title page. For + works in formats which do not have any title page as such, "Title + Page" means the text near the most prominent appearance of the + work's title, preceding the beginning of the body of the text. + + The "publisher" means any person or entity that distributes copies + of the Document to the public. + + A section "Entitled XYZ" means a named subunit of the Document + whose title either is precisely XYZ or contains XYZ in parentheses + following text that translates XYZ in another language. (Here XYZ + stands for a specific section name mentioned below, such as + "Acknowledgements", "Dedications", "Endorsements", or "History".) + To "Preserve the Title" of such a section when you modify the + Document means that it remains a section "Entitled XYZ" according + to this definition. + + The Document may include Warranty Disclaimers next to the notice + which states that this License applies to the Document. These + Warranty Disclaimers are considered to be included by reference in + this License, but only as regards disclaiming warranties: any other + implication that these Warranty Disclaimers may have is void and + has no effect on the meaning of this License. + +2. VERBATIM COPYING + + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License + applies to the Document are reproduced in all copies, and that you + add no other conditions whatsoever to those of this License. You + may not use technical measures to obstruct or control the reading + or further copying of the copies you make or distribute. However, + you may accept compensation in exchange for copies. If you + distribute a large enough number of copies you must also follow the + conditions in section 3. + + You may also lend copies, under the same conditions stated above, + and you may publicly display copies. + +3. COPYING IN QUANTITY + + If you publish printed copies (or copies in media that commonly + have printed covers) of the Document, numbering more than 100, and + the Document's license notice requires Cover Texts, you must + enclose the copies in covers that carry, clearly and legibly, all + these Cover Texts: Front-Cover Texts on the front cover, and + Back-Cover Texts on the back cover. Both covers must also clearly + and legibly identify you as the publisher of these copies. The + front cover must present the full title with all words of the title + equally prominent and visible. You may add other material on the + covers in addition. Copying with changes limited to the covers, as + long as they preserve the title of the Document and satisfy these + conditions, can be treated as verbatim copying in other respects. + + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a machine-readable + Transparent copy along with each Opaque copy, or state in or with + each Opaque copy a computer-network location from which the general + network-using public has access to download using public-standard + network protocols a complete Transparent copy of the Document, free + of added material. If you use the latter option, you must take + reasonably prudent steps, when you begin distribution of Opaque + copies in quantity, to ensure that this Transparent copy will + remain thus accessible at the stated location until at least one + year after the last time you distribute an Opaque copy (directly or + through your agents or retailers) of that edition to the public. + + It is requested, but not required, that you contact the authors of + the Document well before redistributing any large number of copies, + to give them a chance to provide you with an updated version of the + Document. + +4. MODIFICATIONS + + You may copy and distribute a Modified Version of the Document + under the conditions of sections 2 and 3 above, provided that you + release the Modified Version under precisely this License, with the + Modified Version filling the role of the Document, thus licensing + distribution and modification of the Modified Version to whoever + possesses a copy of it. In addition, you must do these things in + the Modified Version: + + #+attr_texinfo: :enum A + 1. Use in the Title Page (and on the covers, if any) a title + distinct from that of the Document, and from those of previous + versions (which should, if there were any, be listed in the + History section of the Document). You may use the same title as + a previous version if the original publisher of that version + gives permission. + + 2. List on the Title Page, as authors, one or more persons or + entities responsible for authorship of the modifications in the + Modified Version, together with at least five of the principal + authors of the Document (all of its principal authors, if it has + fewer than five), unless they release you from this requirement. + + 3. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + + 4. Preserve all the copyright notices of the Document. + + 5. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + + 6. Include, immediately after the copyright notices, a license + notice giving the public permission to use the Modified Version + under the terms of this License, in the form shown in the + Addendum below. + + 7. Preserve in that license notice the full lists of Invariant + Sections and required Cover Texts given in the Document's + license notice. + + 8. Include an unaltered copy of this License. + + 9. Preserve the section Entitled "History", Preserve its Title, and + add to it an item stating at least the title, year, new authors, + and publisher of the Modified Version as given on the Title + Page. If there is no section Entitled "History" in the Document, + create one stating the title, year, authors, and publisher of + the Document as given on its Title Page, then add an item + describing the Modified Version as stated in the previous + sentence. + + 10. Preserve the network location, if any, given in the Document + for public access to a Transparent copy of the Document, and + likewise the network locations given in the Document for + previous versions it was based on. These may be placed in the + "History" section. You may omit a network location for a work + that was published at least four years before the Document + itself, or if the original publisher of the version it refers + to gives permission. + + 11. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section + all the substance and tone of each of the contributor + acknowledgements and/or dedications given therein. + + 12. Preserve all the Invariant Sections of the Document, unaltered + in their text and in their titles. Section numbers or the + equivalent are not considered part of the section titles. + + 13. Delete any section Entitled "Endorsements". Such a section may + not be included in the Modified Version. + + 14. Do not retitle any existing section to be Entitled + "Endorsements" or to conflict in title with any Invariant + Section. + + 15. Preserve any Warranty Disclaimers. + + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no material + copied from the Document, you may at your option designate some or all + of these sections as invariant. To do this, add their titles to the + list of Invariant Sections in the Modified Version's license notice. + These titles must be distinct from any other section titles. + + You may add a section Entitled "Endorsements", provided it contains + nothing but endorsements of your Modified Version by various + parties---for example, statements of peer review or that the text has + been approved by an organization as the authoritative definition of a + standard. + + You may add a passage of up to five words as a Front-Cover Text, and a + passage of up to 25 words as a Back-Cover Text, to the end of the list + of Cover Texts in the Modified Version. Only one passage of + Front-Cover Text and one of Back-Cover Text may be added by (or + through arrangements made by) any one entity. If the Document already + includes a cover text for the same cover, previously added by you or + by arrangement made by the same entity you are acting on behalf of, + you may not add another; but you may replace the old one, on explicit + permission from the previous publisher that added the old one. + + The author(s) and publisher(s) of the Document do not by this License + give permission to use their names for publicity for or to assert or + imply endorsement of any Modified Version. + +5. COMBINING DOCUMENTS + + You may combine the Document with other documents released under + this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination all + of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice, and that you preserve all + their Warranty Disclaimers. + + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name + but different contents, make the title of each such section unique + by adding at the end of it, in parentheses, the name of the + original author or publisher of that section if known, or else + a unique number. Make the same adjustment to the section titles in + the list of Invariant Sections in the license notice of the + combined work. + + In the combination, you must combine any sections Entitled + "History" in the various original documents, forming one section + Entitled "History"; likewise combine any sections Entitled + "Acknowledgements", and any sections Entitled "Dedications". You + must delete all sections Entitled "Endorsements." + +6. COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the + rules of this License for verbatim copying of each of the documents + in all other respects. + + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert + a copy of this License into the extracted document, and follow this + License in all other respects regarding verbatim copying of that + document. + +7. AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of + a storage or distribution medium, is called an "aggregate" if the + copyright resulting from the compilation is not used to limit the + legal rights of the compilation's users beyond what the individual + works permit. When the Document is included in an aggregate, this + License does not apply to the other works in the aggregate which + are not themselves derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one half + of the entire aggregate, the Document's Cover Texts may be placed + on covers that bracket the Document within the aggregate, or the + electronic equivalent of covers if the Document is in electronic + form. Otherwise they must appear on printed covers that bracket + the whole aggregate. + +8. TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of + section 4. Replacing Invariant Sections with translations requires + special permission from their copyright holders, but you may + include translations of some or all Invariant Sections in addition + to the original versions of these Invariant Sections. You may + include a translation of this License, and all the license notices + in the Document, and any Warranty Disclaimers, provided that you + also include the original English version of this License and the + original versions of those notices and disclaimers. In case of + a disagreement between the translation and the original version of + this License or a notice or disclaimer, the original version will + prevail. + + If a section in the Document is Entitled "Acknowledgements", + "Dedications", or "History", the requirement (section 4) to + Preserve its Title (section 1) will typically require changing the + actual title. + +9. TERMINATION + + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense, or distribute it is void, + and will automatically terminate your rights under this License. + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from + that copyright holder, and you cure the violation prior to 30 days + after your receipt of the notice. + + Termination of your rights under this section does not terminate + the licenses of parties who have received copies or rights from you + under this License. If your rights have been terminated and not + permanently reinstated, receipt of a copy of some or all of the + same material does not give you any rights to use it. + +10. FUTURE REVISIONS OF THIS LICENSE + + The Free Software Foundation may publish new, revised versions of + the GNU Free Documentation License from time to time. Such new + versions will be similar in spirit to the present version, but may + differ in detail to address new problems or concerns. See + https://www.gnu.org/copyleft/. + + Each version of the License is given a distinguishing version + number. If the Document specifies that a particular numbered + version of this License "or any later version" applies to it, you + have the option of following the terms and conditions either of + that specified version or of any later version that has been + published (not as a draft) by the Free Software Foundation. If + the Document does not specify a version number of this License, + you may choose any version ever published (not as a draft) by the + Free Software Foundation. If the Document specifies that a proxy + can decide which future versions of this License can be used, that + proxy's public statement of acceptance of a version permanently + authorizes you to choose that version for the Document. + +11. RELICENSING + + "Massive Multiauthor Collaboration Site" (or "MMC Site") means any + World Wide Web server that publishes copyrightable works and also + provides prominent facilities for anybody to edit those works. + A public wiki that anybody can edit is an example of such + a server. A "Massive Multiauthor Collaboration" (or "MMC") + contained in the site means any set of copyrightable works thus + published on the MMC site. + + "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 + license published by Creative Commons Corporation, + a not-for-profit corporation with a principal place of business in + San Francisco, California, as well as future copyleft versions of + that license published by that same organization. + + "Incorporate" means to publish or republish a Document, in whole + or in part, as part of another Document. + + An MMC is "eligible for relicensing" if it is licensed under this + License, and if all works that were first published under this + License somewhere other than this MMC, and subsequently + incorporated in whole or in part into the MMC, (1) had no cover + texts or invariant sections, and (2) were thus incorporated prior + to November 1, 2008. + + The operator of an MMC Site may republish an MMC contained in the + site under CC-BY-SA on the same site at any time before August 1, + 2009, provided the MMC is eligible for relicensing. + +#+texinfo: @page + +* ADDENDUM: How to use this License for your documents +:PROPERTIES: +:UNNUMBERED: notoc +:END: + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + +#+begin_example + Copyright (C) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. +#+end_example + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the "with...Texts."\nbsp{}line with this: + +#+begin_example + with the Invariant Sections being LIST THEIR TITLES, with + the Front-Cover Texts being LIST, and with the Back-Cover Texts + being LIST. +#+end_example + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, to +permit their use in free software. diff --git a/doc/res/install-deps.el b/doc/res/install-deps.el new file mode 100644 index 0000000..09cf4ae --- /dev/null +++ b/doc/res/install-deps.el @@ -0,0 +1,11 @@ +(require 'package) +(package-initialize) +(add-to-list 'package-archives '("nongnu" . "https://elpa.nongnu.org/nongnu/") t) +(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) +(add-to-list 'package-archives '("gnu-devel" . "https://elpa.gnu.org/devel/") t) +(package-refresh-contents) + +(package-install 'org) +(package-install 'org-contrib) +(package-install 'org-transclusion) +(package-install 'htmlize) diff --git a/doc/res/publish.el b/doc/res/publish.el new file mode 100644 index 0000000..c083eb0 --- /dev/null +++ b/doc/res/publish.el @@ -0,0 +1,23 @@ +(require 'package) +(package-initialize) + +(require 'org) +(require 'org-transclusion) +(require 'ox) +(require 'ox-html) +(require 'htmlize) +(require 'ox-texinfo) +(require 'ox-man) + +(setq org-transclusion-exclude-elements nil + org-html-head-include-default-style nil + org-html-head-include-scripts nil + org-html-postamble-format '(("en" "")) + org-html-postamble t + org-html-divs '((preamble "header" "header") + (content "article" "content") + (postamble "footer" "postamble")) + org-html-doctype "html5" + org-html-htmlize-output-type 'css) + +(org-transclusion-add-all) diff --git a/doc/vericert.rst b/doc/vericert.rst new file mode 100644 index 0000000..3c8eaeb --- /dev/null +++ b/doc/vericert.rst @@ -0,0 +1,530 @@ +=============== +Vericert Manual +=============== + + +Introduction +------------ + +Vericert translates C code into a hardware description language called Verilog, which can then be +synthesised into hardware, to be placed onto a field-programmable gate array (FPGA) or +application-specific integrated circuit (ASIC). + +.. _fig:design: + +.. figure:: /_static/images/toolflow.png + + Current design of Vericert, where HTL is an intermediate language representing a finite state + machine with data-path (FSMD) and Verilog is the target language. + +The design shown in Figure `fig:design`_ shows how Vericert leverages an existing verified C +compiler called `CompCert <https://compcert.org/compcert-C.html>`_ to perform this translation. + +.. index:: vericert + +.. _building: + +Building Vericert +----------------- + + +Testing +~~~~~~~ + +To test out ``vericert`` you can try the following examples which are in the test folder using the +following: + +.. code:: shell + + ./bin/vericert test/loop.c -o loop.v + ./bin/vericert test/conditional.c -o conditional.v + ./bin/vericert test/add.c -o add.v + +Or by running the test suite using the following command: + +.. code:: shell + + make test + +.. _using-vericert: + +.. index:: vericert + +Using Vericert +-------------- + +Vericert can be used to translate a subset of C into Verilog. As a simple example, consider the +following C file (``main.c``): + +.. code:: C + + void matrix_multiply(int first[2][2], int second[2][2], int multiply[2][2]) { + int sum = 0; + for (int c = 0; c < 2; c++) { + for (int d = 0; d < 2; d++) { + for (int k = 0; k < 2; k++) { + sum = sum + first[c][k]*second[k][d]; + } + multiply[c][d] = sum; + sum = 0; + } + } + } + + int main() { + int f[2][2] = {{1, 2}, {3, 4}}; + int s[2][2] = {{5, 6}, {7, 8}}; + int m[2][2] = {{0, 0}, {0, 0}}; + + matrix_multiply(f, s, m); + return m[1][1]; + } + +It can be compiled using the following command, assuming that vericert is somewhere on the path. + +.. code:: shell + + vericert main.c -o main.v + +The Verilog file contains a top-level test-bench, which can be given to any Verilog simulator to +simulate the hardware, which should give the same result as executing the C code. Using `Icarus +Verilog <http://iverilog.icarus.com/>`_ as an example: + +.. code:: shell + + iverilog -o main_v main.v + +When executing, it should therefore print the following: + +.. code:: shell + + $ ./main_v + finished: 50 + +This gives the same result as executing the C in the following way: + +.. code:: shell + + $ gcc -o main_c main.c + $ ./main_c + $ echo $? + 50 + +Man pages +~~~~~~~~~ + +.. _unreleased-features: + +Unreleased Features +------------------- + +The following are unreleased features in Vericert that are currently being worked on and have not +been completely proven correct yet. Currently this includes features such as: + +- `scheduling`_, + +- `operation-chaining`_, + +- `if-conversion`_, and + +- `functions`_. + +This page gives some preliminary information on how the features are implemented and how the proofs +for the features are being done. Once these features are properly implemented, they will be added +to the proper documentation. + +.. _scheduling: + +Scheduling +~~~~~~~~~~ + +Scheduling is an optimisation which is used to run various instructions in parallel that are +independent to each other. + +.. _operation-chaining: + +Operation Chaining +~~~~~~~~~~~~~~~~~~ + +Operation chaining is an optimisation that can be added on to scheduling and allows for the +sequential execution of instructions in a clock cycle, while executing other instructions in +parallel in the same clock cycle. + +.. _if-conversion: + +If-conversion +~~~~~~~~~~~~~ + +If-conversion is an optimisation which can turn code with simple control flow into a single block +(called a hyper-block), using predicated instructions. + +.. _functions: + +Functions +~~~~~~~~~ + +Functions are currently only inlined in Vericert, however, we are working on a proper interface to +integrate function calls into the hardware. + +.. _coq-style-guide: + +Coq Style Guide +--------------- + +This style guide was taken from `Silveroak <https://github.com/project-oak/silveroak>`_, it outlines +code style for Coq code in this repository. There are certainly other valid strategies and opinions +on Coq code style; this is laid out purely in the name of consistency. For a visual example of the +style, see the `example`_ at the bottom of this file. + +.. _code-organization: + +Code organization +~~~~~~~~~~~~~~~~~ + +.. _legal-banner: + +Legal banner +^^^^^^^^^^^^ + +- Files should begin with a copyright/license banner, as shown in the example above. + +.. _import-statements: + +Import statements +^^^^^^^^^^^^^^^^^ + +- ``Require Import`` statements should all go at the top of the file, followed by file-wide ``Import`` + statements. + + - =Import=s often contain notations or typeclass instances that might override notations or + instances from another library, so it’s nice to highlight them separately. + +- One ``Require Import`` statement per line; it’s easier to scan that way. + +- ``Require Import`` statements should use “fully-qualified” names (e.g. ``Require Import + Coq.ZArith.ZArith`` instead of ``Require Import ZArith``). + + - Use the ``Locate`` command to find the fully-qualified name! + +- ``Require Import``’s should go in the following order: + + 1. Standard library dependencies (start with ``Coq.``) + + 2. External dependencies (anything outside the current project) + + 3. Same-project dependencies + +- ``Require Import``’s with the same root library (the name before the first ``.``) should be + grouped together. Within each root-library group, they should be in alphabetical order (so + ``Coq.Lists.List`` before ``Coq.ZArith.ZArith``). + +.. _notations-and-scopes: + +Notations and scopes +^^^^^^^^^^^^^^^^^^^^ + +- Any file-wide ``Local Open Scope``’s should come immediately after the =Import=s (see example). + + - Always use ``Local Open Scope``; just ``Open Scope`` will sneakily open the scope for those who + import your file. + +- Put notations in their own separate modules or files, so that those who import your file can + choose whether or not they want the notations. + + - Conflicting notations can cause a lot of headache, so it comes in very handy to leave this + flexibility! + +.. _formatting: + +Formatting +~~~~~~~~~~ + +.. _line-length: + +Line length +^^^^^^^^^^^ + +- Maximum line length 80 characters. + + - Many Coq IDE setups divide the screen in half vertically and use only half to display source + code, so more than 80 characters can be genuinely hard to read on a laptop. + +.. _whitespace-and-indentation: + +Whitespace and indentation +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- No trailing whitespace. + +- Spaces, not tabs. + +- Files should end with a newline. + + - Many editors do this automatically on save. + +- Colons may be either “English-spaced”, with no space before the colon and one space after (``x: + nat``) or “French-spaced”, with one space before and after (``x : nat``). + +- Default indentation is 2 spaces. + + - Keeping this small prevents complex proofs from being indented ridiculously far, and matches IDE + defaults. + +- Use 2-space indents if inserting a line break immediately after: + + - ``Proof.`` + + - ``fun <...> =>`` + + - ``forall <...>,`` + + - ``exists <....>,`` + +- The style for indenting arguments in function application depends on where you make a line + break. If you make the line break immediately after the function name, use a 2-space + indent. However, if you make it after one or more arguments, align the next line with the first + argument: + + .. code:: coq + + (Z.pow + 1 2) + (Z.pow 1 2 3 + 4 5 6) + +- ``Inductive`` cases should not be indented. Example: + + .. code:: coq + + Inductive Foo : Type := + | FooA : Foo + | FooB : Foo + . + +- ``match`` or ``lazymatch`` cases should line up with the “m” in ``match`` or “l” in ``lazymatch``, + as in the following examples: + + .. code:: coq + + match x with + | 3 => true + | _ => false + end. + + lazymatch x with + | 3 => idtac + | _ => fail "Not equal to 3:" x + end. + + repeat match goal with + | _ => progress subst + | _ => reflexivity + end. + + do 2 lazymatch goal with + | |- context [eq] => idtac + end. + +.. _definitions-and-fixpoints: + +Definitions and Fixpoints +~~~~~~~~~~~~~~~~~~~~~~~~~ + +- It’s okay to leave the return type of ``Definition``’s and ``Fixpoint``’s implicit + (e.g. ``Definition x := 5`` instead of ``Definition x : nat := 5``) when the type is very simple + or obvious (for instance, the definition is in a file which deals exclusively with operations on + ``Z``). + +.. _inductives: + +Inductives +~~~~~~~~~~ + +- The ``.`` ending an ``Inductive`` can be either on the same line as the last case or on its own + line immediately below. That is, both of the following are acceptable: + + .. code:: coq + + Inductive Foo : Type := + | FooA : Foo + | FooB : Foo + . + Inductive Foo : Type := + | FooA : Foo + | FooB : Foo. + +.. _lemmatheorem-statements: + +Lemma/Theorem statements +~~~~~~~~~~~~~~~~~~~~~~~~ + +- Generally, use ``Theorem`` for the most important, top-level facts you prove and ``Lemma`` for + everything else. + +- Insert a line break after the colon in the lemma statement. + +- Insert a line break after the comma for ``forall`` or ``exist`` quantifiers. + +- Implication arrows (``->``) should share a line with the previous hypothesis, not the following + one. + +- There is no need to make a line break after every ``->``; short preconditions may share a line. + +.. _proofs-and-tactics: + +Proofs and tactics +~~~~~~~~~~~~~~~~~~ + +- Use the ``Proof`` command (lined up vertically with ``Lemma`` or ``Theorem`` it corresponds to) to + open a proof, and indent the first line after it 2 spaces. + +- Very small proofs (where ``Proof. <tactics> Qed.`` is <= 80 characters) can go all in one line. + +- When ending a proof, align the ending statement (``Qed``, ``Admitted``, etc.) with ``Proof``. + +- Avoid referring to autogenerated names (e.g. ``H0``, ``n0``). It’s okay to let Coq generate these + names, but you should not explicitly refer to them in your proof. So ``intros; my_solver`` is + fine, but ``intros; apply H1; my_solver`` is not fine. + + - You can force a non-autogenerated name by either putting the variable before the colon in the + lemma statement (``Lemma foo x : ...`` instead of ``Lemma foo : forall x, ...``), or by passing + arguments to ``intros`` (e.g. ``intros ? x`` to name the second argument ``x``) + +- This way, the proof won’t break when new hypotheses are added or autogenerated variable names + change. + +- Use curly braces ``{}`` for subgoals, instead of bullets. + +- *Never write tactics with more than one subgoal focused.* This can make the proof very confusing + to step through! If you have more than one subgoal, use curly braces. + +- Consider adding a comment after the opening curly brace that explains what case you’re in (see + example). + + - This is not necessary for small subgoals but can help show the major lines of reasoning in large + proofs. + +- If invoking a tactic that is expected to return multiple subgoals, use ``[ | ... | ]`` before the + ``.`` to explicitly specify how many subgoals you expect. + + - Examples: ``split; [ | ].`` ``induction z; [ | | ].`` + + - This helps make code more maintainable, because it fails immediately if your tactic no longer + solves as many subgoals as expected (or unexpectedly solves more). + +- If invoking a string of tactics (composed by ``;``) that will break the goal into multiple + subgoals and then solve all but one, still use ``[ ]`` to enforce that all but one goal is solved. + + - Example: ``split; try lia; [ ]``. + +- Tactics that consist only of ``repeat``-ing a procedure (e.g. ``repeat match``, ``repeat first``) + should factor out a single step of that procedure a separate tactic called ``<tactic name>_step``, + because the single-step version is much easier to debug. For instance: + + .. code:: coq + + Ltac crush_step := + match goal with + | _ => progress subst + | _ => reflexivity + end. + Ltac crush := repeat crush_step. + +.. _naming: + +Naming +~~~~~~ + +- Helper proofs about standard library datatypes should go in a module that is named to match the + standard library module (see example). + + - This makes the helper proofs look like standard-library ones, which is helpful for categorizing + them if they’re genuinely at the standard-library level of abstraction. + +- Names of modules should start with capital letters. + +- Names of inductives and their constructors should start with capital letters. + +- Names of other definitions/lemmas should be snake case. + +.. _example: + +Example +~~~~~~~ + +A small standalone Coq file that exhibits many of the style points. + +.. code:: coq + + (* + * Vericert: Verified high-level synthesis. + * Copyright (C) 2021 Name <email@example.com> + * + * <License...> + *) + + Require Import Coq.Lists.List. + Require Import Coq.micromega.Lia. + Require Import Coq.ZArith.ZArith. + Import ListNotations. + Local Open Scope Z_scope. + + (* Helper proofs about standard library integers (Z) go within [Module Z] so + that they match standard-library Z lemmas when used. *) + Module Z. + Lemma pow_3_r x : x ^ 3 = x * x * x. + Proof. lia. Qed. (* very short proofs can go all on one line *) + + Lemma pow_4_r x : x ^ 4 = x * x * x * x. + Proof. + change 4 with (Z.succ (Z.succ (Z.succ (Z.succ 0)))). + repeat match goal with + | _ => rewrite Z.pow_1_r + | _ => rewrite Z.pow_succ_r by lia + | |- context [x * (?a * ?b)] => + replace (x * (a * b)) with (a * b * x) by lia + | _ => reflexivity + end. + Qed. + End Z. + (* Now we can access the lemmas above as Z.pow_3_r and Z.pow_4_r, as if they + were in the ZArith library! *) + + Definition bar (x y : Z) := x ^ (y + 1). + + (* example with a painfully manual proof to show case formatting *) + Lemma bar_upper_bound : + forall x y a, + 0 <= x <= a -> 0 <= y -> + 0 <= bar x y <= a ^ (y + 1). + Proof. + (* avoid referencing autogenerated names by explicitly naming variables *) + intros x y a Hx Hy. revert y Hy x a Hx. + (* explicitly indicate # subgoals with [ | ... | ] if > 1 *) + cbv [bar]; refine (natlike_ind _ _ _); [ | ]. + { (* y = 0 *) + intros; lia. } + { (* y = Z.succ _ *) + intros. + rewrite Z.add_succ_l, Z.pow_succ_r by lia. + split. + { (* 0 <= bar x y *) + apply Z.mul_nonneg_nonneg; [ lia | ]. + apply Z.pow_nonneg; lia. } + { (* bar x y < a ^ y *) + rewrite Z.pow_succ_r by lia. + apply Z.mul_le_mono_nonneg; try lia; + [ apply Z.pow_nonneg; lia | ]. + (* For more flexible proofs, use match statements to find hypotheses + rather than referring to them by autogenerated names like H0. In this + case, we'll take any hypothesis that applies to and then solves the + goal. *) + match goal with H : _ |- _ => apply H; solve [auto] end. } } + Qed. + + (* Put notations in a separate module or file so that importers can + decide whether or not to use them. *) + Module BarNotations. + Infix "#" := bar (at level 40) : Z_scope. + Notation "x '##'" := (bar x x) (at level 40) : Z_scope. + End BarNotations. |