Commit c3685082 authored by Federico Vaga's avatar Federico Vaga

doc: first documentation

Signed-off-by: Federico Vaga's avatarFederico Vaga <federico.vaga@cern.ch>
parent a4a8ca36
......@@ -39,13 +39,9 @@ The Mock Turtle framework includes the following components:
- Up to 8 soft-CPUs
- input channels (Host to Mock Turtle - hmq)
- communication with the host system (input, output)
- output channels (Mock Turtle to Host - hmq)
- remote input channels (network to Mock Turtle - rmq)
- remote output channels (Mock Turtle to network -rmq)
- communication with remote systems (input, output)
- Software
......
......@@ -69,7 +69,7 @@ struct trtl_fw_variable svec_variables[] = {
struct trtl_fw_application app = {
.name = "svec-svec",
.name = "manualsvec",
.version = {
.rt_id = RT_APPLICATION_ID,
.rt_version = RT_VERSION(1, 0),
......
_*
doxygen-trtl-output/
......@@ -12,9 +12,20 @@ BUILDDIR = _build
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
.PHONY: help Makefile doxygen doxygen-clean
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
\ No newline at end of file
$(MAKE) doxygen TARGET=$@
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
GIT_VERSION = $(shell cd $(src); git describe --dirty --long --tags)
doxygen:
ifeq ($(TARGET),clean)
@echo "Remove Doxygen files"
@rm -rf doxygen-trtl-output
else
GIT_VERSION=$(GIT_VERSION) EXCLUDE_FILES=$(EXCLUDE_FILES) doxygen ./doxygen-trtl-config
endif
.. _the-mock-turtle-architecture:
===============================
The Mock Turtle Architecture
===============================
......@@ -17,9 +17,10 @@
# 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('.'))
import os
import sys
sys.path.append(os.path.abspath('../software/lib/PyMockTurtle'))
sys.path.append(os.path.abspath('../software/lib/'))
# -- General configuration ------------------------------------------------
......@@ -31,8 +32,12 @@
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = ['sphinx.ext.todo',
'sphinx.ext.coverage']
extensions = ['sphinx.ext.autodoc',
'sphinx.ext.todo',
'sphinx.ext.graphviz',
'sphinx.ext.coverage',
'breathe',
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
......@@ -48,7 +53,7 @@ master_doc = 'index'
# General information about the project.
project = 'Mock Turtle'
copyright = '2018, Federico Vaga <federico.vaga@cern.ch>, Tomasz Wlostowski <Tomasz.Wlostowski@cern.ch>'
copyright = 'CERN 2018'
author = 'Federico Vaga <federico.vaga@cern.ch>, Tomasz Wlostowski <Tomasz.Wlostowski@cern.ch>'
# The version info for the project you're documenting, acts as replacement for
......@@ -67,6 +72,8 @@ release = '4.0.0'
# Usually you set "language" from the command line for these cases.
language = None
highlight_language = 'none'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This patterns also effect to html_static_path and html_extra_path
......@@ -190,3 +197,8 @@ epub_copyright = copyright
epub_exclude_files = ['search.html']
breathe_projects = {
"trtl": "doxygen-trtl-output/xml/",
}
breathe_default_project = "trtl"
==========================
The *Alarm Clock* Demo
==========================
The *Alarm Clock* demo is a firmware program that makes use of the
*Host Message Queue* to receive configuration options and to send
messages to the host system.
This program makes use of the :ref:`sw:fw:frm` and shows the use
of *variables*. The application exports to the host a set of local
variables which are used to configure the application.
::
mockturtle-variable -D $DEVID
The application counts the number of internal iterations; this is represented
by the AC_TIME variable. According to the local variable AC_PERIOD_UPDATE it
periodically sends messages to the host system to notify the current time.
Using the variables AC_ALARM_EN and AC_ALARM_ITER, It is possible to enable and
configure an alarm which will produce a message.
The communication with the host happens through the message queues as described
in the following table.
.. list-table::
:widths: 1 1 2
:header-rows: 1
* - Direction
- Index
- Description
* - Input
- 0
- Receive configuration from the host
* - Output
- 0
- Send configuration to the host
* - Output
- 1
- Send notifications
.. literalinclude:: ../../demos/alarm_clock/firmware/fw-01/fw-ac.c
==============================
The *Data Generator* Demo
==============================
The *Data Generator* demo is a firmware program that pretends to be a
little acquisition system. It makes use of the *Host Message Queue* to
receive configuration options and to send messages to the host system.
This program makes use of the :ref:`sw:fw:frm` and shows the use
of *variables* and *buffers*. The application exports to the host a
set of local variables which are used to configure the application; it
also exports buffers for data array or structures.
::
mockturtle-variable -D $DEVID
mockturtle-buffer -D $DEVID
The application periodically generates data. The generation period can be
adjusted using the variable DG_PERIOD_UPDATE. The application generates
sequential values which can be adjusted using gain and offset; these 2
parameters are part of a data structure exported with the buffer DG_CONF.
Finally, it is possible to read the data from the buffer DG_DATA.
The communication with the host happens through the message queues as described
in the following table.
.. list-table::
:widths: 1 1 2
:header-rows: 1
* - Direction
- Index
- Description
* - Input
- 0
- Receive configuration from the host
* - Output
- 0
- Send configuration to the host
* - Output
- 1
- Send data to the host
.. literalinclude:: ../../demos/data_generator/firmware/fw-01/fw-dg.c
====================
The *FMC SVEC* Demo
====================
The *FMC SVEC* demo is a complete demo that uses hardware features from
the `FMC SVEC carrier`_. This demo offers an example of all layers, so it is
a good starting point to understand how to create a complete Mock Turtle
application.
The main aim of this demo is to handle the SVEC LEDs and LEMOs. The LEDs can be
turned *on* (*red*, *green*, *orange*) and *off*. The LEMOs can be set to *input*
or *output*; when output they can be set to *high* or *low* voltage; when
input it is possible to read their status (*high* or *low*).
.. todo::
add HDL description here
This demo has two firmwares. One is named *autosvec*, the other *manualsvec*.
The *autosvec* firmware runs autonomously without any communication with the host
system or a remote node and for this reason it is the simplest one
It does not use :ref:`sw:fw:frm` but only :ref:`sw:fw:lib`. This firmware does
the following things:
- it turns *on* and *off* all the LEDs one after the other;
- it reproduce on LEMO connector 2 whatever state is on LEMO connector 1
- it generates square signals on LEMO connectors 3
- it generates square signals on LEMO connectors 4
- it periodically prints messages on the console with the GPIO status (LEDs
and LEMOs)
.. literalinclude:: ../../demos/fmc-svec-carrier/software/firmware/fw-01/fw-svec.c
The *manualsvec* firmware offers a manual control of all LEDs and LEMOs.
It does use :ref:`sw:fw:frm`. This firmware does the following things:
- it exportes as :ref:`sw:fw:frm:var` the device peripheral registers
to configure LEDs and LEMOs
- to exports a local :ref:`sw:fw:frm:buf` where the user can read and write
(it is not used)
- it exports a local :ref:`variable <sw:fw:frm:var>` that can be used to
stop/start an *autosvec* firmware running on a different core.
.. literalinclude:: ../../demos/fmc-svec-carrier/software/firmware/fw-02/fw-svec.c
This firmware has also a support layer on the host side. This is not really necessary
because you can always uses the generic Mock Turtle tools
to :ref:`read/write variables <tools:mockturtle-variable>` and
to :ref:`read/write buffers <tools:mockturtle-buffer>`; but for the sake of make this
demos as complete as possible we added an host support layer which is made of a
C library and a C program. A part from the standard operations to open and close a
device, the library exports an API to handle the LEDs and LEMOs status and functions
to set/get a dummy data structure. This library is mainly a wrapper around
the Mock Turtle one.
.. literalinclude:: ../../demos/fmc-svec-carrier/software/lib/libsvec.c
At the end, the host program. This program is a command line tool that uses the
svec library described above to handle the SVEC board. Again, it gives users
the possibility to play with LEDs and LEMOs status.
.. literalinclude:: ../../demos/fmc-svec-carrier/software/tools/mockturtle-svec.c
.. _`FMC SVEC carrier`: https://www.ohwr.org/projects/svec/
==========================
The *Hello World* Demo
==========================
The *Hello World* demo is a firmware program that prints
over the serial interface the string ``"Hello World"`` and exit.
This program makes use of the :ref:`sw:fw:lib`.
::
minicom -D $TTYTRTL
# On a different shell instance
mockturtle-cpu-restart -D $DEVID -i $CPU_INDEX
.. literalinclude:: ../../demos/hello_world/firmware/fw-01/fw-hello.c
There is also the *Hello World* demo based on the :ref:`sw:fw:frm`.
This demo will print on the serial interface general informations
about the firmware application.
::
minicom -D $TTYTRTL
# On a different shell instance
mockturtle-cpu-restart -D $DEVID -i $CPU_INDEX
.. literalinclude:: ../../demos/hello_world_framework/firmware/fw-01/fw-hellofrm.c
============
The Demos
============
This is a collection of demo applications which main purpose is to
introduce the users to the Mock Turtle development. In the following
demos you will find some example code to run and test the applications.
You will notice the usage of environment variable; these variables, of
course, depend of your environment. Here a list of used variable
TRTL
This is the path to the root directory of the Mock Turtle project.
CROSS_COMPILE_TARGET
This is the path to the cross-compiler for the soft-CPU used by Mock Turtle.
DEVID
This is the device-id that uniquely identify a Mock Turtle instance. This
is an integer number in hexadecimal representation (e.g. 0x0201)
CPU_INDEX
This is used to select a Mock Turtle soft-CPU starting from 0.
TTYTRTL
This is the path to the TTY device in /dev (e.g. /dev/ttyTRTL0)
DEMO
This is the path to the demo application directory that you can find in the
``software/demos`` main directory.
In principle you can compile all the demos by running *make* in the main
directory. Then you can load the firmware using
:ref:`tools:mockturtle-firmware-loader` and restart the CPU with
:ref:`tools:mockturtle-cpu-restart`::
# Compile
make -C $DEMO
# Program
mockturtle-loader -D $DEVID -i $CPU_INDEX -f $DEMO/firmware/fw01/hello_world.bin
# Restart and start execution
mockturtle-cpu-restart -D $DEVID -i $CPU_INDEX
.. toctree::
:maxdepth: 2
:caption: Contents:
hello-world
data-generator
alarm-clock
fmc-svec-carrier
PROJECT_NAME = "Mock Turtle"
PROJECT_NUMBER = $(GIT_VERSION)
PROJECT_BRIEF = "Mock Turtle"
PROJECT_LOGO =
OUTPUT_DIRECTORY = doxygen-trtl-output
CREATE_SUBDIRS = YES
TAB_SIZE = 8
OPTIMIZE_OUTPUT_FOR_C = YES
EXTRACT_STATIC = YES
CASE_SENSE_NAMES = YES
WARN_NO_PARAMDOC = YES
INPUT = ../software/lib ../software/rt ../software/include
RECURSIVE = YES
EXCLUDE = ../software/rt/scripts ../software/lib/PyMockTurtle ../software/kernel
GENERATE_HTML = NO
GENERATE_LATEX = NO
GENERATE_XML = YES
trtl-rt-library
trtl-rt-framework
GIT_VERSION = $(shell cd $(src); git describe --dirty --long --tags)
DOC ?= ..
#FIXME glossary words lost during pandoc conversion
INPUT_SRC := $(DOC)/../rt/
INPUT_SRC += $(DOC)/../include/mockturtle-common.h
INPUT_SRC += $(DOC)/../lib/
INPUT_LIB := $(INPUT_SRC)
INPUT_LIB += $(DOC)/doxygen
FIRMWARE_LIBRARY := library-serial.md
FIRMWARE_LIBRARY += library-shared-memory.md
FIRMWARE_LIBRARY += library-message-queue.md
FIRMWARE_LIBRARY += library-utilities.md
FIRMWARE_LIBRARY += library.md
FIRMWARE_FRAMEWORK := framework.md
FIRMWARE_FRAMEWORK +=framework-action.md
FIRMWARE_FRAMEWORK += framework-buffer.md
FIRMWARE_FRAMEWORK += framework-common.md
FIRMWARE_FRAMEWORK += framework-variable.md
FIRMWARE_FRAMEWORK += framework-mqueue.md
FIRMWARE_FRAMEWORK += framework-debug.md
FIRMWARE := firmware.md
FIRMWARE += $(FIRMWARE_LIBRARY)
FIRMWARE += $(FIRMWARE_FRAMEWORK)
LINUX_HOST := linux.md
LINUX_HOST += linux-library.md
LINUX_HOST += linux-library-cpu.md
LINUX_HOST += linux-library-shm.md
LINUX_HOST += linux-library-hmq.md
all: doxy-fw-lib
PANDOC_OPTIONS := --listing --template default.latex -V documentclass=article -V fontsize=10pt -V papersize=a4paper
library.tex: $(DOC)/integration/software/firmware/library-introduction.tex $(DOC)/integration/software/firmware/library-configuration.tex
@pandoc $(PANDOC_OPTIONS) -f latex -o $@ $^
framework.tex: $(DOC)/integration/software/firmware/framework-introduction.tex $(DOC)/integration/software/firmware/framework-configuration.tex
@pandoc $(PANDOC_OPTIONS) -f latex -o $@ $^
firmware.tex: $(DOC)/integration/software/firmware-introduction.tex $(DOC)/integration/software/firmware-configuration.tex
@pandoc $(PANDOC_OPTIONS) -f latex -o $@ $^
%.tex: $(DOC)/integration/software/firmware/%.tex
@pandoc $(PANDOC_OPTIONS) -f latex -o $@ $<
%.tex: $(DOC)/integration/software/%.tex
@pandoc $(PANDOC_OPTIONS) -f latex -o $@ $<
%.md: %.tex
# Start by removing labels and ref from the tex file.
# They will not work and leave visible traces
@sed -i -e "s/\\label{.*}//g" -e "s/ref{.*}//g" $<
@pandoc --reference-links -o $@ $<
@if [ "$@" = "library.md" ] || [ "$@" = "framework.md" ]; then \
sed -i "1s/^/@ingroup firmware\n/" $@;\
fi
@sed -i "1s/^/@addtogroup $*\n/" $@
doxy-fw-lib: $(FIRMWARE) $(LINUX_HOST)
@GIT_VERSION="$(GIT_VERSION)" \
EXAMPLE_PATH="$(EXAMPLE_LIB)" \
INPUT="$(INPUT_LIB)" \
doxygen doxygen-trtl-rt-library
@rm -rf *.md *.tex
PROJECT_NAME = "White Rabbit Node Core - Software"
PROJECT_NAME = "Mock Turtle Firmware Framework"
PROJECT_NUMBER = $(GIT_VERSION)
PROJECT_BRIEF = $(BRIEF)
PROJECT_LOGO =
OUTPUT_DIRECTORY = $(OUTPUT)
OUTPUT_DIRECTORY = "trtl-rt-framework"
CREATE_SUBDIRS = YES
TAB_SIZE = 8
OPTIMIZE_OUTPUT_FOR_C = YES
......@@ -12,9 +12,10 @@ CASE_SENSE_NAMES = YES
WARN_NO_PARAMDOC = YES
INPUT = ../lib ../kernel/wrnc-user.h
INPUT = ../../rt/framework
RECURSIVE = YES
EXCLUDE = $(EXCLUDE_FILES)
EXCLUDE =
GENERATE_HTML = YES
GENERATE_LATEX = YES
COMPACT_LATEX = YES
PROJECT_NAME = "Mock Turtle Software"
PROJECT_NUMBER = $(GIT_VERSION)
PROJECT_BRIEF =
PROJECT_LOGO =
OUTPUT_DIRECTORY = "trtl-rt-library"
CREATE_SUBDIRS = YES
TAB_SIZE = 8
OPTIMIZE_OUTPUT_FOR_C = YES
EXTRACT_STATIC = YES
EXTRACT_ALL = YES
CASE_SENSE_NAMES = YES
WARN_NO_PARAMDOC = YES
INPUT = $(INPUT)
FILE_PATTERNS = *.c *.h *.md *.py
USE_MDFILE_AS_MAINPAGE = $(MAINPAGE)
RECURSIVE = YES
EXCLUDE =
EXAMPLE_PATH = $(EXAMPLE_PATH)
GENERATE_HTML = YES
GENERATE_LATEX = YES
COMPACT_LATEX = YES
HAVE_DOT = YES
CALL_GRAPH = YES
CALLER_GRAPH = YES
UML_LOOK = YES
\ No newline at end of file
========
Glossary
========
.. glossary::
Control System
It is a system that manage, commands, regulates the behaviour of a set
of devices.
Digital Signal Processing
The use of digital processing to perform a wide variety of signal
processing operations.
Embedded System
It is an autonomus system made of software, hardware (and gateware),
implementing dedicated functions
Firmware
It is an embedded software system running on the Mock Turtle soft-cpu.
Gateware
It is a bitstream which configures an FPGA, or the HDL sources
from which it was generated.
Gateware Core
It is an HDL component part of a more complex gateware design.
Hardware
It is a physical component.
Host
It is the system the hosts the hardware in use.
Host Application
It is an user space program.
HMQ
Host Message Queue
It is a message queue that connects the Mock Turtle to the host system.
MQ
Message Queue
It is a communication system based on queues with FIFO policy. Messages are
put on the queue and they are sent to the programmed destination. Each
message queue has two direction: input and output.
Mock Turtle supports two message queues: host and remote.
RTC
Real-Time Computing
It is an hardware and software system subject to time constraints.
RMQ
Remote Message Queue
It is a message queue that connects the Mock Turtle to a network.
SHM
Shared Memory
It is a memory shared among soft-CPUs and the host system.
Soft CPU
soft-cpu
It is an HDL implementation of a CPU running on an FPGA.
MQ Entry
TODO
User Space
It is a software running on the host and it is not in kernel mode.
This includes libraries and programs.
===============
The HDL Core
===============
.. toctree::
:maxdepth: 2
:caption: Contents:
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill-opacity="1" color-rendering="auto" color-interpolation="auto" text-rendering="auto" stroke="black" stroke-linecap="square" width="225" stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1" height="372" font-family="'Dialog'" font-style="normal" stroke-linejoin="miter" font-size="12px" stroke-dashoffset="0" image-rendering="auto">
<!--Generated by ySVG 2.5-->
<defs id="genericDefs"/>
<g>
<defs id="defs1">
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath1">
<path d="M0 0 L225 0 L225 372 L0 372 L0 0 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath2">
<path d="M394 140 L619 140 L619 512 L394 512 L394 140 Z"/>
</clipPath>
</defs>
<g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="translate(-394,-140)" stroke="white">
<rect x="394" width="225" height="372" y="140" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g fill="silver" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-394,-140)" stroke="silver">
<rect x="394" width="225" height="32" y="300" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-394,-140)" fill="gray" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="gray" stroke-width="3" stroke-miterlimit="1.45">
<rect fill="none" x="394" width="225" height="32" y="300" clip-path="url(#clipPath2)"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-394,-140)" stroke-linecap="butt">
<text x="497.0078" xml:space="preserve" y="320.1543" clip-path="url(#clipPath2)" stroke="none">API</text>
</g>
<g fill="rgb(255,204,153)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-394,-140)" stroke="rgb(255,204,153)">
<rect x="394" width="99" height="32" y="220" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-394,-140)" fill="rgb(255,102,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(255,102,0)" stroke-width="3" stroke-miterlimit="1.45">
<rect fill="none" x="394" width="99" height="32" y="220" clip-path="url(#clipPath2)"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-394,-140)" stroke-linecap="butt">
<text x="399.8477" xml:space="preserve" y="240.1543" clip-path="url(#clipPath2)" stroke="none">Project Library</text>
</g>
<g fill="rgb(255,204,153)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-394,-140)" stroke="rgb(255,204,153)">
<rect x="394" width="99" height="32" y="140" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-394,-140)" fill="rgb(255,102,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(255,102,0)" stroke-width="3" stroke-miterlimit="1.45">
<rect fill="none" x="394" width="99" height="32" y="140" clip-path="url(#clipPath2)"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-394,-140)" stroke-linecap="butt">
<text x="417.7568" xml:space="preserve" y="160.1543" clip-path="url(#clipPath2)" stroke="none">program</text>
</g>
<g fill="rgb(255,204,153)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-394,-140)" stroke="rgb(255,204,153)">
<rect x="520" width="99" height="32" y="140" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-394,-140)" fill="rgb(255,102,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(255,102,0)" stroke-width="3" stroke-miterlimit="1.45">
<rect fill="none" x="520" width="99" height="32" y="140" clip-path="url(#clipPath2)"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-394,-140)" stroke-linecap="butt">
<text x="543.7568" xml:space="preserve" y="160.1543" clip-path="url(#clipPath2)" stroke="none">program</text>
<rect stroke-linecap="square" x="394" y="332" clip-path="url(#clipPath2)" width="225" height="75" stroke="none" stroke-miterlimit="10"/>
<rect x="394" y="332" clip-path="url(#clipPath2)" fill="none" width="225" height="75" stroke-width="3"/>
<text fill="silver" x="439.9404" xml:space="preserve" y="373.6543" clip-path="url(#clipPath2)" stroke="none">Mock Turtle Black Box</text>
</g>
<g fill="silver" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-394,-140)" stroke="silver">
<rect x="394" width="225" height="32" y="407" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-394,-140)" fill="gray" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="gray" stroke-width="3" stroke-miterlimit="1.45">
<rect fill="none" x="394" width="225" height="32" y="407" clip-path="url(#clipPath2)"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-394,-140)" stroke-linecap="butt">
<text x="497.0078" xml:space="preserve" y="427.1543" clip-path="url(#clipPath2)" stroke="none">API</text>
</g>
<g fill="rgb(255,204,153)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-394,-140)" stroke="rgb(255,204,153)">
<rect x="394" width="225" height="32" y="480" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-394,-140)" fill="rgb(255,102,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(255,102,0)" stroke-width="3" stroke-miterlimit="1.45">
<rect fill="none" x="394" width="225" height="32" y="480" clip-path="url(#clipPath2)"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-394,-140)" stroke-linecap="butt">
<text x="478.3281" xml:space="preserve" y="500.1543" clip-path="url(#clipPath2)" stroke="none">Firmware</text>
<path fill="none" d="M443.5 260 L443.5 291.9785" clip-path="url(#clipPath2)"/>
<path d="M443.5 252 L438.5 264 L443.5 261 L448.5 264 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path d="M443.5 299.9785 L448.5 287.9785 L443.5 290.9785 L438.5 287.9785 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M443.5 180 L443.5 212" clip-path="url(#clipPath2)"/>
<path d="M443.5 172 L438.5 184 L443.5 181 L448.5 184 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path d="M443.5 220 L448.5 208 L443.5 211 L438.5 208 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M569.5 180 L569.5 292.0029" clip-path="url(#clipPath2)"/>
<path d="M569.5 172 L564.5 184 L569.5 181 L574.5 184 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path d="M569.5 300.0029 L574.5 288.0029 L569.5 291.0029 L564.5 288.0029 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M506.5 447 L506.5 472" clip-path="url(#clipPath2)"/>
<path d="M506.5 439 L501.5 451 L506.5 448 L511.5 451 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path d="M506.5 480 L511.5 468 L506.5 471 L501.5 468 Z" clip-path="url(#clipPath2)" stroke="none"/>
</g>
</g>
</svg>
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill-opacity="1" color-rendering="auto" color-interpolation="auto" text-rendering="auto" stroke="black" stroke-linecap="square" width="256" stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1" height="214" font-family="'Dialog'" font-style="normal" stroke-linejoin="miter" font-size="12px" stroke-dashoffset="0" image-rendering="auto">
<!--Generated by ySVG 2.5-->
<defs id="genericDefs"/>
<g>
<defs id="defs1">
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath1">
<path d="M0 0 L256 0 L256 214 L0 214 L0 0 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath2">
<path d="M292 298 L548 298 L548 512 L292 512 L292 298 Z"/>
</clipPath>
</defs>
<g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="translate(-292,-298)" stroke="white">
<rect x="292" width="256" height="214" y="298" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g fill="rgb(153,204,255)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-292,-298)" stroke="rgb(153,204,255)">
<rect x="292" width="256" height="96" y="298" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-292,-298)" fill="navy" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="navy" stroke-width="3" stroke-miterlimit="1.45">
<rect fill="none" x="292" width="256" height="96" y="298" clip-path="url(#clipPath2)"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-292,-298)" stroke-linecap="butt">
<text x="486.6963" xml:space="preserve" y="350.1543" clip-path="url(#clipPath2)" stroke="none">library</text>
</g>
<g fill="rgb(153,204,255)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-292,-298)" stroke="rgb(153,204,255)">
<rect x="292" width="128" height="64" y="330" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-292,-298)" fill="navy" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="navy" stroke-width="3" stroke-miterlimit="1.45">
<rect fill="none" x="292" width="128" height="64" y="330" clip-path="url(#clipPath2)"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-292,-298)" stroke-linecap="butt">
<text x="323.6885" xml:space="preserve" y="366.1543" clip-path="url(#clipPath2)" stroke="none">framework</text>
</g>
<g fill="silver" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-292,-298)" stroke="silver">
<rect x="298" width="250" height="64" y="448" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-292,-298)" fill="gray" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="gray" stroke-width="3" stroke-miterlimit="1.45">
<rect fill="none" x="298" width="250" height="64" y="448" clip-path="url(#clipPath2)"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-292,-298)" stroke-linecap="butt">
<text x="396.167" xml:space="preserve" y="484.1543" clip-path="url(#clipPath2)" stroke="none">firmware</text>
<path fill="none" d="M356 440.0088 L356 402" clip-path="url(#clipPath2)"/>
<path d="M356 448.0088 L361 436.0088 L356 439.0088 L351 436.0088 Z" clip-path="url(#clipPath2)" stroke="none"/>