aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrygve Laugstøl <trygvis@inamo.no>2016-08-10 02:16:02 +0200
committerTrygve Laugstøl <trygvis@inamo.no>2016-08-10 02:16:02 +0200
commit1dadec53a7a61eae9d37ba2aabf96efea1ad0ac9 (patch)
tree0c09a731271c3a714534556ed36cf2843064d2ff
parentfd0e6e3aa0e7523a36011a2f0264737772aa5e24 (diff)
downloadkicad-utils-1dadec53a7a61eae9d37ba2aabf96efea1ad0ac9.tar.gz
kicad-utils-1dadec53a7a61eae9d37ba2aabf96efea1ad0ac9.tar.bz2
kicad-utils-1dadec53a7a61eae9d37ba2aabf96efea1ad0ac9.tar.xz
kicad-utils-1dadec53a7a61eae9d37ba2aabf96efea1ad0ac9.zip
templates: nodemcu-arduino: better symbol names.
o Adding some documentation to the readme. Adding a small flow chart illustrating how the tool work with a schematic, netlist and template to generate a header file.
-rw-r--r--.gitmodules3
-rw-r--r--CMakeLists.txt1
-rw-r--r--README.md76
-rw-r--r--cli/generate-header.cpp2
-rw-r--r--doc/CMakeLists.txt24
-rw-r--r--doc/flow.svg235
-rw-r--r--doc/flow.tikz29
-rw-r--r--doc/template-qtikz.tex15
-rw-r--r--doc/template-tex.tex15
-rw-r--r--kicad/kicad-utils.pro32
-rw-r--r--templates/nodemcu-arduino.py28
m---------thirdparty/antlr40
12 files changed, 445 insertions, 15 deletions
diff --git a/.gitmodules b/.gitmodules
index 83b6a4d..50c8663 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -5,3 +5,6 @@
[submodule "python/pybind11"]
path = python/pybind11
url = https://github.com/pybind/pybind11
+[submodule "thirdparty/antlr4"]
+ path = thirdparty/antlr4
+ url = https://github.com/trygvis/antlr4
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3b4c6e1..58d3aa4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -8,5 +8,6 @@ add_compile_options(-Wextra)
add_subdirectory(core)
add_subdirectory(python)
add_subdirectory(cli)
+add_subdirectory(doc)
#add_subdirectory(examples)
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..af174b6
--- /dev/null
+++ b/README.md
@@ -0,0 +1,76 @@
+Kicad utils contains utilities for automating your Kicad workflow.
+
+# generate-header
+
+Generate header is a tool to generate header files from your schematics to ensure that your schematic and
+pin mapping always is correct.
+
+![flow]
+
+[flow]: doc/flow.svg "Flow with generate-header"
+
+## Command line usage
+
+You can use the generate-header tool as a standalone command line tool like this:
+
+ generate-header -n schematic/foo.net -r U1 -t intel-quark-d2000 -o firmware/schematic.h
+
+The usage is summarized like this:
+
+ usage: generate-header -n <net file> -r <ref> -t <template> [-l <template lib dir>] [-o <out file>]
+
+## CMake integration
+
+Put this in your `CMakeLists.txt`:
+
+ find_package(KicadUtils)
+
+ kicad_generate_header(
+ OUTPUT schematic.h
+ NET schematic/intel-quark-d2000.net
+ REF U1
+ TEMPLATE intel-quark-d2000)
+
+and `schematic.h` will automatically be generated. CMake now knows that `schematic.h` is generated and depends on
+`schematic/intel-quark-d2000.net`.
+
+# Templates
+
+The templates are simply Python files that map from the part's pin number to a platform-specific symbol. The
+`kicad-utils` KiCAD library contains parts with pins that act as documentation for what the pins mean. If you don't use
+the `kicad-utils` library, make sure that your pin usage matches what is used in the library.
+
+For example the `nodemcu-arduino` template will assume that the part follows the pin ordering and usage for the
+`NODEMCU` part in the library and that it used the Arduino IDE with the ESP8266 board package. The generated header file
+will look like this:
+
+ namespace schematic {
+
+ static const int AD0 = D0;
+ ...
+ }
+
+
+# Building
+
+## Antlr4
+
+Kicad utils needs a fork of Antlr4 with better CMake support.
+
+ mkdir thirdparty/antlr4/build
+ cd thirdparty/antlr4/build
+ cmake .. \
+ -DCMAKE_INSTALL_PREFIX=$HOME/opt/antlr4-cpp
+ make
+ make install
+
+## Kicad utils
+
+ mkdir build
+ cd build
+ cmake .. \
+ -DAntlr4_DIR=$HOME/opt/antlr4-cpp/lib/cmake/Antlr4 \
+ -DCMAKE_INSTALL_PREFIX=$HOME/opt/kicad-utils \
+ -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=YES
+ make
+ make install
diff --git a/cli/generate-header.cpp b/cli/generate-header.cpp
index 3ff39f6..bc02277 100644
--- a/cli/generate-header.cpp
+++ b/cli/generate-header.cpp
@@ -35,7 +35,7 @@ char *program;
__attribute__((noreturn))
void usage(const char *reason = nullptr) {
if (reason) {
- fprintf(stderr, "%s\n", reason);
+ fprintf(stderr, "error: %s\n", reason);
}
fprintf(stderr, "usage: %s -n <net file> -r <ref> -t <template> [-l <template lib dir>] [-o <out file>]\n",
program);
diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt
new file mode 100644
index 0000000..9c7fdb7
--- /dev/null
+++ b/doc/CMakeLists.txt
@@ -0,0 +1,24 @@
+function(add_tikz_target TIKZ_FILE TEMPLATE)
+ get_filename_component(basename ${TIKZ_FILE} NAME_WE)
+ set(pdf_file "${basename}.pdf")
+ set(svg_file "${basename}.svg")
+
+ add_custom_command(OUTPUT ${pdf_file}
+ COMMAND echo "'\\def\\\\tikzfile{${CMAKE_CURRENT_SOURCE_DIR}/${TIKZ_FILE}}'" > tmp.tex
+ COMMAND echo "'\\input{${CMAKE_CURRENT_SOURCE_DIR}/template-tex.tex}}'" >> tmp.tex
+ COMMAND pdflatex -jobname ${basename} -file-line-error -interaction nonstopmode tmp.tex >/dev/null
+ COMMAND cmake -E remove tmp.tex
+ MAIN_DEPENDENCY ${TIKZ_FILE}
+ COMMENT "Generating ${pdf_file}"
+ )
+
+ add_custom_command(OUTPUT ${svg_file}
+ COMMAND pdf2svg ${pdf_file} ${svg_file}
+ COMMAND cmake -E copy_if_different ${svg_file} ${CMAKE_CURRENT_SOURCE_DIR}/${svg_file}
+ MAIN_DEPENDENCY ${pdf_file}
+ COMMENT "Generating ${svg_file}"
+ )
+endfunction()
+
+add_tikz_target(flow.tikz template-qtikz.tex)
+add_custom_target(doc DEPENDS flow.svg)
diff --git a/doc/flow.svg b/doc/flow.svg
new file mode 100644
index 0000000..688e300
--- /dev/null
+++ b/doc/flow.svg
@@ -0,0 +1,235 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="189.797pt" height="379.399pt" viewBox="0 0 189.797 379.399" version="1.1">
+<defs>
+<g>
+<symbol overflow="visible" id="glyph0-0">
+<path style="stroke:none;" d=""/>
+</symbol>
+<symbol overflow="visible" id="glyph0-1">
+<path style="stroke:none;" d="M 2.328125 -1.75 C 1.78125 -1.75 1.359375 -2.21875 1.359375 -2.75 C 1.359375 -3.3125 1.796875 -3.765625 2.328125 -3.765625 C 2.859375 -3.765625 3.28125 -3.296875 3.28125 -2.765625 C 3.28125 -2.1875 2.84375 -1.75 2.328125 -1.75 Z M 1.421875 -1.40625 C 1.453125 -1.390625 1.828125 -1.15625 2.328125 -1.15625 C 3.234375 -1.15625 3.96875 -1.875 3.96875 -2.765625 C 3.96875 -3.0625 3.875 -3.34375 3.703125 -3.625 C 3.921875 -3.75 4.15625 -3.78125 4.28125 -3.796875 C 4.34375 -3.53125 4.578125 -3.453125 4.671875 -3.453125 C 4.84375 -3.453125 5.078125 -3.578125 5.078125 -3.875 C 5.078125 -4.09375 4.890625 -4.40625 4.34375 -4.40625 C 4.234375 -4.40625 3.75 -4.390625 3.296875 -4.0625 C 3.125 -4.171875 2.78125 -4.359375 2.328125 -4.359375 C 1.390625 -4.359375 0.671875 -3.609375 0.671875 -2.765625 C 0.671875 -2.328125 0.84375 -2 1 -1.8125 C 0.890625 -1.65625 0.796875 -1.4375 0.796875 -1.140625 C 0.796875 -0.78125 0.9375 -0.53125 1.03125 -0.421875 C 0.296875 0.03125 0.296875 0.703125 0.296875 0.8125 C 0.296875 1.671875 1.328125 2.28125 2.609375 2.28125 C 3.890625 2.28125 4.9375 1.671875 4.9375 0.8125 C 4.9375 0.453125 4.75 -0.046875 4.25 -0.3125 C 4.109375 -0.390625 3.703125 -0.609375 2.796875 -0.609375 L 2.109375 -0.609375 C 2.03125 -0.609375 1.890625 -0.609375 1.8125 -0.625 C 1.671875 -0.625 1.609375 -0.625 1.484375 -0.765625 C 1.375 -0.90625 1.359375 -1.109375 1.359375 -1.125 C 1.359375 -1.171875 1.390625 -1.3125 1.421875 -1.40625 Z M 2.609375 1.6875 C 1.609375 1.6875 0.875 1.25 0.875 0.8125 C 0.875 0.640625 0.953125 0.3125 1.28125 0.125 C 1.53125 -0.046875 1.609375 -0.046875 2.34375 -0.046875 C 3.234375 -0.046875 4.359375 -0.046875 4.359375 0.8125 C 4.359375 1.25 3.609375 1.6875 2.609375 1.6875 Z M 2.609375 1.6875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-2">
+<path style="stroke:none;" d="M 4.234375 -1.90625 C 4.4375 -1.90625 4.625 -1.90625 4.625 -2.265625 C 4.625 -3.40625 3.984375 -4.390625 2.6875 -4.390625 C 1.5 -4.390625 0.546875 -3.390625 0.546875 -2.15625 C 0.546875 -0.953125 1.5625 0.0625 2.84375 0.0625 C 4.15625 0.0625 4.625 -0.84375 4.625 -1.09375 C 4.625 -1.359375 4.34375 -1.359375 4.28125 -1.359375 C 4.09375 -1.359375 4.015625 -1.328125 3.953125 -1.140625 C 3.734375 -0.640625 3.1875 -0.546875 2.90625 -0.546875 C 2.15625 -0.546875 1.421875 -1.046875 1.25 -1.90625 Z M 1.265625 -2.5 C 1.40625 -3.234375 2 -3.78125 2.6875 -3.78125 C 3.203125 -3.78125 3.828125 -3.53125 3.921875 -2.5 Z M 1.265625 -2.5 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-3">
+<path style="stroke:none;" d="M 1.65625 -3.828125 C 1.65625 -4.140625 1.65625 -4.296875 1.25 -4.296875 L 0.53125 -4.296875 C 0.375 -4.296875 0.125 -4.296875 0.125 -3.984375 C 0.125 -3.6875 0.375 -3.6875 0.515625 -3.6875 L 0.96875 -3.6875 L 0.96875 -0.609375 L 0.53125 -0.609375 C 0.375 -0.609375 0.125 -0.609375 0.125 -0.296875 C 0.125 0 0.375 0 0.515625 0 L 2.109375 0 C 2.25 0 2.5 0 2.5 -0.296875 C 2.5 -0.609375 2.25 -0.609375 2.09375 -0.609375 L 1.65625 -0.609375 L 1.65625 -2.375 C 1.65625 -3.375 2.390625 -3.75 2.90625 -3.75 C 3.421875 -3.75 3.5625 -3.46875 3.5625 -2.875 L 3.5625 -0.609375 L 3.1875 -0.609375 C 3.015625 -0.609375 2.765625 -0.609375 2.765625 -0.296875 C 2.765625 0 3.046875 0 3.1875 0 L 4.703125 0 C 4.84375 0 5.109375 0 5.109375 -0.296875 C 5.109375 -0.609375 4.859375 -0.609375 4.6875 -0.609375 L 4.25 -0.609375 L 4.25 -2.921875 C 4.25 -3.921875 3.75 -4.359375 2.953125 -4.359375 C 2.296875 -4.359375 1.84375 -4.015625 1.65625 -3.828125 Z M 1.65625 -3.828125 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-4">
+<path style="stroke:none;" d="M 2.21875 -1.859375 C 2.21875 -2.796875 2.796875 -3.75 4 -3.75 C 4.015625 -3.515625 4.1875 -3.3125 4.4375 -3.3125 C 4.65625 -3.3125 4.859375 -3.46875 4.859375 -3.734375 C 4.859375 -3.9375 4.734375 -4.359375 3.90625 -4.359375 C 3.40625 -4.359375 2.765625 -4.171875 2.21875 -3.546875 L 2.21875 -3.890625 C 2.21875 -4.203125 2.15625 -4.296875 1.8125 -4.296875 L 0.71875 -4.296875 C 0.5625 -4.296875 0.3125 -4.296875 0.3125 -4 C 0.3125 -3.6875 0.5625 -3.6875 0.71875 -3.6875 L 1.53125 -3.6875 L 1.53125 -0.609375 L 0.71875 -0.609375 C 0.5625 -0.609375 0.3125 -0.609375 0.3125 -0.3125 C 0.3125 0 0.5625 0 0.71875 0 L 3.3125 0 C 3.46875 0 3.734375 0 3.734375 -0.296875 C 3.734375 -0.609375 3.46875 -0.609375 3.3125 -0.609375 L 2.21875 -0.609375 Z M 2.21875 -1.859375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-5">
+<path style="stroke:none;" d="M 3.65625 -0.3125 C 3.875 -0.015625 4.34375 0 4.71875 0 C 5 0 5.21875 0 5.21875 -0.3125 C 5.21875 -0.609375 4.96875 -0.609375 4.828125 -0.609375 C 4.40625 -0.609375 4.3125 -0.65625 4.234375 -0.6875 L 4.234375 -2.84375 C 4.234375 -3.546875 3.6875 -4.390625 2.25 -4.390625 C 1.828125 -4.390625 0.8125 -4.390625 0.8125 -3.65625 C 0.8125 -3.359375 1.015625 -3.203125 1.25 -3.203125 C 1.40625 -3.203125 1.6875 -3.296875 1.6875 -3.65625 C 1.6875 -3.734375 1.703125 -3.75 1.90625 -3.765625 C 2.046875 -3.78125 2.171875 -3.78125 2.265625 -3.78125 C 3.015625 -3.78125 3.53125 -3.46875 3.53125 -2.765625 C 1.78125 -2.734375 0.546875 -2.234375 0.546875 -1.28125 C 0.546875 -0.59375 1.171875 0.0625 2.1875 0.0625 C 2.5625 0.0625 3.1875 -0.015625 3.65625 -0.3125 Z M 3.53125 -2.171875 L 3.53125 -1.328125 C 3.53125 -1.109375 3.53125 -0.890625 3.15625 -0.71875 C 2.796875 -0.546875 2.34375 -0.546875 2.265625 -0.546875 C 1.640625 -0.546875 1.234375 -0.890625 1.234375 -1.28125 C 1.234375 -1.765625 2.09375 -2.140625 3.53125 -2.171875 Z M 3.53125 -2.171875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-6">
+<path style="stroke:none;" d="M 2.21875 -3.6875 L 3.84375 -3.6875 C 4 -3.6875 4.25 -3.6875 4.25 -3.984375 C 4.25 -4.296875 4 -4.296875 3.84375 -4.296875 L 2.21875 -4.296875 L 2.21875 -5.109375 C 2.21875 -5.296875 2.21875 -5.515625 1.875 -5.515625 C 1.53125 -5.515625 1.53125 -5.3125 1.53125 -5.109375 L 1.53125 -4.296875 L 0.65625 -4.296875 C 0.5 -4.296875 0.25 -4.296875 0.25 -3.984375 C 0.25 -3.6875 0.5 -3.6875 0.640625 -3.6875 L 1.53125 -3.6875 L 1.53125 -1.25 C 1.53125 -0.296875 2.203125 0.0625 2.9375 0.0625 C 3.671875 0.0625 4.46875 -0.375 4.46875 -1.25 C 4.46875 -1.4375 4.46875 -1.640625 4.125 -1.640625 C 3.796875 -1.640625 3.78125 -1.4375 3.78125 -1.265625 C 3.78125 -0.640625 3.203125 -0.546875 2.984375 -0.546875 C 2.21875 -0.546875 2.21875 -1.0625 2.21875 -1.3125 Z M 2.21875 -3.6875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-7">
+<path style="stroke:none;" d="M 4.203125 -2.703125 C 4.3125 -2.703125 4.671875 -2.703125 4.671875 -3.046875 C 4.671875 -3.40625 4.3125 -3.40625 4.203125 -3.40625 L 1.03125 -3.40625 C 0.90625 -3.40625 0.5625 -3.40625 0.5625 -3.046875 C 0.5625 -2.703125 0.90625 -2.703125 1.03125 -2.703125 Z M 4.203125 -2.703125 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-8">
+<path style="stroke:none;" d="M 4.25 -2.921875 C 4.25 -3.921875 3.75 -4.359375 2.953125 -4.359375 C 2.296875 -4.359375 1.84375 -4.015625 1.65625 -3.828125 L 1.65625 -5.6875 C 1.65625 -5.984375 1.59375 -6.09375 1.25 -6.09375 L 0.53125 -6.09375 C 0.375 -6.09375 0.125 -6.09375 0.125 -5.78125 C 0.125 -5.484375 0.375 -5.484375 0.515625 -5.484375 L 0.96875 -5.484375 L 0.96875 -0.609375 L 0.53125 -0.609375 C 0.375 -0.609375 0.125 -0.609375 0.125 -0.296875 C 0.125 0 0.375 0 0.515625 0 L 2.109375 0 C 2.25 0 2.5 0 2.5 -0.296875 C 2.5 -0.609375 2.25 -0.609375 2.09375 -0.609375 L 1.65625 -0.609375 L 1.65625 -2.375 C 1.65625 -3.375 2.390625 -3.75 2.90625 -3.75 C 3.421875 -3.75 3.5625 -3.46875 3.5625 -2.875 L 3.5625 -0.609375 L 3.1875 -0.609375 C 3.015625 -0.609375 2.765625 -0.609375 2.765625 -0.296875 C 2.765625 0 3.046875 0 3.1875 0 L 4.703125 0 C 4.84375 0 5.109375 0 5.109375 -0.296875 C 5.109375 -0.609375 4.859375 -0.609375 4.6875 -0.609375 L 4.25 -0.609375 Z M 4.25 -2.921875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-9">
+<path style="stroke:none;" d="M 3.5625 -0.5 C 3.5625 -0.140625 3.5625 0 3.96875 0 L 4.6875 0 C 4.859375 0 5.109375 0 5.109375 -0.3125 C 5.109375 -0.609375 4.84375 -0.609375 4.703125 -0.609375 L 4.25 -0.609375 L 4.25 -5.6875 C 4.25 -5.984375 4.203125 -6.09375 3.859375 -6.09375 L 3.125 -6.09375 C 2.96875 -6.09375 2.71875 -6.09375 2.71875 -5.78125 C 2.71875 -5.484375 2.984375 -5.484375 3.125 -5.484375 L 3.5625 -5.484375 L 3.5625 -3.90625 C 3.234375 -4.203125 2.828125 -4.359375 2.40625 -4.359375 C 1.3125 -4.359375 0.359375 -3.40625 0.359375 -2.140625 C 0.359375 -0.90625 1.25 0.0625 2.3125 0.0625 C 2.875 0.0625 3.296875 -0.203125 3.5625 -0.5 Z M 3.5625 -2.640625 L 3.5625 -1.9375 C 3.5625 -1.375 3.125 -0.546875 2.359375 -0.546875 C 1.640625 -0.546875 1.046875 -1.25 1.046875 -2.140625 C 1.046875 -3.09375 1.75 -3.75 2.4375 -3.75 C 3.078125 -3.75 3.5625 -3.1875 3.5625 -2.640625 Z M 3.5625 -2.640625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-10">
+<path style="stroke:none;" d="M 2.515625 -3.6875 L 3.734375 -3.6875 C 3.890625 -3.6875 4.140625 -3.6875 4.140625 -3.984375 C 4.140625 -4.296875 3.890625 -4.296875 3.734375 -4.296875 L 2.515625 -4.296875 L 2.515625 -4.765625 C 2.515625 -5.546875 3.1875 -5.546875 3.484375 -5.546875 C 3.484375 -5.5 3.578125 -5.109375 3.921875 -5.109375 C 4.125 -5.109375 4.359375 -5.28125 4.359375 -5.546875 C 4.359375 -6.15625 3.5625 -6.15625 3.40625 -6.15625 C 2.609375 -6.15625 1.828125 -5.6875 1.828125 -4.828125 L 1.828125 -4.296875 L 0.84375 -4.296875 C 0.671875 -4.296875 0.421875 -4.296875 0.421875 -3.984375 C 0.421875 -3.6875 0.671875 -3.6875 0.828125 -3.6875 L 1.828125 -3.6875 L 1.828125 -0.609375 L 0.828125 -0.609375 C 0.671875 -0.609375 0.421875 -0.609375 0.421875 -0.3125 C 0.421875 0 0.671875 0 0.828125 0 L 3.53125 0 C 3.671875 0 3.9375 0 3.9375 -0.296875 C 3.9375 -0.609375 3.671875 -0.609375 3.53125 -0.609375 L 2.515625 -0.609375 Z M 2.515625 -3.6875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-11">
+<path style="stroke:none;" d="M 4.65625 -2.15625 C 4.65625 -3.40625 3.734375 -4.390625 2.609375 -4.390625 C 1.5 -4.390625 0.5625 -3.40625 0.5625 -2.15625 C 0.5625 -0.890625 1.515625 0.0625 2.609375 0.0625 C 3.703125 0.0625 4.65625 -0.890625 4.65625 -2.15625 Z M 2.609375 -0.546875 C 1.875 -0.546875 1.25 -1.296875 1.25 -2.21875 C 1.25 -3.125 1.90625 -3.78125 2.609375 -3.78125 C 3.328125 -3.78125 3.96875 -3.125 3.96875 -2.21875 C 3.96875 -1.296875 3.34375 -0.546875 2.609375 -0.546875 Z M 2.609375 -0.546875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-12">
+<path style="stroke:none;" d="M 3.234375 -0.625 C 3.234375 -0.984375 2.9375 -1.25 2.625 -1.25 C 2.25 -1.25 2 -0.9375 2 -0.625 C 2 -0.265625 2.296875 0 2.609375 0 C 2.984375 0 3.234375 -0.3125 3.234375 -0.625 Z M 3.234375 -0.625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-13">
+<path style="stroke:none;" d="M 2.96875 -2.546875 C 2.734375 -2.578125 2.546875 -2.609375 2.296875 -2.65625 C 2 -2.703125 1.328125 -2.828125 1.328125 -3.203125 C 1.328125 -3.46875 1.640625 -3.78125 2.59375 -3.78125 C 3.421875 -3.78125 3.5625 -3.484375 3.59375 -3.21875 C 3.59375 -3.046875 3.625 -2.875 3.921875 -2.875 C 4.28125 -2.875 4.28125 -3.09375 4.28125 -3.296875 L 4.28125 -3.984375 C 4.28125 -4.140625 4.28125 -4.390625 3.984375 -4.390625 C 3.734375 -4.390625 3.703125 -4.25 3.671875 -4.171875 C 3.234375 -4.390625 2.796875 -4.390625 2.609375 -4.390625 C 0.953125 -4.390625 0.71875 -3.5625 0.71875 -3.203125 C 0.71875 -2.296875 1.765625 -2.125 2.6875 -1.984375 C 3.171875 -1.90625 3.96875 -1.78125 3.96875 -1.25 C 3.96875 -0.875 3.59375 -0.546875 2.6875 -0.546875 C 2.21875 -0.546875 1.671875 -0.65625 1.421875 -1.4375 C 1.359375 -1.609375 1.328125 -1.71875 1.0625 -1.71875 C 0.71875 -1.71875 0.71875 -1.515625 0.71875 -1.3125 L 0.71875 -0.34375 C 0.71875 -0.1875 0.71875 0.0625 1.015625 0.0625 C 1.109375 0.0625 1.265625 0.046875 1.390625 -0.3125 C 1.875 0.046875 2.40625 0.0625 2.6875 0.0625 C 4.25 0.0625 4.578125 -0.765625 4.578125 -1.25 C 4.578125 -2.28125 3.296875 -2.5 2.96875 -2.546875 Z M 2.96875 -2.546875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-14">
+<path style="stroke:none;" d="M 4.640625 -1.09375 C 4.640625 -1.359375 4.359375 -1.359375 4.296875 -1.359375 C 4.140625 -1.359375 4.03125 -1.34375 3.96875 -1.140625 C 3.90625 -1.015625 3.71875 -0.546875 2.984375 -0.546875 C 2.140625 -0.546875 1.421875 -1.25 1.421875 -2.15625 C 1.421875 -2.625 1.6875 -3.78125 3.046875 -3.78125 C 3.25 -3.78125 3.640625 -3.78125 3.640625 -3.6875 C 3.65625 -3.34375 3.84375 -3.203125 4.078125 -3.203125 C 4.3125 -3.203125 4.53125 -3.375 4.53125 -3.65625 C 4.53125 -4.390625 3.484375 -4.390625 3.046875 -4.390625 C 1.328125 -4.390625 0.734375 -3.03125 0.734375 -2.15625 C 0.734375 -0.953125 1.671875 0.0625 2.921875 0.0625 C 4.3125 0.0625 4.640625 -0.921875 4.640625 -1.09375 Z M 4.640625 -1.09375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-15">
+<path style="stroke:none;" d="M 1.09375 -4 C 1.0625 -4.296875 0.875 -4.296875 0.6875 -4.296875 L 0.375 -4.296875 C 0.21875 -4.296875 -0.046875 -4.296875 -0.046875 -4 C -0.046875 -3.6875 0.171875 -3.6875 0.53125 -3.6875 L 0.53125 -0.609375 C 0.171875 -0.609375 -0.046875 -0.609375 -0.046875 -0.296875 C -0.046875 0 0.234375 0 0.375 0 L 1.25 0 C 1.390625 0 1.65625 0 1.65625 -0.296875 C 1.65625 -0.609375 1.453125 -0.609375 1.09375 -0.609375 L 1.09375 -2.390625 C 1.09375 -3.28125 1.5 -3.75 1.90625 -3.75 C 2.140625 -3.75 2.265625 -3.578125 2.265625 -2.9375 L 2.265625 -0.609375 C 2.078125 -0.609375 1.828125 -0.609375 1.828125 -0.296875 C 1.828125 0 2.109375 0 2.25 0 L 2.984375 0 C 3.140625 0 3.40625 0 3.40625 -0.296875 C 3.40625 -0.609375 3.1875 -0.609375 2.828125 -0.609375 L 2.828125 -2.390625 C 2.828125 -3.28125 3.234375 -3.75 3.65625 -3.75 C 3.875 -3.75 4.015625 -3.578125 4.015625 -2.9375 L 4.015625 -0.609375 C 3.828125 -0.609375 3.578125 -0.609375 3.578125 -0.296875 C 3.578125 0 3.84375 0 3.984375 0 L 4.734375 0 C 4.890625 0 5.140625 0 5.140625 -0.296875 C 5.140625 -0.609375 4.9375 -0.609375 4.578125 -0.609375 L 4.578125 -3.015625 C 4.578125 -3.21875 4.578125 -4.359375 3.6875 -4.359375 C 3.390625 -4.359375 2.984375 -4.234375 2.703125 -3.84375 C 2.546875 -4.171875 2.265625 -4.359375 1.9375 -4.359375 C 1.625 -4.359375 1.328125 -4.21875 1.09375 -4 Z M 1.09375 -4 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-16">
+<path style="stroke:none;" d="M 4.28125 -3.6875 L 4.578125 -3.6875 C 4.734375 -3.6875 4.984375 -3.6875 4.984375 -3.984375 C 4.984375 -4.296875 4.75 -4.296875 4.578125 -4.296875 L 3.421875 -4.296875 C 3.265625 -4.296875 3.015625 -4.296875 3.015625 -4 C 3.015625 -3.6875 3.265625 -3.6875 3.421875 -3.6875 L 3.703125 -3.6875 L 2.984375 -1.5625 C 2.84375 -1.203125 2.796875 -1.015625 2.71875 -0.703125 C 2.65625 -0.890625 2.578125 -1.109375 2.5 -1.296875 L 1.578125 -3.6875 L 1.828125 -3.6875 C 1.96875 -3.6875 2.21875 -3.6875 2.21875 -3.984375 C 2.21875 -4.296875 1.984375 -4.296875 1.828125 -4.296875 L 0.65625 -4.296875 C 0.5 -4.296875 0.265625 -4.296875 0.265625 -3.984375 C 0.265625 -3.6875 0.515625 -3.6875 0.65625 -3.6875 L 0.96875 -3.6875 L 2.375 -0.125 C 2.421875 -0.03125 2.421875 -0.015625 2.421875 0 C 2.421875 0.015625 2.171875 0.84375 2.046875 1.09375 C 1.75 1.640625 1.390625 1.65625 1.25 1.671875 C 1.25 1.65625 1.296875 1.578125 1.296875 1.453125 C 1.296875 1.203125 1.109375 1.015625 0.875 1.015625 C 0.59375 1.015625 0.421875 1.203125 0.421875 1.453125 C 0.421875 1.875 0.765625 2.265625 1.25 2.265625 C 2.25 2.265625 2.703125 0.953125 2.734375 0.84375 Z M 4.28125 -3.6875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-17">
+<path style="stroke:none;" d="M 1.65625 -2.625 C 1.65625 -3.21875 2.234375 -3.75 2.859375 -3.75 C 3.59375 -3.75 4.171875 -3.015625 4.171875 -2.15625 C 4.171875 -1.203125 3.484375 -0.546875 2.78125 -0.546875 C 2 -0.546875 1.65625 -1.421875 1.65625 -1.90625 Z M 1.65625 -0.453125 C 2.0625 -0.03125 2.5 0.0625 2.8125 0.0625 C 3.890625 0.0625 4.859375 -0.890625 4.859375 -2.15625 C 4.859375 -3.375 3.984375 -4.359375 2.921875 -4.359375 C 2.4375 -4.359375 2 -4.171875 1.65625 -3.875 C 1.65625 -4.15625 1.640625 -4.296875 1.25 -4.296875 L 0.53125 -4.296875 C 0.375 -4.296875 0.125 -4.296875 0.125 -3.984375 C 0.125 -3.6875 0.375 -3.6875 0.515625 -3.6875 L 0.96875 -3.6875 L 0.96875 1.609375 L 0.53125 1.609375 C 0.375 1.609375 0.125 1.609375 0.125 1.90625 C 0.125 2.21875 0.375 2.21875 0.515625 2.21875 L 2.109375 2.21875 C 2.25 2.21875 2.5 2.21875 2.5 1.90625 C 2.5 1.609375 2.25 1.609375 2.09375 1.609375 L 1.65625 1.609375 Z M 1.65625 -0.453125 "/>
+</symbol>
+<symbol overflow="visible" id="glyph0-18">
+<path style="stroke:none;" d="M 2.953125 -5.6875 C 2.953125 -5.984375 2.90625 -6.09375 2.5625 -6.09375 L 0.984375 -6.09375 C 0.828125 -6.09375 0.578125 -6.09375 0.578125 -5.78125 C 0.578125 -5.484375 0.84375 -5.484375 0.984375 -5.484375 L 2.265625 -5.484375 L 2.265625 -0.609375 L 0.984375 -0.609375 C 0.828125 -0.609375 0.578125 -0.609375 0.578125 -0.296875 C 0.578125 0 0.84375 0 0.984375 0 L 4.25 0 C 4.40625 0 4.65625 0 4.65625 -0.296875 C 4.65625 -0.609375 4.421875 -0.609375 4.25 -0.609375 L 2.953125 -0.609375 Z M 2.953125 -5.6875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-0">
+<path style="stroke:none;" d=""/>
+</symbol>
+<symbol overflow="visible" id="glyph1-1">
+<path style="stroke:none;" d="M 2.1875 -6.921875 L 0.953125 -6.921875 L 0.953125 0 L 1.734375 0 L 1.734375 -6.203125 L 1.75 -6.203125 C 1.9375 -5.796875 2.359375 -4.953125 2.40625 -4.84375 L 4.859375 0 L 6.09375 0 L 6.09375 -6.921875 L 5.3125 -6.921875 L 5.3125 -0.703125 L 5.296875 -0.703125 C 5.109375 -1.109375 4.6875 -1.96875 4.640625 -2.078125 Z M 2.1875 -6.921875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-2">
+<path style="stroke:none;" d="M 4.125 -2.1875 C 4.125 -2.515625 4.109375 -3.265625 3.734375 -3.875 C 3.3125 -4.484375 2.71875 -4.59375 2.359375 -4.59375 C 1.25 -4.59375 0.34375 -3.53125 0.34375 -2.25 C 0.34375 -0.9375 1.3125 0.109375 2.5 0.109375 C 3.125 0.109375 3.703125 -0.125 4.09375 -0.40625 L 4.03125 -1.0625 C 3.40625 -0.53125 2.734375 -0.5 2.515625 -0.5 C 1.71875 -0.5 1.078125 -1.203125 1.046875 -2.1875 Z M 1.09375 -2.734375 C 1.25 -3.484375 1.78125 -3.984375 2.359375 -3.984375 C 2.875 -3.984375 3.421875 -3.65625 3.5625 -2.734375 Z M 1.09375 -2.734375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-3">
+<path style="stroke:none;" d="M 1.75 -3.84375 L 3.15625 -3.84375 L 3.15625 -4.421875 L 1.75 -4.421875 L 1.75 -5.6875 L 1.0625 -5.6875 L 1.0625 -4.421875 L 0.1875 -4.421875 L 0.1875 -3.84375 L 1.03125 -3.84375 L 1.03125 -1.1875 C 1.03125 -0.59375 1.171875 0.109375 1.859375 0.109375 C 2.546875 0.109375 3.0625 -0.140625 3.3125 -0.265625 L 3.15625 -0.859375 C 2.890625 -0.640625 2.578125 -0.53125 2.25 -0.53125 C 1.890625 -0.53125 1.75 -0.828125 1.75 -1.359375 Z M 1.75 -3.84375 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-4">
+<path style="stroke:none;" d="M 1.5625 -6.921875 L 0.8125 -6.921875 L 0.8125 0 L 1.5625 0 Z M 1.5625 -6.921875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-5">
+<path style="stroke:none;" d="M 1.625 -6.78125 L 0.734375 -6.78125 L 0.734375 -5.890625 L 1.625 -5.890625 Z M 1.5625 -4.421875 L 0.8125 -4.421875 L 0.8125 0 L 1.5625 0 Z M 1.5625 -4.421875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-6">
+<path style="stroke:none;" d="M 3.421875 -4.28125 C 2.90625 -4.515625 2.5 -4.59375 1.984375 -4.59375 C 1.734375 -4.59375 0.328125 -4.59375 0.328125 -3.296875 C 0.328125 -2.796875 0.625 -2.484375 0.875 -2.296875 C 1.171875 -2.078125 1.390625 -2.03125 1.9375 -1.921875 C 2.296875 -1.859375 2.875 -1.734375 2.875 -1.203125 C 2.875 -0.515625 2.09375 -0.515625 1.9375 -0.515625 C 1.140625 -0.515625 0.578125 -0.890625 0.40625 -1 L 0.28125 -0.328125 C 0.59375 -0.171875 1.140625 0.109375 1.953125 0.109375 C 2.140625 0.109375 2.6875 0.109375 3.109375 -0.203125 C 3.421875 -0.453125 3.59375 -0.84375 3.59375 -1.28125 C 3.59375 -1.828125 3.21875 -2.15625 3.203125 -2.1875 C 2.8125 -2.546875 2.546875 -2.609375 2.046875 -2.6875 C 1.5 -2.796875 1.03125 -2.90625 1.03125 -3.390625 C 1.03125 -4 1.75 -4 1.890625 -4 C 2.203125 -4 2.734375 -3.96875 3.296875 -3.625 Z M 3.421875 -4.28125 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-7">
+<path style="stroke:none;" d="M 4.640625 -6.640625 C 4.09375 -6.96875 3.53125 -7.140625 2.8125 -7.140625 C 1.421875 -7.140625 0.5625 -6.15625 0.5625 -5.171875 C 0.5625 -4.75 0.703125 -4.328125 1.09375 -3.90625 C 1.515625 -3.453125 1.953125 -3.34375 2.546875 -3.203125 C 3.390625 -2.984375 3.484375 -2.953125 3.765625 -2.71875 C 3.96875 -2.546875 4.1875 -2.21875 4.1875 -1.78125 C 4.1875 -1.125 3.640625 -0.46875 2.734375 -0.46875 C 2.328125 -0.46875 1.421875 -0.5625 0.59375 -1.28125 L 0.4375 -0.46875 C 1.3125 0.078125 2.109375 0.21875 2.734375 0.21875 C 4.0625 0.21875 4.96875 -0.78125 4.96875 -1.890625 C 4.96875 -2.53125 4.671875 -3.015625 4.453125 -3.25 C 3.984375 -3.75 3.65625 -3.84375 2.734375 -4.0625 C 2.15625 -4.203125 2 -4.25 1.6875 -4.5 C 1.625 -4.5625 1.34375 -4.859375 1.34375 -5.296875 C 1.34375 -5.875 1.890625 -6.484375 2.796875 -6.484375 C 3.640625 -6.484375 4.109375 -6.15625 4.484375 -5.84375 Z M 4.640625 -6.640625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-8">
+<path style="stroke:none;" d="M 4.09375 -4.171875 C 3.5 -4.5 3.15625 -4.59375 2.546875 -4.59375 C 1.171875 -4.59375 0.359375 -3.390625 0.359375 -2.21875 C 0.359375 -0.984375 1.265625 0.109375 2.515625 0.109375 C 3.046875 0.109375 3.59375 -0.03125 4.140625 -0.40625 L 4.078125 -1.0625 C 3.5625 -0.671875 3.03125 -0.53125 2.515625 -0.53125 C 1.6875 -0.53125 1.140625 -1.25 1.140625 -2.21875 C 1.140625 -3 1.5 -3.953125 2.5625 -3.953125 C 3.078125 -3.953125 3.421875 -3.875 3.96875 -3.515625 Z M 4.09375 -4.171875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-9">
+<path style="stroke:none;" d="M 4.34375 -2.96875 C 4.34375 -3.625 4.1875 -4.53125 2.96875 -4.53125 C 2.359375 -4.53125 1.875 -4.234375 1.5625 -3.8125 L 1.5625 -6.921875 L 0.8125 -6.921875 L 0.8125 0 L 1.578125 0 L 1.578125 -2.4375 C 1.578125 -3.09375 1.828125 -3.921875 2.59375 -3.921875 C 3.546875 -3.921875 3.5625 -3.21875 3.5625 -2.90625 L 3.5625 0 L 4.34375 0 Z M 4.34375 -2.96875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-10">
+<path style="stroke:none;" d="M 7.109375 -2.96875 C 7.109375 -3.640625 6.953125 -4.53125 5.734375 -4.53125 C 5.140625 -4.53125 4.625 -4.25 4.25 -3.71875 C 4 -4.46875 3.296875 -4.53125 2.984375 -4.53125 C 2.265625 -4.53125 1.796875 -4.125 1.53125 -3.765625 L 1.53125 -4.484375 L 0.8125 -4.484375 L 0.8125 0 L 1.578125 0 L 1.578125 -2.4375 C 1.578125 -3.125 1.859375 -3.921875 2.59375 -3.921875 C 3.515625 -3.921875 3.5625 -3.28125 3.5625 -2.90625 L 3.5625 0 L 4.34375 0 L 4.34375 -2.4375 C 4.34375 -3.125 4.609375 -3.921875 5.359375 -3.921875 C 6.28125 -3.921875 6.328125 -3.28125 6.328125 -2.90625 L 6.328125 0 L 7.109375 0 Z M 7.109375 -2.96875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-11">
+<path style="stroke:none;" d="M 3.984375 -2.875 C 3.984375 -3.890625 3.25 -4.59375 2.328125 -4.59375 C 1.6875 -4.59375 1.234375 -4.4375 0.765625 -4.171875 L 0.828125 -3.515625 C 1.34375 -3.875 1.84375 -4 2.328125 -4 C 2.796875 -4 3.203125 -3.609375 3.203125 -2.875 L 3.203125 -2.4375 C 1.703125 -2.421875 0.4375 -2 0.4375 -1.125 C 0.4375 -0.703125 0.703125 0.109375 1.578125 0.109375 C 1.71875 0.109375 2.65625 0.09375 3.234375 -0.359375 L 3.234375 0 L 3.984375 0 Z M 3.203125 -1.3125 C 3.203125 -1.125 3.203125 -0.875 2.859375 -0.6875 C 2.578125 -0.515625 2.1875 -0.5 2.078125 -0.5 C 1.609375 -0.5 1.15625 -0.734375 1.15625 -1.140625 C 1.15625 -1.84375 2.765625 -1.90625 3.203125 -1.9375 Z M 3.203125 -1.3125 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-12">
+<path style="stroke:none;" d="M 6.109375 -6.921875 L 5.21875 -6.921875 L 5.21875 -3.890625 L 1.828125 -3.890625 L 1.828125 -6.921875 L 0.9375 -6.921875 L 0.9375 0 L 1.828125 0 L 1.828125 -3.296875 L 5.21875 -3.296875 L 5.21875 0 L 6.109375 0 Z M 6.109375 -6.921875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-13">
+<path style="stroke:none;" d="M 4.328125 -6.921875 L 3.578125 -6.921875 L 3.578125 -3.984375 C 3.046875 -4.421875 2.5 -4.53125 2.125 -4.53125 C 1.140625 -4.53125 0.359375 -3.5 0.359375 -2.21875 C 0.359375 -0.90625 1.125 0.109375 2.078125 0.109375 C 2.40625 0.109375 2.984375 0.015625 3.546875 -0.515625 L 3.546875 0 L 4.328125 0 Z M 3.546875 -1.390625 C 3.546875 -1.25 3.53125 -1.0625 3.21875 -0.78125 C 2.984375 -0.578125 2.734375 -0.5 2.484375 -0.5 C 1.859375 -0.5 1.140625 -0.96875 1.140625 -2.203125 C 1.140625 -3.515625 2 -3.921875 2.578125 -3.921875 C 3.03125 -3.921875 3.328125 -3.703125 3.546875 -3.375 Z M 3.546875 -1.390625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-14">
+<path style="stroke:none;" d="M 1.5625 -2.140625 C 1.5625 -3.125 2.28125 -3.84375 3.265625 -3.875 L 3.265625 -4.53125 C 2.375 -4.53125 1.828125 -4.03125 1.515625 -3.578125 L 1.515625 -4.484375 L 0.8125 -4.484375 L 0.8125 0 L 1.5625 0 Z M 1.5625 -2.140625 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-15">
+<path style="stroke:none;" d="M 3.84375 -6.21875 L 4.71875 -6.21875 C 4.84375 -6.21875 4.96875 -6.203125 5.078125 -6.203125 L 6.421875 -6.203125 L 6.421875 -6.859375 L 0.359375 -6.859375 L 0.359375 -6.203125 L 1.6875 -6.203125 C 1.8125 -6.203125 1.9375 -6.21875 2.046875 -6.21875 L 2.953125 -6.21875 L 2.953125 0 L 3.84375 0 Z M 3.84375 -6.21875 "/>
+</symbol>
+<symbol overflow="visible" id="glyph1-16">
+<path style="stroke:none;" d="M 1.59375 -0.453125 C 1.90625 -0.171875 2.34375 0.109375 2.9375 0.109375 C 3.90625 0.109375 4.78125 -0.875 4.78125 -2.21875 C 4.78125 -3.421875 4.15625 -4.53125 3.203125 -4.53125 C 2.609375 -4.53125 2.03125 -4.328125 1.5625 -3.9375 L 1.5625 -4.421875 L 0.8125 -4.421875 L 0.8125 1.9375 L 1.59375 1.9375 Z M 1.59375 -3.3125 C 1.828125 -3.671875 2.21875 -3.890625 2.65625 -3.890625 C 3.40625 -3.890625 4 -3.140625 4 -2.21875 C 4 -1.203125 3.296875 -0.5 2.546875 -0.5 C 2.15625 -0.5 1.890625 -0.703125 1.6875 -0.96875 C 1.59375 -1.109375 1.59375 -1.140625 1.59375 -1.3125 Z M 1.59375 -3.3125 "/>
+</symbol>
+</g>
+<clipPath id="clip1">
+ <path d="M 89 203 L 189.796875 203 L 189.796875 283 L 89 283 Z M 89 203 "/>
+</clipPath>
+<clipPath id="clip2">
+ <path d="M 103 311 L 184 311 L 184 379.398438 L 103 379.398438 Z M 103 311 "/>
+</clipPath>
+</defs>
+<g id="surface1">
+<g clip-path="url(#clip1)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 38.56375 28.347094 L -38.565156 28.347094 C -40.764375 28.347094 -42.549531 26.561937 -42.549531 24.362719 L -42.549531 -24.359938 C -42.549531 -26.563063 -40.764375 -28.348219 -38.565156 -28.348219 L 38.56375 -28.348219 C 40.762969 -28.348219 42.548125 -26.563063 42.548125 -24.359938 L 42.548125 24.362719 C 42.548125 26.561937 40.762969 28.347094 38.56375 28.347094 Z M 38.56375 28.347094 " transform="matrix(1,0,0,-1,143.53,243.351)"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-1" x="104.302" y="245.288"/>
+ <use xlink:href="#glyph0-2" x="109.532365" y="245.288"/>
+ <use xlink:href="#glyph0-3" x="114.76273" y="245.288"/>
+ <use xlink:href="#glyph0-2" x="119.993095" y="245.288"/>
+ <use xlink:href="#glyph0-4" x="125.22346" y="245.288"/>
+ <use xlink:href="#glyph0-5" x="130.453825" y="245.288"/>
+ <use xlink:href="#glyph0-6" x="135.68419" y="245.288"/>
+ <use xlink:href="#glyph0-2" x="140.914555" y="245.288"/>
+ <use xlink:href="#glyph0-7" x="146.14492" y="245.288"/>
+ <use xlink:href="#glyph0-8" x="151.375285" y="245.288"/>
+ <use xlink:href="#glyph0-2" x="156.60565" y="245.288"/>
+ <use xlink:href="#glyph0-5" x="161.836015" y="245.288"/>
+ <use xlink:href="#glyph0-9" x="167.06638" y="245.288"/>
+ <use xlink:href="#glyph0-2" x="172.296745" y="245.288"/>
+ <use xlink:href="#glyph0-4" x="177.52711" y="245.288"/>
+</g>
+<path style="fill:none;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 24.360625 135.651781 L -24.362031 135.651781 C -26.56125 135.651781 -28.346406 133.866625 -28.346406 131.667406 L -28.346406 82.94475 C -28.346406 80.741625 -26.56125 78.956469 -24.362031 78.956469 L 24.360625 78.956469 C 26.56375 78.956469 28.345 80.741625 28.345 82.94475 L 28.345 131.667406 C 28.345 133.866625 26.56375 135.651781 24.360625 135.651781 Z M 24.360625 135.651781 " transform="matrix(1,0,0,-1,143.53,243.351)"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph1-1" x="129.901" y="133.529"/>
+ <use xlink:href="#glyph1-2" x="136.95751" y="133.529"/>
+ <use xlink:href="#glyph1-3" x="141.384889" y="133.529"/>
+ <use xlink:href="#glyph1-4" x="144.982384" y="133.529"/>
+ <use xlink:href="#glyph1-5" x="147.362449" y="133.529"/>
+ <use xlink:href="#glyph1-6" x="149.742514" y="133.529"/>
+ <use xlink:href="#glyph1-3" x="153.561179" y="133.529"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-10" x="125.224" y="145.485"/>
+ <use xlink:href="#glyph0-11" x="130.454365" y="145.485"/>
+ <use xlink:href="#glyph0-11" x="135.68473" y="145.485"/>
+ <use xlink:href="#glyph0-12" x="140.915095" y="145.485"/>
+ <use xlink:href="#glyph0-3" x="146.14546" y="145.485"/>
+ <use xlink:href="#glyph0-2" x="151.375825" y="145.485"/>
+ <use xlink:href="#glyph0-6" x="156.60619" y="145.485"/>
+</g>
+<path style="fill:none;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 24.360625 242.956469 L -24.362031 242.956469 C -26.56125 242.956469 -28.346406 241.171312 -28.346406 238.972094 L -28.346406 190.245531 C -28.346406 188.046312 -26.56125 186.261156 -24.362031 186.261156 L 24.360625 186.261156 C 26.56375 186.261156 28.345 188.046312 28.345 190.245531 L 28.345 238.972094 C 28.345 241.171312 26.56375 242.956469 24.360625 242.956469 Z M 24.360625 242.956469 " transform="matrix(1,0,0,-1,143.53,243.351)"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph1-7" x="122.207" y="26.226"/>
+ <use xlink:href="#glyph1-8" x="127.742221" y="26.226"/>
+ <use xlink:href="#glyph1-9" x="132.1696" y="26.226"/>
+ <use xlink:href="#glyph1-2" x="137.317275" y="26.226"/>
+ <use xlink:href="#glyph1-10" x="141.744655" y="26.226"/>
+ <use xlink:href="#glyph1-11" x="149.658944" y="26.226"/>
+ <use xlink:href="#glyph1-3" x="154.44697" y="26.226"/>
+ <use xlink:href="#glyph1-5" x="158.044465" y="26.226"/>
+ <use xlink:href="#glyph1-8" x="160.42453" y="26.226"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-10" x="125.224" y="38.181"/>
+ <use xlink:href="#glyph0-11" x="130.454365" y="38.181"/>
+ <use xlink:href="#glyph0-11" x="135.68473" y="38.181"/>
+ <use xlink:href="#glyph0-12" x="140.915095" y="38.181"/>
+ <use xlink:href="#glyph0-13" x="146.14546" y="38.181"/>
+ <use xlink:href="#glyph0-14" x="151.375825" y="38.181"/>
+ <use xlink:href="#glyph0-8" x="156.60619" y="38.181"/>
+</g>
+<g clip-path="url(#clip2)" clip-rule="nonzero">
+<path style="fill:none;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 24.360625 -78.957594 L -24.362031 -78.957594 C -26.56125 -78.957594 -28.346406 -80.74275 -28.346406 -82.941969 L -28.346406 -131.664625 C -28.346406 -133.86775 -26.56125 -135.652906 -24.362031 -135.652906 L 24.360625 -135.652906 C 26.56375 -135.652906 28.345 -133.86775 28.345 -131.664625 L 28.345 -82.941969 C 28.345 -80.74275 26.56375 -78.957594 24.360625 -78.957594 Z M 24.360625 -78.957594 " transform="matrix(1,0,0,-1,143.53,243.351)"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph1-12" x="128.904" y="348.136"/>
+ <use xlink:href="#glyph1-2" x="135.96051" y="348.136"/>
+ <use xlink:href="#glyph1-11" x="140.387889" y="348.136"/>
+ <use xlink:href="#glyph1-13" x="145.175915" y="348.136"/>
+ <use xlink:href="#glyph1-2" x="150.32359" y="348.136"/>
+ <use xlink:href="#glyph1-14" x="154.750969" y="348.136"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-10" x="130.454" y="360.091"/>
+ <use xlink:href="#glyph0-11" x="135.684365" y="360.091"/>
+ <use xlink:href="#glyph0-11" x="140.91473" y="360.091"/>
+ <use xlink:href="#glyph0-12" x="146.145095" y="360.091"/>
+ <use xlink:href="#glyph0-8" x="151.37546" y="360.091"/>
+</g>
+<path style="fill:none;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -82.944063 135.651781 L -139.147188 135.651781 C -141.350313 135.651781 -143.131563 133.866625 -143.131563 131.667406 L -143.131563 82.94475 C -143.131563 80.741625 -141.350313 78.956469 -139.147188 78.956469 L -82.944063 78.956469 C -80.740938 78.956469 -78.955781 80.741625 -78.955781 82.94475 L -78.955781 131.667406 C -78.955781 133.866625 -80.740938 135.651781 -82.944063 135.651781 Z M -82.944063 135.651781 " transform="matrix(1,0,0,-1,143.53,243.351)"/>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph1-15" x="13.169" y="132.422"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph1-2" x="19.12265" y="132.422"/>
+ <use xlink:href="#glyph1-10" x="23.550029" y="132.422"/>
+ <use xlink:href="#glyph1-16" x="31.464319" y="132.422"/>
+ <use xlink:href="#glyph1-4" x="36.611994" y="132.422"/>
+ <use xlink:href="#glyph1-11" x="38.992059" y="132.422"/>
+ <use xlink:href="#glyph1-3" x="43.780085" y="132.422"/>
+ <use xlink:href="#glyph1-2" x="47.37758" y="132.422"/>
+</g>
+<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
+ <use xlink:href="#glyph0-15" x="3.719" y="144.378"/>
+ <use xlink:href="#glyph0-16" x="8.949365" y="144.378"/>
+ <use xlink:href="#glyph0-7" x="14.17973" y="144.378"/>
+ <use xlink:href="#glyph0-6" x="19.410095" y="144.378"/>
+ <use xlink:href="#glyph0-2" x="24.64046" y="144.378"/>
+ <use xlink:href="#glyph0-15" x="29.870825" y="144.378"/>
+ <use xlink:href="#glyph0-17" x="35.10119" y="144.378"/>
+ <use xlink:href="#glyph0-18" x="40.331555" y="144.378"/>
+ <use xlink:href="#glyph0-5" x="45.56192" y="144.378"/>
+ <use xlink:href="#glyph0-6" x="50.792285" y="144.378"/>
+ <use xlink:href="#glyph0-2" x="56.02265" y="144.378"/>
+</g>
+<path style="fill:none;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0.00125 185.862719 L 0.00125 137.011156 " transform="matrix(1,0,0,-1,143.53,243.351)"/>
+<path style="fill:none;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -0.0006725 3.087187 L 3.089171 0.00125 L -0.0006725 -3.088594 " transform="matrix(0,1,1,0,143.53,103.64911)"/>
+<path style="fill:none;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0.00125 78.558031 L 0.00125 29.706469 " transform="matrix(1,0,0,-1,143.53,243.351)"/>
+<path style="fill:none;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -0.000535 3.087187 L 3.089309 0.00125 L -0.000535 -3.088594 " transform="matrix(0,1,1,0,143.53,210.95366)"/>
+<path style="fill:none;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0.00125 -28.746656 L 0.00125 -77.598219 " transform="matrix(1,0,0,-1,143.53,243.351)"/>
+<path style="fill:none;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -0.0003875 3.087187 L 3.089456 0.00125 L -0.0003875 -3.088594 " transform="matrix(0,1,1,0,143.53,318.2582)"/>
+<path style="fill:none;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -111.045625 78.558031 L -111.045625 -0.0005625 L -43.908906 -0.0005625 " transform="matrix(1,0,0,-1,143.53,243.351)"/>
+<path style="fill:none;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -0.0011625 3.089281 L 3.088681 -0.0005625 L -0.0011625 -3.090406 " transform="matrix(1,0,0,-1,96.93085,243.351)"/>
+</g>
+</svg>
diff --git a/doc/flow.tikz b/doc/flow.tikz
new file mode 100644
index 0000000..4c6c49e
--- /dev/null
+++ b/doc/flow.tikz
@@ -0,0 +1,29 @@
+\begin{tikzpicture}
+[
+major/.style={rectangle,draw,rounded corners, thick, align=center, minimum size=20mm},
+minor/.style={rectangle,draw,rounded corners, thick, minimum width=40mm, minimum height=15mm}
+]
+
+\node (generate-header)[major] {\texttt{generate-header}};
+\node (netlist)[major, above=5em of generate-header] {Netlist\\\texttt{foo.net}};
+\node (schematic)[major, above=5em of netlist] {Schematic\\\texttt{foo.sch}};
+\node (header)[major, below=5em of generate-header] {Header\\\texttt{foo.h}};
+\node (template)[major, left=5em of netlist] {Template\\\texttt{my-template}};
+
+\draw [-Straight Barb, thick]
+ (schematic.south) -- (netlist.north)
+ node[above, midway] {};
+
+\draw [-Straight Barb, thick]
+ (netlist.south) -- (generate-header.north)
+ node[above, near end] {};
+
+\draw [-Straight Barb, thick]
+ (generate-header.south) -- (header.north)
+ node[above, midway] {};
+
+\draw [-Straight Barb, thick]
+ (template.south) |- (generate-header.west)
+ node[above, near end] {};
+
+\end{tikzpicture}
diff --git a/doc/template-qtikz.tex b/doc/template-qtikz.tex
new file mode 100644
index 0000000..45a9e74
--- /dev/null
+++ b/doc/template-qtikz.tex
@@ -0,0 +1,15 @@
+\documentclass{standalone}
+\usepackage{tikz}
+\usetikzlibrary{arrows.meta}
+\usetikzlibrary{backgrounds}
+\usetikzlibrary{calc}
+\usetikzlibrary{fit}
+\usetikzlibrary{positioning}
+
+\usepackage{flowchart}
+
+\tikzstyle{every picture}+=[font=\sffamily]
+
+\begin{document}
+<>
+\end{document}
diff --git a/doc/template-tex.tex b/doc/template-tex.tex
new file mode 100644
index 0000000..5329710
--- /dev/null
+++ b/doc/template-tex.tex
@@ -0,0 +1,15 @@
+\documentclass{standalone}
+\usepackage{tikz}
+\usetikzlibrary{arrows.meta}
+\usetikzlibrary{backgrounds}
+\usetikzlibrary{calc}
+\usetikzlibrary{fit}
+\usetikzlibrary{positioning}
+
+\usepackage{flowchart}
+
+\tikzstyle{every picture}+=[font=\sffamily]
+
+\begin{document}
+\input{\tikzfile}
+\end{document}
diff --git a/kicad/kicad-utils.pro b/kicad/kicad-utils.pro
new file mode 100644
index 0000000..d6cdf98
--- /dev/null
+++ b/kicad/kicad-utils.pro
@@ -0,0 +1,32 @@
+update=Sun 07 Aug 2016 14:04:39 CEST
+version=1
+last_client=kicad
+[pcbnew]
+version=1
+LastNetListRead=
+UseCmpFile=1
+PadDrill=0.600000000000
+PadDrillOvalY=0.600000000000
+PadSizeH=1.500000000000
+PadSizeV=1.500000000000
+PcbTextSizeV=1.500000000000
+PcbTextSizeH=1.500000000000
+PcbTextThickness=0.300000000000
+ModuleTextSizeV=1.000000000000
+ModuleTextSizeH=1.000000000000
+ModuleTextSizeThickness=0.150000000000
+SolderMaskClearance=0.000000000000
+SolderMaskMinWidth=0.000000000000
+DrawSegmentWidth=0.200000000000
+BoardOutlineThickness=0.100000000000
+ModuleOutlineThickness=0.150000000000
+[cvpcb]
+version=1
+NetIExt=net
+[general]
+version=1
+[eeschema]
+version=1
+LibDir=
+[eeschema/libraries]
+LibName1=kicad_utils
diff --git a/templates/nodemcu-arduino.py b/templates/nodemcu-arduino.py
index 1f258e6..ab0f283 100644
--- a/templates/nodemcu-arduino.py
+++ b/templates/nodemcu-arduino.py
@@ -12,26 +12,26 @@ gpio_map = {
8: None, # SD0
9: None, # CMD
10: None, # SD1
- 11: '9', # SD2
- 12: '10', # SD3
+ 11: 'D9', # SD2
+ 12: 'D10', # SD3
13: None, # RSV
14: None, # RSV
- 15: '0', # A0
+ 15: 'D0', # A0
# Right side
- 16: '16',
- 17: '5',
- 18: '4',
- 19: '0',
- 20: '2',
+ 16: 'D16',
+ 17: 'D5',
+ 18: 'D4',
+ 19: 'D0',
+ 20: 'D2',
21: None, # 3V3
22: None, # Gnd
- 23: '14',
- 24: '12',
- 25: '13',
- 26: '15',
- 27: '3',
- 28: '1',
+ 23: 'D14',
+ 24: 'D12',
+ 25: 'D13',
+ 26: 'D15',
+ 27: 'D3',
+ 28: 'D1',
29: None, # GND
30: None, # 3V3
}
diff --git a/thirdparty/antlr4 b/thirdparty/antlr4
new file mode 160000
+Subproject f47e9548b77ef4fc84291a66ff3d19fb0807ad3