From 79dcd62ac47e920aa0f60ec6228ca226182302bf Mon Sep 17 00:00:00 2001
From: Florian Pose <fp@igh-essen.com>
Date: Mon, 25 Sep 2006 15:53:33 +0000
Subject: [PATCH] Moved doc into trunk

---
 doc/Makefile                 |  107 +
 doc/ethercat_doc.tex         | 5037 ++++++++++++++++++++++++++++++++++
 doc/images/ethercat.eps      | 1617 +++++++++++
 doc/images/ethercat.pdf      |  Bin 0 -> 2405 bytes
 doc/images/fmmus.eps         |  941 +++++++
 doc/images/fmmus.fig         |  223 ++
 doc/images/fmmus.pdf         |  Bin 0 -> 31022 bytes
 doc/images/fsm-change.eps    |  424 +++
 doc/images/fsm-change.fig    |  101 +
 doc/images/fsm-change.pdf    |  Bin 0 -> 6686 bytes
 doc/images/fsm-coedown.eps   |  319 +++
 doc/images/fsm-coedown.fig   |   79 +
 doc/images/fsm-coedown.pdf   |  Bin 0 -> 4305 bytes
 doc/images/fsm-eoe.eps       |  282 ++
 doc/images/fsm-eoe.fig       |   65 +
 doc/images/fsm-eoe.pdf       |  Bin 0 -> 4068 bytes
 doc/images/fsm-idle.eps      |  479 ++++
 doc/images/fsm-idle.fig      |  110 +
 doc/images/fsm-idle.pdf      |  Bin 0 -> 7642 bytes
 doc/images/fsm-op.eps        |  524 ++++
 doc/images/fsm-op.fig        |  116 +
 doc/images/fsm-op.pdf        |  Bin 0 -> 9001 bytes
 doc/images/fsm-sii.eps       |  376 +++
 doc/images/fsm-sii.fig       |  106 +
 doc/images/fsm-sii.pdf       |  Bin 0 -> 4799 bytes
 doc/images/fsm-slaveconf.eps |  567 ++++
 doc/images/fsm-slaveconf.fig |  132 +
 doc/images/fsm-slaveconf.pdf |  Bin 0 -> 9093 bytes
 doc/images/fsm-slavescan.eps |  414 +++
 doc/images/fsm-slavescan.fig |  104 +
 doc/images/fsm-slavescan.pdf |  Bin 0 -> 5867 bytes
 doc/images/ighsign.eps       |  183 ++
 doc/images/ighsign.pdf       |  Bin 0 -> 2754 bytes
 doc/images/interrupt.eps     |  635 +++++
 doc/images/interrupt.fig     |   85 +
 doc/images/interrupt.pdf     |  Bin 0 -> 4219 bytes
 doc/images/master-locks.eps  |  254 ++
 doc/images/master-locks.fig  |   54 +
 doc/images/master-locks.pdf  |  Bin 0 -> 3795 bytes
 doc/images/masterarch.eps    |  432 +++
 doc/images/masterarch.fig    |  156 ++
 doc/images/masterarch.pdf    |  Bin 0 -> 3828 bytes
 doc/images/masters.eps       |  140 +
 doc/images/masters.fig       |   23 +
 doc/images/masters.pdf       |  Bin 0 -> 1546 bytes
 doc/images/modes.eps         |  254 ++
 doc/images/modes.fig         |   50 +
 doc/images/modes.pdf         |  Bin 0 -> 3305 bytes
 doc/images/statetrans.eps    |  287 ++
 doc/images/statetrans.fig    |   52 +
 doc/images/statetrans.pdf    |  Bin 0 -> 4550 bytes
 doc/images/uml-all.eps       |  539 ++++
 doc/images/uml-all.fig       |  264 ++
 doc/images/uml-all.pdf       |  Bin 0 -> 3070 bytes
 doc/images/uml-datagram.eps  |  179 ++
 doc/images/uml-datagram.fig  |   38 +
 doc/images/uml-datagram.pdf  |  Bin 0 -> 1466 bytes
 doc/images/uml-debug.eps     |  134 +
 doc/images/uml-debug.fig     |   23 +
 doc/images/uml-debug.pdf     |   75 +
 doc/images/uml-device.eps    |  167 ++
 doc/images/uml-device.fig    |   34 +
 doc/images/uml-device.pdf    |  Bin 0 -> 1484 bytes
 doc/images/uml-domain.eps    |  220 ++
 doc/images/uml-domain.fig    |   39 +
 doc/images/uml-domain.pdf    |  Bin 0 -> 1628 bytes
 doc/images/uml-eoe.eps       |  259 ++
 doc/images/uml-eoe.fig       |   52 +
 doc/images/uml-eoe.pdf       |  Bin 0 -> 1694 bytes
 doc/images/uml-fsm.eps       |  382 +++
 doc/images/uml-fsm.fig       |   93 +
 doc/images/uml-fsm.pdf       |  Bin 0 -> 1991 bytes
 doc/images/uml-master.eps    |  303 ++
 doc/images/uml-master.fig    |   69 +
 doc/images/uml-master.pdf    |  Bin 0 -> 1997 bytes
 doc/images/uml-slave.eps     |  357 +++
 doc/images/uml-slave.fig     |   89 +
 doc/images/uml-slave.pdf     |   81 +
 doc/svn.sty                  |   79 +
 79 files changed, 18204 insertions(+)
 create mode 100644 doc/Makefile
 create mode 100644 doc/ethercat_doc.tex
 create mode 100644 doc/images/ethercat.eps
 create mode 100644 doc/images/ethercat.pdf
 create mode 100644 doc/images/fmmus.eps
 create mode 100644 doc/images/fmmus.fig
 create mode 100644 doc/images/fmmus.pdf
 create mode 100644 doc/images/fsm-change.eps
 create mode 100644 doc/images/fsm-change.fig
 create mode 100644 doc/images/fsm-change.pdf
 create mode 100644 doc/images/fsm-coedown.eps
 create mode 100644 doc/images/fsm-coedown.fig
 create mode 100644 doc/images/fsm-coedown.pdf
 create mode 100644 doc/images/fsm-eoe.eps
 create mode 100644 doc/images/fsm-eoe.fig
 create mode 100644 doc/images/fsm-eoe.pdf
 create mode 100644 doc/images/fsm-idle.eps
 create mode 100644 doc/images/fsm-idle.fig
 create mode 100644 doc/images/fsm-idle.pdf
 create mode 100644 doc/images/fsm-op.eps
 create mode 100644 doc/images/fsm-op.fig
 create mode 100644 doc/images/fsm-op.pdf
 create mode 100644 doc/images/fsm-sii.eps
 create mode 100644 doc/images/fsm-sii.fig
 create mode 100644 doc/images/fsm-sii.pdf
 create mode 100644 doc/images/fsm-slaveconf.eps
 create mode 100644 doc/images/fsm-slaveconf.fig
 create mode 100644 doc/images/fsm-slaveconf.pdf
 create mode 100644 doc/images/fsm-slavescan.eps
 create mode 100644 doc/images/fsm-slavescan.fig
 create mode 100644 doc/images/fsm-slavescan.pdf
 create mode 100644 doc/images/ighsign.eps
 create mode 100644 doc/images/ighsign.pdf
 create mode 100644 doc/images/interrupt.eps
 create mode 100644 doc/images/interrupt.fig
 create mode 100644 doc/images/interrupt.pdf
 create mode 100644 doc/images/master-locks.eps
 create mode 100644 doc/images/master-locks.fig
 create mode 100644 doc/images/master-locks.pdf
 create mode 100644 doc/images/masterarch.eps
 create mode 100644 doc/images/masterarch.fig
 create mode 100644 doc/images/masterarch.pdf
 create mode 100644 doc/images/masters.eps
 create mode 100644 doc/images/masters.fig
 create mode 100644 doc/images/masters.pdf
 create mode 100644 doc/images/modes.eps
 create mode 100644 doc/images/modes.fig
 create mode 100644 doc/images/modes.pdf
 create mode 100644 doc/images/statetrans.eps
 create mode 100644 doc/images/statetrans.fig
 create mode 100644 doc/images/statetrans.pdf
 create mode 100644 doc/images/uml-all.eps
 create mode 100644 doc/images/uml-all.fig
 create mode 100644 doc/images/uml-all.pdf
 create mode 100644 doc/images/uml-datagram.eps
 create mode 100644 doc/images/uml-datagram.fig
 create mode 100644 doc/images/uml-datagram.pdf
 create mode 100644 doc/images/uml-debug.eps
 create mode 100644 doc/images/uml-debug.fig
 create mode 100644 doc/images/uml-debug.pdf
 create mode 100644 doc/images/uml-device.eps
 create mode 100644 doc/images/uml-device.fig
 create mode 100644 doc/images/uml-device.pdf
 create mode 100644 doc/images/uml-domain.eps
 create mode 100644 doc/images/uml-domain.fig
 create mode 100644 doc/images/uml-domain.pdf
 create mode 100644 doc/images/uml-eoe.eps
 create mode 100644 doc/images/uml-eoe.fig
 create mode 100644 doc/images/uml-eoe.pdf
 create mode 100644 doc/images/uml-fsm.eps
 create mode 100644 doc/images/uml-fsm.fig
 create mode 100644 doc/images/uml-fsm.pdf
 create mode 100644 doc/images/uml-master.eps
 create mode 100644 doc/images/uml-master.fig
 create mode 100644 doc/images/uml-master.pdf
 create mode 100644 doc/images/uml-slave.eps
 create mode 100644 doc/images/uml-slave.fig
 create mode 100644 doc/images/uml-slave.pdf
 create mode 100644 doc/svn.sty

diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 00000000..be8d4a5f
--- /dev/null
+++ b/doc/Makefile
@@ -0,0 +1,107 @@
+#------------------------------------------------------------------------------
+#
+#  LaTeX Makefile
+#
+#  $Id$
+#
+#------------------------------------------------------------------------------
+
+FILE := ethercat_doc
+
+DVI_DEPEND := images/*.eps
+PDF_DEPEND := images/*.pdf
+
+LATEX_OPTIONS := -file-line-error-style
+
+LATEX_CMD := latex $(LATEX_OPTIONS) \\nonstopmode\\input{$(FILE).tex}
+PDFLATEX_CMD := pdflatex $(LATEX_OPTIONS) $(FILE)
+
+#------------------------------------------------------------------------------
+
+dvi: $(FILE).dvi
+
+pdf: $(FILE).pdf
+
+all: dvi pdf
+
+$(FILE).dvi: $(FILE).tex $(DVI_DEPEND)
+	@if [ ! -f $(FILE).toc ]; then touch $(FILE).toc; fi
+	@if [ ! -f $(FILE).idx ]; then touch $(FILE).idx; fi
+	@if [ ! -f $(FILE).glo ]; then touch $(FILE).glo; fi
+	@cp $(FILE).toc $(FILE).toc.bak
+	@cp $(FILE).idx $(FILE).idx.bak
+	@cp $(FILE).glo $(FILE).glo.bak
+	$(LATEX_CMD)
+	@count=5; \
+	while (grep -s 'cross-references' $(FILE).log || \
+		! diff -q $(FILE).toc $(FILE).toc.bak) && \
+		[ $$count -gt 0 ]; \
+	do \
+		cp $(FILE).toc $(FILE).toc.bak; \
+		$(LATEX_CMD); \
+		count=`expr $$count - 1`; \
+	done
+	@rerunlatex=0
+	@if ! diff -q $(FILE).idx $(FILE).idx.bak; then \
+		echo "Rebuilding Index"; \
+		makeindex $(FILE); \
+		rerunlatex=1; \
+	fi
+	@if ! diff -q $(FILE).glo $(FILE).glo.bak; then \
+		echo "Rebuilding Glossary"; \
+		makeindex $(FILE).glo -s nomencl.ist -o $(FILE).gls; \
+		rerunlatex=1; \
+	fi
+	@if [ ! $$rerunlatex ]; then \
+		echo "Re-running LaTeX..."; \
+		$(LATEX_CMD); \
+	fi
+	@rm -f $(FILE).toc.bak
+	@rm -f $(FILE).idx.bak
+	@rm -f $(FILE).glo.bak
+
+$(FILE).pdf: $(FILE).tex $(PDF_DEPEND)
+	@if [ ! -f $(FILE).toc ]; then touch $(FILE).toc; fi
+	@if [ ! -f $(FILE).idx ]; then touch $(FILE).idx; fi
+	@if [ ! -f $(FILE).glo ]; then touch $(FILE).glo; fi
+	@cp $(FILE).toc $(FILE).toc.bak
+	@cp $(FILE).idx $(FILE).idx.bak
+	@cp $(FILE).glo $(FILE).glo.bak
+	$(PDFLATEX_CMD)
+	@count=5; \
+	while (grep -s 'cross-references' $(FILE).log || \
+		! diff -q $(FILE).toc $(FILE).toc.bak) && \
+		[ $$count -gt 0 ]; \
+	do \
+		cp $(FILE).toc $(FILE).toc.bak; \
+		$(PDFLATEX_CMD); \
+		count=`expr $$count - 1`; \
+	done
+	@rerunlatex=0
+	@if ! diff -q $(FILE).idx $(FILE).idx.bak; then \
+		echo "Rebuilding Index"; \
+		makeindex $(FILE); \
+		rerunlatex=1; \
+	fi
+	@if ! diff -q $(FILE).glo $(FILE).glo.bak; then \
+		echo "Rebuilding Glossary"; \
+		makeindex $(FILE).glo -s nomencl.ist -o $(FILE).gls; \
+		rerunlatex=1; \
+	fi
+	@if [ ! $$rerunlatex ]; then \
+		echo "Re-running LaTeX..."; \
+		$(PDFLATEX_CMD); \
+	fi
+	@rm -f $(FILE).toc.bak
+	@rm -f $(FILE).idx.bak
+	@rm -f $(FILE).glo.bak
+
+clean:
+	@rm -f $(FILE).aux $(FILE).dvi $(FILE).idx \
+			$(FILE).ilg $(FILE).ind $(FILE).log \
+			$(FILE).out $(FILE).pdf $(FILE).ps \
+			$(FILE).toc $(FILE).lot $(FILE).lof \
+			$(FILE).lol $(FILE).glo $(FILE).gls \
+			images/*.bak *~
+
+#------------------------------------------------------------------------------
diff --git a/doc/ethercat_doc.tex b/doc/ethercat_doc.tex
new file mode 100644
index 00000000..3b777827
--- /dev/null
+++ b/doc/ethercat_doc.tex
@@ -0,0 +1,5037 @@
+%------------------------------------------------------------------------------
+%
+%  IgH EtherCAT Master Documentation
+%
+%  $Id$
+%
+%------------------------------------------------------------------------------
+
+\documentclass[a4paper,12pt,BCOR6mm,bibtotoc,idxtotoc]{scrbook}
+
+\usepackage[latin1]{inputenc}
+\usepackage[automark,headsepline]{scrpage2}
+\usepackage{graphicx}
+\usepackage{makeidx}
+\usepackage[refpage]{nomencl}
+\usepackage{listings}
+\usepackage{svn}
+\usepackage{textcomp}
+\usepackage{url}
+\usepackage{hyperref}
+
+\setlength{\parskip}{0.8ex plus 0.8ex minus 0.5ex}
+\setlength{\parindent}{0mm}
+
+\setcounter{secnumdepth}{\subsubsectionlevel}
+
+\DeclareFontShape{OT1}{cmtt}{bx}{n}
+{
+  <5><6><7><8><9><10><10.95><12><14.4><17.28><20.74><24.88>cmttb10
+}{}
+
+\lstset{basicstyle=\ttfamily\small,numberstyle=\tiny,aboveskip=4mm,
+  belowskip=2mm,gobble=2,escapechar=`}
+\renewcommand\lstlistlistingname{List of Listings}
+
+\renewcommand\nomname{Glossary}
+
+\newcommand{\IgH}{\raisebox{-0.7667ex}
+  {\includegraphics[height=2.2ex]{images/ighsign}}}
+
+\SVN $Date$
+\SVN $Revision$
+
+\makeindex
+\makeglossary
+
+%------------------------------------------------------------------------------
+
+\begin{document}
+
+\pagenumbering{roman}
+\pagestyle{empty}
+
+\begin{titlepage}
+  \begin{center}
+    \rule{\textwidth}{1.5mm}
+
+    {\Huge\bf IgH \includegraphics[height=2.4ex]{images/ethercat}
+      Master 1.1\\[1ex]
+      Documentation}
+
+    \vspace{1ex}
+    \rule{\textwidth}{1.5mm}
+
+    \vspace{\fill}
+    {\Large Florian Pose, \url{fp@igh-essen.com}\\[1ex]
+      Ingenieurgemeinschaft \IgH}
+
+    \vspace{\fill}
+    {\Large Essen, \SVNDate\\[1ex]
+      Revision \SVNRevision}
+  \end{center}
+\end{titlepage}
+
+%------------------------------------------------------------------------------
+
+\tableofcontents
+\listoftables
+\listoffigures
+\lstlistoflistings
+
+%------------------------------------------------------------------------------
+
+\newpage
+\pagestyle{scrheadings}
+
+\section*{Conventions}
+\addcontentsline{toc}{section}{Conventions}
+\markleft{Conventions}
+
+The following typographic conventions are used:
+
+\begin{itemize}
+\item \textit{Italic face} is used for newly introduced terms, file
+  names, parameter names and in-text source code elements.
+\item \texttt{Typewriter face} is used for code examples and
+  command line output.
+\item \texttt{\textbf{Bold typewriter face}} is used for user input in
+  command lines.
+\end{itemize}
+
+Data values and addresses are specified as hexadecimal values with the
+prefix 0x. Example: 0x88A4. Unless otherwise noted, address values are
+specified as byte addresses.
+
+Concerning bit operations, the phrase ``setting a bit'', stands for
+setting the bit to $1$, ``clearing a bit'' means setting it to $0$,
+respectively.
+
+Function names are always printed with parentheses, but without
+parameters. So, if a function \textit{ecrt\_request\_master()} has
+empty parentheses, this does not mean, that it has no parameters.
+
+If shell commands have to be entered, this is marked by a prompt:
+
+\begin{lstlisting}[gobble=2]
+  host>
+\end{lstlisting}
+
+Further, if a shell command has to be entered as the superuser, the
+prompt ends with a mesh:
+
+\begin{lstlisting}[gobble=2]
+  host#
+\end{lstlisting}
+
+%------------------------------------------------------------------------------
+
+\chapter{The IgH EtherCAT Master}
+\label{chapter:master}
+\pagenumbering{arabic}
+
+This section will first introduce the master's general features and
+the concepts used for master development and will then explain the
+master's general architecture and offer details of the different
+modules. In addition, it will cover state machine definitions, mailbox
+protocol implementation and the user space interface. The last section
+will deal with timing aspects.
+
+%------------------------------------------------------------------------------
+
+\section{Feature Summary}
+\label{sec:summary}
+\index{Master!Features}
+
+The list below gives a short summary of the features of the
+implemented EtherCAT master.
+
+\begin{itemize}
+\item The master runs as a kernel module for Linux 2.6.
+\item It comes with EtherCAT-capable network driver for RealTek
+  RTL8139 (and compatible) network interface cards.
+  \begin{itemize}
+  \item The Ethernet hardware is operated without interrupts.
+  \item Drivers for additional Ethernet hardware can easily be
+    implemented due to a common device interface provided by the
+    master.
+  \end{itemize}
+\item The master module supports multiple EtherCAT masters on one
+  machine.
+\item The master code supports any Linux realtime extension through
+  its independent architecture.
+  \begin{itemize}
+  \item RTAI\nomenclature{RTAI}{RealTime Application Interface},
+    ADEOS\nomenclature{ADEOS}{Adaptive Domain Environment for
+      Operating Systems}, etc.
+  \item It runs well even without realtime extensions.
+  \end{itemize}
+\item Common ``realtime interface'' for modules, that want to use
+  EtherCAT functionality.
+  \begin{itemize}
+  \item Synchronous and asynchronous sending and receiving of frames
+    is supported.
+  \item Avoidance of unnecessary copy operations for process data.
+  \end{itemize}
+\item \textit{Domains} are introduced, to allow grouping of process
+  data objects.
+  \begin{itemize}
+  \item Handling of multiple domains with different sampling rates.
+  \item Automatic calculation of process data mapping, FMMU and sync manager
+    configuration within each domain.
+  \end{itemize}
+\item Communication through serveral finite state machines.
+  \begin{itemize}
+  \item Bus monitoring possible during realtime operation.
+  \item Automatic reconfiguration of slaves on bus power failure
+    during realtime operation.
+  \item Controlling of single slaves during realtime operation.
+  \end{itemize}
+\item Master idle mode.
+  \begin{itemize}
+  \item Automatic scanning of slaves upon topology changes.
+  \item Bus visualisation and EoE processing without a realtime module
+    connected.
+  \end{itemize}
+\item Implementation of the CANopen-over-EtherCAT (CoE) protocol.
+  \begin{itemize}
+  \item Configuration of CoE-capable slaves via SDO interface.
+  \end{itemize}
+\item Implementation of the Ethernet-over-EtherCAT (EoE) protocol.
+  \begin{itemize}
+  \item Each master creates virtual network devices that are
+    automatically coupled to EoE-cap\-able slaves found.
+  \item This implementation natively supports either a switched or a
+    routed EoE network architecture.
+  \end{itemize}
+\item User space interface via the System Filesystem
+  (Sysfs)\nomenclature{Sysfs}{System Filesystem}.
+  \begin{itemize}
+  \item User space tool for bus visualisation.
+  \item Slave E$^2$PROM image reading and writing.
+  \end{itemize}
+\item Seamless system integration though LSB\nomenclature{LSB}{Linux
+    Standard Base} compliance.
+  \begin{itemize}
+  \item Master and network device configuration via Sysconfig files.
+  \item Linux Standard Base compatible init script for master control.
+  \end{itemize}
+\item Virtual read-only network interface for monitoring and debugging
+  purposes.
+\end{itemize}
+
+%------------------------------------------------------------------------------
+
+\section{License}
+\label{sec:license}
+
+The master code is released under the terms and conditions of the GNU
+General Public License\index{GPL} \cite{gpl} (version 2). Other
+developers, that want to use EtherCAT with Linux systems, are invited
+to use the master code or even participate on development.
+
+%------------------------------------------------------------------------------
+
+\section{General Master Architecture}
+\label{sec:masterarch}
+\index{Master!Architecture}
+
+The EtherCAT master is integrated into the Linux 2.6 kernel. This was
+an early design decision, which has been made for serveral reasons:
+
+\begin{itemize}
+\item Kernel code has significantly better realtime characteristics,
+  i.~e. less jitter than user space code. It was foreseeable, that a
+  fieldbus master has a lot of cyclic work to do. Cyclic work is
+  usually triggered by timer interrupts inside the kernel. The
+  execution delay of a function that processes timer interrupts is
+  less, when it resides in kernel space, because there is no need of
+  time-consuming context switches to a user space process.
+\item It was also foreseeable, that the master code has to directly
+  communicate with the Ethernet hardware. This has to be done in the
+  kernel anyway (through network device drivers), which is one more
+  reason for the master code being in kernel space.
+\end{itemize}
+
+A general overview of the master architecture can be seen in
+figure~\ref{fig:masterarch}.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.9\textwidth]{images/masterarch}
+  \caption{Master architecture}
+  \label{fig:masterarch}
+\end{figure}
+
+\paragraph{Master Module}
+\index{Master module}
+
+The EtherCAT master mainly consists of the master module, containing
+one or more EtherCAT masters (section~\ref{sec:mastermod}), the
+``Device Interface'' (section~\ref{sec:ecdev}) and the ``Realtime
+Interface'' (section~\ref{sec:ecrt}).
+
+\paragraph{Device Modules}
+\index{Device modules}
+
+Furthermore there are EtherCAT-capable network device driver
+modules\index{Device modules}, that connect to the EtherCAT master via
+the device interface. These modified network drivers can handle both
+network devices used for EtherCAT operation and ``normal'' Ethernet
+devices. The common case is, that the master module offers a single
+EtherCAT master: An EtherCAT-capable network device driver module
+connects one network device to this master, that is now able to send
+and receive EtherCAT frames, while all other network devices handled
+by the network driver get connected to the kernel's network stack as
+usual.
+
+\paragraph{Realtime Modules}
+
+A ``realtime module''\index{Realtime module} is a kernel module, that
+uses the EtherCAT master for cyclic exchange of process data with
+EtherCAT slaves. Realtime modules are not part of the EtherCAT master
+code\footnote{Although there are serveral examples provided in the
+  \textit{examples} directory, see chapter~\ref{chapter:usage} for
+  more information}, so anybody wanting to use the master has to write
+one. A realtime module can ``request'' a master through the realtime
+interface. If this succeeds, the module has the control over the
+master. It can now configure slaves and set up a process data image
+(see section~\ref{sec:processdata}) for cyclic exchange. This cyclic
+code has to be provided by the realtime module, so it is in hands of
+the developer, which mechanism to use for this. Moreover he has to
+decide, whether or not using a Linux realtime extension.
+
+\paragraph{Why ``Realtime'' Module?}
+
+The name shall not imply, that a linux realtime extension is
+mandatory: The master runs well even without realtime extensions, as
+section~\ref{sec:mini} shows. However, the code using the master is
+time-critical, because process data IO has to be done in cyclic work.
+Some EtherCAT slaves support watchdog units, that stop driving the
+outputs when process data was not exchanged for some time. So the
+names ``realtime interface'' and ``realtime module'' are quite
+appropriate.
+
+%------------------------------------------------------------------------------
+
+\subsection{Handling of Process Data}
+\label{sec:processdata}
+
+\paragraph{Process Data Image}
+\index{Process data}
+
+The slaves offer their inputs and outputs by presenting the master
+so-called ``Process Data Objects'' (PDOs\index{PDO}). The available
+PDOs can be determined by reading out the slave's TXPDO and RXPDO
+E$^2$PROM categories. The realtime module can register the PDOs for
+data exchange during cyclic operation. The sum of all registered PDOs
+defines the ``process data image'', which is exchanged via the
+``Logical ReadWrite'' datagrams introduced
+in~\cite[section~5.4.2.4]{dlspec}.
+
+\paragraph{Process Data Domains}
+\index{Domain}
+
+The process data image can be easily managed by creating co-called
+``domains'', which group PDOs and allocate the datagrams needed to
+exchange them. Domains are mandatory for process data exchange, so
+there has to be at least one. They were introduced for the following
+reasons:
+
+\begin{itemize}
+\item The maximum size of a ``Logical ReadWrite'' datagram is limited
+  due to the limited size of an Ethernet frame: The maximum data size
+  is the Ethernet data field size minus the EtherCAT frame header,
+  EtherCAT datagram header and EtherCAT datagram footer: $1500 - 2 -
+  12 - 2 = 1484$ octets. If the size of the process data image exceeds
+  this limit, multiple frames have to be sent, and the image has to be
+  partitioned for the use of multiple datagrams. A domain manages this
+  automatically.
+\item Not every PDO has to be exchanged with the same frequency: The
+  values of PDOs can vary slowly over time (for example temperature
+  values), so exchanging them with a high frequency would just waste
+  bus bandwidth. For this reason, multiple domains can be created, to
+  group different PDOs and so allow separate exchange.
+\end{itemize}
+
+There is no upper limit for the number of domains, but each domain
+occupies one FMMU in each slave involved, so the maximum number of
+domains is also limited by the slaves' capabilities.
+
+\paragraph{FMMU Configuration}
+\index{FMMU!Configuration}
+
+A realtime module can register PDOs for process data exchange. Every
+PDO is part of a memory area in the slave's physical memory, that is
+protected by a sync manager \cite[section~6.7]{dlspec} for
+synchronized access. In order to make a sync manager react on a
+datagram accessing its memory, it is necessary to access the last byte
+covered by the sync manager. Otherwise the sync manager will not react
+on the datagram and no data will be exchanged. That is why the whole
+synchronized memory area has to be included into the process data
+image: For example, if a certain PDO of a slave is registered for
+exchange with a certain domain, one FMMU will be configured to map the
+complete sync-manager-protected memory, the PDO resides in. If a
+second PDO of the same slave is registered for process data exchange
+within the same domain, and this PDO resides in the same
+sync-manager-protected memory as the first PDO, the FMMU configuration
+is not touched, because the appropriate memory is already part of the
+domain's process data image.  If the second PDO belongs to another
+sync-manager-protected area, this complete area is also included into
+the domains process data image. See figure~\ref{fig:fmmus} for an
+overview, how FMMU's are configured to map physical memory to logical
+process data images.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=\textwidth]{images/fmmus}
+  \caption{FMMU configuration for serveral domains}
+  \label{fig:fmmus}
+\end{figure}
+
+\paragraph{Process Data Pointers}
+
+The figure also demonstrates the way, the realtime module can access the
+exchanged process data: At PDO registration, the realtime module has
+to provide the address of a process data pointer. Upon calculation of
+the domain image and allocation of process data memory, this pointer
+is redirected to the appropriate location inside the domain's process
+data memory and can later be easily dereferenced by the module code.
+
+%------------------------------------------------------------------------------
+
+\subsection{Operation Modes}
+\index{Master modes}
+
+The EtherCAT master has serveral modes of operation:
+
+\begin{description}
+\item[Orphaned Mode] This mode takes effect, when the master has no
+  EtherCAT-capable network device connected. No bus communication is
+  possible, so this mode is not of further interest.
+\item[Idle Mode]\index{Idle mode} takes effect when the master is
+  unused (i.~e. there is no realtime module, that reserved the
+  master). In this case, the master has the ability to scan the bus by
+  itsself and generously allow bus access from user space.  This mode
+  is meant for maintenance and visualisation.
+\item[Operation Mode]\index{Operation mode} The master is reserved for
+  exclusive access by a realtime module. In this mode, the master is
+  adjusted for availability and monitoring. Access from user space is
+  very restrictive and mostly limited to reading direction.
+
+\end{description}
+
+Figure~\ref{fig:modes} shows the three modes and the possible mode
+transitions.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.9\textwidth]{images/modes}
+  \caption{Master modes and transitions}
+  \label{fig:modes}
+\end{figure}
+
+\subsubsection{Idle Mode}
+\index{Idle mode}
+
+The master enters idle mode upon connection of a device module (see
+section~\ref{sec:device}) or releasing by a realtime module. The
+master owns a kernel workqueue and a suitable work structure, which is
+used to cyclically process the ``Idle state machine'' (see
+section~\ref{sec:fsm-idle}). This state machine automatically scans
+the bus for slaves (and re-scans upon topology changes), configures
+slaves for idle operation and executes pending operations from the
+user space interface (for example E$^2$PROM writing). On device
+disconnection or realtime request, the idle mode is stopped by
+cancelling the work and flushing the workqueue.
+
+\subsubsection{Operation Mode}
+\index{Operation mode}
+
+Operation mode is entered when a realtime module requests the master.
+The idle mode is stopped and the bus is scanned by getting the number
+of slaves and executing the ``Slave scan state machine'' (see
+section~\ref{sec:fsm-scan}) for each slave. The master is now ready to
+create domains and accept PDO registrations and slave configurations.
+After that, cyclic communication can be done by the realtime module.
+
+\paragraph{Master Phases}
+
+Every realtime module should use the master in three phases:
+
+\begin{enumerate}
+\item \textit{Startup} - The master is requested and the bus is
+  validated. Domains are created and PDOs are registered. Slave
+  configurations are applied.
+\item \textit{Operation} - Cyclic code is run, process data is
+  exchanged and the master state machine is executed.
+\item \textit{Shutdown} - Cyclic code is stopped and the master
+  is released.
+\end{enumerate}
+
+%------------------------------------------------------------------------------
+
+\section{Device Modules}
+\label{sec:device}
+\index{Device modules}
+
+Device modules are network device driver modules that handle Ethernet
+devices, which the master can use to connect to an EtherCAT bus.
+
+Section~\ref{sec:networkdrivers} offers an overview of general Linux
+network driver modules, while section~\ref{sec:requirements} will show
+the requirements to an EtherCAT-enabled network driver. Finally,
+sections~\ref{sec:seldev} to~\ref{sec:patching} show how to fulfill
+these requirements and implement such a driver module.
+
+%------------------------------------------------------------------------------
+
+\subsection{Network Driver Basics}
+\label{sec:networkdrivers}
+\index{Network drivers}
+
+EtherCAT relies on Ethernet hardware and the master needs a physical
+Ethernet device to communicate with the bus. Therefore it is necessary
+to understand how Linux handles network devices and their drivers,
+respectively.
+
+\paragraph{Tasks of a Network Driver}
+
+Network device drivers handle the lower two layers of the OSI model,
+that is the physical layer and the data-link layer. A network device
+itself natively handles the physical layer issues: It represents the
+hardware to connect to the medium and to send and receive data in the
+way, the physical layer protocol describes. The network device driver
+is responsible for getting data from the kernel's networking stack and
+forwarding it to the hardware, that does the physical transmission.
+If data is received by the hardware respectively, the driver is
+notified (usually by means of an interrupt) and has to read the data
+from the hardware memory and forward it to the network stack. There
+are a few more tasks, a network device driver has to handle, including
+queue control, statistics and device dependent features.
+
+\paragraph{Driver Startup}
+
+Usually, a driver searches for compatible devices on module loading.
+For PCI drivers, this is done by scanning the PCI bus and checking for
+known device IDs. If a device is found, data structures are allocated
+and the device is taken into operation.
+
+\paragraph{Interrupt Operation}
+\index{Interrupt}
+
+A network device usually provides a hardware interrupt that is used to
+notify the driver of received frames and success of transmittion, or
+errors, respectively. The driver has to register an interrupt service
+routine (ISR\index{ISR}\nomenclature{ISR}{Interrupt Service Routine}),
+that is executed each time, the hardware signals such an event. If the
+interrupt was thrown by the own device (multiple devices can share one
+hardware interrupt), the reason for the interrupt has to be determined
+by reading the device's interrupt register. For example, if the flag
+for received frames is set, frame data has to be copied from hardware
+to kernel memory and passed to the network stack.
+
+\paragraph{The net\_device structure}
+\index{net\_device}
+
+The driver registers a \textit{net\_device} structure for each device
+to communicate with the network stack and to create a ``network
+interface''. In case of an Ethernet driver, this interface appears as
+\textit{ethX}, where X is a number assigned by the kernel on
+registration. The \textit{net\_device} structure receives events
+(either from user space or from the network stack) via serveral
+callbacks, which have to be set before registration. Not every
+callback is mandatory, but for reasonable operation the ones below are
+needed in any case:
+
+\begin{description}
+\item[int (*open)(struct net\_device *)] This function is called when
+  network communication has to be started, for example after a command
+  \textit{ifconfig ethX up} from user space. Frame reception has to be
+  enabled by the driver.
+\item[int (*stop)(struct net\_device *)] The purpose of this callback
+  is to ``close'' the device, i.~e. make the hardware stop receiving
+  frames.
+\item[int (*hard\_start\_xmit)(struct sk\_buff *, struct net\_device
+  *)] This function is cal\-led for each frame that has to be
+  transmitted.  The network stack passes the frame as a pointer to an
+  \textit{sk\_buff} structure (``socket buffer''\index{Socket buffer},
+  see below), which has to be freed after sending.
+\item[struct net\_device\_stats *(*get\_stats)(struct net\_device *)]
+  This call has to return a pointer to the device's
+  \textit{net\_device\_stats} structure, which permanently has to be
+  filled with frame statistics. This means, that everytime a frame is
+  received, sent, or an error happened, the appropriate counter in
+  this structure has to be increased.
+\end{description}
+
+The actual registration is done with the \textit{register\_netdev()}
+call, unregistering is done with \textit{unregister\_netdev()}.
+
+\paragraph{The netif Interface}
+\index{netif}
+
+All other communication in the direction interface $\to$ network stack
+is done via the \textit{netif\_*} calls. For example, on successful
+device opening, the network stack has to be notified, that it can now
+pass frames to the interface. This is done by calling
+\textit{netif\_start\_queue()}. After this call, the
+\textit{hard\_start\_xmit()} callback can be called by the network
+stack. Furthermore a network driver usually manages a frame
+transmission queue. If this gets filled up, the network stack has to
+be told to stop passing further frames for a while. This happens with
+a call to \textit{netif\_stop\_queue()}. If some frames have been
+sent, and there is enough space again to queue new frames, this can be
+notified with \textit{netif\_wake\_queue()}. Another important call is
+\textit{netif\_receive\_skb()}\footnote{This function is part of the
+  NAPI (``New API''), that replaces the ``old'' kernel 2.4 technique
+  for interfacing to the network stack (with \textit{netif\_rx()}).
+  NAPI is a technique to improve network performance on Linux. Read
+  more in
+  http://www.cyberus.ca/\textasciitilde{}hadi/usenix-paper.tgz}: It
+passes a frame to the network stack, that was just received by the
+device.  Frame data has to be packed into a so-called ``socket
+buffer'' for that (see below).
+
+\paragraph{Socket Buffers}
+\index{Socket buffer}
+
+Socket buffers are the basic data type for the whole network stack.
+They serve as containers for network data and are able to quickly add
+data headers and footers, or strip them off again. Therefore a socket
+buffer consists of an allocated buffer and serveral pointers that mark
+beginning of the buffer (\textit{head}), beginning of data
+(\textit{data}), end of data (\textit{tail}) and end of buffer
+(\textit{end}). In addition, a socket buffer holds network header
+information and (in case of received data) a pointer to the
+\textit{net\_device}, it was received on. There exist functions that
+create a socket buffer (\textit{dev\_alloc\_skb()}), add data either
+from front (\textit{skb\_push()}) or back (\textit{skb\_put()}),
+remove data from front (\textit{skb\_pull()}) or back
+(\textit{skb\_trim()}), or delete the buffer (\textit{kfree\_skb()}).
+A socket buffer is passed from layer to layer, and is freed by the
+layer that uses it the last time. In case of sending, freeing has to
+be done by the network driver.
+
+%------------------------------------------------------------------------------
+
+\subsection{EtherCAT Network Drivers}
+\label{sec:requirements}
+
+There are a few requirements for Ethernet network devices to function
+as EtherCAT devices, when connected to an EtherCAT bus.
+
+\paragraph{Dedicated Interfaces}
+
+For performance and realtime purposes, the EtherCAT master needs
+direct and exclusive access to the Ethernet hardware. This implies
+that the network device must not be connected to the kernel's network
+stack as usual, because the kernel would try to use it as an ordinary
+Ethernet device.
+
+\paragraph{Interrupt-less Operation}
+\index{Interrupt}
+
+EtherCAT frames travel through the logical EtherCAT ring and are then
+sent back to the master. Communication is highly deterministic: A
+frame is sent and will be received again after a constant time.
+Therefore, there is no need to notify the driver about frame
+reception: The master can instead query the hardware for received
+frames.
+
+Figure~\ref{fig:interrupt} shows two workflows for cyclic frame
+transmittion and reception with and without interrupts.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.8\textwidth]{images/interrupt}
+  \caption{Interrupt Operation versus Interrupt-less Operation}
+  \label{fig:interrupt}
+\end{figure}
+
+In the left workflow ``Interrupt Operation'', the data from the last
+cycle is first processed and a new frame is assembled with new
+datagrams, which is then sent.  The cyclic work is done for now.
+Later, when the frame is received again by the hardware, an interrupt
+is triggered and the ISR is executed. The ISR will fetch the frame
+data from the hardware and initiate the frame dissection: The
+datagrams will be processed, so that the data is ready for processing
+in the next cycle.
+
+In the right workflow ``Interrupt-less Operation'', there is no
+hardware interrupt enabled.  Instead, the hardware will be polled by
+the master by executing the ISR. If the frame has been received in the
+meantime, it will be dissected. The situation is now the same as at
+the beginning of the left workflow: The received data is processed and
+a new frame is assembled and sent. There is nothing to do for the rest
+of the cycle.
+
+The interrupt-less operation is desirable, because there is simply no
+need for an interrupt. Moreover hardware interrupts are not conducive
+in improving the driver's realtime behaviour: Their undeterministic
+incidences contribute to increasing the jitter. Besides, if a realtime
+extension (like RTAI) is used, some additional effort would have to be
+made to priorize interrupts.
+
+\paragraph{Ethernet and EtherCAT Devices}
+
+Another issue lies in the way Linux handles devices of the same type.
+For example, a PCI\nomenclature{PCI}{Peripheral Component
+  Interconnect, Computer Bus} driver scans the PCI bus for devices it
+can handle. Then it registers itself as the responsible driver for all
+of the devices found. The problem is, that an unmodified driver can
+not be told to ignore a device because it will be used for EtherCAT
+later. There must be a way to handle multiple devices of the same
+type, where one is reserved for EtherCAT, while the other is treated
+as an ordinary Ethernet device.
+
+For all this reasons, the author has decided that the only acceptable
+solution is to modify standard Ethernet drivers in a way that they
+keep their normal functionality, but gain the ability to treat one or
+more of the devices as EtherCAT-capable.
+
+Below are the advantages of this solution:
+
+\begin{itemize}
+\item No need to tell the standard drivers to ignore certain devices.
+\item One networking driver for EtherCAT and non-EtherCAT devices.
+\item No need to implement a network driver from scratch and running
+  into issues, the former developers already solved.
+\end{itemize}
+
+The chosen approach has the following disadvantages:
+
+\begin{itemize}
+\item The modified driver gets more complicated, as it must handle
+  EtherCAT and non-EtherCAT devices.
+\item Many additional case differentiations in the driver code.
+\item Changes and bugfixes on the standard drivers have to be ported
+  to the Ether\-CAT-capable versions from time to time.
+\end{itemize}
+
+%------------------------------------------------------------------------------
+
+\subsection{Device Selection}
+\label{sec:seldev}
+
+After loading the master module, at least one EtherCAT-capable network
+driver module has to be loaded, that connects one of its devices to
+the master. To specify an EtherCAT device and the master to connect
+to, all EtherCAT-capable network driver modules should provide two
+module parameters:
+
+\begin{description}
+\item[ec\_device\_index] PCI device index of the device that is
+  connected to the EtherCAT bus. If this parameter is left away, all
+  devices found are treated as ordinary Ethernet devices. Default:
+  $-1$
+\item[ec\_master\_index] Index of the master to connect to. Default:
+  $0$
+\end{description}
+
+The following command loads the EtherCAT-capable RTL8139 device
+driver, telling it to handle the second device as an EtherCAT device
+and connecting it to the first master:
+
+\begin{lstlisting}
+  host# `\textbf{modprobe ec\_8139too ec\_device\_index=1}`
+\end{lstlisting}
+
+Usually, this command does not have to be entered manually, but is
+called by the EtherCAT init script. See section~\ref{sec:init} for
+more information.
+
+%------------------------------------------------------------------------------
+
+\subsection{The Device Interface}
+\label{sec:ecdev}
+\index{Device interface}
+
+An anticipation to the section about the master module
+(section~\ref{sec:mastermod}) has to be made in order to understand
+the way, a network device driver module can connect a device to a
+specific EtherCAT master.
+
+The master module provides a ``device interface'' for network device
+drivers. To use this interface, a network device driver module must
+include the header
+\textit{devices/ecdev.h}\nomenclature{ecdev}{EtherCAT Device}, coming
+with the EtherCAT master code. This header offers a function interface
+for EtherCAT devices which is explained below. All functions of the
+device interface are named with the prefix \textit{ecdev}.
+
+\paragraph{Device Registration}
+
+A network device driver can connect a physical device to an EtherCAT
+master with the \textit{ecdev\_register()} function.
+
+\begin{lstlisting}[language=C]
+  ec_device_t *ecdev_register(unsigned int master_index,
+                              struct net_device *net_dev,
+                              ec_isr_t isr,
+                              struct module *module);
+\end{lstlisting}
+
+The first parameter \textit{master\_index} must be the index of the
+EtherCAT master to connect to (see section~\ref{sec:mastermod}),
+followed by \textit{net\_dev}, the pointer to the corresponding
+net\_device structure, which represents the network device to connect.
+The third parameter \textit{isr} must be a pointer to the interrupt
+service routine (ISR\index{ISR}) handling the device. The master will
+later execute the ISR in order to receive frames and to update the
+device status. The last parameter \textit{module} must be the pointer
+to the device driver module, which is usually accessible via the macro
+\textit{THIS\_MODULE} (see next paragraph). On success, the function
+returns a pointer to an \textit{ec\_device\_t} object, which has to be
+specified when calling further functions of the device interface.
+Therefore the device module has to store this pointer for future use.
+In error case, the \textit{ecdev\_register()} returns \textit{NULL},
+which means that the device could not be registered.  The reason for
+this is printed to \textit{syslog}\index{syslog}. In this case, the
+device module is supposed to abort the module initialisation and let
+the \textit{insmod} command fail.
+
+\paragraph{Implicit Dependencies}
+
+The reason for the module pointer has to be specified at device
+registration is a non-trivial one: The master has to know about the
+module, because there will be an implicit dependency between the
+device module and a later connected realtime module: When a realtime
+module connects to the master, the use count of the master module will
+be increased, so that the master module can not be unloaded for the
+time of the connection. This is reasonable, and so automatically done
+by the kernel. The kernel knows about this dependency, because the
+realtime module uses kernel symbols provided by the master module.
+Moreover it is mandatory, that the device module can be unloaded
+neither, because it is implicitely used by the realtime module, too.
+Unloading it would lead to a fatal situation, because the master would
+have no device to send and receive frames for the realtime module.
+This dependency can not be detected automatically, because the
+realtime module does not use any symbols of the device module.
+Therefore the master explicitly increments the use counter of the
+connected device module upon connection of a realtime module and
+decrements it, if the realtime module disconnects. In this manner, it
+is impossible to unload a device module while the master is in use.
+This is done with the kernel function pair \textit{try\_module\_get()}
+\index{try\_module\_get@\textit{try\_module\_get()}} and
+\textit{module\_put()} \index{module\_put@\textit{module\_put()}}. The
+first one increases the use count of a module and only fails, if the
+module is currenly being unloaded. The last one decreases the use
+count again and never fails. Both functions take a pointer to the
+module as their argument, which the device module therefore has to
+specify upon device registration.
+
+\paragraph{Device Unregistering}
+
+The unregistration of a device is usually done in the device module's
+cleanup function, by calling the \textit{ecdev\_unregister()} function
+and specifying the master index and a pointer to the device object
+again.
+
+\begin{lstlisting}[language=C]
+  void ecdev_unregister(unsigned int master_index,
+                        ec_device_t *device);
+\end{lstlisting}
+
+This function can fail too (if the master index is invalid, or the
+given device was not registered), but due to the fact, that this
+failure can not be dealt with appropriately, because the device module
+is unloading anyway, the failure code would not be of any interest. So
+the function has a void return value.
+
+\paragraph{Starting the Master}
+
+When a device has been initialized completely and is ready to send and
+receive frames, the master has to be notified about this by calling
+the \textit{ecdev\_start()} function.
+
+\begin{lstlisting}[language=C]
+  int ecdev_start(unsigned int master_index);
+\end{lstlisting}
+
+The master will then enter ``Idle Mode'' and start scanning the bus
+(and possibly handling EoE slaves). Moreover it will make the bus
+accessible via Sysfs interface and react to user interactions. The
+function takes one parameter \textit{master\_index}, which has to be
+the same as at the call to \textit{ecdev\_register()}. The return
+value will be non-zero if the starting process failed. In this case
+the device module is supposed to abort the init sequence and make the
+init function return an error code.
+
+\paragraph{Stopping the Master}
+
+Before a device can be unregistered, the master has to be stopped by
+calling the \textit{ecdev\_stop()} function. It will stop processing
+messages of EoE slaves and leave ``Idle Mode''. The only parameter is
+\textit{master\_index}. This function can not fail.
+
+\begin{lstlisting}[language=C]
+  void ecdev_stop(unsigned int master_index);
+\end{lstlisting}
+
+A subsequent call to \textit{ecdev\_unregister()} will now unregister
+the device savely.
+
+\paragraph{Receiving Frames}
+
+The interrupt service routine handling device events usually has a
+section where new frames are fetched from the hardware and forwarded
+to the kernel network stack via \textit{netif\_receive\_skb()}. For an
+EtherCAT-capable device, this has to be replaced by calling the
+\textit{ecdev\_receive()} function to forward the received data to the
+connected EtherCAT master instead.
+
+\begin{lstlisting}[language=C]
+  void ecdev_receive(ec_device_t *device,
+                     const void *data,
+                     size_t size);
+\end{lstlisting}
+
+This function takes 3 arguments, a pointer to the device object
+(\textit{device}), a pointer to the received data, and the size of the
+received data. The data range has to include the Ethernet headers
+starting with the destination address and reach up to the last octet
+of EtherCAT data, excluding the FCS. Most network devices handle the
+FCS in hardware, so it is not seen by the driver code and therefore
+doesn't have to be cut off manually.
+
+\paragraph{Handling the Link Status}
+
+Information about the link status (i.~e. if there is a carrier signal
+detected on the physical port) is also important to the master. This
+information is usually gathered by the ISR and should be forwarded to
+the master by calling the \textit{ecdev\_link\_state()} function. The
+master then can react on this and warn the realtime module of a lost
+link.
+
+\begin{lstlisting}[language=C]
+  void ecdev_link_state(ec_device_t *device,
+                        uint8_t new_state);
+\end{lstlisting}
+
+The parameter \textit{device} has to be a pointer to the device object
+returned by \textit{ecdev\_\-register()}. With the second parameter
+\textit{new\_state}, the new link state is passed: 1, if the link went
+up, and 0, if it went down.
+
+%------------------------------------------------------------------------------
+
+\subsection{Patching Network Drivers}
+\label{sec:patching}
+\index{Network drivers}
+
+This section will demonstrate, how to make a standard Ethernet driver
+EtherCAT-capable. The below code examples are taken out of the
+modified RealTek RTL8139 driver coming with the EtherCAT master
+(\textit{devices/8139too.c}). The driver was originally developed by
+Donald Becker, and is currently maintained by Jeff Garzik.
+
+Unfortunately, there is no standard procedure to enable an Ethernet
+driver for use with the EtherCAT master, but there are a few common
+techniques, that are described in this section.
+
+\begin{enumerate}
+\item A first simple rule is, that \textit{netif\_*()}-calls must be
+  strictly avoided for all EtherCAT devices. As mentioned before,
+  EtherCAT devices have no connection to the network stack, and
+  therefore must not call its interface functions.
+\item Another important thing is, that EtherCAT devices should be
+  operated without interrupts. So any calls of registering interrupt
+  handlers and enabling interrupts at hardware level must be avoided,
+  too.
+\item The master does not use a new socket buffer for each send
+  operation: Instead there is a fix one allocated on master
+  initialization. This socket buffer is filled with an EtherCAT frame
+  with every send operation and passed to the
+  \textit{hard\_start\_xmit()} callback. For that it is necessary,
+  that the socket buffer is not be freed by the network driver as
+  usual.
+\end{enumerate}
+
+As mentioned before, the driver will handle both EtherCAT and ordinary
+Ethernet devices. This implies, that for each device-dependent
+operation, it has to be checked if an EtherCAT device is involved, or
+just an Ethernet device. For means of simplicity, this example driver
+will only handle one EtherCAT device. This makes the case
+differentiations easier.
+
+\paragraph{Global Variables}
+
+First of all, there have to be additional global variables declared,
+as shown in the listing:
+
+\begin{lstlisting}[language=C,numbers=left]
+  static int ec_device_index = -1;
+  static int ec_device_master_index = 0;
+  static ec_device_t *rtl_ec_dev;
+  struct net_device *rtl_ec_net_dev = NULL;
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 1} -- \textcircled{\tiny 2}] To
+  comply to the requirements for parameters of EtherCAT device modules
+  described in section~\ref{sec:seldev}, there have to be additional
+  parameter variables: \textit{ec\_\-device\_\-index} holds the index
+  of the EtherCAT device and defaults to $-1$ (no EtherCAT device),
+  while \textit{ec\_device\_master\_index} stores index of the master,
+  the single device will be connected to. Default: $0$
+\item[\normalfont\textcircled{\tiny 3}] \textit{rtl\_ec\_dev} will be
+  the pointer to the later registered RealTek EtherCAT device, which
+  can be used as a parameter for device methods.
+\item[\normalfont\textcircled{\tiny 4}] \textit{rtl\_ec\_net\_dev} is
+  a pointer to the \textit{net\_device} structure of the dedicated
+  device and is set while scanning the PCI bus and finding the device
+  with the specified index. This is done inside the
+  \textit{pci\_module\_init()} function executed as the first thing on
+  module loading.
+\end{description}
+
+\paragraph{Module Initialization}
+
+Below is the (shortened) coding of the device driver's module init
+function:
+
+\begin{lstlisting}[language=C,numbers=left]
+  static int __init rtl8139_init_module(void)
+  {
+          if (pci_module_init(&rtl8139_pci_driver) < 0) {
+                  printk(KERN_ERR "Failed to init PCI mod.\n");
+                  goto out_return;
+          }
+
+          if (rtl_ec_net_dev) {
+                  printk(KERN_INFO "Registering"
+                         " EtherCAT device...\n");
+                  if (!(rtl_ec_dev =
+                          ecdev_register(ec_device_master_index,
+                                         rtl_ec_net_dev,
+                                         rtl8139_interrupt,
+                                         THIS_MODULE))) {
+                          printk(KERN_ERR "Failed to reg."
+                                          " EtherCAT device!\n");
+                          goto out_unreg_pci;
+                  }
+
+                  printk(KERN_INFO "Starting EtherCAT"
+                         " device...\n");
+                  if (ecdev_start(ec_device_master_index)) {
+                          printk(KERN_ERR "Failed to start"
+                                 " EtherCAT device!\n");
+                          goto out_unreg_ec;
+                  }
+          } else {
+                  printk(KERN_WARNING "No EtherCAT device"
+                         " registered!\n");
+          }
+
+          return 0;
+
+      out_unreg_ec:
+          ecdev_unregister(ec_device_master_index, rtl_ec_dev);
+      out_unreg_pci:
+          pci_unregister_driver(&rtl8139_pci_driver);
+      out_return:
+          return -1;
+  }
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 3}] This call initializes all
+  RTL8139-compatible devices found on the pci bus. If a device with
+  index \textit{ec\_device\_index} is found, a pointer to its
+  \textit{net\_device} structure is stored in
+  \textit{rtl\_ec\_net\_dev} for later use (see next listings).
+\item[\normalfont\textcircled{\tiny 8}] If the specified device was
+  found, \textit{rtl\_ec\_net\_dev} is non-zero.
+\item[\normalfont\textcircled{\tiny 11}] The device is connected to
+  the specified master with a call to \textit{ecdev\_register()}. If
+  this fails, module loading is aborted.
+\item[\normalfont\textcircled{\tiny 23}] The device registration was
+  successful and the master is started. This can fail, which aborts
+  module loading.
+\item[\normalfont\textcircled{\tiny 29}] If no EtherCAT device was
+  found, a warning is output.
+\end{description}
+
+\paragraph{Device Searching}
+
+During the PCI initialization phase, a variable \textit{board\_idx} is
+increased for each RTL8139-compatible device found. The code below is
+executed for each device:
+
+\begin{lstlisting}[language=C,numbers=left]
+  if (board_idx == ec_device_index) {
+          rtl_ec_net_dev = dev;
+          strcpy(dev->name, "ec0");
+  }
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 1}] The device with the specified
+  index will be the EtherCAT device.
+\end{description}
+
+\paragraph{Avoiding Device Registration}
+
+Later in the PCI initialization phase, the net\_devices get
+registered. This has to be avoided for EtherCAT devices and so this is
+a typical example for an EtherCAT case differentiation:
+
+\begin{lstlisting}[language=C,numbers=left]
+  if (dev != rtl_ec_net_dev) {
+          i = register_netdev(dev);
+          if (i) goto err_out;
+  }
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 1}] If the current net\_device is
+  not the EtherCAT device, it is registered at the network stack.
+\end{description}
+
+\paragraph{Avoiding Interrupt Registration}
+
+In the next two listings, there is an interrupt requested and the
+device's interrupts are enabled. This also has to be encapsulated by
+if-clauses, because interrupt operation is not wanted for EtherCAT
+devices.
+
+\begin{lstlisting}[language=C,numbers=left]
+  if (dev != rtl_ec_net_dev) {
+          retval = request_irq(dev->irq, rtl8139_interrupt,
+                               SA_SHIRQ, dev->name, dev);
+          if (retval) return retval;
+  }
+\end{lstlisting}
+
+\begin{lstlisting}[language=C,numbers=left]
+  if (dev != rtl_ec_net_dev) {
+          /* Enable all known interrupts by setting
+             the interrupt mask. */
+          RTL_W16(IntrMask, rtl8139_intr_mask);
+  }
+\end{lstlisting}
+
+\paragraph{Frame Sending}
+
+The listing below shows an exerpt of the function representing the
+\textit{hard\_start\_xmit()} callback of the net\_device.
+
+\begin{lstlisting}[language=C,numbers=left]
+  /* Note: the chip doesn't have auto-pad! */
+  if (likely(len < TX_BUF_SIZE)) {
+          if (len < ETH_ZLEN)
+                  memset(tp->tx_buf[entry], 0, ETH_ZLEN);
+          skb_copy_and_csum_dev(skb, tp->tx_buf[entry]);
+          if (dev != rtl_ec_net_dev) {
+                  dev_kfree_skb(skb);
+          }
+  } else {
+          if (dev != rtl_ec_net_dev) {
+                  dev_kfree_skb(skb);
+          }
+          tp->stats.tx_dropped++;
+          return 0;
+  }
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 6} + \textcircled{\tiny 10}] The
+  master uses a fixed socket buffer for transmission, which is reused
+  and may not be freed.
+\end{description}
+
+\paragraph{Frame Receiving}
+
+During ordinary frame reception, a socket buffer is created and filled
+with the received data. This is not necessary for an EtherCAT device:
+
+\begin{lstlisting}[language=C,numbers=left]
+  if (dev != rtl_ec_net_dev) {
+          /* Malloc up new buffer, compatible with net-2e. */
+          /* Omit the four octet CRC from the length. */
+
+          skb = dev_alloc_skb (pkt_size + 2);
+          if (likely(skb)) {
+                  skb->dev = dev;
+                  skb_reserve(skb, 2); /* 16 byte align
+                                          the IP fields. */
+                  eth_copy_and_sum(skb, &rx_ring[ring_off + 4],
+                                   pkt_size, 0);
+                  skb_put(skb, pkt_size);
+                  skb->protocol = eth_type_trans(skb, dev);
+
+                  dev->last_rx = jiffies;
+                  tp->stats.rx_bytes += pkt_size;
+                  tp->stats.rx_packets++;
+
+                  netif_receive_skb (skb);
+          } else {
+                  if (net_ratelimit())
+                          printk(KERN_WARNING
+                                 "%s: Memory squeeze, dropping"
+                                 " packet.\n", dev->name);
+                  tp->stats.rx_dropped++;
+          }
+  } else {
+          ecdev_receive(rtl_ec_dev,
+                        &rx_ring[ring_offset + 4], pkt_size);
+          dev->last_rx = jiffies;
+          tp->stats.rx_bytes += pkt_size;
+          tp->stats.rx_packets++;
+  }
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 28}] If the device is an EtherCAT
+  device, no socket buffer is allocated. Instead a pointer to the data
+  (which is still in the device's receive ring) is passed to the
+  EtherCAT master. Unnecessary copy operations are avoided.
+\item[\normalfont\textcircled{\tiny 30} -- \textcircled{\tiny 32}] The
+  device's statistics are updated as usual.
+\end{description}
+
+\paragraph{Link State}
+
+The link state (i.~e. if there is a carrier signal detected on the
+receive port) is determined during execution of the ISR. The listing
+below shows the different processing for Ethernet and EtherCAT
+devices:
+
+\begin{lstlisting}[language=C,numbers=left]
+  if (dev != rtl_ec_net_dev) {
+          if (tp->phys[0] >= 0) {
+                  mii_check_media(&tp->mii, netif_msg_link(tp),
+                                  init_media);
+          }
+  } else {
+          void __iomem *ioaddr = tp->mmio_addr;
+          uint16_t link = RTL_R16(BasicModeStatus)
+                          & BMSR_LSTATUS;
+          ecdev_link_state(rtl_ec_dev, link ? 1 : 0);
+  }
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 3}] The ``media check'' is done
+  via the media independent interface (MII\nomenclature{MII}{Media
+    Independent Interface}), a standard interface for Fast Ethernet
+  devices.
+\item[\normalfont\textcircled{\tiny 7} -- \textcircled{\tiny 10}] For
+  EtherCAT devices, the link state is fetched manually from the
+  appropriate device register, and passed to the EtherCAT master by
+  calling \textit{ecdev\_\-link\_\-state()}.
+\end{description}
+
+\paragraph{Module Cleanup}
+
+Below is the module's cleanup function:
+
+\begin{lstlisting}[language=C,numbers=left]
+  static void __exit rtl8139_cleanup_module (void)
+  {
+          printk(KERN_INFO "Cleaning up RTL8139-EtherCAT"
+                 " module...\n");
+
+          if (rtl_ec_net_dev) {
+                  printk(KERN_INFO "Stopping device...\n");
+                  ecdev_stop(ec_device_master_index);
+                  printk(KERN_INFO "Unregistering device...\n");
+                  ecdev_unregister(ec_device_master_index,
+                                   rtl_ec_dev);
+                  rtl_ec_dev = NULL;
+          }
+
+          pci_unregister_driver(&rtl8139_pci_driver);
+
+          printk(KERN_INFO "RTL8139-EtherCAT module"
+                 " cleaned up.\n");
+  }
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 6}] Stopping and unregistration is
+  only done, if a device was registered before.
+\item[\normalfont\textcircled{\tiny 8}] The master is first stopped,
+  so it does not access the device any more.
+\item[\normalfont\textcircled{\tiny 10}] After this, the device is
+  unregistered. The master is now ``ophaned''.
+\end{description}
+
+%------------------------------------------------------------------------------
+
+\section{The Master Module}
+\label{sec:mastermod}
+\index{Master module}
+
+The EtherCAT master is designed to run as a kernel module. Moreover
+the master kernel module \textit{ec\_master} can handle multiple
+masters at the same time: The number of masters has to be passed to
+the module with the parameter \textit{ec\_master\_count}, that
+defaults to $1$. A certain master can later be addressed by its index.
+For example, if the master module has been loaded with the command
+
+\begin{lstlisting}
+  host# `\textbf{modprobe ec\_master ec\_master\_count=2}`
+\end{lstlisting}
+
+the two masters can be addressed by their indices 0 and 1 respectively
+(see figure~\ref{fig:masters}). This master index mandatory for
+certain functions of the master interfaces.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.5\textwidth]{images/masters}
+  \caption{Multiple masters in one module}
+  \label{fig:masters}
+\end{figure}
+
+\paragraph{Master Log Messages}
+
+The master module gives information about it's state and events via
+the syslog interface. The module loading command above should result
+in the following syslog messages:
+
+\begin{lstlisting}
+  EtherCAT: Master driver, 1.1 (stable) - rev. 513,
+            compiled by fp at Aug  09 2006 09:43:50
+  EtherCAT: Initializing 2 EtherCAT master(s)...
+  EtherCAT: Initializing master 0.
+  EtherCAT: Initializing master 1.
+  EtherCAT: Master driver initialized.
+\end{lstlisting}
+
+The master provides information about it's version number, subversion
+revision number and compile information, like the date of compilation
+and the user, who compiled. All messages are prefixed either with
+\texttt{EtherCAT:}, \texttt{EtherCAT WARNING:} or \texttt{EtherCAT
+  ERROR:}, which makes searching the logs easier.
+
+%------------------------------------------------------------------------------
+
+\subsection{Class Reference}
+\label{sec:classes}
+
+This section is not intended to be a complete reference of master
+classes and functions\footnote{The comprehensive master reference can
+  be obtained at http://etherlab.org/download/download-en.html}, but
+will give a general survey of the master's classes, and how they
+interact.
+
+Figure~\ref{fig:uml-all} shows an UML class diagram of the master
+classes.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=\textwidth]{images/uml-all}
+  \caption{UML class diagram with associations}
+  \label{fig:uml-all}
+\end{figure}
+
+The following subsections introduce serveral classes with their
+attributes and methods.
+
+%------------------------------------------------------------------------------
+
+\subsubsection{The Master Class}
+\label{sec:class-master}
+\index{Master!Class}
+
+Figure~\ref{fig:uml-master} shows an UML class diagram of the master
+class. There is a short explanation of the attributes and methods
+below.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.8\textwidth]{images/uml-master}
+  \caption{Master UML class diagram}
+  \label{fig:uml-master}
+\end{figure}
+
+\paragraph{Master Attributes}
+
+\begin{description}
+\item[list] is a listhead structure that is needed to manage the list
+  of masters in the master module (see section~\ref{sec:mastermod}).
+\item[reserved] is a flag, that marks the master as reserved for a
+  realtime module, so that a call to \textit{ecrt\_request\_master()}
+  fails, if another module is already using the master.
+\item[index] contains the number of the master. The first master will
+  get index 0, the second index 1, and so on.
+\item[kobj] In order to make the master object available via Sysfs
+  (see section~\ref{sec:sysfs}), this structure is needed inside the
+  master object (see section~\ref{sec:sysfs}).
+\item[slaves] is the list of slaves. It consists of objects of the
+  \textit{ec\_slave\_t} class (see section~\ref{sec:class-slave}).
+\item[slave\_count] is the number of slaves in the list.
+\item[device] points to the network device that is used by the master
+  to send and receive frames (see section~\ref{sec:class-device}). It
+  is \textit{NULL}, if no device is connected.
+\item[datagram\_queue] is a list of datagrams (see
+  section~\ref{sec:class-datagram}) that have to be sent by the
+  master, or have already been sent and wait to be received again.
+  Upon reception or error, the datagrams are dequeued.
+\item[datagram\_index] contains the index value for the next datagram.
+  The master stores this incrementing index into every datagram, to
+  make it easier to assign a received datagram to the one sent before.
+\item[domains] contains the list of domains created by the realtime
+  module (section~\ref{sec:class-domain}).
+\item[debug\_level] controls, how much debugging output is printed by
+  the master: 0 means no debugging output, 1 means to output certain
+  executing marks and actions, and 2 means to output frame contents in
+  addition. This value can be changed at runtime via the Sysfs
+  interface (see section~\ref{sec:sysfs}).
+\item[stats] is a statistics object that contains certain counters
+  (like the number of missed frames).  These statistics are output on
+  demand, but at most once a second.
+\item[workqueue] is the kernel workqueue used for idle mode.
+\item[idle\_work] is the work object, that is queued.
+\item[fsm] The attribute \textit{fsm} represents the master's finite
+  state machine, that does all the slave processing. See
+  sections~\ref{sec:class-fsm} and~\ref{sec:fsm} for further details.
+\item[mode] contains the current master mode, if it is orphaned, idle,
+  or in operation mode.
+\item[eoe\_timer] is the kernel timer used for EoE\index{EoE}
+  processing.
+\item[eoe\_running] marks the state of EoE processing.
+\item[eoe\_handlers] is the list of EoE handlers (see
+  section~\ref{sec:class-eoe}).
+\item[internal\_lock] is a spinlock used in idle mode, that controls
+  the concurrency of the idle and EoE processes.
+\item[request\_cb] The ``request lock'' callback function, the master
+  has to provide for foreign instances, which want to access the
+  master (see section~\ref{sec:concurr}).
+\item[release\_cb] The callback function that will release the master
+  lock.
+\item[cb\_data] This value will be passed as an argument to each
+  callback.
+\item[eeprom\_write\_enable] flag can be written via Sysfs to enable
+  the general writing of E$^2$PROM contents.
+\end{description}
+
+\paragraph{Public Master Methods}
+
+\begin{description}
+\item[ec\_master\_init()] is the master's constructor. It initializes
+  all attributes, creates the workqueue, creates EoE handlers and the
+  state machine object, and adds the kernel object to the Sysfs
+  hierarchy.
+\item[ec\_master\_clear()] is the destructor and undoes all these
+  actions.
+\item[ec\_master\_reset()] clears the master, but initializes it
+  again. This is needed, when a realtime module disconnects: Slaves
+  and other attributes are cleared and are later rebuilt by the idle
+  process.
+\item[ec\_master\_idle\_start/stop()] These methods enable or disable
+  the idle process.
+\item[ec\_master\_eoe\_start/stop()] These methods do the same for the
+  EoE timer.
+\item[ec\_master\_receive\_datagrams()] This method is called by the
+  device, which uses it to pass received frames to the master.  The
+  frame is dissected and the contained datagrams are assigned to the
+  datagram objects in the datagram queue, which are dequeued on
+  reception or error.
+\item[ec\_master\_queue\_datagram()] This method is used to queue a
+  new datagram for sending and receiving.
+\item[ec\_master\_output\_stats()] This method is cyclically called to
+  output a summary of the \textit{stats} attribute at most once a
+  second.
+\item[ec\_master\_clear\_slaves()] clears the list of slaves. This is
+  needed on connection/disconnection of a realtime module or at a
+  topology change in idle mode, when all slaves objects are rebuilt.
+\end{description}
+
+\paragraph{Private Master Methods}
+
+A few of a master's methods are private, meaning, that they can only
+be called from other master methods:
+
+\begin{description}
+\item[ec\_master\_send\_datagrams()] searches the datagram queue for
+  unsent datagrams, allocates frames to send them, does the actual
+  sending and marks the datagrams as sent.
+\item[ec\_master\_idle\_run()] is the work function for the idle mode.
+  It executes the idle state machine, described in
+  section~\ref{sec:fsm-idle}.
+\item[ec\_master\_eoe\_run()] is called by the EoE timer and is
+  responsible for communicating with EoE-capable slaves. See
+  section~\ref{sec:eoeimp} for more information.
+\end{description}
+
+\paragraph{Master Methods (Realtime Interface)}
+
+The master methods belonging to the Eth\-er\-CAT realtime
+interface\index{ecrt@\textit{ecrt}}\nomenclature{ecrt}{EtherCAT
+  Realtime Interface} begin with the prefix \textit{ecrt} instead of
+\textit{ec}. The functions of the realtime interface are explained in
+section~\ref{sec:ecrt-master}.
+
+%------------------------------------------------------------------------------
+
+\subsubsection{The Slave Class}
+\label{sec:class-slave}
+\index{Slave!Class}
+
+Figure~\ref{fig:uml-slave} shows an UML class diagram of the slave
+class. There is a short explanation of the attributes and methods
+below.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.8\textwidth]{images/uml-slave}
+  \caption{Slave UML class diagram}
+  \label{fig:uml-slave}
+\end{figure}
+
+\paragraph{Slave Attributes}
+
+\begin{description}
+\item[list] The master holds a slave list, therefore the slave class
+  must contain this structure used as an anchor for the linked
+  list.
+\item[kobj] This pointer serves as base object for the slave's Sysfs
+  representation.
+\item[master] is the pointer to the master owning this slave object.
+\item[ring\_position] is the logical position in the logical ring
+  topology.
+\item[station\_address] is the configured station address. This is
+  always the ring position~+~$1$).
+\item[coupler\_index] is the index of the last bus coupler.
+\item[coupler\_subindex] is the slave's position, counted from the
+  last bus coupler. See section~\ref{sec:addr} for more information.
+\item[base\_*] These attributes contain base information about the
+  slave, that are read from the ``DL Information'' attribute.
+\item[dl\_*] These fields store information of the ``DL Status''
+  attribute, for example states of the the communication ports.
+\item[sii\_*] These attributes contain values from the ``Slave
+  Information Interface'' \cite[section~6.4]{dlspec}, mostly identity
+  and mailbox information, but also the list of sync manager
+  configurations and PDOs.
+\item[registered] This flag is set, if one or more PDOs of the slave
+  have been registered for process data exchange. Otherwise a warning
+  is output, because the slave is unused.
+\item[fmmus] Is an array of FMMU configurations, that have to be
+  applied to the slave.
+\item[fmmu\_count] contains number of FMMUs used.
+\item[eeprom\_*] These fields contain E$^2$PROM contents and the
+  extracted category information \cite[section~5.4]{alspec}.
+\item[new\_eeprom\_data] If this pointer is not \textit{NULL}, it
+  points to new E$^2$PROM contents, that have to be written to the
+  slave.
+\item[new\_eeprom\_size] This field represents the size of the new
+  E$^2$PROM data.
+\item[requested\_state] is the requested slave state.
+\item[current\_state] is the current slave state.
+\item[error\_flag] is used by the operation and idle state machines
+  to indicate, that a state transisition has failed and should not be
+  tried again until an external event happens.
+\item[online] This flag contains the online state of the slave (i.~e.
+  if it currently responds to the masters commands). Changes of the
+  online state are always reported.
+\item[varsize\_fields] is only suitable for slaves that provide PDOs
+  of variable size (like slaves that manage a sub-fieldbus) and
+  contains information about what size this fields actually should
+  have.
+\end{description}
+
+\paragraph{Public Slave Methods}
+
+\begin{description}
+\item[ec\_slave\_init()] The slave's constructor.
+\item[ec\_slave\_clear()] The slave's destructor.
+\item[ec\_prepare\_fmmu()] prepares an FMMU configuration. The FMMU is
+  configured for a certain sync manager and domain.
+\item[ec\_fetch\_*()] Serveral methods to extract information of the
+  E$^2$PROM category contents.
+\item[ec\_slave\_locate\_string()] extracts a string out of a STRING
+  category and allocates string memory.
+\item[ec\_slave\_calc\_sync\_size()] calculates the size of sync
+  manager contents, because they can be variable due to variable-sized
+  PDOs.
+\item[ec\_slave\_info()] This method prints all slave information into
+  a buffer for Sysfs reading.
+\item[ec\_slave\_mbox\_*()] These functions prepare datagrams for
+  mailbox communication, or process mailbox responses, respectively.
+\end{description}
+
+\paragraph{Private Slave Methods}
+
+\begin{description}
+\item[ec\_slave\_write\_eeprom()] This function accepts E$^2$PROM data
+  from user space, does a quick validation of the contents and
+  schedules them for writing through the idle state machine.
+\end{description}
+
+\paragraph{Slave Methods (Realtime Interface)}
+
+\begin{description}
+\item[ecrt\_slave\_conf\_sdo*()] These methods accept SDO
+  configurations, that are applied on slave activation (i.~e.
+  everytime the slave is configured). The methods differ only in the
+  data size of the SDO (8, 16 or 32 bit).
+\item[ecrt\_slave\_pdo\_size()] This method specifies the size of a
+  variable-sized PDO.
+\end{description}
+
+%------------------------------------------------------------------------------
+
+\subsubsection{The Device Class}
+\label{sec:class-device}
+\index{Device!Class}
+
+The device class is responsible for communicating with the connected
+EtherCAT-enabled network driver. Figure~\ref{fig:uml-device} shows its
+UML class diagram.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.3\textwidth]{images/uml-device}
+  \caption{Device UML class diagram}
+  \label{fig:uml-device}
+\end{figure}
+
+\paragraph{Device Attributes}
+
+\begin{description}
+\item[master] A pointer to the master, which owns the device object.
+\item[dev] This is the pointer to the \textit{net\_device} structure
+  of the connected network device driver.
+\item[open] This flag stores, if the network device is ``opened'' and
+  ready for transmitting and receiving frames.
+\item[tx\_skb] The transmittion socket buffer. Instead of allocating a
+  new socket buffer for each frame, the same socket buffer is recycled
+  and used for every frame.
+\item[isr] The pointer to the network device's interrupt service
+  routine. \textit{ec\_isr\_t} is a type definition in the device
+  interface, which looks like below:
+  \begin{lstlisting}[gobble=4,language=C]
+    typedef irqreturn_t (*ec_isr_t)(int, void *,
+                                    struct pt_regs *);
+  \end{lstlisting}
+\item[module] A pointer to the network driver module, to increase and
+  decrease the use counter (see paragraph ``Implicit Dependencies'' in
+  section~\ref{sec:ecdev}).
+\item[link\_state] The current link state. It can be 0 ``down'' or 1
+  ``up''.
+\item[dbg] Every device objects contains a debugging interface (see
+  sectios~\ref{sec:class-debug} and~\ref{sec:debug}).
+\end{description}
+
+\paragraph{Public Device Methods}
+
+\begin{description}
+\item[ec\_device\_init()] The device constructor.
+\item[ec\_device\_clear()] The device destructor.
+\item[ec\_device\_open()] ``Opens'' the device for transmittion and
+  reception of frames. This is equivalent to the \textit{ifconfig up}
+  command for ordinary Ethernet devices.
+\item[ec\_device\_close()] Stops frame transmittion and reception.
+  This is equivalent to the \textit{ifconfig down} command for
+  ordinary Ethernet devices.
+\item[ec\_device\_call\_isr()] Calls the interrupt service routine of
+  the device.
+\item[ec\_device\_tx\_data()] Returns a pointer into the memory of the
+  transmittion socket buffer \textit{tx\_skb}. This is used by the
+  master to assemble a new EtherCAT frame.
+\item[ec\_device\_send()] Sends an assembled frame by passing it to
+  the device's \textit{hard\_\-start\_\-xmit()} callback.
+\end{description}
+
+\paragraph{Device Methods (Device Interface)}
+
+The device methods belonging to the device interface are explained in
+section~\ref{sec:ecdev}.
+
+%------------------------------------------------------------------------------
+
+\subsubsection{The Datagram Class}
+\label{sec:class-datagram}
+\index{Datagram!Class}
+
+So send and receive a datagram, an object of the
+\textit{ec\_datagram\_t} class is needed. It can be initialized with a
+datagram type \cite[section~5.4]{dlspec} and length (optionally filled
+with data) and appended to the master's datagram queue.
+Figure~\ref{fig:uml-datagram} shows its UML class diagram.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.3\textwidth]{images/uml-datagram}
+  \caption{Datagram UML class diagram}
+  \label{fig:uml-datagram}
+\end{figure}
+
+\paragraph{Datagram Attributes}
+
+\begin{description}
+\item[list] This attribute is needed to make a list of datagrams, as
+  used in the domain class (see section~\ref{sec:class-domain}).
+\item[queue] This attribute is the anchor to the master's datagram
+  queue, which is implemented as a linked list.
+\item[type] The datagram type. \textit{ec\_\-datagram\_\-type\_\-t} is
+  an enumeration, which can have the values
+  \textit{EC\_\-DATAGRAM\_\-APRD}, \textit{EC\_\-DATAGRAM\_\-APWR},
+  \textit{EC\_\-DATAGRAM\_\-NPRD}, \textit{EC\_\-DATAGRAM\_\-NPWR},
+  \textit{EC\_\-DATAGRAM\_\-BRD}, \textit{EC\_\-DATAGRAM\_\-BWR} or
+  \textit{EC\_\-DATAGRAM\_\-LRW}.
+\item[address] The slave address. For all addressing schemes take 4
+  bytes, \textit{ec\_address\_t} is a union type:
+  \begin{lstlisting}[gobble=4,language=C]
+    typedef union {
+            struct {
+                    uint16_t slave; /**< configured or
+                                         autoincrement
+                                         address */
+                    uint16_t mem; /**< physical memory
+                                       address */
+            } physical; /**< physical address */
+            uint32_t logical; /**< logical address */
+    } ec_address_t;
+  \end{lstlisting}
+\item[data] The actual data of the datagram. These are either filled
+  in before sending (at writing access) or are inserted by the
+  adressed slave(s) (at reading access). In any case, the data memory
+  must be dynamically allocated. Besides, this can be done before
+  cyclic processing with the \textit{ec\_datagram\_prealloc()} method
+  (see below).
+\item[mem\_size] The size of the allocated memory, \textit{data}
+  points to.
+\item[data\_size] The size of the actual data in the \textit{data}
+  memory.
+\item[index] The sequential EtherCAT datagram index. This value is set
+  by the master on sending, to easier assign a received datagram to a
+  queued datagram object.
+\item[working\_counter] The working counter of the datagram. This is
+  set to zero on sending and filled with the real value of the working
+  counter on datagram reception.
+\item[state] The state of the datagram.
+  \textit{ec\_\-datagram\_\-state\_\-t} is an enumeration and can be
+  \textit{EC\_\-DATA\-GRAM\_\-INIT},
+  \textit{EC\_\-DATA\-GRAM\_\-QUEU\-ED},
+  \textit{EC\_\-DATA\-GR\-AM\_\-SEN\-T},
+  \textit{EC\_\-DATA\-GRAM\_\-REC\-EIVED},
+  \textit{EC\_\-DATA\-GRAM\_\-TIMED\_\-OUT} or
+  \textit{EC\_\-DA\-TA\-GRAM\_\-ERR\-OR}.
+\item[t\_sent] This attribute is set to the timestamp, when the
+  datagram was sent, to later detect a timeout.
+\end{description}
+
+\paragraph{Public Datagram Methods}
+
+\begin{description}
+\item[ec\_datagram\_init()] The datagram's constructor.
+\item[ec\_datagram\_clear()] The datagram's destructor.
+\item[ec\_datagram\_prealloc()] Allocates memory for the datagram
+  data. This is especially needed, if the datagram structure will
+  later be used in a context, where no dynamic memory allocation is
+  allowed.
+\item[ec\_datagram\_nprd()] Initializes a ``Node-Addressed Physical
+  Read'' datagram \cite[section~5.4.1.2]{dlspec}.
+\item[ec\_datagram\_npwr()] Initializes a ``Node-Addressed Physical
+  Write'' datagram \cite[section~5.4.2.2]{dlspec}.
+\item[ec\_datagram\_aprd()] Initializes a ``Auto-Increment Physical
+  Read'' datagram \cite[section~5.4.1.1]{dlspec}.
+\item[ec\_datagram\_apwr()] Initializes a ``Auto-Increment Physical
+  Write'' datagram \cite[section~5.4.2.1]{dlspec}.
+\item[ec\_datagram\_brd()] Initializes a ``Broadcast Read'' datagram
+  \cite[section~5.4.1.3]{dlspec}.
+\item[ec\_datagram\_bwr()] Initializes a ``Broadcast Write'' datagram
+  \cite[section~5.4.2.3]{dlspec}.
+\item[ec\_datagram\_lrw()] Initializes a ``Logical ReadWrite''
+  datagram \cite[section~5.4.3.4]{dlspec}.
+\end{description}
+
+%------------------------------------------------------------------------------
+
+\subsubsection{The Domain Class}
+\label{sec:class-domain}
+\index{Domain!Class}
+
+The domain class encapsules PDO registration and management of the
+process data image and its exchange. The UML class diagram can be seen
+in figure~\ref{fig:uml-domain}.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.4\textwidth]{images/uml-domain}
+  \caption{Domain UML class diagram}
+  \label{fig:uml-domain}
+\end{figure}
+
+\paragraph{Domain Attributes}
+
+\begin{description}
+\item[kobj] This \textit{kobject} structure is needed for the Sysfs
+  representation of the domain.
+\item[list] The master manages a list of domains, so this list anchor
+  is needed.
+\item[index] The domain's index. The first domain will get index 0,
+  the second index 1, and so on.
+\item[master] A pointer to the master owning the domain.
+\item[data\_size] The size of the domain's process data image.
+\item[datagram] A linked list with the datagram objects, the domain
+  needs for process data exchange (see
+  section~\ref{sec:class-datagram}).
+\item[base\_address] This attribute stores the logical offset, to
+  which the domain's process data are mapped.
+\item[response\_count] The sum of the datagrams' working counters at
+  the last process data exchange. Changes are always reported.
+\item[data\_regs] The (linked) list of PDO registrations. The realtime
+  module requests the exchange of certain PDOs and supplies the
+  address of process data pointers, that will later point to the
+  respective locations in the process data image. These ``data
+  registrations'' are saved in the \textit{data\_regs} list.
+\item[working\_counter\_changes] This field stores the number of
+  working counter changes since the last notification. This helps to
+  reduce syslog output in case of frequent changes.
+\item[t\_last] The timestamp of the last working counter change
+  notification.
+\end{description}
+
+\paragraph{Public Domain Methods}
+
+\begin{description}
+\item[ec\_domain\_init()] The domain's constructor.
+\item[ec\_domain\_clear()] The domain's destructor.
+\item[ec\_domain\_alloc()] Allocates the process data image and the
+  respective datagrams based on the process data registrations.
+\item[ec\_domain\_queue()] Queues the domain's datagrams for exchange
+  via the master.
+\end{description}
+
+\paragraph{Private Domain Methods}
+
+\begin{description}
+\item[ec\_domain\_reg\_pdo\_entry()] This method is used to do a PDO
+  registration. It finds the appropriate sync manager covering the PDO
+  data, calculates its offset in the sync-manager-protected memory and
+  prepares the FMMU configurations for the related slave. Then the PDO
+  registration is appended to the list.
+\item[ec\_domain\_clear\_data\_regs()] Clearing all process data
+  registrations is needed in serveral places and therefore has been
+  sourced out to an own method.
+\item[ec\_domain\_add\_datagram()] This methods allocates a datagram
+  and appends it to the list. This is done during domain allocation.
+\end{description}
+
+\paragraph{Domain Methods (Realtime Interface)}
+
+The domain methods belonging to the realtime interface are introduced
+in section~\ref{sec:ecrt-domain}.
+
+%------------------------------------------------------------------------------
+
+\subsubsection{The Finite State Machine Class}
+\label{sec:class-fsm}
+\index{FSM!Class}
+
+This class encapsules all state machines, except the EoE state
+machine. Its UML class diagram can be seen in
+figure~\ref{fig:uml-fsm}.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.9\textwidth]{images/uml-fsm}
+  \caption{Finite State Machine UML class diagram}
+  \label{fig:uml-fsm}
+\end{figure}
+
+\paragraph{FSM Attributes}
+
+\begin{description}
+\item[master] A pointer to the master owning the FSM object.
+\item[slave] Serveral sub state machines are executed for single
+  slaves. This pointer stores the current slave for these FSMs.
+\item[datagram] The FSM class has its own datagram, which is used in
+  every state and sub-state.
+\item[master\_state] This function pointer stores the current state
+  function for one of the master's state machines.
+\item[master\_slaves\_responding] This attribute is used in the
+  operation state machine (see section~\ref{sec:fsm-op}) to store the
+  number of slaves, that responded to the last broadcast command.
+\item[master\_slave\_states] This attribute stores the slave states,
+  that were determined by the last broadcast command.
+\item[master\_validation] This flag is used by the operation state
+  machine and is non-zero, if a bus validation has to be done.
+\item[slave\_state] This function pointer stores the current state of
+  the slave scan state machine (see section~\ref{sec:fsm-scan}) or the
+  slave configuration state machine (see section~\ref{sec:fsm-conf}).
+\item[sii\_state] This function pointer stores the current state of
+  the SII state machine (see section~\ref{sec:fsm-sii}).
+\item[sii\_offset] This attribute is used by the SII state machine to
+  store the word address for the current read or write cycle.
+\item[sii\_mode] If this attribute is zero, the SII access is done
+  with ``auto-increment'' datagrams \cite[section~5.4]{dlspec}.
+  If it is non-zero, ``station-address'' datagrams are used.
+\item[sii\_value] This attribute stores the value to write, or the
+  read value, respectively.
+\item[sii\_start] A timestamp attribute, that stores the beginning
+  time of an SII operation to detect a timeout.
+\item[change\_state] This function pointer stores the current state of
+  the state change state machine.
+\item[change\_new] This attribute stores the requested state for the
+  state change state machine.
+\item[change\_start] A timestamp attribute to detect a timeout while
+  changing slave states.
+\item[coe\_state] This function pointer stores the current state of
+  the CoE state machines.
+\item[sdodata] This is an SDO data object that stores information
+  about the current SDO to write.
+\item[coe\_start] A timestamp attribute to detect timeouts during CoE
+  configuration.
+\end{description}
+
+\paragraph{Public FSM Methods}
+
+\begin{description}
+\item[ec\_fsm\_init()] Constructor of the FSM class.
+\item[ec\_fsm\_clear()] Destructor of the FSM class.
+\item[ec\_fsm\_reset()] Resets the whole FSM object. This is needed to
+  restart the master state machines.
+\item[ec\_fsm\_execute()] Executes one state of the current state
+  machine and then returns.
+\item[ec\_fsm\_startup()] Initializes the master startup state
+  machine, which determines the number of slaves and executes the
+  slave scan state machine for each slave.
+\item[ec\_fsm\_startup\_running()] Returns non-zero, if the startup
+  state machine did not terminate yet.
+\item[ec\_fsm\_startup\_success()] Returns non-zero, if the startup
+  state machine terminated with success.
+\item[ec\_fsm\_configuration()] Initializes the master configuration
+  state machine, which executes the slave configuration state machine
+  for each slave.
+\item[ec\_fsm\_configuration\_running()] Returns non-zero, if the
+  configuration state machine did not terminate yet.
+\item[ec\_fsm\_configuration\_success()] Returns non-zero, if the
+  configuration state machine terminated with success.
+\end{description}
+
+\paragraph{FSM State Methods}
+
+The rest of the methods showed in the UML class diagram are state
+methods of the state machines. These states are described in
+section~\ref{sec:fsm}.
+
+%------------------------------------------------------------------------------
+
+\subsubsection{The EoE Class}
+\label{sec:class-eoe}
+\index{EoE!Class}
+
+Objects of the \textit{ec\_eoe\_t} class are called EoE handlers. Each
+EoE handler represents a virtual network interface and can be coupled
+to a EoE-capable slave on demand. The UML class diagram can be seen in
+figure~\ref{fig:uml-eoe}.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.4\textwidth]{images/uml-eoe}
+  \caption{EoE UML class diagram}
+  \label{fig:uml-eoe}
+\end{figure}
+
+\paragraph{EoE Attributes}
+
+\begin{description}
+\item[list] The master class maintains a list of EoE handlers.
+  Therefore this list anchor is needed.
+\item[slave] If an EoE handler is coupled to a slave, this pointer
+  points to the related slave object. Otherwise it is \textit{NULL}.
+\item[datagram] Every EoE handler owns a datagram object to exchange
+  data with the coupled slave via its state machine.
+\item[state] This function pointer points to the current state of the
+  EoE state machine (see section~\ref{sec:eoeimp}).
+\item[dev] A pointer to the \textit{net\_device} structure that
+  represents the network interface to the kernel.
+\item[stats] The statistics object for the network interface.
+\item[opened] This flag stores, if the network interface was opened.
+  No EoE processing will be done, if the device is not opened.
+\item[t\_last] This timestamp attribute stores the time of the last
+  bit rate measurement.
+\item[rx\_skb] A pointer to the current receive socket buffer. On
+  every first fragment of a received frame, a new receive socket
+  buffer is allocated. On every last fragment, this buffer will be
+  passed to the network stack.
+\item[rx\_skb\_offset] This attribute stores the offset for the next
+  fragment data in the receive socket buffer.
+\item[rx\_skb\_size] This attribute stores the current data size of
+  the receive socket buffer.
+\item[rx\_expected\_fragment] The expected number of the next
+  fragment. If a fragment with an invalid number is received, the
+  whole frame will be dropped.
+\item[rx\_counter] This is the sum of the octets received since the
+  last bit rate measurement.
+\item[rx\_rate] This attribute stores the receive bit rate in bps.
+\item[tx\_queue] Each EoE handler maintains a transmittion queue for
+  frames, that come in via the network interface. This queue is
+  implemented with a linked list and protected by a spinlock.
+\item[tx\_queue\_active] This flag stores, if the transmittion queue
+  is currently accepting frames from the network stack. If the queue
+  gets filled up, frame transmittion is suspended with a call to
+  \textit{netif\_stop\_queue()}. If the fill state decreases below the
+  half capacity, frame transmittion is restarted with
+  \textit{netif\_wake\_queue()}.
+\item[tx\_queued\_frames] The number of frames in the transmittion
+  queue.
+\item[tx\_queue\_lock] The spinlock used to protect the transmittion
+  queue. This is needed, because the queue is accessed both from
+  network stack context and from the master's EoE timer.
+\item[tx\_frame] The frame that is currently sent. The
+  \textit{ec\_eoe\_frame\_t} structure combines the socket buffer
+  structure with a list head to append it to the transmittion queue.
+\item[tx\_frame\_number] The EoE protocol demands to maintain a
+  sequencial frame number, that must be increased with every frame
+  sent.
+\item[tx\_fragment\_number] The sequencial number of the next fragment
+  to transmit.
+\item[tx\_offset] Current frame data offset for the next fragment to
+  transmit.
+\item[tx\_counter] The number of octets transferred since the last bit
+  rate measurement.
+\item[tx\_rate] The recent transmittion bit rate in bps.
+\end{description}
+
+\paragraph{Public EoE Methods}
+
+\begin{description}
+\item[ec\_eoe\_init()] The EoE handler's constructor. The network
+  interface is allocated and registered.
+\item[ec\_eoe\_clear()] The EoE handler's destructor. The network
+  interface is unregistered and all allocated memory is freed.
+\item[ec\_eoe\_run()] Executes the EoE state machine (see
+  section~\ref{sec:eoeimp}) for this handler.
+\item[ec\_eoe\_active()] Returns true, if the handler has a slave
+  coupled and the network interface is opened.
+\end{description}
+
+\paragraph{Private EoE Methods}
+
+\begin{description}
+\item[ec\_eoe\_flush()] Clears the transmittion queue and drops all
+  frames queued for sending.
+\item[ec\_eoe\_send()] Sends one fragment of the current frame.
+\end{description}
+
+
+\paragraph{EoE State Methods}
+
+The rest of the private methods are state functions for the EoE state
+machine, which is discussed in section~\ref{sec:eoeimp}.
+
+%------------------------------------------------------------------------------
+
+\subsubsection{The Debug Class}
+\label{sec:class-debug}
+
+The debug class maintains a virtual network interface. All frames that
+are sent and received by the master will be forwarded to this network
+interface, so that bus monitoring can be done with third party tools
+(see section~\ref{sec:debug}). Figure~\ref{fig:uml-debug} shows the
+UML class diagram.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.3\textwidth]{images/uml-debug}
+  \caption{Debug UML class diagram}
+  \label{fig:uml-debug}
+\end{figure}
+
+\paragraph{Debug Attributes}
+
+\begin{description}
+\item[dev] A pointer to the allocated \textit{net\_device} structure
+  that represents the network interface in the kernel.
+\item[stats] An object for interface statistics.
+\item[opened] Stores the state of the device. Frames will only be
+  forwarded, if the device was opened with the \textit{ifconfig up}
+  command (or something similar).
+\end{description}
+
+\paragraph{Public Debug Methods}
+
+\begin{description}
+\item[ec\_debug\_init()] The constructor.
+\item[ec\_debug\_clear()] The destructor.
+\item[ec\_debug\_send()] This method forwards a frame to the virtual
+  network interface. It dynamically allocates a new socket buffer and
+  passes it to the network stack.
+\end{description}
+
+%------------------------------------------------------------------------------
+
+\subsection{The Realtime Interface}
+\label{sec:ecrt}
+\index{Realtime interface}
+
+The realtime interface provides functions and data structures for
+realtime modules to access and use an EtherCAT master.
+
+\subsubsection{Master Requesting and Releasing}
+
+Before a realtime module can access am EtherCAT master provided by the
+master module, it has to reserve one for exclusive use. After use, it
+has to release the requested master and make it available for other
+modules. This is done with the following functions:
+
+\begin{lstlisting}[language=C]
+  ec_master_t *ecrt_request_master(unsigned int master_index);
+  void ecrt_release_master(ec_master_t *master);
+\end{lstlisting}
+
+The \textit{ecrt\_request\_master()} function has to be the first
+function a module has to call, when using EtherCAT. The function takes
+the index of the master as its argument. The first master has index 0,
+the $n$th master has index $n - 1$. The number of existent masters has
+to be specified when loading the master module (see
+section~\ref{sec:mastermod}). The function tries to reserve the
+specified master and scans for slaves. It returns a pointer to the
+reserved master object upon success, or \textit{NULL} if an error
+occured.
+
+The \textit{ecrt\_release\_master()} function releases a reserved
+master after use. It takes the pointer to the master object returned
+by \textit{ecrt\_request\_master()} as its argument and can never
+fail.
+
+\subsubsection{Master Methods}
+\label{sec:ecrt-master}
+
+\paragraph{Domain Creation}
+
+For process data exchange, at least one process data domain is needed
+(see section~\ref{sec:processdata}).
+
+\begin{lstlisting}[language=C]
+  ec_domain_t *ecrt_master_create_domain(ec_master_t *master);
+\end{lstlisting}
+
+The \textit{ecrt\_master\_create\_domain()} method creates a new
+process data domain and returns a pointer to the new domain object.
+This object can be used for registering process data objects and
+exchange process data in cyclic operation. On failure, the function
+returns \textit{NULL}.
+
+\paragraph{Slave Handlers}
+
+To access a certain slave, there is a method to get a slave handler:
+
+\begin{lstlisting}[language=C]
+  ec_slave_t *ecrt_master_get_slave(const ec_master_t *,
+                                    const char *);
+\end{lstlisting}
+
+The \textit{ecrt\_master\_get\_slave()} method returns a pointer to a
+certain slave object, specified by its ASCII address (see
+section~\ref{sec:addr}). If the address is invalid, \textit{NULL} is
+returned.
+
+\paragraph{Master Activation}
+
+When all domains are created, and all process data objects are
+registered, the master can be activated:
+
+\begin{lstlisting}[language=C]
+  int ecrt_master_activate(ec_master_t *master);
+  void ecrt_master_deactivate(ec_master_t *master);
+\end{lstlisting}
+
+By calling the \textit{ecrt\_master\_activate()} method, all slaves
+are configured according to the prior method calls and are brought
+into \textit{OP} state. In this case, the method has a return value of
+0. Otherwise (wrong configuration or bus failure) the method returns
+non-zero.
+
+The \textit{ecrt\_master\_deactivate()} method is the counterpart to
+the activate call: It brings all slaves back into \textit{INIT} state
+again. This method should be called prior to
+\textit{ecrt\_\-master\_\-release()}.
+
+\paragraph{Locking Callbacks}
+
+For concurrent master access, the realtime module has to provide a
+locking mechanism (see section~\ref{sec:concurr}):
+
+\begin{lstlisting}[language=C]
+  void ecrt_master_callbacks(ec_master_t *master,
+                             int (*request_cb)(void *),
+                             void (*release_cb)(void *),
+                             void *cb_data);
+\end{lstlisting}
+
+The ``request lock'' and ``release lock'' callbacks can be set with
+the \textit{ecrt\_master\_call\-backs()} method. It takes two function
+pointers and a data value as additional arguments. The arbitrary data
+value will be passed as argument on every callback. Asynchronous
+master access (like EoE processing) is only possible if these
+callbacks have been set.
+
+\paragraph{Preparation of Cyclic Data Exchange}
+
+Cyclic operation mostly consists of the three steps input, processing
+and output. In EtherCAT terms this would mean: Receive datagrams,
+evaluate process data and send datagrams. The first cycle differs from
+this principle, because no datagrams have been sent yet, so there is
+nothing to receive. To avoid having a case differantiation (in terms
+of an \textit{if} clause), the following method exists:
+
+\begin{lstlisting}[language=C]
+  void ecrt_master_prepare(ec_master_t *master);
+\end{lstlisting}
+
+As a last thing before cyclic operation, a call to the
+\textit{ecrt\_master\_prepare()} method should be issued. It makes all
+process data domains queue their datagrams and issues a send command,
+so that the first receive call in cyclic operation will not fail.
+
+\paragraph{Frame Sending and Receiving}
+
+To send all queued datagrams and to later receive the sent datagrams
+there are two methods:
+
+\begin{lstlisting}[language=C]
+  void ecrt_master_send(ec_master_t *master);
+  void ecrt_master_receive(ec_master_t *master);
+\end{lstlisting}
+
+The \textit{ecrt\_master\_send()} method takes all datagrams, that
+have been queued for transmission, packs them into frames, and passes
+them to the network device for sending.
+
+The \textit{ecrt\_master\_receive()} queries the network device for
+received frames (by calling the ISR\index{ISR}), extracts received
+datagrams and dispatches the results to the datagram objects in the
+queue. Received datagrams, and the ones that timed out, will be
+marked, and then dequeued.
+
+\paragraph{Running the Operation State Machine}
+
+The master's operation state machine (see section~\ref{sec:fsm-op})
+monitors the bus in cyclic operation and reconfigures slaves, if
+necessary. Therefore, the following method should be called
+cyclically:
+
+\begin{lstlisting}[language=C]
+  void ecrt_master_run(ec_master_t *master);
+\end{lstlisting}
+
+The \textit{ecrt\_master\_run()} method executes the master's
+operation state machine step by step. It returns after processing one
+state and queuing a datagram. Calling this function is not mandatory,
+but highly recommended.
+
+\paragraph{Master Monitoring}
+
+It is also highly recommended to evaluate the master's error state. In
+this way it is possible to notice lost network links, failed bus
+segments, and other issues:
+
+\begin{lstlisting}[language=C]
+  int ecrt_master_state(const ec_master_t *master);
+\end{lstlisting}
+
+The \textit{ecrt\_master\_state()} method returns the master's error
+state. The following states are defined as part of the realtime
+interface:
+
+\begin{description}
+\item[EC\_MASTER\_OK] means, that no error has occurred.
+\item[EC\_MASTER\_LINK\_ERROR] means, that the network link is
+  currently down.
+\item[EC\_MASTER\_BUS\_ERROR] means, that one or more slaves do not
+  respond.
+\end{description}
+
+\subsubsection{Domain Methods}
+\label{sec:ecrt-domain}
+
+\paragraph{PDO Registration}
+
+To access data of a slave's PDO in cyclic operation, it is necessary
+to make it part of a process data domain:
+
+\begin{lstlisting}[language=C]
+  ec_slave_t *ecrt_domain_register_pdo(ec_domain_t *domain,
+                                       const char *address,
+                                       uint32_t vendor_id,
+                                       uint32_t product_code,
+                                       const char *pdo_name
+                                       void **data_ptr);
+  int ecrt_domain_register_pdo_list(ec_domain_t *domain,
+                                    const ec_pdo_reg_t *pdos);
+\end{lstlisting}
+
+The \textit{ecrt\_domain\_register\_pdo()} method registers a certain
+PDO as part of the domain and takes the address of the process data
+pointer. This pointer will be set on master activation and then can be
+parameter to the \textit{EC\_READ\_*} and \textit{EC\_WRITE\_*} macros
+described below.
+
+A perhaps easier way to register multiple PDOs at the same time is to
+fill an array of \textit{ec\_pdo\_reg\_t} and hand it to the
+\textit{ecrt\_domain\_register\_pdo\_list()} method. Attention: This
+array has to be terminated by an empty structure (\textit{\{\}})!
+
+\paragraph{Evaluating Domain Data}
+
+To evaluate domain data, the following method has to be used:
+
+\begin{lstlisting}[language=C]
+  void ecrt_domain_process(ec_domain_t *domain);
+\end{lstlisting}
+
+The \textit{ecrt\_domain\_process()} method sets the domains state and
+requeues its datagram for sending.
+
+\paragraph{Domain State}
+
+Similar to the master state, a domain has an own error state:
+
+\begin{lstlisting}[language=C]
+  int ecrt_domain_state(const ec_domain_t *domain);
+\end{lstlisting}
+
+The \textit{ecrt\_domain\_state()} method returns the domain's error
+state. It is non-zero if \underline{not} all process data values could
+be exchanged, and zero otherwise.
+
+\subsubsection{Slave Methods}
+\label{sec:ecrt-slave}
+
+\paragraph{SDO Configuration}
+
+To configure slave SDOs, the function interface below can be used:
+
+\begin{lstlisting}[language=C]
+  int ecrt_slave_conf_sdo8(ec_slave_t *slave,
+                           uint16_t sdo_index,
+                           uint8_t sdo_subindex,
+                           uint8_t value);
+  int ecrt_slave_conf_sdo16(ec_slave_t *slave,
+                            uint16_t sdo_index,
+                            uint8_t sdo_subindex,
+                            uint16_t value);
+  int ecrt_slave_conf_sdo32(ec_slave_t *slave,
+                            uint16_t sdo_index,
+                            uint8_t sdo_subindex,
+                            uint32_t value);
+\end{lstlisting}
+
+The \textit{ecrt\_slave\_conf\_sdo*()} methods prepare the
+configuration of a certain SDO. The index and subindex of the SDO, and
+the value have to be specified. The configuration is done each time,
+the slave is reconfigured. The methods only differ in the SDO's data
+type. If the configuration could be prepared, zero is returned. If an
+error occured, non-zero is returned.
+
+\paragraph{Variable-sized PDOs}
+
+For specifying the size of variable-sized PDOs, the following method
+can be used:
+
+\begin{lstlisting}[language=C]
+  int ecrt_slave_pdo_size(ec_slave_t *slave,
+                          const char *pdo_name,
+                          size_t size);
+\end{lstlisting}
+
+The \textit{ecrt\_slave\_pdo\_size()} method takes the name of the PDO
+and the size. It returns zero on success, otherwise non-zero.
+
+\subsubsection{Process Data Access}
+\label{sec:macros}
+
+The endianess of the process data could differ from that of the CPU.
+Therefore, process data access has to be done by the macros below,
+that are also provided by the realtime interface:
+
+\begin{lstlisting}[language=C]
+  #define EC_READ_BIT(DATA, POS)
+  #define EC_WRITE_BIT(DATA, POS, VAL)
+
+  #define EC_READ_U8(DATA)
+  #define EC_READ_S8(DATA)
+  #define EC_READ_U16(DATA)
+  #define EC_READ_S16(DATA)
+  #define EC_READ_U32(DATA)
+  #define EC_READ_S32(DATA)
+
+  #define EC_WRITE_U8(DATA, VAL)
+  #define EC_WRITE_S8(DATA, VAL)
+  #define EC_WRITE_U16(DATA, VAL)
+  #define EC_WRITE_S16(DATA, VAL)
+  #define EC_WRITE_U32(DATA, VAL)
+  #define EC_WRITE_S32(DATA, VAL)
+\end{lstlisting}
+
+There are macros for bitwise access (\textit{EC\_READ\_BIT()},
+\textit{EC\_WRITE\_BIT()}), and bytewise access
+(\textit{EC\_READ\_*()}, \textit{EC\_WRITE\_*()}). The bytewise macros
+carry the data type in their name. Example: \textit{EC\_WRITE\_S16()}
+writes a 16 bit signed value to EtherCAT data. The \textit{DATA}
+parameter is supposed to be a process data pointer, as provided at PDO
+registration.
+
+The macros use the kernel's endianess conversion macros, that are
+preprocessed to empty macros in case of equal endianess. This is the
+definition for the \textit{EC\_\-READ\_\-U16()} macro:
+
+\begin{lstlisting}[language=C]
+  #define EC_READ_U16(DATA) \
+          ((uint16_t) le16_to_cpup((void *) (DATA)))
+\end{lstlisting}
+
+The \textit{le16\_to\_cpup()} macro converts a little-endian, 16 bit
+value to the CPU's architecture and takes a pointer to the input value
+as its argument. If the CPU's architecture is little-endian, too (for
+example on X86 and compatible), nothing has to be converted. In this
+case, the macro is replaced with an empty macro by the preprocessor
+and so there is no unneeded function call or case differentiation in
+the code.
+
+For keeping it portable, it is highly recommended to make use of these
+macros.
+
+%------------------------------------------------------------------------------
+
+\subsection{Slave Addressing}
+\label{sec:addr}
+\index{Slave!Addressing}
+
+The master offers the serveral slave addressing schemes (for PDO
+registration or configuration) via the realtime interface. For this
+reason, slave addresses are ASCII\nomenclature{ASCII}{American
+  Standard Code for Information Interchange}-coded and passed as a
+string. The addressing schemes are independent of the EtherCAT
+protocol and represent an additional feature of the master.
+
+Below, the allowed addressing schemes are described. The descriptions
+are followed by a regular expression formally defining the addressing
+scheme, and one or more examples.
+
+\begin{description}
+\item[Position Addressing] This is the normal addressing scheme, where
+  each slave is addressed by its ring position. The first slave has
+  address 0, and the $n$th slave has address $n - 1$. This addressing
+  scheme is useful for small busses that have a fixed number of slaves.\\
+  RegEx: \texttt{[0-9]+} --- Example: \texttt{"42"}
+\item[Advanced Position Addressing] Bus couplers segment the bus into
+  (physical) blocks. Though the logical ring positions keep being the
+  same, it is easier to address a slave with its block number and the
+  relative position inside the block. This addressing is done by
+  passing the (zero-based) index of the bus coupler (not the coupler's
+  ring position), followed by a colon and the relative position of the
+  actual slave starting at the bus coupler.\\
+  RegEx: \texttt{[0-9]+:[0-9]+} --- Examples: \texttt{"0:42"},
+  \texttt{"2:7"}
+\item[Alias Addressing] Each slave can have a ``secondary slave
+  address'' or ``alias address''\footnote{Information about how to set
+    the alias can be found in section~\ref{sec:eepromaccess}} stored
+  in its E$^2$PROM.  The alias is evaluated by the master and can be
+  used to address the slave, which is useful when a clearly defined
+  slave has to be addressed and the ring position is not known or can
+  change over time. This scheme is used by starting the address string
+  with a mesh (\#) followed by the alias address.  The latter can also
+  be provided as hexadecimal value, prefixed with \textit{0x}.\\
+  RegEx: \texttt{\#(0x[0-9A-F]+|[0-9]+)} --- Examples:
+  \texttt{"\#6622"}, \texttt{"\#0xBEEF"}
+\item[Advanced Alias Addressing] This is a mixture of the ``Alias
+  Addressing'' and ``Advanced Position Addressing'' schemes. A certain
+  slave is addressed by specifying its relative position after an
+  aliased slave. This is very useful, if a complete block of slaves
+  can vary its position in the bus. The bus coupler preceeding the
+  block should get an alias. The block slaves can then be addressed by
+  specifying this alias and their position inside the block. This
+  scheme is used by starting the address string with a mesh (\#)
+  followed by the alias address (which can be hexadecimal), then a
+  colon and the relative posision of the slave to
+  address.\\
+  RegEx: \texttt{\#(0x[0-9A-F]+|[0-9]+):[0-9]+} --- Examples:
+  \texttt{"\#0xBEEF:7"}, \texttt{"\#6:2"}
+\end{description}
+
+In anticipation of section~\ref{sec:ecrt}, the functions accepting
+these address strings are \textit{ecrt\_\-master\_\-get\_slave()},
+\textit{ecrt\_domain\_register\_pdo()} and
+\textit{ecrt\_domain\_register\_pdo\_list()} (the latter through the
+\textit{ec\_pdo\_reg\_t} structure).
+
+%------------------------------------------------------------------------------
+
+\subsection{Concurrent Master Access}
+\label{sec:concurr}
+\index{Concurrency}
+
+In some cases, one master is used by serveral instances, for example
+when a realtime module does cyclic process data exchange, and there
+are EoE-capable slaves that require to exchange Ethernet data with the
+kernel (see section~\ref{sec:eoeimp}). For this reason, the master is
+a shared resource, and access to it has to be sequenctialized. This is
+usually done by locking with semaphores, or other methods to protect
+critical sections.
+
+The master itself can not provide locking mechanisms, because it has
+no chance to know the appropriate kind of lock. Imagine, the realtime
+module uses RTAI functionality, then ordinary kernel semaphores would
+not be sufficient. For that, an important design decision was made:
+The realtime module that reserved a master must have the total
+control, therefore it has to take responsibility for providing the
+appropriate locking mechanisms. If another instance wants to access
+the master, it has to request the master lock by callbacks, that have
+to be set by the realtime module. Moreover the realtime module can
+deny access to the master if it consideres it to be awkward at the
+moment.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.6\textwidth]{images/master-locks}
+  \caption{Concurrent master access}
+  \label{fig:locks}
+\end{figure}
+
+Figure~\ref{fig:locks} exemplary shows, how two processes share one
+master: The realtime module's cyclic thread uses the master for
+process data exchange, while the master-internal EoE process uses it
+to communicate with EoE-capable slaves. Both have to aquire the master
+lock before access: The realtime thread can access the lock natively,
+while the EoE process has to use the master callbacks.
+Section~\ref{sec:concurrency} gives an example, of how to implement
+this.
+
+%------------------------------------------------------------------------------
+
+\section{The Master's State Machines}
+\label{sec:fsm}
+\index{FSM}
+
+Many parts of the EtherCAT master are implemented as \textit{finite
+  state machines} (FSMs\nomenclature{FSM}{Finite State Machine}).
+Though this leads to a higher grade of complexity in some aspects, is
+opens many new possibilities.
+
+The below short code example exemplary shows how to read all slave
+states and moreover illustrates the restrictions of ``sequential''
+coding:
+
+\begin{lstlisting}[language=C,numbers=left]
+  ec_datagram_brd(datagram, 0x0130, 2); // prepare datagram
+  if (ec_master_simple_io(master, datagram)) return -1;
+  slave_states = EC_READ_U8(datagram->data); // process datagram
+\end{lstlisting}
+
+The \textit{ec\_master\_simple\_io()} function provides a simple
+interface for synchronously sending a single datagram and receiving
+the result\footnote{For all communication issues have been meanwhile
+  sourced out into state machines, the function is deprecated and
+  stopped existing. Nevertheless it is adequate for showing it's own
+  restrictions.}. Internally, it queues the specified datagram,
+invokes the \textit{ec\_master\_send\_datagrams()} function to send a
+frame with the queued datagram and then waits actively for its
+reception.
+
+This sequential approach is very simple, reflecting in only three
+lines of code. The disadvantage is, that the master is blocked for the
+time it waits for datagram reception. There is no difficulty when only
+one instance is using the master, but if more instances want to
+(synchronously\footnote{At this time, synchronous master access will
+  be adequate to show the advantages of an FSM. The asynchronous
+  approach will be discussed in section~\ref{sec:eoeimp}}) use the
+master, it is inevitable to think about an alternative to the
+sequential model.
+
+Master access has to be sequentialized for more than one instance
+wanting to send and receive datagrams synchronously. With the present
+approach, this would result in having one phase of active waiting for
+each instance, which would be non-acceptable especially in realtime
+circumstances, because of the huge time overhead.
+
+A possible solution is, that all instances would be executed
+sequentially to queue their datagrams, then give the control to the
+next instance instead of waiting for the datagram reception. Finally,
+bus IO is done by a higher instance, which means that all queued
+datagrams are sent and received. The next step is to execute all
+instances again, which then process their received datagrams and issue
+new ones.
+
+This approach results in all instances having to retain their state,
+when giving the control back to the higher instance. It is quite
+obvious to use a \textit{finite state machine} model in this case.
+Section~\ref{sec:fsmtheory} will introduce some of the theory used,
+while the listings below show the basic approach by coding the example
+from above as a state machine:
+
+\begin{lstlisting}[language=C,numbers=left]
+  // state 1
+  ec_datagram_brd(datagram, 0x0130, 2); // prepare datagram
+  ec_master_queue(master, datagram); // queue datagram
+  next_state = state_2;
+  // state processing finished
+\end{lstlisting}
+
+After all instances executed their current state and queued their
+datagrams, these are sent and received. Then the respective next
+states are executed:
+
+\begin{lstlisting}[language=C,numbers=left]
+  // state 2
+  if (datagram->state != EC_DGRAM_STATE_RECEIVED) {
+          next_state = state_error;
+          return; // state processing finished
+  }
+  slave_states = EC_READ_U8(datagram->data); // process datagram
+  // state processing finished.
+\end{lstlisting}
+
+See section~\ref{sec:statemodel} for an introduction to the
+state machine programming concept used in the master code.
+
+%------------------------------------------------------------------------------
+
+\subsection{State Machine Theory}
+\label{sec:fsmtheory}
+\index{FSM!Theory}
+
+A finite state machine \cite{automata} is a model of behavior with
+inputs and outputs, where the outputs not only depend on the inputs,
+but the history of inputs. The mathematical definition of a finite
+state machine (or finite automaton) is a six-tuple $(\Sigma, \Gamma,
+S, s_0, \delta, \omega)$, with
+
+\begin{itemize}
+\item the input alphabet $\Sigma$, with $\Sigma \neq
+  \emptyset$, containing all input symbols,
+\item the output alphabet $\Gamma$, with $\Gamma \neq
+  \emptyset$, containing all output symbols,
+\item the set of states $S$, with $S \neq \emptyset$,
+\item the set of initial states $s_0$ with $s_0 \subseteq S, s_0 \neq
+  \emptyset$
+\item the transition function $\delta: S \times \Sigma \rightarrow S
+  \times \Gamma$
+\item the output function $\omega$.
+\end{itemize}
+
+The state transition function $\delta$ is often specified by a
+\textit{state transition table}, or by a \textit{state transition
+  diagram}. The transition table offers a matrix view of the state
+machine behavior (see table~\ref{tab:statetrans}). The matrix rows
+correspond to the states ($S = \{s_0, s_1, s_2\}$) and the columns
+correspond to the input symbols ($\Gamma = \{a, b, \varepsilon\}$).
+The table contents in a certain row $i$ and column $j$ then represent
+the next state (and possibly the output) for the case, that a certain
+input symbol $\sigma_j$ is read in the state $s_i$.
+
+\begin{table}[htbp]
+  \caption{A typical state transition table}
+  \label{tab:statetrans}
+  \vspace{2mm}
+  \centering
+  \begin{tabular}{l|ccc}
+    & $a$ & $b$ & $\varepsilon$\\ \hline
+    $s_0$ & $s_1$ & $s_1$ & $s_2$\\
+    $s_1$ & $s_2$ & $s_1$ & $s_0$\\
+    $s_2$ & $s_0$ & $s_0$ & $s_0$\\ \hline
+  \end{tabular}
+\end{table}
+
+The state diagram for the same example looks like the one in
+figure~\ref{fig:statetrans}. The states are represented as circles or
+ellipses and the transitions are drawn as arrows between them. Close
+to a transition arrow can be the condition that must be fulfilled to
+allow the transition. The initial state is marked by a filled black
+circle with an arrow pointing to the respective state.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.5\textwidth]{images/statetrans}
+  \caption{A typical state transition diagram}
+  \label{fig:statetrans}
+\end{figure}
+
+\paragraph{Deterministic and non-deterministic state machines}
+
+A state machine can be deterministic, meaning that for one state and
+input, there is one (and only one) following state. In this case, the
+state machine has exactly one starting state. Non-deterministic state
+machines can have more than one transitions for a single state-input
+combination. There is a set of starting states in the latter case.
+
+\paragraph{Moore and Mealy machines}
+
+There is a distinction between so-called \textit{Moore machines}, and
+\textit{Mealy machines}. Mathematically spoken, the distinction lies
+in the output function $\omega$: If it only depends on the current
+state ($\omega: S \rightarrow \Gamma$), the machine corresponds to the
+``Moore Model''. Otherwise, if $\omega$ is a function of a state and
+the input alphabet ($\omega: S \times \Sigma \rightarrow \Gamma$) the
+state machine corresponds to the ``Mealy model''. Mealy machines are
+the more practical solution in most cases, because their design allows
+machines with a minimum number of states. In practice, a mixture of
+both models is often used.
+
+\paragraph{Misunderstandings about state machines}
+
+There is a phenomenon called ``state explosion'', that is oftenly
+taken as a counter-argument against general use of state machines in
+complex environments. It has to be mentioned, that this point is
+misleading~\cite{fsmmis}. State explosions happen usually as a result
+of a bad state machine design: Common mistakes are storing the present
+values of all inputs in a state, or not dividing a complex state
+machine into simpler sub state machines. The EtherCAT master uses
+serveral state machines, that are executed hierarchically and so serve
+as sub state machines. These are also described below.
+
+%------------------------------------------------------------------------------
+
+\subsection{The Master's State Model}
+\label{sec:statemodel}
+
+This section will introduce the techniques used in the master to
+implement state machines.
+
+\paragraph{State Machine Programming}
+
+There are certain ways to implement a state machine in \textit{C}
+code. An obvious way is to implement the different states and actions
+by one big case differentiation:
+
+\begin{lstlisting}[language=C,numbers=left]
+  enum {STATE_1, STATE_2, STATE_3};
+  int state = STATE_1;
+
+  void state_machine_run(void *priv_data) {
+          switch (state) {
+                  case STATE_1:
+                          action_1();
+                          state = STATE_2;
+                          break;
+                  case STATE_2:
+                          action_2()
+                          if (some_condition) state = STATE_1;
+                          else state = STATE_3;
+                          break;
+                  case STATE_3:
+                          action_3();
+                          state = STATE_1;
+                          break;
+          }
+  }
+\end{lstlisting}
+
+For small state machines, this is an option. The disadvantage is, that
+with an increasing number of states the code soon gets complex and an
+additional case differentiation is executed each run. Besides, lots of
+indentation is wasted.
+
+The method used in the master is to implement every state in an own
+function and to store the current state function with a function
+pointer:
+
+\begin{lstlisting}[language=C,numbers=left]
+  void (*state)(void *) = state1;
+
+  void state_machine_run(void *priv_data) {
+          state(priv_data);
+  }
+
+  void state1(void *priv_data) {
+          action_1();
+          state = state2;
+  }
+
+  void state2(void *priv_data) {
+          action_2();
+          if (some_condition) state = state1;
+          else state = state2;
+  }
+
+  void state3(void *priv_data) {
+          action_3();
+          state = state1;
+  }
+\end{lstlisting}
+
+In the master code, state pointers of all state machines\footnote{All
+  except for the EoE state machine, because multiple EoE slaves have
+  to be handled in parallel. For this reason each EoE handler object
+  has its own state pointer.} are gathered in a single object of the
+\textit{ec\_fsm\_t} class. This is advantageous, because there is
+always one instance of every state machine available and can be
+started on demand.
+
+\paragraph{Mealy and Moore}
+
+If a closer look is taken to the above listing, it can be seen that
+the actions executed (the ``outputs'' of the state machine) only
+depend on the current state. This accords to the ``Moore'' model
+introduced in section~\ref{sec:fsmtheory}. As mentioned, the ``Mealy''
+model offers a higher flexibility, which can be seen in the listing
+below:
+
+\begin{lstlisting}[language=C,numbers=left]
+  void state7(void *priv_data) {
+          if (some_condition) {
+                  action_7a();
+                  state = state1;
+          }
+          else {
+                  action_7b();
+                  state = state8;
+          }
+  }
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 3} + \textcircled{\tiny 7}] The
+  state function executes the actions depending on the state
+  transition, that is about to be done.
+\end{description}
+
+The most flexible alternative is to execute certain actions depending
+on the state, followed by some actions dependent on the state
+transition:
+
+\begin{lstlisting}[language=C,numbers=left]
+  void state9(void *priv_data) {
+          action_9();
+          if (some_condition) {
+                  action_9a();
+                  state = state7;
+          }
+          else {
+                  action_9b();
+                  state = state10;
+          }
+  }
+\end{lstlisting}
+
+This model is oftenly used in the master. It combines the best aspects
+of both approaches.
+
+\paragraph{Using Sub State Machines}
+
+To avoid having too much states, certain functions of the EtherCAT
+master state machine have been sourced out into sub state machines.
+This helps to encapsule the related workflows and moreover avoids the
+``state explosion'' phenomenon described in
+section~\ref{sec:fsmtheory}. If the master would instead use one big
+state machine, the number of states would be a multiple of the actual
+number. This would increase the level of complexity to a
+non-manageable grade.
+
+\paragraph{Executing Sub State Machines}
+
+If a state machine starts to execute a sub state machine, it usually
+remains in one state until the sub state machine terminates. This is
+usually done like in the listing below, which is taken out of the
+slave configuration state machine code:
+
+\begin{lstlisting}[language=C,numbers=left]
+  void ec_fsm_slaveconf_saveop(ec_fsm_t *fsm)
+  {
+          fsm->change_state(fsm); // execute state change
+                                  // sub state machine
+
+          if (fsm->change_state == ec_fsm_error) {
+                  fsm->slave_state = ec_fsm_end;
+                  return;
+          }
+
+          if (fsm->change_state != ec_fsm_end) return;
+
+          // continue state processing
+          ...
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 3}] \textit{change\_state} is the
+  state pointer of the state change state machine. The state function,
+  the pointer points on, is executed\ldots
+\item[\normalfont\textcircled{\tiny 6}] \ldots either until the state
+  machine terminates with the error state \ldots
+\item[\normalfont\textcircled{\tiny 11}] \ldots or until the state
+  machine terminates in the end state. Until then, the ``higher''
+  state machine remains in the current state and executes the sub
+  state machine again in the next cycle.
+\end{description}
+
+\paragraph{State Machine Descriptions}
+
+The below sections describe every state machine used in the EtherCAT
+master. The textual descriptions of the state machines contain
+references to the transitions in the corresponding state transition
+diagrams, that are marked with an arrow followed by the name of the
+successive state.  Transitions caused by trivial error cases (i.~e. no
+response from slave) are not described explicitly. These transitions
+are drawn as dashed arrows in the diagrams.
+
+%------------------------------------------------------------------------------
+
+\subsection{The Operation State Machine}
+\label{sec:fsm-op}
+\index{FSM!Operation}
+
+The Operation state machine is executed by calling the
+\textit{ecrt\_master\_run()} method in cyclic realtime code. Its
+purpose is to monitor the bus and to reconfigure slaves after a bus
+failure or power failure. Figure~\ref{fig:fsm-op} shows its transition
+diagram.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.8\textwidth]{images/fsm-op}
+  \caption{Transition diagram of the operation state machine}
+  \label{fig:fsm-op}
+\end{figure}
+
+\begin{description}
+\item[START] This is the beginning state of the operation state
+  machine. There is a datagram issued, that queries the ``AL Control
+  Response'' attribute \cite[section~5.3.2]{alspec} of all slaves via
+  broadcast. In this way, all slave states and the number of slaves
+  responding can be determined.  $\rightarrow$~\textit{BROADCAST}
+
+\item[BROADCAST] The broadcast datagram is evaluated. A change in the
+  number of responding slaves is treates as a topology change. If the
+  number of slaves is not as expected, the bus is marked as
+  ``tainted''. In this state, no slave reconfiguration is possible,
+  because the assignment of known slaves and those present on the bus
+  is ambiguous. If the number of slaves is considered as right, the
+  bus is marked for validation, because it turned from tainted to
+  normal state and it has to be checked, if all slaves are valid. Now,
+  the state of every single slave has to be determined. For that, a
+  (unicast) datagram is issued, that queries the first slave's ``AL
+  Control Response'' attribute. $\rightarrow$~\textit{READ STATES}
+
+\item[READ STATES] If the current slave did not respond to its
+  configured station address, it is marked as offline, and the next
+  slave is queried. $\rightarrow$~\textit{READ STATES}
+
+  If the slave responded, it is marked as online and its current state
+  is stored. The next slave is queried. $\rightarrow$~\textit{READ
+    STATES}
+
+  If all slaves have been queried, and the bus is marked for
+  validation, the validation is started by checking the first slaves
+  vendor ID. $\rightarrow$~\textit{VALIDATE VENDOR}
+
+  If no validation has to be done, it is checked, if all slaves are in
+  the state they are supposed to be. If not, the first of slave with
+  the wrong state is reconfigured and brought in the required state.
+  $\rightarrow$~\textit{CONFIGURE SLAVES}
+
+  If all slaves are in the correct state, the state machine is
+  restarted. $\rightarrow$~\textit{START}
+
+\item[CONFIGURE SLAVES] The slave configuration state machine is
+  executed until termination. $\rightarrow$~\textit{CONFIGURE SLAVES}
+
+  If there are still slaves in the wrong state after another check,
+  the first of these slaves is configured and brought into the correct
+  state again. $\rightarrow$~\textit{CONFIGURE SLAVES}
+
+  If all slaves are in the correct state, the state machine is
+  restarted. $\rightarrow$~\textit{START}
+
+\item[VALIDATE VENDOR] The SII state machine is executed until
+  termination. If the slave has the wrong vendor ID, the state machine
+  is restarted. $\rightarrow$~\textit{START}
+
+  If the slave has the correct vendor ID, its product ID is queried.
+  $\rightarrow$~\textit{VALIDATE PRODUCT}
+
+\item[VALIDATE PRODUCT] The SII state machine is executed until
+  termination. If the slave has the wrong product ID, the state
+  machine is restarted. $\rightarrow$~\textit{START}
+
+  If the slave has the correct product ID, the next slave's vendor ID
+  is queried. $\rightarrow$~\textit{VALIDATE VENDOR}
+
+  If all slaves have the correct vendor IDs and product codes, the
+  configured station addresses can be safely rewritten. This is done
+  for the first slave marked as offline.
+  $\rightarrow$~\textit{REWRITE ADDRESSES}
+
+\item[REWRITE ADDRESSES] If the station address was successfully
+  written, it is sear\-ched for the next slave marked as offline. If
+  there is one, its address is reconfigured, too.
+  $\rightarrow$~\textit{REWRITE ADDRESSES}
+
+  If there are no more slaves marked as offline, the state machine is
+  restarted. $\rightarrow$~\textit{START}
+\end{description}
+
+%------------------------------------------------------------------------------
+
+\subsection{The Idle State Machine}
+\label{sec:fsm-idle}
+\index{FSM!Idle}
+
+The Idle state machine is executed by a kernel workqueue, if no
+realtime module is connected. Its purpose is to make slave information
+available to user space, operate EoE-capable slaves, read and write
+E$^2$PROM contents and test slave functionality.
+Figure~\ref{fig:fsm-idle} shows its transition diagram.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.8\textwidth]{images/fsm-idle}
+  \caption{Transition diagram of the idle state machine}
+  \label{fig:fsm-idle}
+\end{figure}
+
+\begin{description}
+\item[START] The beginning state of the idle state machine. Similar to
+  the operation state machine, a broadcast datagram is issued, to
+  query all slave states and the number of slaves.
+  $\rightarrow$~\textit{BROADCAST}
+
+\item[BROADCAST] The number of responding slaves is evaluated. If it
+  has changed since the last time, this is treated as a topology
+  change and the internal list of slaves is cleared and rebuild
+  completely. The slave scan state machine is started for the first
+  slave. $\rightarrow$~\textit{SCAN FOR SLAVES}
+
+  If no topology change happened, every single slave state is fetched.
+  $\rightarrow$~\textit{READ STATES}
+
+\item[SCAN FOR SLAVES] The slave scan state machine is executed until
+  termination. $\rightarrow$~\textit{SCAN FOR SLAVES}
+
+  If there is another slave to scan, the slave scan state machine is
+  started again. $\rightarrow$~\textit{SCAN FOR SLAVES}
+
+  If all slave information has been fetched, slave addresses are
+  calculated and EoE processing is started. Then, the state machine is
+  restarted. $\rightarrow$~\textit{START}
+
+\item[READ STATES] If the slave did not respond to the query, it is
+  marked as offline. The next slave is queried.
+  $\rightarrow$~\textit{READ STATES}
+
+  If the slave responded, it is marked as online. And the next slave
+  is queried. $\rightarrow$~\textit{READ STATES}
+
+  If all slave states have been determined, it is checked, if any
+  slaves are not in the state they supposed to be. If this is true,
+  the slave configuration state machine is started for the first of
+  them. $\rightarrow$~\textit{CONFIGURE SLAVES}
+
+  If all slaves are in the correct state, it is checked, if any
+  E$^2$PROM write operations are pending. If this is true, the first
+  pending operation is executed by starting the SII state machine for
+  writing access. $\rightarrow$~\textit{WRITE EEPROM}
+
+  If all these conditions are false, there is nothing to do and the
+  state machine is restarted. $\rightarrow$~\textit{START}
+
+\item[CONFIGURE SLAVES] The slave configuration state machine is
+  executed until termination. $\rightarrow$~\textit{CONFIGURE SLAVES}
+
+  After this, it is checked, if another slave needs a state change. If
+  this is true, the slave state change state machine is started for
+  this slave. $\rightarrow$~\textit{CONFIGURE SLAVES}
+
+  If all slaves are in the correct state, it is determined, if any
+  E$^2$PROM write operations are pending. If this is true, the first
+  pending operation is executed by starting the SII state machine for
+  writing access. $\rightarrow$~\textit{WRITE EEPROM}
+
+  If all prior conditions are false, the state machine is restarted.
+  $\rightarrow$~\textit{START}
+
+\item[WRITE EEPROM] The SII state machine is executed until
+  termination. $\rightarrow$~\textit{WRITE EEPROM}
+
+  If the current word has been written successfully, and there are
+  still word to write, the SII state machine is started for the next
+  word. $\rightarrow$~\textit{WRITE EEPROM}
+
+  If all words have been written successfully, the new E$^2$PROM
+  contents are evaluated and the state machine is restarted.
+  $\rightarrow$~\textit{START}
+
+\end{description}
+
+%------------------------------------------------------------------------------
+
+\subsection{The Slave Scan State Machine}
+\label{sec:fsm-scan}
+\index{FSM!Slave Scan}
+
+The slave scan state machine, which can be seen in
+figure~\ref{fig:fsm-slavescan}, leads through the process of fetching
+all slave information.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.6\textwidth]{images/fsm-slavescan}
+  \caption{Transition diagram of the slave scan state machine}
+  \label{fig:fsm-slavescan}
+\end{figure}
+
+\begin{description}
+\item[START] In the beginning state of the slave scan state machine,
+  the station address is written to the slave, which is always the
+  ring position~+~$1$. In this way, the address 0x0000 (default
+  address) is not used, which makes it easy to detect unconfigured
+  slaves.  $\rightarrow$~\textit{ADDRESS}
+
+\item[ADDRESS] The writing of the station address is verified. After
+  that, the slave's ``AL Control Response'' attribute is queried.
+  $\rightarrow$~\textit{STATE}
+
+\item[STATE] The AL state is evaluated. A warning is output, if the
+  slave has still the \textit{Change} bit set. After that, the slave's
+  ``DL Information'' attribute is queried.
+  $\rightarrow$~\textit{BASE}
+
+\item[BASE] The queried base data are evaluated: Slave type, revision
+  and build number, and even more important, the number of supported
+  sync managers and FMMUs are stored. After that, the slave's data
+  link layer information is read from the ``DL Status'' attribute at
+  address 0x0110. $\rightarrow$~\textit{DATALINK}
+
+\item[DATALINK] In this state, the DL information is evaluated: This
+  information about the communication ports contains, if the link is
+  up, if the loop has been closed and if there is a carrier detected
+  on the RX side of each port.
+
+  Then, the state machine starts measuring the size of the slave's
+  E$^2$PROM contents. This is done by subsequently reading out each
+  category header, until the last category is reached (type 0xFFFF).
+  This procedure is started by querying the first category header at
+  word address 0x0040 via the SII state machine.
+  $\rightarrow$~\textit{EEPROM SIZE}
+
+\item[EEPROM SIZE] The SII state machine is executed until
+  termination. $\rightarrow$~\textit{EEPROM SIZE}
+
+  If the category type does not mark the end of the categories, the
+  position of the next category header is determined via the length of
+  the current category, and the SII state machine is started again.
+  $\rightarrow$~\textit{EEPROM SIZE}
+
+  If the size of the E$^2$PROM contents has been determined, memory is
+  allocated, to read all the contents. The SII state machine is
+  started to read the first word. $\rightarrow$~\textit{EEPROM DATA}
+
+\item[EEPROM DATA] The SII state machine is executed until
+  termination. $\rightarrow$~\textit{EEPROM DATA}
+
+  Two words have been read. If more than one word is needed, the two
+  words are written in the allocated memory. Otherwise only one word
+  (the last word) is copied. If more words are to read, the SII state
+  machine is started again to read the next two words.
+  $\rightarrow$~\textit{EEPROM DATA}
+
+  The complete E$^2$PROM contents have been read. The slave's identity
+  object and mailbox information are evaluated. Moreover the category
+  types STRINGS, GENERAL, SYNC and PDO are evaluated. The slave
+  scanning has been completed. $\rightarrow$~\textit{END}
+
+\item[END] Slave scanning has been finished.
+
+\end{description}
+
+%------------------------------------------------------------------------------
+
+\subsection{The Slave Configuration State Machine}
+\label{sec:fsm-conf}
+\index{FSM!Slave Configuration}
+
+The slave configuration state machine, which can be seen in
+figure~\ref{fig:fsm-slaveconf}, leads through the process of
+configuring a slave and bringing it to a certain state.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.6\textwidth]{images/fsm-slaveconf}
+  \caption{Transition diagram of the slave configuration state
+    machine}
+  \label{fig:fsm-slaveconf}
+\end{figure}
+
+\begin{description}
+\item[INIT] The state change state machine has been initialized to
+  bring the slave into the \textit{INIT} state. Now, the slave state
+  change state machine is executed until termination.
+  $\rightarrow$~\textit{INIT}
+
+  If the slave state change failed, the configuration has to be
+  aborted. $\rightarrow$~\textit{END}
+
+  The slave state change succeeded and the slave is now in
+  \textit{INIT} state. If this is the target state, the configuration
+  is finished. $\rightarrow$~\textit{END}
+
+  If the slave does not support any sync managers, the sync manager
+  configuration can be skipped. The state change state machine is
+  started to bring the slave into \textit{PREOP} state.
+  $\rightarrow$~\textit{PREOP}
+
+  Sync managers are configured conforming to the sync manager category
+  information provided in the slave's E$^2$PROM. The corresponding
+  datagram is issued. $\rightarrow$~\textit{SYNC}
+
+\item[SYNC] If the sync manager configuration datagram is accepted,
+  the sync manager configuration was successful. The slave may now
+  enter the \textit{PREOP} state, and the state change state machine
+  is started. $\rightarrow$~\textit{PREOP}
+
+\item[PREOP] The state change state machine is executed until
+  termination. $\rightarrow$~\textit{PREOP}
+
+  If the state change failed, the configuration has to be aborted.
+  $\rightarrow$~\textit{END}
+
+  If the \textit{PREOP} state was the target state, the configuration
+  is finished. $\rightarrow$~\textit{END}
+
+  If the slave supports no FMMUs, the FMMU configuration can be
+  skipped. If the slave has SDOs to configure, it is begun with
+  sending the first SDO. $\rightarrow$~\textit{SDO\_CONF}
+
+  If no SDO configurations are provided, the slave can now directly be
+  brought into the \textit{SAVEOP} state and the state change state
+  machine is started again. $\rightarrow$~\textit{SAVEOP}
+
+  Otherwise, all supported FMMUs are configured according to the PDOs
+  requested via the master's realtime interface. The appropriate
+  datagram is issued. $\rightarrow$~\textit{FMMU}
+
+\item[FMMU] The FMMU configuration datagram was accepted. If the slave
+  has SDOs to configure, it is begun with sending the first SDO.
+  $\rightarrow$~\textit{SDO\_CONF}
+
+  Otherwise, the slave can now be brought into the \textit{SAVEOP}
+  state. The state change state machine is started.
+  $\rightarrow$~\textit{SAVEOP}
+
+\item[SDO\_CONF] The CoE state machine is executed until termination.
+  $\rightarrow$~\textit{SDO\_CONF}
+
+  If another SDO has to be configured, a new SDO download sequence is
+  begun. $\rightarrow$~\textit{SDO\_CONF}
+
+  Otherwise, the slave can now be brought into the \textit{SAVEOP}
+  state. The state change state machine is started.
+  $\rightarrow$~\textit{SAVEOP}
+
+\item[SAVEOP] The state change state machine is executed until
+  termination. $\rightarrow$~\textit{SAVEOP}
+
+  If the state change failed, the configuration has to be aborted.
+  $\rightarrow$~\textit{END}
+
+  If the \textit{SAVEOP} state was the target state, the configuration
+  is finished. $\rightarrow$~\textit{END}
+
+  The slave can now directly be brought into the \textit{OP} state and
+  the state change state machine is started a last time.
+  $\rightarrow$~\textit{OP}
+
+\item[OP] The state change state machine is executed until
+  termination. $\rightarrow$~\textit{OP}
+
+  If the state change state machine terminates, the slave
+  configuration is finished, regardless of its success.
+  $\rightarrow$~\textit{END}
+
+\item[END] The termination state.
+
+\end{description}
+
+%------------------------------------------------------------------------------
+
+\subsection{The State Change State Machine}
+\label{sec:fsm-change}
+\index{FSM!State Change}
+
+The state change state machine, which can be seen in
+figure~\ref{fig:fsm-change}, leads through the process of changing a
+slave's state. This implements the states and transitions described in
+\cite[section~6.4.1]{alspec}.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.9\textwidth]{images/fsm-change}
+  \caption{Transition diagram of the state change state machine}
+  \label{fig:fsm-change}
+\end{figure}
+
+\begin{description}
+\item[START] The beginning state, where a datagram with the state
+  change command is written to the slave's ``AL Control Request''
+  attribute. Nothing can fail. $\rightarrow$~\textit{CHECK}
+
+\item[CHECK] After the state change datagram has been sent, the ``AL
+  Control Response'' attribute is queried with a second datagram.
+  $\rightarrow$~\textit{STATUS}
+
+\item[STATUS] The read memory contents are evaluated: While the
+  parameter \textit{State} still contains the old slave state, the
+  slave is busy with reacting on the state change command. In this
+  case, the attribute has to be queried again.
+  $\rightarrow$~\textit{STATUS}
+
+  In case of success, the \textit{State} parameter contains the new
+  state and the \textit{Change} bit is cleared. The slave is in the
+  requested state.  $\rightarrow$~\textit{END}
+
+  If the slave can not process the state change, the \textit{Change}
+  bit is set: Now the master tries to get the reason for this by
+  querying the \textit{AL Status Code} parameter.
+  $\rightarrow$~\textit{CODE}
+
+\item[END] If the state machine ends in this state, the slaves's state
+  change has been successful.
+
+\item[CODE] The status code query has been sent. Reading the
+  \textit{AL Status Code} might fail, because not all slaves support
+  this parameter. Anyway, the master has to acknowledge the state
+  change error by writing the current slave state to the ``AL Control
+  Request'' attribute with the \textit{Acknowledge} bit set.
+  $\rightarrow$~\textit{ACK}
+
+\item[ACK] After that, the ``AL Control Response'' attribute is
+  queried for the state of the acknowledgement.
+  $\rightarrow$~\textit{CHECK ACK}
+
+\item[CHECK ACK] If the acknowledgement has been accepted by the
+  slave, the old state is kept. Still, the state change was
+  unsuccessful. $\rightarrow$~\textit{ERROR}
+
+  If the acknowledgement is ignored by the slave, a timeout happens.
+  In any case, the overall state change was unsuccessful.
+  $\rightarrow$~\textit{ERROR}
+
+  If there is still now response from the slave, but the timer did not
+  run out yet, the slave's ``AL Control Response'' attribute is
+  queried again.  $\rightarrow$~\textit{CHECK ACK}
+
+\item[ERROR] If the state machine ends in this state, the slave's
+  state change was unsuccessful.
+
+\end{description}
+
+%------------------------------------------------------------------------------
+
+\subsection{The SII State Machine}
+\label{sec:fsm-sii}
+\index{FSM!SII}
+
+The SII\index{SII} state machine (shown in figure~\ref{fig:fsm-sii})
+implements the process of reading or writing E$^2$PROM data via the
+Slave Information Interface described in \cite[section~5.4]{alspec}.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.9\textwidth]{images/fsm-sii}
+  \caption{Transition diagram of the SII state machine}
+  \label{fig:fsm-sii}
+\end{figure}
+
+\begin{description}
+\item[READ\_START] The beginning state for reading access, where the
+  read request and the requested address are written to the SII
+  attribute. Nothing can fail up to now.
+  $\rightarrow$~\textit{READ\_CHECK}
+
+\item[READ\_CHECK] When the SII read request has been sent
+  successfully, a timer is started. A check/fetch datagram is issued,
+  that reads out the SII attribute for state and data.
+  $\rightarrow$~\textit{READ\_FETCH}
+
+\item[READ\_FETCH] Upon reception of the check/fetch datagram, the
+  \textit{Read Operation} and \textit{Busy} parameters are checked:
+  \begin{itemize}
+  \item If the slave is still busy with fetching E$^2$PROM data into
+    the interface, the timer is checked. If it timed out, the reading
+    is aborted ($\rightarrow$~\textit{ERROR}), if not, the check/fetch
+    datagram is issued again. $\rightarrow$~\textit{READ\_FETCH}
+
+  \item If the slave is ready with reading data, these are copied from
+    the datagram and the read cycle is completed.
+    $\rightarrow$~\textit{END}
+  \end{itemize}
+\end{description}
+
+The write access states behave nearly the same:
+
+\begin{description}
+\item[WRITE\_START] The beginning state for writing access,
+  respectively. A write request, the target address and the data word
+  are written to the SII attribute. Nothing can fail.
+  $\rightarrow$~\textit{WRITE\_CHECK}
+
+\item[WRITE\_CHECK] When the SII write request has been sent
+  successfully, the timer is started. A check datagram is issued, that
+  reads out the SII attribute for the state of the write operation.
+  $\rightarrow$~\textit{WRITE\_CHECK2}
+
+\item[WRITE\_CHECK2] Upon reception of the check datagram, the
+  \textit{Write Operation} and \textit{Busy} parameters are checked:
+  \begin{itemize}
+  \item If the slave is still busy with writing E$^2$PROM data, the
+    timer is checked. If it timed out, the operation is aborted
+    ($\rightarrow$~\textit{ERROR}), if not, the check datagram is
+    issued again. $\rightarrow$~\textit{WRITE\_CHECK2}
+  \item If the slave is ready with writing data, the write cycle is
+    completed. $\rightarrow$~\textit{END}
+  \end{itemize}
+\end{description}
+
+%------------------------------------------------------------------------------
+
+\section{Mailbox Protocol Implementations}
+\index{Mailbox}
+
+The EtherCAT master implements the EoE and the CoE mailbox
+protocols. See the below section for details.
+
+%------------------------------------------------------------------------------
+
+\subsection{Ethernet-over-EtherCAT (EoE)}
+\label{sec:eoeimp}
+\index{EoE}
+
+The EtherCAT master implements the Ethernet-over-EtherCAT mailbox
+protocol to enable the tunneling of Ethernet frames to special slaves,
+that can either have physical Ethernet ports to forward the frames to,
+or have an own IP stack to receive the frames.
+
+\paragraph{Virtual Network Interfaces}
+
+The master creates a virtual EoE network interface for every
+EoE-capable slave. These interfaces are called \textit{eoeX}, where X
+is a number provided by the kernel on interface registration. Frames
+sent to these interfaces are forwarded to the associated slaves by the
+master. Frames, that are received by the slaves, are fetched by the
+master and forwarded to the virtual interfaces.
+
+This bears the following advantages:
+
+\begin{itemize}
+\item Flexibility: The user can decide, how the EoE-capable slaves are
+  interconnected with the rest of the world.
+\item Standard tools can be used to monitor the EoE activity and to
+  configure the EoE interfaces.
+\item The Linux kernel's layer-2-bridging implementation (according to
+  the IEEE 802.1D MAC Bridging standard) can be used natively to
+  bridge Ethernet traffic between EoE-capable slaves.
+\item The Linux kernel's network stack can be used to route packets
+  between EoE-capable slaves and to track security issues, just like
+  having physical network interfaces.
+\end{itemize}
+
+\paragraph{EoE Handlers}
+
+The virtual EoE interfaces and the related functionality is encapsuled
+in the \textit{ec\_eoe\_t} class (see section~\ref{sec:class-eoe}).
+So the master does not create the network interfaces directly: This is
+done inside the constructor of the \textit{ec\_eoe\_t} class. An
+object of this class is called ``EoE handler'' below. An EoE handler
+additionaly contains a frame queue. Each time, the kernel passes a new
+socket buffer for sending via the interface's
+\textit{hard\_start\_xmit()} callback, the socket buffer is queued for
+transmittion by the EoE state machine (see below). If the queue gets
+filled up, the passing of new socket buffers is suspended with a call
+to \textit{netif\_stop\_queue()}.
+
+\paragraph{Static Handler Creation}
+
+The master creates a pool of EoE handlers at startup, that are coupled
+to EoE-capable slaves on demand. The lifetime of the corresponding
+network interfaces is equal to the lifetime of the master module.
+This approach is opposed to creating the virtual network interfaces on
+demand (i.~e. on running across a new EoE-capable slave). The latter
+approach was considered as difficult, because of serveral reasons:
+
+\begin{itemize}
+\item The \textit{alloc\_netdev()} function can sleep and must be
+  called from a non-interrupt context. This reduces the flexibility of
+  choosing an appropriate method for cyclic EoE processing.
+\item Unregistering network interfaces requires them to be ``down'',
+  which can not be guaranteed upon sudden disappearing of an
+  EoE-capable slave.
+\item The connection to the EoE-capable slaves must be as continuous
+  as possible. Especially the transition from idle to operation mode
+  (and vice versa) causes the rebuilding of the internal data
+  structures. These transitions must be as transparent as possible for
+  the instances using the network interfaces.
+\end{itemize}
+
+\paragraph{Number of Handlers}
+
+The master module has a parameter \textit{ec\_eoeif\_count} to specify
+the number of EoE interfaces (and handlers) per master to create. This
+parameter can either be specified when manually loading the master
+module, or (when using the init script) by setting the
+\textit{\$EOE\_INTERFACES} variable in the sysconfig file (see
+section~\ref{sec:sysconfig}). Upon loading of the master module, the
+virtual interfaces become available:
+
+\begin{lstlisting}
+  host# `\textbf{ifconfig -a}`
+  eoe0      Link encap:Ethernet  HWaddr 00:11:22:33:44:06
+            BROADCAST MULTICAST  MTU:1500  Metric:1
+            RX packets:0 errors:0 dropped:0 overruns:0 frame:0
+            TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
+            collisions:0 txqueuelen:1000
+            RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
+
+  eoe1      Link encap:Ethernet  HWaddr 00:11:22:33:44:07
+            BROADCAST MULTICAST  MTU:1500  Metric:1
+            RX packets:0 errors:0 dropped:0 overruns:0 frame:0
+            TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
+            collisions:0 txqueuelen:1000
+            RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
+  ...
+\end{lstlisting}
+
+\paragraph{Coupling of EoE Slaves}
+
+During execution of the slave scan state machine (see
+section~\ref{sec:fsm-scan}), the master determines the supported
+mailbox protocols. This is done by examining the ``Supported Mailbox
+Protocols'' mask field at word address 0x001C of the SII\index{SII}.
+If bit 1 is set, the slave supports the EoE protocol. After slave
+scanning, the master runs through all slaves again and couples each
+EoE-capable slave to a free EoE handler. It can happen, that there are
+not enough EoE handlers to cover all EoE-capable slaves. In this case,
+the number of EoE handlers must be increased accordingly.
+
+\paragraph{EoE State Machine}
+\index{FSM!EoE}
+
+Every EoE handler owns an EoE state machine, that is used to send
+frames to the coupled slave and receive frames from the it via the EoE
+communication primitives. This state machine is showed in
+figure~\ref{fig:fsm-eoe}.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.7\textwidth]{images/fsm-eoe}
+  \caption{Transition diagram of the EoE state machine}
+  \label{fig:fsm-eoe}
+\end{figure}
+
+\begin{description}
+\item[RX\_START] The beginning state of the EoE state machine. A
+  mailbox check datagram is sent, to query the slave's mailbox for new
+  frames. $\rightarrow$~\textit{RX\_CHECK}
+
+\item[RX\_CHECK] The mailbox check datagram is received. If the
+  slave's mailbox did not contain data, a transmit cycle is started.
+  $\rightarrow$~\textit{TX\_START}
+
+  If there are new data in the mailbox, a datagram is sent to fetch
+  the new data. $\rightarrow$~\textit{RX\_FETCH}
+
+\item[RX\_FETCH] The fetch datagram is received. If the mailbox data
+  do not contain a ``EoE Fragment request'' command, the data are
+  dropped and a transmit sequence is started.
+  $\rightarrow$~\textit{TX\_START}
+
+  If the received Ethernet frame fragment is the first fragment, a new
+  socket buffer is allocated. In either case, the data are copied into
+  the correct position of the socket buffer.
+
+  If the fragment is the last fragment, the socket buffer is forwarded
+  to the network stack and a transmit sequence is started.
+  $\rightarrow$~\textit{TX\_START}
+
+  Otherwise, a new receive sequence is started to fetch the next
+  fragment. $\rightarrow$~\textit{RX\_\-START}
+
+\item[TX\_START] The beginning state of a transmit sequence. It is
+  checked, if the transmittion queue contains a frame to send. If not,
+  a receive sequence is started. $\rightarrow$~\textit{RX\_START}
+
+  If there is a frame to send, it is dequeued. If the queue was
+  inactive before (because it was full), the queue is woken up with a
+  call to \textit{netif\_wake\_queue()}. The first fragment of the
+  frame is sent. $\rightarrow$~\textit{TX\_SENT}
+
+\item[TX\_SENT] It is checked, if the first fragment was sent
+  successfully. If the current frame consists of further fragments,
+  the next one is sent. $\rightarrow$~\textit{TX\_SENT}
+
+  If the last fragment was sent, a new receive sequence is started.
+  $\rightarrow$~\textit{RX\_START}
+\end{description}
+
+\paragraph{EoE Processing}
+
+To execute the EoE state machine of every active EoE handler, there
+must be a cyclic process. The easiest thing would be to execute the
+EoE state machines synchronously to the operation state machine (see
+section~\ref{sec:fsm-op}) with every realtime cycle. This approach has
+the following disadvantages:
+
+\begin{itemize}
+\item Only one EoE fragment can be sent or received every few cycles.
+  This causes the data rate to be very low, because the EoE state
+  machines are not executed in the time between the realtime
+  cycles. Moreover, the data rate would be dependent on the frequency
+  of the realtime process.
+\item The receiving and forwarding of frames to the kernel requires
+  the dynamic allocation of frames. Some realtime extensions do not
+  support calling memory allocation functions in realtime context, so
+  the EoE state machine may not be executed with each realtime cycle.
+\end{itemize}
+
+To overcome these problems, an own cyclic process is needed to
+asynchronously execute the EoE state machines. For that, the master
+owns a kernel timer, that is executed each timer interrupt. This
+guarantees a constant bandwidth, but poses the new problem of
+concurrent access to the master. The locking mechanisms needed for
+this are introduced in section~\ref{sec:concurr}.
+Section~\ref{sec:concurrency} gives practical implementation examples.
+
+\paragraph{Idle Mode}
+
+EoE data must also be exchanged idle mode, to guarantee the continuous
+availability of the connection to the EoE-capable slaves. Although
+there is no realtime module connected in this case, the master is
+still accessed by the idle state machine (see
+section~\ref{sec:fsm-idle}), that is executed by the master's
+workqueue. With the EoE timer running in addition, there is still
+concurrency, that has to be protected by a lock. Therefore the master
+owns an internal spinlock that is used protect master access during
+idle mode.
+
+\paragraph{Automatic Configuration}
+
+By default, slaves are left in \textit{INIT} state during idle mode.
+If an EoE interface is set to running state (i.~e. with the
+\textit{ifconfig up} command), the requested slave state of the
+related slave is automatically set to \textit{OP}, whereupon the idle
+state machine will attempt to configure the slave and put it into
+operation.
+
+%------------------------------------------------------------------------------
+
+\subsection{CANopen-over-EtherCAT (CoE)}
+\label{sec:coeimp}
+\index{CoE}
+
+The CANopen-over-EtherCAT protocol \cite[section~5.6]{alspec} is used
+to configure slaves on application level. Each CoE-capable slave
+provides a list of SDOs for this reason.
+
+\paragraph{SDO Configuration}
+
+The SDO configurations have to be provided by the realtime module.
+This is done via the \textit{ecrt\_slave\_conf\_sdo*()} methods (see
+section~\ref{sec:ecrt-slave}), that are part of the realtime
+interface. The slave stores the SDO configurations in a linked list,
+but does not apply them at once.
+
+\paragraph{SDO Download State Machine}
+
+The best time to apply SDO configurations is during the slave's
+\textit{PREOP} state, because mailbox communication is already
+possible and slave's application will start with updating input data
+in the succeeding \textit{SAVEOP} state. Therefore the SDO
+configuration has to be part of the slave configuration state machine
+(see section~\ref{sec:fsm-conf}): It is implemented via an SDO
+download state machine, that is executed just before entering the
+slave's \textit{SAVEOP} state. In this way, it is guaranteed that the
+SDO configurations are applied each time, the slave is reconfigured.
+
+The transition diagram of the SDO Download state machine can be seen
+in figure~\ref{fig:fsm-coedown}.
+
+\begin{figure}[htbp]
+  \centering
+  \includegraphics[width=.9\textwidth]{images/fsm-coedown}
+  \caption{Transition diagram of the CoE download state machine}
+  \label{fig:fsm-coedown}
+\end{figure}
+
+\begin{description}
+\item[START] The beginning state of the CoE download state
+  machine. The ``SDO Download Normal Request'' mailbox command is
+  sent. $\rightarrow$~\textit{REQUEST}
+
+\item[REQUEST] It is checked, if the CoE download request has been
+  received by the slave. After that, a mailbox check command is issued
+  and a timer is started. $\rightarrow$~\textit{CHECK}
+
+\item[CHECK] If no mailbox data is available, the timer is checked.
+  \begin{itemize}
+  \item If it timed out, the SDO download is aborted.
+    $\rightarrow$~\textit{ERROR}
+  \item Otherwise, the mailbox is queried again.
+    $\rightarrow$~\textit{CHECK}
+  \end{itemize}
+
+  If the mailbox contains new data, the response is fetched.
+  $\rightarrow$~\textit{RESPONSE}
+
+\item[RESPONSE] If the mailbox response could not be fetched, the data
+  is invalid, the wrong protocol was received, or a ``Abort SDO
+  Transfer Request'' was received, the SDO download is aborted.
+  $\rightarrow$~\textit{ERROR}
+
+  If a ``SDO Download Normal Response'' acknowledgement was received,
+  the SDO download was successful. $\rightarrow$~\textit{END}
+
+\item[END] The SDO download was successful.
+
+\item[ERROR] The SDO download was aborted due to an error.
+
+\end{description}
+
+%------------------------------------------------------------------------------
+
+\section{User Space}
+\label{sec:user}
+\index{User space}
+
+For the master runs as a kernel module, accessing it is natively
+limited to analyzing syslog messages and controlling using modutils.
+
+It is necessary to implement further interfaces, that make it easier
+to access the master from user space and allow a finer influence. It
+should be possible to view and to change special parameters at runtime.
+
+Bus visualization is a second point: For development and debugging
+purposes it would be nice, if one could show the connected slaves with
+a single command.
+
+Another aspect is automatic startup and configuration. If the master
+is to be integrated into a running system, it must be able to
+automatically start with a persistent configuration.
+
+A last thing is monitoring EtherCAT communication. For debugging
+purposes, there had to be a way to analyze EtherCAT datagrams. The
+best way would be with a popular network analyzer, like Wireshark
+\cite{wireshark} (the former Ethereal) or others.
+
+This section covers all those points and introduces the interfaces and
+tools to make all that possible.
+
+%------------------------------------------------------------------------------
+
+\subsection{The Sysfs Interface}
+\label{sec:sysfs}
+
+The system filesystem (Sysfs\index{Sysfs}) was introduced with Linux
+kernel 2.5 and is a well-defined interface for drivers to export
+information to user space. It serves also as an relief for the process
+filesystem (Procfs), where over the years much non-process information
+was concentrated.
+
+Sysfs exports information about devices, classes and busses via a
+virtual filesystem, usually mounted to \textit{/sys}. The EtherCAT
+master slightly differs from this concept, because the only physical
+device is the network adapter it uses for bus communication, which is
+already represented in Sysfs. For the EtherCAT bus is no system bus
+like PCI (with device and driver structures), it would not make any
+sense to represent it as bus structure in Sysfs.
+
+Therefore, the EtherCAT master is represented as a new directory
+directly unter the Sysfs root. Every master gets its own Sysfs entry
+named \textit{ethercatX}, where X is the index of the master. Two
+masters would result in the directories \textit{/sys/ethercat0} and
+\textit{/sys/ethercat1}, respectively.
+
+The Sysfs base class in the kernel code is the \textit{kobject}
+structure. Each object structure, that is to be represented in Sysfs,
+has to contain such a structure, because due to the concurrent access
+(through ``normal'' kernel code and Sysfs code) the object deletion
+gets a little more complicated: The object may not be freed until no
+instance uses it any more. Therefore, each kobject maintains a
+reference counter. If the reference counter gets zero, the object is
+finally freed. A kobject can be registered to appear as a directory in
+Sysfs with a call to \textit{kobject\_add()}. Each kobject type can
+define attributes, that appear as files in the kobject's
+directory. Callback functions have to be provided for reading (and
+perhaps writing) access.
+
+\subsubsection{Master Attributes}
+\label{sec:sysfs-master}
+
+Below is a typical listing of the masters Sysfs directory (that is a
+file system representation of the master's kobject):
+
+\begin{lstlisting}
+  host> `\textbf{ls /sys/ethercat0}`
+  debug_level          slave000  slave003  slave006
+  eeprom_write_enable  slave001  slave004  slave007
+  info                 slave002  slave005  slave008
+\end{lstlisting}
+
+The following attributes exist in the master directory:
+
+\begin{description}
+\item[debug\_level] (read/write) This attribute contains the master's
+  debug level, which controls, how much information is printed into
+  syslog. The values 0 (no additional debug messages), 1 (a few
+  additional debug messages) and 2 (all additional debug messages) are
+  defined. Writing is done with command like
+
+  \begin{lstlisting}[gobble=4]
+    host# `\textbf{echo 1 > /sys/ethercat0/debug\_level}`
+  \end{lstlisting}
+
+  and is receipted with a syslog message by the master:
+
+  \begin{lstlisting}[gobble=4]
+    EtherCAT: Master debug level set to 1.
+  \end{lstlisting}
+
+\item[enable\_eeprom\_writing] (read/write) See
+  section~\ref{sec:eepromaccess} for how to use this attribute.
+
+\item[info] (read only) This attribute contains information about the
+  master. Example contents are below:
+
+  \begin{lstlisting}[gobble=4]
+    host> `\textbf{cat /sys/ethercat0/info}`
+
+    Mode: IDLE
+    Slaves: 9
+
+    Timing (min/avg/max) [us]:
+      Idle cycle: 4 / 4.38 / 34
+      EoE cycle: 9 / 11.91 / 23
+
+    EoE statistics (RX/TX) [bps]:
+      eoe0: 0 / 3184
+  \end{lstlisting}
+
+  The mode can be \textit{ORPHANED}, \textit{IDLE} or
+  \textit{OPERATION}. The other parameters are self-explanatory.
+
+\end{description}
+
+\subsubsection{Domain Attributes}
+\label{sec:sysfs-domain}
+
+In operation mode, each created domain is represented as a directory
+\textit{domainX}, where X is the domain index. Below is a listing of
+the domain directory contents:
+
+\begin{lstlisting}
+  host> `\textbf{ls /sys/ethercat0/domain0}`
+  image_size
+\end{lstlisting}
+
+The domain directories currently only export the domain's image size.
+It is planned to export the whole process data mapping for debugging
+purposes.
+
+\subsubsection{Slave Attributes}
+\label{sec:sysfs-slave}
+
+Each slave on the bus is represented in its own directory
+\textit{slaveXXX}, where XXX is the slave's 3-digit ring position in
+the EtherCAT bus. Below is a listing of a slave directory:
+
+\begin{lstlisting}
+  host> `\textbf{ls /sys/ethercat0/slave003}`
+  eeprom  info  state
+\end{lstlisting}
+
+\begin{description}
+\item[eeprom] (read/write) See section~\ref{sec:eepromaccess} for how
+  to use this attribute.
+
+\item[info] (read only) This attribute contains a bunch of information
+  about the slave. Below is an example output:
+
+  \begin{lstlisting}[gobble=4]
+    host> `\textbf{cat /sys/ethercat0/slave003/info}`
+
+    Name: EL4132 2K. Ana. Ausgang +/-10V
+    Vendor ID: 0x00000002
+    Product code: 0x10243052
+
+    State: INIT
+    Ring position: 3
+    Advanced position: 1:3
+
+    Data link status:
+      Port 0 (EBUS) Link down, Loop open, Signal detected
+      Port 1 (EBUS) Link down, Loop open, Signal detected
+      Port 2 (EBUS) Link down, Loop closed, No signal
+      Port 3 (EBUS) Link down, Loop closed, No signal
+
+    Mailboxes:
+      RX mailbox: 0x1800/246, TX mailbox: 0x18F6/246
+      Supported protocols: CoE, FoE
+
+    SII data:
+      Group: AnaOut
+      Image: TERM_AO
+      Order#: EL4132
+
+    Sync-Managers:
+      0: 0x1800, length 246, control 0x26, enable
+      1: 0x18F6, length 246, control 0x22, enable
+      2: 0x1000, length 0, control 0x24, enable
+      3: 0x1100, length 0, control 0x20, enable
+
+    PDOs:
+      RXPDO "Channel 1" (0x1600), Sync-Manager 2
+        "Output" 0x6411:1, 16 bit
+      RXPDO "Channel 2" (0x1601), Sync-Manager 2
+        "Output" 0x6411:2, 16 bit
+  \end{lstlisting}
+
+  This is nearly all of the SII category information needed to
+  configure the slave, supplemented with state and addressing
+  information.
+
+\item[state] (read/write) This attribute contains the slave's state.
+  It can be read or written:
+
+  \begin{lstlisting}[gobble=4]
+    host# `\textbf{cat /sys/ethercat0/slave003/state}`
+    OP
+    host# `\textbf{echo SAVEOP > /sys/ethercat0/slave003/state}`
+  \end{lstlisting}
+
+  This command should also be receipted with a syslog message:
+
+  \begin{lstlisting}[gobble=4]
+    EtherCAT: Accepted new state SAVEOP for slave 3.
+    EtherCAT: Changing state of slave 3 from OP to SAVEOP.
+    EtherCAT: Slave states: INIT, SAVEOP, OP.
+  \end{lstlisting}
+
+  After the new requested state was accepted from user space, the
+  operation state machine (see section~\ref{sec:fsm-op}) or the idle
+  state machine (section~\ref{sec:fsm-idle}) notices, that the
+  requested slave state differs from the current one, and therefore
+  executes the slave configuration state machine, until the slave has
+  reached the requested state.
+\end{description}
+
+%------------------------------------------------------------------------------
+
+\subsubsection{E$^2$PROM Access}
+\label{sec:eepromaccess}
+\index{E$^2$PROM!Access}
+
+It is possible to directly read or write the complete E$^2$PROM
+contents of the slaves. This was introduced for the reasons below:
+
+\begin{itemize}
+\item The format of the E$^2$PROM data is still in development and
+  categories can be added in the future. With read and write access,
+  the complete memory contents can be easily backed up and restored.
+\item Some E$^2$PROM data fields have to be altered (like the alias
+  address). A quick writing must be possible for that.
+\item Through read access, analyzing category data is possible from
+  user space.
+\end{itemize}
+
+Reading out E$^2$PROM data is as easy as reading other
+attributes. Though the data are in binary format, analyzation is
+easier with a tool like \textit{hexdump}:
+
+\begin{lstlisting}
+  host> `\textbf{cat /sys/ethercat0/slave003/eeprom | hexdump}`
+  0000000 0103 0000 0000 0000 0000 0000 0000 008c
+  0000010 0002 0000 3052 07f0 0000 0000 0000 0000
+  0000020 0000 0000 0000 0000 0000 0000 0000 0000
+  ...
+\end{lstlisting}
+
+Backing up E$^2$PROM contents gets as easy as copying a file:
+
+\begin{lstlisting}
+  host> `\textbf{cp /sys/ethercat0/slave003/eeprom slave003.eep}`
+\end{lstlisting}
+
+Writing access is only possible as \textit{root}. Moreover writing has
+to be explicitly enabled and is only allowed in idle mode. This is a
+safety measure, because without the correct memory contents, a slave
+is unusable. Writing E$^2$PROM contents in operation mode is not
+provided yet.
+
+E$^2$PROM writing is enabled with the command below:
+
+\begin{lstlisting}
+  host# `\textbf{echo 1 > /sys/ethercat0/eeprom\_write\_enable}`
+\end{lstlisting}
+
+The success can be seen in the syslog messages again:
+
+\begin{lstlisting}
+  EtherCAT: Slave EEPROM writing enabled.
+\end{lstlisting}
+
+Now, it is possible to write E$^2$PROM contents to a slave. The master
+will accept data through the \textit{eeprom} file and will perform a
+short validation of the contents, before starting the write operation.
+This validation checks the complete size and the category headers.
+
+\begin{lstlisting}
+  host# `\textbf{cat slave003.eep > /sys/ethercat0/slave003/eeprom}`
+\end{lstlisting}
+
+The write operation can take a few seconds.
+
+\begin{lstlisting}
+  EtherCAT: EEPROM writing scheduled for slave 3, 88 words.
+  EtherCAT: Writing EEPROM of slave 3...
+  EtherCAT: Finished writing EEPROM of slave 3.
+\end{lstlisting}
+
+%------------------------------------------------------------------------------
+
+\subsection{User Space Tools}
+\index{User space!Tools}
+
+There is a user space tool called \textit{lsec}\index{lsec} (``List
+EtherCAT'') to visualize the EtherCAT bus. Running it usually results
+in an output like this:
+
+\begin{lstlisting}
+  host> `\textbf{lsec}`
+  EtherCAT bus listing for master 0:
+     0  1:0  OP      EK1100 Ethernet Kopplerklemme (2A E-Bus)
+     1  1:1  INIT    EL4132 2K. Ana. Ausgang +/-10V
+     2  1:2  INIT    EL4132 2K. Ana. Ausgang +/-10V
+     3  1:3  SAVEOP  EL4132 2K. Ana. Ausgang +/-10V
+     4  1:4  INIT    EL5101 Incremental Encoder Interface
+     5  1:5  INIT    EL1014 4K. Dig. Eingang 24V, 10s
+     6  1:6  OP      EL6601 1 Port Switch (Ethernet, CoE)
+     7  1:7  INIT    EL5101 Incremental Encoder Interface
+     8  1:8  INIT    EL5001 1K. SSI Encoder
+\end{lstlisting}
+
+Every slave is displayed as one text row. The first column shows its
+ring position, the second displays the ``advanced position address''
+(see section~\ref{sec:addr}) and the third column displays the current
+slave state. The last column is the slave's name, as it appears in the
+``general'' E$^2$PROM category.
+
+The lsec program is a Perl script, that evaluates the Sysfs
+\textit{info} attributes of the slaves (see
+section~\ref{sec:sysfs-slave}). This is done for master $0$ by
+default, but the master index can be specified via command line:
+
+\begin{lstlisting}
+  host> `\textbf{lsec -h}`
+  Usage: ec_list [OPTIONS]
+          -m <IDX>    Query master <IDX>.
+          -h          Show this help.
+\end{lstlisting}
+
+This script has proved as useful for troubleshooting: If it displays
+slaves, the master is up and running, and the bus connection is
+present, too. It is also useful when building up a bus: It can verify
+the list of slaves and help to create a process data image (see
+chapter~\ref{chapter:usage}).
+
+%------------------------------------------------------------------------------
+
+\subsection{System Integration}
+\label{sec:system}
+
+To integrate the EtherCAT master into a running system, it has to be
+guaranteed, that it is started on system startup. In addition, there has
+to be a persistent configuration, that is also applied on startup.
+
+\subsubsection{The EtherCAT Init Script}
+\label{sec:init}
+\index{Init script}
+
+The EtherCAT master provides an ``init script'', that conforms to the
+requirements of the ``Linux Standard Base'' (LSB\index{LSB},
+\cite{lsb}). The script is installed to \textit{/etc/init.d/ethercat},
+so that the master can be easily inserted as a service. The different
+Linux distributions offer different ways to mark the service for
+starting and stopping in certain runlevels (for example, SUSE provides
+the \textit{insserv} command).
+
+To provide service dependencies (i.~e. which services have to be
+started before) right inside the init script code, LSB defines a
+special comment block. System tools can extract this information to
+insert the EtherCAT init script at the correct place in the startup
+sequence:
+
+\begin{lstlisting}
+  ### BEGIN INIT INFO
+  # Provides:          ethercat
+  # Required-Start:    $local_fs $syslog $network
+  # Should-Start:      $time
+  # Required-Stop:     $local_fs $syslog $network
+  # Should-Stop:       $time
+  # Default-Start:     3 5
+  # Default-Stop:      0 1 2 6
+  # Short-Description: EtherCAT master modules
+  # Description:
+  ### END INIT INFO
+\end{lstlisting}
+
+The init script can also be used for manually starting and stopping
+the EtherCAT master. It has to be executed with one of the parameters
+\textit{start}, \textit{stop}, \textit{restart} or \textit{status}.
+Besides, a link to the script is placed at
+\textit{/usr/sbin/rcethercat} for easier access.
+
+\begin{lstlisting}
+  host# `\textbf{/etc/init.d/ethercat restart}`
+  Shutting down EtherCAT master                done
+  Starting EtherCAT master                     done
+\end{lstlisting}
+
+\subsubsection{The EtherCAT Sysconfig File}
+\label{sec:sysconfig}
+\index{Sysconfig file}
+
+For persistent configuration, the init script uses a sysconfig file
+installed to \textit{/etc/sys\-config/ethercat}, that is mandatory for
+the init script. The sysconfig file contains all configuration
+variables needed to operate a master:
+
+\begin{description}
+\item[DEVICE\_INDEX] This variable must contain the PCI index of the
+  EtherCAT device.  Setting this is mandatory for the EtherCAT init
+  script. Default: $-1$
+\item[EOE\_INTERFACES] The number of virtual Ethernet-over-EtherCAT
+  interfaces, every master creates on startup. See
+  section~\ref{sec:eoeimp}. Default: $0$
+\item[EOE\_BRIDGE] If this variable is set, all EoE interfaces will be
+  added to a network bridge according to IEEE 802.1D after master
+  startup. The variable must contain the name of the bridge. To use
+  this functionality, the kernel must be configured with the
+  \textit{CONFIG\_BRIDGE} option and the \textit{bridge-utils} package
+  must be installed (i.~e. the \textit{brctl} command is needed).
+\item[EOE\_IP\_ADDRESS] The IP address of the EoE bridge. Setting this
+  together with \textit{EOE\_IP\_NETMASK} will let the local host
+  communicate with devices on the EoE bridge.
+\item[EOE\_IP\_NETMASK] IP netmask of the EoE bridge.
+\item[EOE\_EXTRA\_INTERFACES] The list of extra interfaces to include
+  in the EoE brid\-ge. Set this to interconnect the EoE bridge with
+  other local interfaces. If \textit{EOE\_\-BRIDGE} is empty or
+  undefined, setting this variable has no effect. Important: The IP
+  address of the listed interfaces will be cleared. Setting
+  \textit{EOE\_\-IP\_\-ADDRESS} and \textit{EOE\_IP\_NETMASK} will
+  re-enable them for IP traffic.
+\item[EOE\_GATEWAY] The IP address of the default gateway. If this
+  variable is set, the gateway will be renewed after bridge
+  installation. This is necessary, if the default gateway's interface
+  is one of the \textit{EOE\_EXTRA\_INTERFACES}.
+\end{description}
+
+%------------------------------------------------------------------------------
+
+\subsection{Monitoring and Debugging}
+\label{sec:debug}
+\index{Monitoring}
+
+For debugging purposes, every EtherCAT master registeres a read-only
+network interface \textit{ecX}, where X is a number, provided by the
+kernel on device registration. While it is ``up'', the master forwards
+every frame sent and received to this interface.
+
+This makes it possible to connect an network monitor (like Wireshark
+or tcpdump) to the debug interface and monitor the EtherCAT frames.
+
+It has to be considered, that can be frame rate can be very high. The
+idle state machine usually runs every kernel timer interrupt (up to
+$1$~kHz) and with a connected realtime module, the rate can be even
+higher.
+
+\paragraph{Attention:} The socket buffers needed for the operation of
+the debugging interface have to be allocated dynamically. Some Linux
+realtime extensions do not allow this in realtime context!
+
+%------------------------------------------------------------------------------
+
+\section{Timing Aspects}
+\label{sec:timing}
+
+Although EtherCAT's timing is highly deterministic and therefore
+timing issues are rare, there are a few aspects that can (and should
+be) dealt with.
+
+%------------------------------------------------------------------------------
+
+\subsection{Realtime Interface Profiling}
+\label{sec:timing-profile}
+\index{Realtime!Profiling}
+
+One of the most important timing aspects are the runtimes of the
+realtime interface functions, that are called in cyclic context. These
+functions make up an important part of the overall timing of the
+realtime module. To measure the timing of the functions, the following
+code was used:
+
+\begin{lstlisting}[gobble=2,language=C]
+  c0 = get_cycles();
+  ecrt_master_receive(master);
+  c1 = get_cycles();
+  ecrt_domain_process(domain1);
+  c2 = get_cycles();
+  ecrt_master_run(master);
+  c3 = get_cycles();
+  ecrt_master_send(master);
+  c4 = get_cycles();
+\end{lstlisting}
+
+Between each call of an interface function, the CPU timestamp counter
+is read. The counter differences are converted to microseconds with
+help of the \textit{cpu\_khz} variable, that contains the number of
+increments per millisecond.
+
+For the actual measuring, a system with a $2.0$~GHz CPU was used, that
+ran the above code in an RTAI thread with a cycle time of $100$
+\textmu s.  The measuring was repeated $n = 100$ times and the results
+were averaged. These can be seen in table~\ref{tab:profile}.
+
+\begin{table}[htpb]
+  \centering
+  \caption{Profiling of a Realtime Cycle on a $2.0$~GHz Processor}
+  \label{tab:profile}
+  \vspace{2mm}
+  \begin{tabular}{l|r|r}
+    Element & Mean Duration [\textmu s] & Standard Deviancy [\textmu s] \\
+    \hline
+    \textit{ecrt\_master\_receive()} & 8.04 & 0.48\\
+    \textit{ecrt\_domain\_process()} & 0.14 & 0.03\\
+    \textit{ecrt\_master\_run()} & 0.29 & 0.12\\
+    \textit{ecrt\_master\_send()} & 2.18 & 0.17\\ \hline
+    Complete Cycle & 10.65 & 0.69\\ \hline
+  \end{tabular}
+\end{table}
+
+It is obvious, that the the functions accessing hardware make up the
+lion's share. The \textit{ec\_master\_receive()} executes the ISR of
+the Ethernet device, analyzes datagrams and copies their contents into
+the memory of the datagram objects. The \textit{ec\_master\_send()}
+assembles a frame out of different datagrams and copies it to the
+hardware buffers. Interestingly, this makes up only a quarter of the
+receiving time.
+
+The functions that only operate on the masters internal data
+structures are very fast ($\Delta t < 1$~\textmu s). Interestingly the
+runtime of \textit{ec\_domain\_process()} has a small standard
+deviancy relative to the mean value, while this ratio is about twice
+as big for \textit{ec\_master\_run()}: This probably results from the
+latter function having to execute code depending on the current state
+and the different state functions are more or less complex.
+
+For a realtime cycle makes up about $10$~\textmu s, the theoretical
+frequency can be up to $100$~kHz. For two reasons, this frequency
+keeps being theoretical:
+
+\begin{enumerate}
+\item The processor must still be able to run the operating system
+  between the realtime cycles.
+\item The EtherCAT frame must be sent and received, before the next
+  realtime cycle begins. The determination of the bus cycle time is
+  difficult and covered in section~\ref{sec:timing-bus}.
+\end{enumerate}
+
+%------------------------------------------------------------------------------
+
+\subsection{Bus Cycle Measuring}
+\label{sec:timing-bus}
+\index{Bus cycle}
+
+For measuring the time, a frame is ``on the wire'', two timestamps
+must be be taken:
+
+\begin{enumerate}
+\item The time, the Ethernet hardware begins with physically sending
+  the frame.
+\item The time, the frame is completely received by the Ethernet
+  hardware.
+\end{enumerate}
+
+Both times are difficult to determine. The first reason is, that the
+interrupts are disabled and the master is not notified, when a frame
+is sent or received (polling would distort the results). The second
+reason is, that even with interrupts enabled, the time from the event
+to the notification is unknown. Therefore the only way to confidently
+determine the bus cycle time is an electrical measuring.
+
+Anyway, the bus cycle time is an important factor when designing
+realtime code, because it limits the maximum frequency for the cyclic
+part of the realtime module. In practice, these timing parameters are
+highly dependent on the hardware and often a trial and error method
+must be used to determine the limits of the system.
+
+The central question is: What happens, if the cycle frequency is too
+high? The answer is, that the EtherCAT frames that have been sent at
+the end of the cycle are not yet received, when the next cycle starts.
+First this is noticed by \textit{ecrt\_domain\_process()}, because the
+working counter of the process data datagrams were not increased. The
+function will notify the user via syslog\footnote{To limit syslog
+  output, a mechanism has been implementet, that outputs a summarized
+  notification at maximum once a second.}. In this case, the process
+data keeps being the same as in the last cycle, because it is not
+erased by the domain. When the domain datagrams are queued again, the
+master notices, that they are already queued (and marked as sent). The
+master will mark them as unsent again and output a warning, that
+datagrams were ``skipped''.
+
+On the mentioned $2.0$~GHz system, the possible cycle frequency can be
+up to $25$~kHz without skipped frames. This value can surely be
+increased by choosing faster hardware. Especially the RealTek network
+hardware could be replaced by a faster one. Besides, implementing a
+dedicated ISR for EtherCAT devices would also contribute to increasing
+the latency. These are two points on the author's to-do list.
+
+%------------------------------------------------------------------------------
+
+\chapter{Using the EtherCAT Master}
+\label{chapter:usage}
+\index{Master!Usage}
+
+This chapter will give practical examples of how to use the EtherCAT
+master via the realtime interface by writing a realtime module.
+
+Section~\ref{sec:make} shows how to compile and install the master,
+while the sections~\ref{sec:mini} to~\ref{sec:concurrency} give
+examples for different realtime modules.
+
+%------------------------------------------------------------------------------
+
+\section{Compiling and Installing}
+\label{sec:make}
+\index{Master!Compilation}
+
+The current EtherCAT master code is available at~\cite{etherlab}.
+After downloading the \textit{tar.bz2} file, it has to be unpacked
+with the command below (or similar):
+
+\begin{lstlisting}
+  host> `\textbf{tar xjf ethercat-stable-1.1-r513-src.tar.bz2}`
+  host> `\textbf{cd ethercat-stable-1.1-r513-src}`
+\end{lstlisting}
+
+For compilation, the kernel sources are needed. Basically any kernel
+sources are appropriate\footnote{If a realtime extension is to be
+  used, the kernel has to be patched before that.}, that are
+configured with networking. If the host kernel is not the running
+kernel, a copy of the configuration template has to be made:
+
+\begin{lstlisting}
+  host> `\textbf{cp ethercat.conf.tmpl ethercat.conf}`
+\end{lstlisting}
+
+Now the \textit{\$KERNEL} variable inside the \textit{ethercat.conf}
+file can be adjusted to reflect the appropriate kernel version. If
+everything is correct now, the sucessive call to
+
+\begin{lstlisting}
+  host> `\textbf{make}`
+\end{lstlisting}
+
+will result in no errors.
+
+The following commands have to be entered as \textit{root}: To install
+the kernel modules, the init script, the sysconfig file and the user
+space tools, the below command has to be executed:
+
+\begin{lstlisting}
+  host# `\textbf{make install}`
+\end{lstlisting}
+
+If the sysconfig file did not exist yet, the user is notified to edit
+it, before running the master. For the contents of the file, see
+section~\ref{sec:sysconfig}. To give a short summary: The most
+important thing is to adjust the \textit{\$DEVICE\_INDEX} variable. It
+has to be set to the index of the compatible network device to use
+with EtherCAT, where the order of devices is dependent on their
+position in the PCI bus. If this is not known, the index can be
+determinded with trial and error, but it has to be considered that a
+wrong value can cause a loss of network connection.
+
+After the basic configuration is done, the master can be started with
+the below command:
+
+\begin{lstlisting}
+  host# `\textbf{/etc/init.d/ethercat start}`
+\end{lstlisting}
+
+The operation of the master can be observed by looking at the
+syslog\index{syslog} messages, which should look like the ones below:
+
+\begin{lstlisting}[numbers=left]
+  EtherCAT: Master driver, 1.1 (stable) - rev. 513,
+      compiled by fp at Aug 09 2006 10:23:20
+  EtherCAT: Initializing 1 EtherCAT master(s)...
+  EtherCAT: Initializing master 0.
+  EtherCAT: Master driver initialized.
+  ec_8139too Fast Ethernet driver 0.9.27 Revision 513,
+      compiled by fp at Aug 09 2006 10:23:20
+  ec_device_index is 0
+  ACPI: PCI Interrupt 0000:01:00.0[A] -> Link [LNKC]
+      -> GSI 11 (level, low) -> IRQ 11
+  ec0: RealTek RTL8139 at 0xd047c000, 00:c0:26:00:c6:aa, IRQ 11
+  ec0:  Identified 8139 chip type 'RTL-8100B/8139D'
+  Registering EtherCAT device...
+  Starting EtherCAT device...
+  EtherCAT: Link state changed to UP.
+  EtherCAT: Starting Idle mode.
+  EtherCAT: 11 slaves responding.
+  EtherCAT: Slave states: INIT, OP.
+  EtherCAT: Scanning bus.
+  EtherCAT: Bus scanning completed.
+  EtherCAT: No EoE handlers coupled.
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 1}] The master module is loaded,
+  and one master is initialized.
+\item[\normalfont\textcircled{\tiny 6}] The EtherCAT-capable RTL8139
+  device driver is loaded. It connects its first network device to the
+  master.
+\item[\normalfont\textcircled{\tiny 16}] The master starts idle mode
+  and begins scanning the bus for slaves.
+\end{description}
+
+%------------------------------------------------------------------------------
+
+\section{A Minimal Example Module}
+\label{sec:mini}
+\index{Examples!Minimal}
+
+This section will explain the usage of the EtherCAT master from a
+minimal kernel module. The complete module code is obtainable as a
+part of the EtherCAT master code release (see~\cite{etherlab}, file
+\textit{examples/mini/mini.c}).
+
+The minimal example uses a kernel timer (software interrupt) to handle
+cyclic code. After the timer function is executed, it re-adds itself
+with a delay of one \textit{jiffy}\index{jiffies}, which results in a
+timer frequency of \textit{HZ}\nomenclature{HZ}{Kernel macro
+  containing the timer interrupt frequency}
+
+The module-global variables, needed to operate the master can be seen
+in listing~\ref{lst:minivar}.
+
+\begin{lstlisting}[language=C,numbers=left,caption={Minimal
+    variables},label=lst:minivar]
+  struct timer_list timer;
+
+  ec_master_t *master = NULL;
+  ec_domain_t *domain1 = NULL;
+
+  void *r_dig_in, *r_ana_out;
+
+  ec_pdo_reg_t domain1_pdos[] = {
+          {"1", Beckhoff_EL1014_Inputs, &r_dig_in},
+          {"2", Beckhoff_EL4132_Ouput1, &r_ana_out},
+          {}
+  };
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 1}] There is a timer object
+  declared, that is needed to tell the kernel to install a timer and
+  execute a certain function, if it runs out. This is done by a
+  variable of the \textit{timer\_list} structure.
+\item[\normalfont\textcircled{\tiny 3} -- \textcircled{\tiny 4}] There
+  is a pointer declared, that will later point to a requested EtherCAT
+  master.  Additionally there is a pointer to a domain object needed,
+  that will manage process data IO.
+\item[\normalfont\textcircled{\tiny 6}] The pointers \textit{r\_*}
+  will later point to the \underline{r}aw process data values inside
+  the domain memory. The addresses they point to will be set during a
+  call to \textit{ec\_\-master\_\-activate()}, that will create the
+  domain memory and configure the mapped process data image.
+\item[\normalfont\textcircled{\tiny 8} -- \textcircled{\tiny 12}] The
+  configuration of the mapping of certain PDOs in a domain can easily
+  be done with the help of an initialization array of the
+  \textit{ec\_pdo\_reg\_t} type, defined as part of the realtime
+  interface. Each record must contain the ASCII bus-address of the
+  slave (see section~\ref{sec:addr}), the slave's vendor ID and
+  product code, and the index and subindex of the PDO to map (these
+  four fields can be specified in junction, by using one of the
+  defines out of the \textit{include/ecdb.h} header). The last field
+  has to be the address of the process data pointer, so it can later
+  be redirected appropriately. Attention: The initialization array
+  must end with an empty record (\textit{\{\}})!
+\end{description}
+
+The initialization of the minimal realtime module is done by the
+``Minimal init function'' in listing~\ref{lst:miniinit}.
+
+\begin{lstlisting}[language=C,numbers=left,caption={Minimal init
+    function},label={lst:miniinit}]
+  int __init init_mini_module(void)
+  {
+          if (!(master = ecrt_request_master(0))) {
+                  goto out_return;
+          }
+
+          if (!(domain1 = ecrt_master_create_domain(master))) {
+                  goto out_release_master;
+          }
+
+          if (ecrt_domain_register_pdo_list(domain1,
+                                            domain1_pdos)) {
+                  goto out_release_master;
+          }
+
+          if (ecrt_master_activate(master)) {
+                  goto out_release_master;
+          }
+
+          ecrt_master_prepare(master);
+
+          init_timer(&timer);
+          timer.function = run;
+          timer.expires = jiffies + 10;
+          add_timer(&timer);
+
+          return 0;
+
+        out_release_master:
+          ecrt_release_master(master);
+        out_return:
+          return -1;
+  }
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 3}] It is tried to request the
+  first EtherCAT master (index 0). On success, the
+  \textit{ecrt\_\-request\_\-master()} function returns a pointer to
+  the reserved master, that can be used as an object to following
+  functions calls. On failure, the function returns \textit{NULL}.
+\item[\normalfont\textcircled{\tiny 7}] In order to exchange process
+  data, a domain object has to be created. The
+  \textit{ecrt\_\-master\_\-create\_domain()} function also returns a
+  pointer to the created domain, or \textit{NULL} in error case.
+\item[\normalfont\textcircled{\tiny 11}] The registration of domain
+  PDOs with an initialization array results in a single function call.
+  Alternatively the data fields could be registered with individual
+  calls of \textit{ecrt\_domain\_register\_pdo()}.
+\item[\normalfont\textcircled{\tiny 16}] After the configuration of
+  process data mapping, the master can be activated for cyclic
+  operation. This will configure all slaves and bring them into
+  \textit{OP} state.
+\item[\normalfont\textcircled{\tiny 20}] This call is needed to avoid
+  a case differentiation in cyclic operation: The first operation in
+  cyclic mode is a receive call. Due to the fact, that there is
+  nothing to receive during the first cycle, there had to be an
+  \textit{if}-statement to avoid a warning. A call to
+  \textit{ec\_master\_prepare()} sends a first datagram containing a
+  process data exchange datagram, so that the first receive call will
+  not fail.
+\item[\normalfont\textcircled{\tiny 22} -- \textcircled{\tiny 25}] The
+  master is now ready for cyclic operation. The kernel timer that
+  cyclically executes the \textit{run()} function is initialized and
+  started.
+\end{description}
+
+The coding of a cleanup function fo the minimal module can be seen in
+listing~\ref{lst:miniclean}.
+
+\begin{lstlisting}[language=C,numbers=left,caption={Minimal cleanup
+    function},label={lst:miniclean}]
+  void __exit cleanup_mini_module(void)
+  {
+          del_timer_sync(&timer);
+          ecrt_master_deactivate(master);
+          ecrt_release_master(master);
+  }
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 3}] To cleanup the module, it it
+  necessary to stop the cyclic processing. This is done by a call to
+  \textit{del\_timer\_sync()} which safely removes a queued timer
+  object. It is assured, that no cyclic work will be done after this
+  call returns.
+\item[\normalfont\textcircled{\tiny 4}] This call deactivates the
+  master, which results in all slaves being brought to their
+  \textit{INIT} state again.
+\item[\normalfont\textcircled{\tiny 5}] This call releases the master,
+  removes any existing configuration and silently starts the idle
+  mode. The value of the master pointer is invalid after this call and
+  the module can be safely unloaded.
+\end{description}
+
+The final part of the minimal module is that for the cyclic work. Its
+coding can be seen in listing~\ref{lst:minirun}.
+
+\begin{lstlisting}[language=C,numbers=left,caption={Minimal cyclic
+    function},label={lst:minirun}]
+  void run(unsigned long data)
+  {
+          static uint8_t dig_in_0;
+
+          ecrt_master_receive(master);
+          ecrt_domain_process(domain1);
+
+          dig_in_0 = EC_READ_BIT(r_dig_in, 0);
+          EC_WRITE_S16(r_ana_out, dig_in_0 * 0x3FFF);
+
+          ecrt_master_run(master);
+          ecrt_master_send(master);
+
+          timer.expires += 1; // frequency = HZ
+          add_timer(&timer);
+  }
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 5}] The cyclic processing starts
+  with receiving datagrams, that were sent in the last cycle. The
+  frames containing these datagrams have to be received by the network
+  interface card prior to this call.
+\item[\normalfont\textcircled{\tiny 6}] The process data of domain 1
+  has been automatically copied into domain memory while datagram
+  reception. This call checks the working counter for changes and
+  re-queues the domain's datagram for sending.
+\item[\normalfont\textcircled{\tiny 8}] This is an example for reading
+  out a bit-oriented process data value (i.~e. bit 0) via the
+  \textit{EC\_READ\_BIT()} macro. See section~\ref{sec:macros} for
+  more information about those macros.
+\item[\normalfont\textcircled{\tiny 9}] This line shows how to write a
+  signed, 16-bit process data value. In this case, the slave is able
+  to output voltages of $-10$~V to $+10$~V with a resolution of 16
+  bit.  This write command outputs either $0$~V or $+5$~V, depending
+  of the value of \textit{dig\_in\_0}.
+\item[\normalfont\textcircled{\tiny 11}] This call runs the master's
+  operation state machine (see section~\ref{sec:fsm-op}). A single
+  state is processed, and datagrams are queued. Mainly bus observation
+  is done: The bus state is determined and in case of slaves that lost
+  their configuration, reconfiguration is tried.
+\item[\normalfont\textcircled{\tiny 12}] This method sends all queued
+  datagrams, in this case the domain's datagram and one of the master
+  state machine. In best case, all datagrams fit into one frame.
+\item[\normalfont\textcircled{\tiny 14} -- \textcircled{\tiny 15}]
+  Kernel timers are implemented as ``one-shot'' timers, so they have
+  to be re-added after each execution. The time of the next execution
+  is specified in \textit{jiffies} and will happen at the time of the
+  next system timer interrupt. This results in the \textit{run()}
+  function being executed with a frequency of \textit{HZ}.
+\end{description}
+
+%------------------------------------------------------------------------------
+
+\section{An RTAI Example Module}
+\label{sec:rtai}
+\index{Examples!RTAI}
+
+The whole code can be seen in the EtherCAT master code release
+(see~\cite{etherlab}, file \textit{examples/rtai/rtai\_sample.c}).
+
+Listing~\ref{lst:rtaivar} shows the defines and global variables
+needed for a minimal RTAI module with EtherCAT processing.
+
+\begin{lstlisting}[language=C,numbers=left,caption={RTAI task
+    declaration},label={lst:rtaivar}]
+  #define FREQUENCY 10000
+  #define TIMERTICKS (1000000000 / FREQUENCY)
+
+  RT_TASK task;
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 1} -- \textcircled{\tiny 2}] RTAI
+  takes the cycle period as nanoseconds, so the easiest way is to
+  define a frequency and convert it to a cycle time in nanoseconds.
+\item[\normalfont\textcircled{\tiny 4}] The \textit{task} variable
+  later contains information about the running RTAI task.
+\end{description}
+
+Listing~\ref{lst:rtaiinit} shows the module init function for the RTAI
+module. Most lines are the same as in listing~\ref{lst:miniinit},
+differences come up when starting the cyclic code.
+
+\begin{lstlisting}[language=C,numbers=left,caption={RTAI module init
+    function},label={lst:rtaiinit}]
+  int __init init_mod(void)
+  {
+          RTIME requested_ticks, tick_period, now;
+
+          if (!(master = ecrt_request_master(0))) {
+                  goto out_return;
+          }
+
+          if (!(domain1 = ecrt_master_create_domain(master))) {
+                  goto out_release_master;
+          }
+
+          if (ecrt_domain_register_pdo_list(domain1,
+                                            domain1_pdos)) {
+                  goto out_release_master;
+          }
+
+          if (ecrt_master_activate(master)) {
+                  goto out_release_master;
+          }
+
+          ecrt_master_prepare(master);
+
+          requested_ticks = nano2count(TIMERTICKS);
+          tick_period = start_rt_timer(requested_ticks);
+
+          if (rt_task_init(&task, run, 0, 2000, 0, 1, NULL)) {
+                  goto out_stop_timer;
+          }
+
+          now = rt_get_time();
+          if (rt_task_make_periodic(&task, now + tick_period,
+                                    tick_period)) {
+                  goto out_stop_task;
+          }
+
+          return 0;
+
+      out_stop_task:
+          rt_task_delete(&task);
+      out_stop_timer:
+          stop_rt_timer();
+      out_deactivate:
+          ecrt_master_deactivate(master);
+      out_release_master:
+          ecrt_release_master(master);
+      out_return:
+          return -1;
+  }
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 24} -- \textcircled{\tiny 25}] The
+  nanoseconds are converted to RTAI timer ticks and an RTAI timer is
+  started.  \textit{tick\_period} will be the ``real'' number of ticks
+  used for the timer period (which can be different to the requested
+  one).
+\item[\normalfont\textcircled{\tiny 27}] The RTAI task is initialized
+  by specifying the cyclic function, the parameter to hand over, the
+  stack size, priority, a flag that tells, if the function will use
+  floating point operations and a signal handler.
+\item[\normalfont\textcircled{\tiny 32}] The task is made periodic by
+  specifying a start time and a period.
+\end{description}
+
+The cleanup function of the RTAI module in listing~\ref{lst:rtaiclean}
+is nearly as simple as that of the minimal module.
+
+\begin{lstlisting}[language=C,numbers=left,caption={RTAI module
+    cleanup function},label={lst:rtaiclean}]
+  void __exit cleanup_mod(void)
+  {
+          rt_task_delete(&task);
+          stop_rt_timer();
+          ecrt_master_deactivate(master);
+          ecrt_release_master(master);
+          rt_sem_delete(&master_sem);
+  }
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 2}] The RTAI task will be stopped
+  and deleted.
+\item[\normalfont\textcircled{\tiny 3}] After that, the RTAI timer can
+  be stopped.
+\end{description}
+
+The rest is the same as for the minimal module.
+
+Worth to mention is, that the cyclic function of the RTAI module
+(listing~\ref{lst:rtairun}) has a slightly different architecture. The
+function is not executed until returning for every cycle, but has an
+infinite loop in it, that is placed in a waiting state for the rest of
+each cycle.
+
+\begin{lstlisting}[language=C,numbers=left,caption={RTAI module cyclic
+    function},label={lst:rtairun}]
+  void run(long data)
+  {
+          while (1) {
+                  ecrt_master_receive(master);
+                  ecrt_domain_process(domain1);
+
+                  k_pos = EC_READ_U32(r_ssi_input);
+
+                  ecrt_master_run(master);
+                  ecrt_master_send(master);
+
+                  rt_task_wait_period();
+          }
+  }
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 3}] The \textit{while (1)} loop
+  executes for the lifetime of the RTAI task.
+\item[\normalfont\textcircled{\tiny 12}] The
+  \textit{rt\_task\_wait\_period()} function sets the process into a
+  sleeping state until the beginning of the next cycle. It also
+  checks, if the cyclic function has to be terminated.
+\end{description}
+
+%------------------------------------------------------------------------------
+
+\section{Concurrency Example}
+\label{sec:concurrency}
+\index{Examples!Concurrency}
+
+As mentioned before, there can be concurrent access to the EtherCAT
+master. The realtime module and a EoE\index{EoE} process can compete
+for master access, for example. In this case, the module has to
+provide the locking mechanism, because it depends on the module's
+architecture which lock has to be used. The module makes this locking
+mechanism available to the master through the master's locking
+callbacks.
+
+In case of RTAI, the lock can be an RTAI semaphore, as shown in
+listing~\ref{lst:convar}. A normal linux semaphore would not be
+appropriate, because it could not block the RTAI task due to RTAI
+running in a higher domain than the linux kernel (see~\cite{rtai}).
+
+\begin{lstlisting}[language=C,numbers=left,caption={RTAI semaphore for
+    concurrent access},label={lst:convar}]
+  SEM master_sem;
+\end{lstlisting}
+
+The module has to implement the two callbacks for requesting and
+releasing the master lock. An exemplary coding can be seen in
+listing~\ref{lst:conlock}.
+
+\begin{lstlisting}[language=C,numbers=left,caption={RTAI locking
+    callbacks for concurrent access},label={lst:conlock}]
+  int request_lock(void *data)
+  {
+          rt_sem_wait(&master_sem);
+          return 0;
+  }
+
+  void release_lock(void *data)
+  {
+          rt_sem_signal(&master_sem);
+  }
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 1}] The \textit{request\_lock()}
+  function has a data parameter. The master always passes the value,
+  that was specified when registering the callback function. This can
+  be used for handing the master pointer. Notice, that it has an
+  integer return value (see line 4).
+\item[\normalfont\textcircled{\tiny 3}] The call to
+  \textit{rt\_sem\_wait()} either returns at once, when the semaphore
+  was free, or blocks until the semaphore is freed again. In any case,
+  the semaphore finally is reserved for the process calling the
+  request function.
+\item[\normalfont\textcircled{\tiny 4}] When the lock was requested
+  successfully, the function should return 0. The module can prohibit
+  requesting the lock by returning non-zero (see paragraph ``Tuning
+  the jitter'' below).
+\item[\normalfont\textcircled{\tiny 7}] The \textit{release\_lock()}
+  function gets the same argument passed, but has a void return value,
+  because is always succeeds.
+\item[\normalfont\textcircled{\tiny 9}] The \textit{rt\_sem\_signal()}
+  function frees the semaphore, that was prior reserved with
+  \textit{rt\_sem\_wait()}.
+\end{description}
+
+In the module's init function, the semaphore must be initialized, and
+the callbacks must be passed to the EtherCAT master:
+
+\begin{lstlisting}[language=C,numbers=left,caption={Module init
+    function for concurrent access},label={lst:coninit}]
+  int __init init_mod(void)
+  {
+          RTIME tick_period, requested_ticks, now;
+
+          rt_sem_init(&master_sem, 1);
+
+          if (!(master = ecrt_request_master(0))) {
+                  goto out_return;
+          }
+
+          ecrt_master_callbacks(master, request_lock,
+                                release_lock, NULL);
+          // ...
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 5}] The call to
+  \textit{rt\_sem\_init()} initializes the semaphore and sets its
+  value to 1, meaning that only one process can reserve the semaphore
+  without blocking.
+\item[\normalfont\textcircled{\tiny 11}] The callbacks are passed to
+  the master with a call to \textit{ecrt\_master\_callbacks()}. The
+  last parameter is the argument, that the master should pass with
+  each call to a callback function. Here it is not used and set to
+  \textit{NULL}.
+\end{description}
+
+For the cyclic function being only one competitor for master access,
+it has to request the lock like any other process. There is no need to
+use the callbacks (which are meant for processes of lower priority),
+so it can access the semaphore directly:
+
+\begin{lstlisting}[language=C,numbers=left,caption={RTAI cyclic
+    function for concurrent access},label={lst:conrun}]
+  void run(long data)
+  {
+          while (1) {
+                  rt_sem_wait(&master_sem);
+
+                  ecrt_master_receive(master);
+                  ecrt_domain_process(domain1);
+
+                  k_pos = EC_READ_U32(r_ssi_input);
+
+                  ecrt_master_run(master);
+                  ecrt_master_send(master);
+
+                  rt_sem_signal(&master_sem);
+                  rt_task_wait_period();
+          }
+  }
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 4}] Every access to the master has
+  to be preceeded by a call to \textit{rt\_sem\_wait()}, because
+  another instance might currently access the master.
+\item[\normalfont\textcircled{\tiny 14}] When cyclic processing
+  finished, the semaphore has to be freed again, so that other
+  processes have the possibility to access the master.
+\end{description}
+
+A little change has to be made to the cleanup function in case of
+concurrent master access.
+
+\begin{lstlisting}[language=C,numbers=left,caption={RTAI module
+    cleanup function for concurrent access},label={lst:conclean}]
+  void __exit cleanup_mod(void)
+  {
+          rt_task_delete(&task);
+          stop_rt_timer();
+          ecrt_master_deactivate(master);
+          ecrt_release_master(master);
+          rt_sem_delete(&master_sem);
+  }
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 7}] Upon module cleanup, the
+  semaphore has to be deleted, so that memory can be freed.
+\end{description}
+
+\paragraph{Tuning the Jitter}
+\index{Jitter}
+
+Concurrent access leads to higher jitter of the realtime process,
+because there are situations, in which the realtime process has to
+wait for a process of lower priority to finish accessing the master.
+In most cases this is acceptable, because a master access cycle
+(receive/process/send) only takes $10$~\textmu s to $20$~\textmu s on
+recent systems, what would be the maximum additional jitter. However
+some applications demand a minimum jitter. For this reason the master
+access can be prohibited by the realtime module: If the time, another
+process wants to access the master, is to close to the beginning of
+the next realtime cycle, the module can disallow, that the lock is
+taken. In this case, the request callback has to return $1$, meaning
+that the lock has not been taken. The foreign process must abort its
+master access and try again next time.
+
+This measure helps to significantly reducing the jitter produced by
+concurrent master access. Below are exerpts of an example coding:
+
+\begin{lstlisting}[language=C,numbers=left,caption={Variables for
+    jitter reduction},label={lst:redvar}]
+  #define FREQUENCY 10000 // RTAI task frequency in Hz
+  // ...
+  cycles_t t_last_cycle = 0;
+  const cycles_t t_critical = cpu_khz * 1000 / FREQUENCY
+                              - cpu_khz * 30 / 1000;
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 3}] The variable
+  \textit{t\_last\_cycle} holds the timer ticks at the beginning of
+  the last realtime cycle.
+\item[\normalfont\textcircled{\tiny 4}] \textit{t\_critical} contains
+  the number of ticks, that may have passed since the beginning of the
+  last cycle, until there is no more foreign access possible. It is
+  calculated by substracting the ticks for $30$~\textmu s from the
+  ticks for a complete cycle.
+\end{description}
+
+\begin{lstlisting}[language=C,numbers=left,caption={Cyclic function
+    with reduced jitter},label={lst:redrun}]
+  void run(long data)
+  {
+          while (1) {
+                  t_last_cycle = get_cycles();
+                  rt_sem_wait(&master_sem);
+                  // ...
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 4}] The ticks of the beginning of
+  the current realtime cycle are taken before reserving the semaphore.
+\end{description}
+
+\begin{lstlisting}[language=C,numbers=left,caption={Request callback
+    for reduced jitter},label={lst:redreq}]
+  int request_lock(void *data)
+  {
+          // too close to the next RT cycle: deny access.
+          if (get_cycles() - t_last_cycle > t_critical)
+                  return -1;
+
+          // allow access
+          rt_sem_wait(&master_sem);
+          return 0;
+  }
+\end{lstlisting}
+
+\begin{description}
+\item[\normalfont\textcircled{\tiny 4}] If the time of request is too
+  close to the next realtime cycle (here: \textless~$30$~\textmu s
+  before the estimated beginning), the locking is denied. The
+  requesting process must abort its cycle.
+\end{description}
+
+%------------------------------------------------------------------------------
+
+\begin{thebibliography}{99}
+\bibitem{etherlab} Ingenieurgemeinschaft IgH: EtherLab -- Open Source
+  Toolkit for rapid realtime code generation under Linux with
+  Simulink/RTW and EtherCAT technology. URL: http://etherlab.org,
+  July~31, 2006.
+\bibitem{dlspec} IEC 61158-4-12: Data-link Protocol Specification.
+  International Electrotechnical Comission (IEC), 2005.
+\bibitem{alspec} IEC 61158-6-12: Application Layer Protocol
+  Specification. International Electrotechnical Comission (IEC), 2005.
+\bibitem{gpl} GNU General Public License, Version 2. URL:
+  http://www.gnu.org/licenses/gpl.txt. August~9, 2006.
+\bibitem{lsb} Linux Standard Base. URL:
+  http://www.freestandards.org/en/LSB. August~9, 2006.
+\bibitem{wireshark} Wireshark. URL: http://www.wireshark.org.
+  August~9, 2006.
+\bibitem{automata} {\it Hopcroft, J.~E. / Ullman, J.~D.}: Introduction
+  to Automata Theory, Languages and Computation. Adison-Wesley,
+  Reading, Mass.~1979.
+\bibitem{fsmmis} {\it Wagner, F. / Wolstenholme, P.}: State machine
+  misunderstandings. In: IEE journal ``Computing and Control
+  Engineering'', 2004.
+\bibitem{rtai} RTAI. The RealTime Application Interface for Linux from
+  DIAPM. URL: http://www.rtai.org, 2006.
+\end{thebibliography}
+
+\printglossary
+\addcontentsline{toc}{chapter}{\nomname}
+\markleft{\nomname}
+
+\printindex
+\markleft{Index}
+
+%------------------------------------------------------------------------------
+
+\end{document}
+
+%------------------------------------------------------------------------------
diff --git a/doc/images/ethercat.eps b/doc/images/ethercat.eps
new file mode 100644
index 00000000..964cb183
--- /dev/null
+++ b/doc/images/ethercat.eps
@@ -0,0 +1,1617 @@
+%!PS-Adobe-2.0 EPSF-1.2
+%%Title: E_CAT_4c_oT.FH10
+%%Creator: FreeHand 10.0
+%%CreationDate: Sat Nov 22 16:59:04 2003 
+%%BoundingBox: 0 0 364 83
+%%FHPathName:\\Nt-data01\dfs\Marketingcom\Sonstiges\EtherCAT_Marketing\gespeert\logo\ethercat\E_CAT_4c_oT.FH10
+%ALDOriginalFile:\\Nt-data01\dfs\Marketingcom\Sonstiges\EtherCAT_Marketing\gespeert\logo\ethercat\E_CAT_4c_oT.FH10
+%ALDBoundingBox: -104 -400 491 442
+%%FHPageNum:1
+%%DocumentSuppliedResources: procset Altsys_header 4 0
+%%ColorUsage: Color
+%%DocumentProcessColors: Cyan Magenta Yellow Black
+%%CMYKProcessColor: 0 1 1 0 (Rot)
+%%EndComments
+%%BeginAGDEmbeddedDoc: version 1.0
+%:s8W,W5t==#^::et!!!KAGQG3TH$g;p(4MY[WQDsgNY!=r^aZD&
+%:s8VO$KL?VQ6b!2+5saRn)j:7OYQQ_4^uR0S&;4U[<,dt=$+PSiMActI_&k-sJ,fX#Elaq>jA;1K,)YB2XtJDr^$\L=3oa$8f^8K/IpMNDpZg;0fA0HWj<,h0,WB;^Gm^?t.QJmW;E:bW!!.Jh=6AC3MGe*h9ql?d:AH^KF<H%PTljcO!mrkCL,p#B_k:"[?`%Lt8*d6`a/l-1lhK"ST]Z3;980;R5<erq,U=Rc*2Y>Rqh`K-7=li;
+%:e-HXu+DNkbLg8r#iDY4[XCpb.E5d7.O`8EDU,e3&n(:g'KWha7,DKVBT%P7X:Ln+F(#<ni?*1#?&2f**;#E]ALPpZe\-dr7\l=aU;ZdB)L=AbA!R$8:PASmE^e^`LGZRmFDD4UgPkls%6I-IYH9g6X%(21$WSC<MAS>3YQ%-+l%YT+,3uRtrFOK[5C\hs8Gi>$+FNoi=cti&I/MnlGs&T4U1.MaR#6]5f7P./OXfABQL*eLs)G+fE
+%:NhR+1B-KD]rbXAHlga^<8TRh0<caefp1ADLFR799no$J-pP4#n2u!20flsddnE>+:'mJKL9k+TbW6uMB6*=LMdFpY"e<5BX9k+Tj]5F9;:3(3BUVD09Lfsa*N\NV,8$6\kHYOc1R7G9DZD.@W%&q!4.\@[Cj9Vnk<TT.5SX*kUcAlKLHYXk,XZ(lK8#\(+[GN:3`Mr.qK=*hjT&O1UnAg(b>8)meVA+lB??9k4)o,%YW>I:L'(fKs
+%:*4u\tiSG`;FC6,P;S!!kH"\TE%#p*gg#V)QOUf9['Q(.eG$p<4>bMdlgZo)-%ul?>XL&2@fJadF?QE&u&3&lN]GfHnDDRC6MuZiC"o7G/`L,=Z55csZ]9R%abB7$h7Yet"&Y`7&3`7OYL0@G:h$0M;%8&9skP**>.dW_laj#Tm]V8&KJ/)o5_U9O%QU-`'X,3c4[1P5j-'3jZInUD5DJo)\,5t"ZAY;@oW<Bi;Grsh*G&OgS/p4)-
+%:"S#[8QqF<J=Mf\$Q4e2^dt+!re3S3LW=sD3/gX[joKqK(DQ.]"O$&e]'OY1VDcr5@6le]4X[>1,]#[P<B)P9O/c\Pk?=Sgrm8d[A04plr/2JN_M'h5C<rY_HV<9ell<T]VSTo#]_=T.JZI+Cs`XDU3RH<s0/I)Fo'^"RREMJ1hbJC@sSI^;4R[!6^/BlAt)E_0]9IB$npYahrm\N*46^(kG6.Aus"MPu3mSC/c%[MS%!i(QBq4-`Q
+%:#.napr3E?XFO#n?%3E5T*Eg,1Ngcu8j:TOd9MIT1;H6C?[\K]L[q#kX62&;\N2NQ/rIJp;&0<>WY;0%sFIue7-8%tc>*)r]qm_\;ZtGgJ9hO724N<U#6)gn,S5D4c-J6_=:8i)?F$]Vpp)W@]dB^AK'N;bTa="h-OL'`RIY'V4e^g=Oec)g\WQj2;$LS2sOHE`tT7<1g(a#c$Q8MMEJi`*N;e;AFe[>Kue[W<Q:MT4;_//VCf@90u
+%:=\[Ds8,K90hHM=/HF=&';es)cVN/,L.9M%9Lu@H1Q!3KHcZHQIV*m%U4-e#<DS-mk0)r8S.e>JoPomG5j[NBOT-deU&`^%`rp&9UV:)OL"mXkr%^j217e"[BWu7=O4m9KRkd)tZ1OJ9l^:tj2q<FHU6iBP\=PSj%o]fZ?Lm130IWVT,,>7FFe?N'r&B]`$S[c"sg3;Ir4#1r`n9q!HaOD$.[u3Nk1A1U#2heO\;jTgg;3e2NMuXHO
+%:g6&A0%m;J.%K5qV8SQWQ#+#8KNXo0'0%<l;Or)hLW#I;saqpI,?hC!PRW7/D9V$L&>UUP3elG#;;eZ@MI%8g]`1N0@4DmCp8<%SHa7)8ph)4?t<?>:LNBN#%;7i0kF,"d`nXA/P>?>t9fM&Nmi<tUGQ*dNng>=/[Y^BeR?.MuobR5W#TPfZVgnk64F`H@iTe*,OZA@8BTVfH;H<M^)16n4c<O'W"RUSWX=cfVk=b.d&Tr-IVm6Ee>
+%:VC\YTZA8rn:fI60?5#q@ff6t0:%!=1D%BE@*G94)luoco,AV:LFp&&N*mQ^op.*a!ZCc+GUPEAb)d:5rCW0Zrk#H/C`"kEiF_dsX-lZo9pWa.E`I^c@$9PCmA4''3n!#&]"dt60T:f:s6VVu,YuE+ZC4e(s[OeAVbN%Iqb(<=+s8<&=+rb:^C</i;/BAM1MFBGq'C,iZ7Uk2p&o5#sH6;oZ!bt*25/?iU:c?hQZ#=5G'oeiuQ]l6D
+%:pGf(jr=+Za78g'&gq#gk7+5sAef'edVN*<V9CVS[EOr5#*ceDm6)MXS>:1U6C?f>9A#Z3me,:<>NKfi\<Yq,#X<*<=,<.Nc%jPj!8D'T\T%]qD*]p:Fj,n)BKgM,oi\"G3;g_M!AO31QFtBqmT4+\sJdS8mR)T^R5rGig9X'-!S@uD26_4,.;,]t#m1N%OR<O,@DAVGpQL<&"=t;T.f?)HX;"";*e`$#jJuAY9(>RC812@W8TV</I
+%:%]aG>dM1;FS:9I37W*#8CX9%%LV?hGhonsPa+()36D[IUH]"QJC_LH(4figVELdP6h<7\I;NIj;6N[I4G?nWf/PjM7kniAdcZ*7a'.bM3A/q$D95$"p2G>+hl(Fs^(=-$Z:WV=f0YEOJ3'9jqKs_OEY.KUS[2t`?U:<*+hjA$/kB3#LIEt."NRCoIc1'ao(mYp7_J3h*9@A09BcfoG)fj\kr`(,+%5i:(h,LAJn`0NN*6"2PFYnf[
+%:J$%#!=f%F]N>#RmT6ZBsoup>Re_,m$[H^;a3r@u)?.K^&5$)/tp<tcg!HqsKR5u;?<@rYY=e4I@X=fDMX.L2COY7&!Th&Gt>GW,2,#e)']7d3(g_T21f]RoS1cW]!%IO?Dap>Jeo#DY`3+a?FdV'PWELquO%8Y=?#/L.['!>u0g:'dnM$rXC,,d?-%#_2^DJB*.gACPe/fQ"MY*O>`L!ggoBb$JtM@!Xkp7-M-E:<chK&u*..E=F<
+%:U,?M].Y"Fm.iQSP`g0(3SX)09`,/Z(D\hGj].GT%@L4"?C9]*WQ%a+_UUJG^>IU9&G0g.Y-jqf\da:UjaG*C-6nB-A2In<2\NHR%aAd9/.CFNMV.ttBT;d"K<f]T]>;BCLH.siO54YN-^55WVe5dShml!j^`B4nbf[;1S61-L,2Y7Y?-fmqLU+B/_MY3+!(CX[0MB,SjYf4+&N(c\>>$mPq)1lF<)7XTaJ_&O^2T!G@)-Ip"(a%(b
+%:<8?Uh7>hbcV$q4U54O@6)-^+(ZO2UMQtQeu[XNSJeNESf@&pmQ(n%rm4$]l'Q:8P=jaC37CTW4d^UUd3,ARCLC>.udd:,L\.75&`Pl;:nJrP=dH5PBX;t0HL^*DQJ.R]8b%?_p(/2pb.`,I2@KjYibDk@HXZY^TiOG,l/d)H^D:Tn(!0#X4[/M/1jb:$]p<c31M(;CXGEGfpc$<),t<5moq6<TDLnAKYfMeo>kD4*$_AO30pOJ.4B
+%:ZKEYPfhbU`O=:Qh&uQnYUJHR26hDFnT&`?/d:5RX-EaE^SqVEC@U[.n2&W\kA)1+r)mst]cC06[fs2Jp]u`c+ktYuS/Zp/!YHZZgDth1H.P+>]04]VJSEc\PQr7&QiV0,f`qBF_DsN,.ZXfP]o>$2i1NLtQVoQ'n_Gc5NHL]X2A]2$E\OY-j>Hf^;JKlk7k$hNb3V2<FJsd;/`5^@>7H!P]AS`qUHNs%c$Lg@nd>@'b-EoSZ$k>1M
+%:TgQU]L=qA^'/N%9,,U`0BZfM+jb8;HLa<0q`+lWc$0[2t8rqq9:/?C#@Hpj[HA7b#EQ-H&Q8P,>U%oN3A)hV_4\?)99'4P8gWk638OTQ*]t"f6ZJ@Np]o*4)F0eAI\Yg/Z7ZI"`YgCn/cEQqtmZadjmTT;Uk/0N3MAG1D<db*-\3I["d%)9-?K0c.k]>uk.ip@HWg`\'agRP)SVmqjj!@4Y],*.*7fQt25ifMQ>+9)J[olYr_7\pT
+%:4'JYE,K56g2l][0YS1/fTOUC5nINWi2l8#""3huBr<;"_9M;Cdac25,10TPW4cN*^3Qsk:I!Wd)1#FYpj=;=B-r-d(`'(50;-&F`JA]3D*GM7_&nV-o7gV=/fD)o`$Tt<2nDuD6B*rqj-.n-5%pJ;<A^h_dD#b:#acRe"4`GpZDa$NP8AGfp*9`3)R#lYl1P=6c2c"N9;%%&3c.s5@"26`cjlL.:?i\DWk4+`,[JCq,]D5ZTK=D`X
+%:JUBB&?`QOKihJ9bq0e0A-?.9tZ"]@g;rq?b68ll0X1T!%E"D*mAY`#@GIqqKAe99SKIq'PhGdXBJ.:[0r%b($VsLdlS71+dI)1f_jC^=;nPn<:]s.I(Lc]N3[TSA_%!F.J@B6C=[RUP[S-hgmr7G0]5'HRMI%\RLK76$qEe?[!1&0!BS2)8DHmC[#/28;.Z#eNmY+7X$G%;Cd2r%<?2j3'SLPqn]-RU8f,^8M$-+RfhV"Vnb3t"^5
+%:AiVTV;jRtcSWe;Ek2Ig.Xeb.EDnm1Q7='gAd`_7i]h5-.Nn2Y`g;qss.mGPTo=!ceGT3&<[";VZf1!jNTGoc$laiF7CF()-/H^Qi-^E1uO!krmGUK^=r`mGTE!K-$WI)Nqk'=K\HGcZsn6^oZ)AW;u!VueW7VQ[M@:F%a!!0W26tp.Q!!0K-;fm%oDJ&qM*`-EgF)Y]#FD5o07ri<S!!*'oE)0qXARff^!:ro`FE2)5B)hqs]FInU
+%:9h]8BF8u=&9gi]*F8u@<6t(1K<,$2\!!%U?847B+87c4?AT@bN2aV>!@qu&EH:;X]D.RU,!!0`59lNm;C&e5B5t==4Df0Xs!KL,f@T6cFCh3SIo2BpO@W-'VBju*kEd7Wc;,D:OE(k=p!!,ejEc5H!A9Dp(!!#YZDes?42?3aE9ho,6AH2_Y9PJQi!!()6Bl7KY@<;JLG"$4YD+nYbF8u;b7;QOP:i^Jn9QP:U!/sB]B6A6+=KjnY
+%:!!.XLFEq\6:i^Jn9QP:U!I[mcDfe?bCi=>P!!"Z=@<6-m9PJBU!!"W<@<6-m7VQ[T!!'#hF_PAtErZ5$:gnHZ!!#SXDes6$@ruX0!!'`,@<lF)!!"?3EcQ)B:gnHZ!!#tcDf'H3F(o`-:gnHZ!!&fbEc6)>!!!!!YQ;-4I0$_VI0$_VI0$_U9*!B?a8j9]a8j9]a8j9]a8j9]a8j9]dJtTo-3,@m-3,@m-3,@mdK-`VI0$_Vps8:@
+%:I0$_VI0$_VI0$_VI/q[qm/TcZG6$n/[/do@9)s/9l2\Nu9)s/9G6"WCl2e9m^&Ue+G6$n/[/do@9)s/9G6,)Om/ZMR0*(A?JH.;&G6'](G5s5qG6'](G5s5qG6'](G5ugf3<47(3<8=E;uh+C3<47(3<47(3<47'G6'](G6'](l2Xc`G6'](l2[U[G5ugeG6'](G6'](G6'](G6'](l2Xc`l2[U[l2[U[G6'](l2[U[l2e9mpsoN)
+%:^&ZR^[/fRpNW:[4[/^U9[/mo@JH4*um/ZDOm/ZDOG6$%l*WYI+q>p0f2ZW4FG6"WCm/V>1l2[U\]E%3sm/ZMS[/fRp[/fRp[/fRp[/fRoo)S.Xo)V\gm/ZDOJjsQbFCdjO@rGmh!<<*!rr<$!Hd6uF
+%:~>
+%%EndAGDEmbeddedDoc
+%%BeginResource: procset Altsys_header 4 0
+userdict begin /AltsysDict 300 dict def end
+AltsysDict begin
+/bdf{bind def}bind def
+/xdf{exch def}bdf
+/defed{where{pop true}{false}ifelse}bdf
+/ndf{1 index where{pop pop pop}{dup xcheck{bind}if def}ifelse}bdf
+/d{setdash}bdf
+/h{closepath}bdf
+/H{}bdf
+/J{setlinecap}bdf
+/j{setlinejoin}bdf
+/M{setmiterlimit}bdf
+/n{newpath}bdf
+/N{newpath}bdf
+/q{gsave}bdf
+/Q{grestore}bdf
+/w{setlinewidth}bdf
+/Xic{matrix invertmatrix concat}bdf
+/Xq{matrix currentmatrix mark}bdf
+/XQ{cleartomark setmatrix}bdf
+/sepdef{
+dup where not
+{
+AltsysSepDict
+}
+if	
+3 1 roll exch put
+}bdf
+/st{settransfer}bdf
+/colorimage defed /_rci xdf
+/cntr 0 def
+/readbinarystring{
+/cntr 0 def
+2 copy readstring
+{
+{
+dup
+(\034) search
+{
+length exch pop exch
+dup length 0 ne
+{
+dup dup 0 get  32 sub 0 exch put
+/cntr cntr 1 add def
+}
+{
+pop 1 string dup
+0 6 index read pop 32 sub put
+}ifelse
+3 copy
+putinterval pop
+1 add
+1 index length 1 sub
+1 index sub
+dup 0 le {pop pop exit}if
+getinterval
+}
+{
+pop exit
+} ifelse
+} loop
+}if
+cntr 0 gt
+{
+pop 2 copy
+dup length cntr sub cntr getinterval
+readbinarystring
+} if
+pop exch pop
+} bdf
+/_NXLevel2 defed {			
+_NXLevel2 not {			
+/colorimage where {
+userdict eq {
+/_rci false def		
+} if
+} if
+} if
+} if
+/md defed{	
+md type /dicttype eq {		
+/colorimage where {		
+md eq {				
+/_rci false def	
+}if
+}if
+/settransfer where {
+md eq {
+/st systemdict /settransfer get def
+}if
+}if
+}if
+}if
+/setstrokeadjust defed
+{
+true setstrokeadjust
+/C{curveto}bdf
+/L{lineto}bdf
+/m{moveto}bdf
+}
+{
+/dr{transform .25 sub round .25 add
+exch .25 sub round .25 add exch itransform}bdf
+/C{dr curveto}bdf
+/L{dr lineto}bdf
+/m{dr moveto}bdf
+/setstrokeadjust{pop}bdf	
+}ifelse
+/privrectpath {	
+4 -2 roll m
+dtransform round exch round exch idtransform	
+2 copy 0 lt exch 0 lt xor
+{dup 0 exch rlineto exch 0 rlineto neg 0 exch rlineto}
+{exch dup 0 rlineto exch 0 exch rlineto neg 0 rlineto}
+ifelse
+closepath
+}bdf
+/rectclip{newpath privrectpath clip newpath}def
+/rectfill{gsave newpath privrectpath fill grestore}def
+/rectstroke{gsave newpath privrectpath stroke grestore}def
+/_fonthacksave false def
+/currentpacking defed
+{
+/_bfh {/_fonthacksave currentpacking def false setpacking} bdf
+/_efh {_fonthacksave setpacking} bdf
+}
+{
+/_bfh {} bdf
+/_efh {} bdf
+}ifelse
+/packedarray{array astore readonly}ndf
+/`	
+{
+false setoverprint		
+/-save0- save def
+5 index concat
+pop
+storerect left bottom width height rectclip
+pop
+/MMdict_count countdictstack def
+/MMop_count count 1 sub def
+userdict begin
+/showpage {} def
+0 setgray 0 setlinecap 1 setlinewidth
+0 setlinejoin 10 setmiterlimit [] 0 setdash newpath
+} bdf
+/currentpacking defed{true setpacking}if
+/min{2 copy gt{exch}if pop}bdf
+/max{2 copy lt{exch}if pop}bdf
+/xformfont { currentfont exch makefont setfont } bdf
+/fhnumcolors 1
+statusdict begin
+/processcolors defed
+{
+pop processcolors
+}
+{
+/deviceinfo defed {
+deviceinfo /Colors known {
+pop deviceinfo /Colors get
+} if
+} if
+} ifelse
+end 
+def
+%	pix = x^2 + y^2
+/printerRes
+gsave
+matrix defaultmatrix setmatrix
+72 72 dtransform
+abs exch abs
+max
+grestore
+def
+/graycalcs
+[
+{Angle Frequency}			
+{GrayAngle GrayFrequency}	
+{0 Width Height matrix defaultmatrix idtransform
+dup mul exch dup mul add sqrt 72 exch div}	
+{0 GrayWidth GrayHeight matrix defaultmatrix idtransform
+dup mul exch dup mul add sqrt 72 exch div}	
+] def
+/calcgraysteps {
+forcemaxsteps
+{
+maxsteps
+}
+{
+/currenthalftone defed
+{currenthalftone /dicttype eq}{false}ifelse
+{
+currenthalftone begin
+HalftoneType 4 le
+{graycalcs HalftoneType 1 sub get exec}
+{
+HalftoneType 5 eq
+{
+Default begin
+{graycalcs HalftoneType 1 sub get exec}
+end
+}
+{0 60}	
+ifelse
+}
+ifelse
+end
+}
+{
+currentscreen pop exch			
+}
+ifelse
+printerRes 300 max exch div exch	
+2 copy								
+sin mul round dup mul				
+3 1 roll							
+cos mul round dup mul				
+add 1 add							
+dup maxsteps gt {pop maxsteps} if	
+dup minsteps lt {pop minsteps} if	
+}
+ifelse
+} bdf
+/nextrelease defed {						
+/languagelevel defed not {				
+/framebuffer defed {				
+0 40 string framebuffer 9 1 roll 8 {pop} repeat
+dup 516 eq exch 520 eq or
+{
+/fhnumcolors 3 def
+/currentscreen {60 0 {pop pop 1}}bdf
+/calcgraysteps {maxsteps} bdf
+}if
+}if
+}if
+}if
+fhnumcolors 1 ne {
+/calcgraysteps {maxsteps} bdf
+} if
+/currentpagedevice defed {
+currentpagedevice /PreRenderingEnhance known
+{
+currentpagedevice /PreRenderingEnhance get
+{
+/calcgraysteps
+{
+forcemaxsteps
+{maxsteps}
+{256 maxsteps min}
+ifelse
+} def
+} if
+} if
+} if
+/gradfrequency 144 def
+printerRes 1000 lt {
+/gradfrequency 72 def
+} if
+/adjnumsteps {
+dup dtransform abs exch abs max  
+printerRes div 					 
+gradfrequency mul 				 
+round 						 
+5 max						 
+min							 
+}bdf
+/goodsep {
+spots exch get 4 get dup sepname eq exch (_vc_Registration) eq or
+}bdf
+/BeginGradation defed
+{/bb{BeginGradation}bdf}
+{/bb{}bdf}
+ifelse
+/EndGradation defed
+{/eb{EndGradation}bdf}
+{/eb{}bdf}
+ifelse
+/bottom -0 def			
+/delta -0 def			
+/frac -0 def			
+/height -0 def			
+/left -0 def			
+/numsteps1 -0 def		
+/radius -0 def			
+/right -0 def			
+/top -0 def				
+/width -0 def			
+/xt -0 def				
+/yt -0 def				
+/df currentflat def		
+/tempstr 1 string def	
+/clipflatness currentflat def	
+/inverted?				
+0 currenttransfer exec .5 ge def
+/tc1 [0 0 0 1] def		
+/tc2 [0 0 0 1] def		
+/storerect{/top xdf /right xdf /bottom xdf /left xdf
+/width right left sub def /height top bottom sub def}bdf
+/concatprocs{
+systemdict /packedarray known
+{dup type /packedarraytype eq 2 index type /packedarraytype eq or}{false}ifelse
+{	
+/proc2 exch cvlit def	/proc1 exch cvlit def
+proc1 aload pop proc2 aload pop
+proc1 length proc2 length add packedarray cvx
+}
+{	
+/proc2 exch cvlit def	/proc1 exch cvlit def
+/newproc proc1 length proc2 length add array def
+newproc 0 proc1 putinterval newproc proc1 length proc2 putinterval
+newproc cvx
+}ifelse
+}bdf
+/i{dup 0 eq
+{pop df dup}	
+{dup} ifelse
+/clipflatness xdf setflat
+}bdf
+version cvr 38.0 le
+{/setrgbcolor{
+currenttransfer exec 3 1 roll
+currenttransfer exec 3 1 roll
+currenttransfer exec 3 1 roll
+setrgbcolor}bdf}if
+/vms {/vmsv save def} bdf
+/vmr {vmsv restore} bdf
+/vmrs{vmsv restore /vmsv save def}bdf
+/eomode{
+{/filler /eofill load def /clipper /eoclip load def}
+{/filler /fill load def /clipper /clip load def}
+ifelse
+}bdf
+/normtaper{}bdf
+/logtaper{9 mul 1 add log}bdf
+/CD{
+/NF exch def	
+{				
+exch dup	
+/FID ne 1 index/UniqueID ne and
+{exch NF 3 1 roll put}
+{pop pop}
+ifelse
+}forall
+NF
+}bdf
+/MN{
+1 index length 		
+/Len exch def
+dup length Len add 	
+string dup 			
+Len 				
+4 -1 roll 			
+putinterval 		
+dup 				
+0 					
+4 -1 roll			
+putinterval			
+}bdf
+/RC{4 -1 roll /ourvec xdf 256 string cvs(|______)anchorsearch
+{1 index MN cvn/NewN exch def cvn
+findfont dup maxlength dict CD dup/FontName NewN put dup
+/Encoding ourvec put NewN exch definefont pop}{pop}ifelse}bdf
+/RF{						
+dup 					
+FontDirectory exch 		
+known					
+{pop 3 -1 roll pop}		
+{RC}
+ifelse
+}bdf
+/FF{dup 256 string cvs(|______)exch MN cvn dup FontDirectory exch known
+{exch pop findfont 3 -1 roll pop}
+{pop dup findfont dup maxlength dict CD dup dup
+/Encoding exch /Encoding get 256 array copy 7 -1 roll
+{3 -1 roll dup 4 -2 roll put}forall put definefont}
+ifelse}bdf
+/RCJ{4 -1 roll 			
+/ourvec xdf  		
+256 string cvs 		
+(|______) anchorsearch
+{pop				
+cvn				
+dup FDFJ		
+exch	 		
+1 index 		
+eq				
+{
+_bfh findfont _efh		
+dup 					
+maxlength dict			
+CD						
+dup						
+/FontName 		
+3 index			
+put						
+dup						
+/Encoding ourvec put	
+1 index					
+exch 					
+definefont				
+pop						
+}
+{exch pop}		
+ifelse
+}
+{pop}				
+ifelse
+}bdf
+/RFJ{						
+dup 					
+FontDirectory exch 		
+known					
+{pop 3 -1 roll pop}		
+{RCJ}
+ifelse
+}bdf
+/hasfont
+{
+/resourcestatus where	
+{
+pop			
+/Font resourcestatus
+{			
+pop pop true
+}
+{			
+false
+}
+ifelse
+}
+{
+dup FontDirectory exch known
+{pop true}
+{
+256 string
+cvs
+(fonts/) exch MN
+status
+{pop pop pop pop true}
+{false}
+ifelse
+}
+ifelse
+}
+ifelse
+}bdf
+/FDFJ
+{
+dup			
+hasfont		
+not			
+{			
+pop
+/Ryumin-Light-83pv-RKSJ-H
+hasfont			
+{
+/Ryumin-Light-83pv-RKSJ-H
+}
+{
+/Courier
+}
+ifelse			
+}
+if
+}bdf
+/FFJ{
+_bfh
+dup					
+256 string cvs		
+(|______)exch MN	
+cvn					
+dup					
+FontDirectory
+exch known			
+{					
+exch				
+pop					
+findfont			
+3 -1 roll			
+pop					
+}
+{					
+pop					
+FDFJ				
+dup findfont		
+dup maxlength dict	
+CD 					
+dup dup				
+/Encoding exch		
+/Encoding get		
+256 array copy		
+7 -1 roll 			
+{					
+3 -1 roll		
+dup				
+4 -2 roll		
+put				
+}forall
+put 				
+definefont			
+}
+ifelse
+_efh
+}bdf
+/GS {
+dup
+hasfont
+{
+findfont
+exch makesetfont
+exch
+pop
+ts
+}
+{
+pop pop pop
+ts
+} ifelse
+} bdf
+/RCK{4 -1 roll 			
+/ourvec xdf  		
+256 string cvs 		
+(|______) anchorsearch
+{pop				
+cvn				
+dup FDFK		
+exch	 		
+1 index 		
+eq				
+{
+_bfh findfont _efh		
+dup 					
+maxlength dict			
+CD						
+dup						
+/FontName 		
+3 index			
+put						
+dup						
+/Encoding ourvec put	
+1 index					
+exch 					
+definefont				
+pop						
+}
+{exch pop}		
+ifelse
+}
+{pop}				
+ifelse
+}bdf
+/RFK{						
+dup 					
+FontDirectory exch 		
+known					
+{pop 3 -1 roll pop}		
+{RCK}
+ifelse
+}bdf
+/hasfont
+{
+/resourcestatus where	
+{
+pop			
+/Font resourcestatus
+{			
+pop pop true
+}
+{			
+false
+}
+ifelse
+}
+{
+dup FontDirectory exch known
+{pop true}
+{
+256 string
+cvs
+(fonts/) exch MN
+status
+{pop pop pop pop true}
+{false}
+ifelse
+}
+ifelse
+}
+ifelse
+}bdf
+/FDFK
+{
+dup			
+hasfont		
+not			
+{			
+pop
+/JCsm
+hasfont			
+{
+/JCsm
+}
+{
+/Courier
+}
+ifelse			
+}
+if
+}bdf
+/FFK{
+_bfh
+dup					
+256 string cvs		
+(|______)exch MN	
+cvn					
+dup					
+FontDirectory
+exch known			
+{					
+exch				
+pop					
+findfont			
+3 -1 roll			
+pop					
+}
+{					
+pop					
+FDFK				
+dup findfont		
+dup maxlength dict	
+CD 					
+dup dup				
+/Encoding exch		
+/Encoding get		
+256 array copy		
+7 -1 roll 			
+{					
+3 -1 roll		
+dup				
+4 -2 roll		
+put				
+}forall
+put 				
+definefont			
+}
+ifelse
+_efh
+}bdf
+/RCTC{4 -1 roll 			
+/ourvec xdf  		
+256 string cvs 		
+(|______) anchorsearch
+{pop				
+cvn				
+dup FDFTC		
+exch	 		
+1 index 		
+eq				
+{
+_bfh findfont _efh		
+dup 					
+maxlength dict			
+CD						
+dup						
+/FontName 		
+3 index			
+put						
+dup						
+/Encoding ourvec put	
+1 index					
+exch 					
+definefont				
+pop						
+}
+{exch pop}		
+ifelse
+}
+{pop}				
+ifelse
+}bdf
+/RFTC{						
+dup 					
+FontDirectory exch 		
+known					
+{pop 3 -1 roll pop}		
+{RCTC}
+ifelse
+}bdf
+/FDFTC
+{
+dup			
+hasfont		
+not			
+{			
+pop
+/DFMing-Lt-HK-BF
+hasfont			
+{
+/DFMing-Lt-HK-BF
+}
+{
+/Courier
+}
+ifelse			
+}
+if
+}bdf
+/FFTC{
+_bfh
+dup					
+256 string cvs		
+(|______)exch MN	
+cvn					
+dup					
+FontDirectory
+exch known			
+{					
+exch				
+pop					
+findfont			
+3 -1 roll			
+pop					
+}
+{					
+pop					
+FDFTC				
+dup findfont		
+dup maxlength dict	
+CD 					
+dup dup				
+/Encoding exch		
+/Encoding get		
+256 array copy		
+7 -1 roll 			
+{					
+3 -1 roll		
+dup				
+4 -2 roll		
+put				
+}forall
+put 				
+definefont			
+}
+ifelse
+_efh
+}bdf
+/RCSC{4 -1 roll 			
+/ourvec xdf  		
+256 string cvs 		
+(|______) anchorsearch
+{pop				
+cvn				
+dup FDFSC		
+exch	 		
+1 index 		
+eq				
+{
+_bfh findfont _efh		
+dup 					
+maxlength dict			
+CD						
+dup						
+/FontName 		
+3 index			
+put						
+dup						
+/Encoding ourvec put	
+1 index					
+exch 					
+definefont				
+pop						
+}
+{exch pop}		
+ifelse
+}
+{pop}				
+ifelse
+}bdf
+/RFSC{						
+dup 					
+FontDirectory exch 		
+known					
+{pop 3 -1 roll pop}		
+{RCSC}
+ifelse
+}bdf
+/FDFSC
+{
+dup			
+hasfont		
+not			
+{			
+pop
+/zh-gbscript-1.11
+hasfont			
+{
+/zh-gbscript-1.11
+}
+{
+/Courier
+}
+ifelse			
+}
+if
+}bdf
+/FFSC{
+_bfh
+dup					
+256 string cvs		
+(|______)exch MN	
+cvn					
+dup					
+FontDirectory
+exch known			
+{					
+exch				
+pop					
+findfont			
+3 -1 roll			
+pop					
+}
+{					
+pop					
+FDFSC				
+dup findfont		
+dup maxlength dict	
+CD 					
+dup dup				
+/Encoding exch		
+/Encoding get		
+256 array copy		
+7 -1 roll 			
+{					
+3 -1 roll		
+dup				
+4 -2 roll		
+put				
+}forall
+put 				
+definefont			
+}
+ifelse
+_efh
+}bdf
+/fps{
+currentflat 		
+exch 				
+dup 0 le{pop 1}if	
+{
+dup setflat 3 index stopped
+{1.3 mul dup 3 index gt{pop setflat pop pop stop}if}	
+{exit}			
+ifelse
+}loop
+pop setflat pop pop
+}bdf
+/fp{100 currentflat fps}bdf
+/clipper{clip}bdf		
+/W{/clipper load 100 clipflatness dup setflat fps}bdf
+/AVec 256 array def
+AVec 0 /Helvetica findfont
+/Encoding get 0 256 getinterval putinterval
+/ANSIPatch[
+16#0/grave 16#1/acute 16#2/circumflex 16#3/tilde 16#4/macron 16#5/breve
+16#6/dotaccent 16#7/dieresis 16#8/ring 16#9/cedilla 16#A/hungarumlaut
+16#B/ogonek 16#C/caron 16#D/dotlessi 16#27/quotesingle 16#60/grave
+16#7C/bar 16#82/quotesinglbase 16#83/florin 16#84/quotedblbase 16#85
+/ellipsis 16#86/dagger 16#87/daggerdbl 16#89/perthousand 16#8A/Scaron
+16#8B/guilsinglleft 16#8C/OE 16#91/quoteleft 16#92/quoteright 16#93
+/quotedblleft 16#94/quotedblright 16#95/bullet 16#96/endash 16#97/emdash
+16#99/trademark 16#9A/scaron 16#9B/guilsinglright 16#9C/oe
+16#9F/Ydieresis 16#A0/space 16#A4/currency 16#A6/brokenbar
+16#A7/section 16#A8/dieresis 16#A9/copyright 16#AA/ordfeminine 16#AB/guillemotleft
+16#AC/logicalnot 16#AD/hyphen 16#AE/registered 16#AF/macron 16#B0/degree
+16#B1/plusminus 16#B2/twosuperior 16#B3/threesuperior 16#B4/acute 16#B5/mu
+16#B6/paragraph 16#B7/periodcentered 16#B8/cedilla 16#B9/onesuperior
+16#BA/ordmasculine 16#BB/guillemotright 16#BC/onequarter 16#BD/onehalf
+16#BE/threequarters 16#BF/questiondown 16#C0/Agrave 16#C1/Aacute 16#C2/Acircumflex
+16#C3/Atilde 16#C4/Adieresis 16#C5/Aring 16#C6/AE 16#C7/Ccedilla 16#C8/Egrave
+16#C9/Eacute 16#CA/Ecircumflex 16#CB/Edieresis 16#CC/Igrave 16#CD/Iacute
+16#CE/Icircumflex 16#CF/Idieresis 16#D0/Eth 16#D1/Ntilde 16#D2/Ograve
+16#D3/Oacute 16#D4/Ocircumflex 16#D5/Otilde 16#D6/Odieresis 16#D7/multiply
+16#D8/Oslash 16#D9/Ugrave 16#DA/Uacute 16#DB/Ucircumflex 16#DC/Udieresis
+16#DD/Yacute 16#DE/Thorn 16#DF/germandbls 16#E0/agrave 16#E1/aacute
+16#E2/acircumflex 16#E3/atilde 16#E4/adieresis 16#E5/aring 16#E6/ae
+16#E7/ccedilla 16#E8/egrave 16#E9/eacute 16#EA/ecircumflex 16#EB/edieresis
+16#EC/igrave 16#ED/iacute 16#EE/icircumflex 16#EF/idieresis 16#F0/eth
+16#F1/ntilde 16#F2/ograve 16#F3/oacute 16#F4/ocircumflex 16#F5/otilde
+16#F6/odieresis 16#F7/divide 16#F8/oslash 16#F9/ugrave 16#FA/uacute
+16#FB/ucircumflex 16#FC/udieresis 16#FD/yacute 16#FE/thorn 16#FF/ydieresis
+] def
+127 1 159 { AVec exch/bullet put } for
+ANSIPatch aload pop ANSIPatch length 2 idiv{AVec 3 1 roll put}repeat
+/DoPatch { dup /CharStrings known
+{ setfont
+0 1 255 { dup
+currentfont
+/Encoding get
+exch get
+currentfont /CharStrings get
+exch known
+{pop} {currentfont /Encoding get exch /bullet put} ifelse
+} for
+} {pop} ifelse
+} def
+/findheaderfont {
+AVec 256 array copy
+/FHT /|______Helvetica dup RF findfont def
+FHT DoPatch
+FHT
+}	def
+end		%. AltsysDict
+%%EndResource
+%%EndProlog
+%%BeginSetup
+AltsysDict begin
+_bfh	
+_efh	
+end %. AltsysDict
+%%EndSetup
+AltsysDict begin	
+/onlyk4{false}ndf
+/ccmyk{dup 5 -1 roll sub 0 max exch}ndf
+/cmyk2gray{
+4 -1 roll 0.3 mul 4 -1 roll 0.59 mul 4 -1 roll 0.11 mul
+add add add 1 min neg 1 add
+}bdf
+/setcmykcolor{1 exch sub ccmyk ccmyk ccmyk pop setrgbcolor}ndf
+/maxcolor {    
+max max max		
+} ndf
+/maxspot {
+pop
+} ndf
+/setcmykcoloroverprint{4{dup -1 eq{pop 0}if 4 1 roll}repeat setcmykcolor}ndf
+/findcmykcustomcolor{5 packedarray}ndf
+/setcustomcolor{exch aload pop pop 4{4 index mul 4 1 roll}repeat setcmykcolor pop}ndf
+/setseparationgray{setgray}ndf
+/setoverprint{pop}ndf		
+/currentoverprint false ndf
+/cmykbufs2gray{
+0 1 2 index length 1 sub
+{
+4 index 1 index get	0.3 mul		
+4 index 2 index get	0.59 mul	
+4 index 3 index get	0.11 mul	
+4 index 4 index get				
+add add add cvi 255 min
+255 exch sub
+2 index 3 1 roll put
+}for
+4 1 roll pop pop pop
+}bdf
+/colorimage{
+pop pop
+[
+5 -1 roll/exec cvx
+6 -1 roll/exec cvx
+7 -1 roll/exec cvx
+8 -1 roll/exec cvx
+/cmykbufs2gray cvx
+]cvx
+image
+}
+%. version 47.1 on Linotronic of Postscript defines colorimage incorrectly (rgb model only)
+version cvr 47.1 le
+statusdict /product get (Lino) anchorsearch{pop pop true}{pop false}ifelse
+and{userdict begin bdf end}{ndf}ifelse
+fhnumcolors 1 ne {/yt save def} if
+/customcolorimage{
+aload pop
+(_vc_Registration) eq
+{
+pop pop pop pop separationimage
+}
+{
+/ik xdf /iy xdf /im xdf /ic xdf
+ic im iy ik cmyk2gray /xt xdf
+currenttransfer
+{dup 1.0 exch sub xt mul add}concatprocs
+st
+image
+}
+ifelse
+}ndf
+fhnumcolors 1 ne {yt restore} if
+fhnumcolors 3 ne {/yt save def} if
+/customcolorimage{
+aload pop
+(_vc_Registration) eq
+{
+pop pop pop pop separationimage
+}
+{
+/ik xdf /iy xdf /im xdf /ic xdf
+1.0 dup ic ik add min sub	
+1.0 dup im ik add min sub	
+1.0 dup iy ik add min sub	
+/ic xdf /iy xdf /im xdf
+currentcolortransfer
+4 1 roll	
+{dup 1.0 exch sub ic mul add}concatprocs 4 1 roll	
+{dup 1.0 exch sub iy mul add}concatprocs 4 1 roll	
+{dup 1.0 exch sub im mul add}concatprocs 4 1 roll	
+setcolortransfer
+{/dummy xdf dummy}concatprocs{dummy}{dummy}true 3 colorimage
+}
+ifelse
+}ndf
+fhnumcolors 3 ne {yt restore} if
+fhnumcolors 4 ne {/yt save def} if
+/customcolorimage{
+aload pop
+(_vc_Registration) eq
+{
+pop pop pop pop separationimage
+}
+{
+/ik xdf /iy xdf /im xdf /ic xdf
+currentcolortransfer
+{1.0 exch sub ik mul ik sub 1 add}concatprocs 4 1 roll
+{1.0 exch sub iy mul iy sub 1 add}concatprocs 4 1 roll
+{1.0 exch sub im mul im sub 1 add}concatprocs 4 1 roll
+{1.0 exch sub ic mul ic sub 1 add}concatprocs 4 1 roll
+setcolortransfer
+{/dummy xdf dummy}concatprocs{dummy}{dummy}{dummy}
+true 4 colorimage
+}
+ifelse
+}ndf
+fhnumcolors 4 ne {yt restore} if
+/separationimage{image}ndf
+/spotascmyk false ndf
+/newcmykcustomcolor{6 packedarray}ndf
+/inkoverprint false ndf
+/setinkoverprint{pop}ndf		
+/setspotcolor {		
+spots exch get
+dup 4 get (_vc_Registration) eq
+{pop 1 exch sub setseparationgray}
+{0 5 getinterval exch setcustomcolor}
+ifelse
+}ndf
+/currentcolortransfer{currenttransfer dup dup dup}ndf
+/setcolortransfer{st pop pop pop}ndf
+/fas{}ndf
+/sas{}ndf
+/fhsetspreadsize{pop}ndf
+/filler{fill}bdf			
+/F{gsave {filler}fp grestore}bdf
+/f{closepath F}bdf
+/S{gsave {stroke}fp grestore}bdf
+/s{closepath S}bdf
+userdict /islevel2
+systemdict /languagelevel known dup
+{
+pop systemdict /languagelevel get 2 ge
+} if
+put
+islevel2 not
+{
+/currentcmykcolor
+{
+0 0 0 1 currentgray sub
+} ndf
+} if
+/tc
+{
+gsave
+setcmykcolor currentcmykcolor
+grestore
+} bind def
+/testCMYKColorThrough
+{
+tc add add add 0 ne
+} bind def
+/fhiscomposite where not {
+userdict /fhiscomposite
+islevel2
+{
+gsave 1 1 1 1 setcmykcolor currentcmykcolor grestore
+add add add 4 eq
+}
+{
+1 0 0 0 testCMYKColorThrough
+0 1 0 0 testCMYKColorThrough
+0 0 1 0 testCMYKColorThrough
+0 0 0 1 testCMYKColorThrough
+and and and
+} ifelse
+put
+}
+{ pop }
+ifelse
+/bc4 [0 0 0 0] def	
+/_lfp4 {
+1 pop	
+/yt xdf							
+/xt xdf							
+/ang xdf						
+storerect
+/taperfcn xdf
+/k2 xdf /y2 xdf /m2 xdf /c2 xdf
+/k1 xdf /y1 xdf /m1 xdf /c1 xdf
+c1 c2 sub abs
+m1 m2 sub abs
+y1 y2 sub abs
+k1 k2 sub abs
+maxcolor						
+calcgraysteps mul abs round		
+height abs adjnumsteps			
+dup 1 lt {pop 1} if				
+1 sub /numsteps1 xdf
+currentflat mark				
+currentflat clipflatness		
+/delta top bottom sub numsteps1 1 add div def	
+/right right left sub def		
+/botsv top delta sub def		
+{
+{
+W
+xt yt translate
+ang rotate
+xt neg yt neg translate
+dup setflat				
+/bottom botsv def
+0 1 numsteps1			
+{
+numsteps1 dup 0 eq {pop pop 0.5} {div} ifelse 
+taperfcn /frac xdf
+bc4 0 c2 c1 sub frac mul c1 add put
+bc4 1 m2 m1 sub frac mul m1 add put
+bc4 2 y2 y1 sub frac mul y1 add put
+bc4 3 k2 k1 sub frac mul k1 add put
+bc4 vc
+1 index setflat		
+{
+mark {newpath left bottom right delta rectfill}stopped
+{cleartomark exch 1.3 mul dup setflat exch 2 copy gt{stop}if}
+{cleartomark exit}ifelse
+}loop
+/bottom bottom delta sub def
+}for
+}
+gsave stopped grestore
+{exch pop 2 index exch 1.3 mul dup 100 gt{cleartomark setflat stop}if}
+{exit}ifelse
+}loop
+cleartomark setflat
+}bdf
+/bcs [0 0] def	
+/_lfs4 {
+/yt xdf							
+/xt xdf							
+/ang xdf						
+storerect
+/taperfcn xdf
+/tint2 xdf						
+/tint1 xdf						
+bcs exch 1 exch put				
+tint1 tint2 sub abs				
+bcs 1 get maxspot				
+calcgraysteps mul abs round		
+height abs adjnumsteps			
+dup 2 lt {pop 2} if				
+1 sub /numsteps1 xdf
+currentflat mark				
+currentflat clipflatness		
+/delta top bottom sub numsteps1 1 add div def	
+/right right left sub def		
+/botsv top delta sub def		
+{
+{
+W
+xt yt translate
+ang rotate
+xt neg yt neg translate
+dup setflat				
+/bottom botsv def
+0 1 numsteps1			
+{
+numsteps1 div taperfcn /frac xdf
+bcs 0
+1.0 tint2 tint1 sub frac mul tint1 add sub
+put bcs vc
+1 index setflat		
+{
+mark {newpath left bottom right delta rectfill}stopped
+{cleartomark exch 1.3 mul dup setflat exch 2 copy gt{stop}if}
+{cleartomark exit}ifelse
+}loop
+/bottom bottom delta sub def
+}for
+}
+gsave stopped grestore
+{exch pop 2 index exch 1.3 mul dup 100 gt{cleartomark setflat stop}if}
+{exit}ifelse
+}loop
+cleartomark setflat
+}bdf
+/_rfs6 {
+/tint2 xdf						
+/tint1 xdf						
+bcs exch 1 exch put				
+/inrad xdf						
+/radius xdf						
+/yt xdf							
+/xt xdf							
+tint1 tint2 sub abs				
+bcs 1 get maxspot				
+calcgraysteps mul abs round		
+radius inrad sub abs			
+adjnumsteps						
+dup 1 lt {pop 1} if				
+1 sub /numsteps1 xdf
+radius inrad sub numsteps1 dup 0 eq {pop} {div} ifelse	
+2 div /halfstep xdf				
+currentflat mark				
+currentflat clipflatness		
+{
+{
+dup setflat				
+W 						
+0 1 numsteps1			
+{
+dup /radindex xdf
+numsteps1 dup 0 eq {pop pop 0.5} {div} ifelse 
+/frac xdf
+bcs 0
+tint2 tint1 sub frac mul tint1 add
+put bcs vc
+1 index setflat		
+{
+newpath mark	
+xt yt radius inrad sub 1 frac sub mul halfstep add inrad add 0 360
+{	arc
+radindex numsteps1 ne
+inrad 0 gt or		
+{
+xt yt			
+numsteps1 0 eq
+{ inrad }	
+{			
+radindex 1 add numsteps1 div 1 exch sub
+radius inrad sub mul halfstep add inrad add
+}ifelse
+dup xt add yt moveto
+360 0 arcn
+} if
+fill
+}stopped
+{cleartomark exch 1.3 mul dup setflat exch 2 copy gt{stop}if}
+{cleartomark exit}ifelse
+}loop
+}for
+}
+gsave stopped grestore
+{exch pop 2 index exch 1.3 mul dup 100 gt{cleartomark setflat stop}if}
+{exit}ifelse
+}loop
+cleartomark setflat
+}bdf
+/_rfp6 {
+1 pop	
+/k2 xdf /y2 xdf /m2 xdf /c2 xdf
+/k1 xdf /y1 xdf /m1 xdf /c1 xdf
+/inrad xdf						
+/radius xdf						
+/yt xdf							
+/xt xdf							
+c1 c2 sub abs
+m1 m2 sub abs
+y1 y2 sub abs
+k1 k2 sub abs
+maxcolor					
+calcgraysteps mul abs round	
+radius inrad sub abs		
+adjnumsteps					
+dup 1 lt {pop 1} if			
+1 sub /numsteps1 xdf
+radius inrad sub numsteps1 dup 0 eq {pop} {div} ifelse	
+2 div /halfstep xdf			
+currentflat mark			
+currentflat clipflatness	
+{
+{
+dup setflat			
+W 					
+0 1 numsteps1		
+{
+dup /radindex xdf
+numsteps1 dup 0 eq {pop pop 0.5} {div} ifelse 
+/frac xdf
+bc4 0 c2 c1 sub frac mul c1 add put
+bc4 1 m2 m1 sub frac mul m1 add put
+bc4 2 y2 y1 sub frac mul y1 add put
+bc4 3 k2 k1 sub frac mul k1 add put
+bc4 vc
+1 index setflat		
+{
+newpath mark	
+xt yt radius inrad sub 1 frac sub mul halfstep add inrad add 0 360
+{	arc
+radindex numsteps1 ne
+inrad 0 gt or		
+{
+xt yt			
+numsteps1 0 eq
+{ inrad }	
+{			
+radindex 1 add numsteps1 div 1 exch sub
+radius inrad sub mul halfstep add inrad add
+}ifelse
+dup xt add yt moveto
+360 0 arcn
+} if
+fill
+}stopped
+{cleartomark exch 1.3 mul dup setflat exch 2 copy gt{stop}if}
+{cleartomark exit}ifelse
+}loop
+}for
+}
+gsave stopped grestore
+{exch pop 2 index exch 1.3 mul dup 100 gt{cleartomark setflat stop}if}
+{exit}ifelse
+}loop
+cleartomark setflat
+}bdf
+/lfp4{_lfp4}ndf
+/lfs4{_lfs4}ndf
+/rfs6{_rfs6}ndf
+/rfp6{_rfp6}ndf
+/cvc [0 0 0 1] def	
+/vc{
+AltsysDict /cvc 2 index put	
+aload length dup 4 eq
+{pop dup -1 eq{pop setrgbcolor}{setcmykcolor}ifelse}
+{6 eq {sethexcolor} {setspotcolor}	ifelse }
+ifelse
+}bdf	
+0 setseparationgray
+/imgr {1700.5 1577 2295.5 2419 } def			
+/bleed 0 def			
+/clpr {1700.5 1577 2295.5 2419 } def			
+/xs 1 def				
+/ys 1 def				
+/botx 0 def			
+/overlap 0 def			
+/wdist 18 def			
+0 2 mul fhsetspreadsize	
+0 0 ne {/df 0 def /clipflatness 0 def} if	
+/maxsteps 256 def		
+/forcemaxsteps false def	
+/minsteps 0 def		
+userdict begin /AGDOrigMtx matrix currentmatrix def end
+vms
+-1804 -1977 translate
+/currentpacking defed{false setpacking}if 	
+/spots[
+1 0 0 0 (Process Cyan) false newcmykcustomcolor
+0 1 0 0 (Process Magenta) false newcmykcustomcolor
+0 0 1 0 (Process Yellow) false newcmykcustomcolor
+0 0 0 1 (Process Black) false newcmykcustomcolor
+]def
+n
+[] 0 d
+3.863708 M
+1 w
+0 j
+0 J
+false setoverprint
+0 i
+false eomode
+[0 0 0 1]vc
+vms
+2091.3033 2026.6948 m
+2125.3191 1999.5805 L
+2125.3191 2012.4079 L
+2167.8568 2012.4081 L
+2167.8568 2026.7087 L
+2091.3033 2026.6948 L
+f	
+n
+2167.8568 2032.1369 m
+2133.8409 2059.2513 L
+2133.8409 2046.4239 L
+2031.7963 2046.4312 L
+2031.7962 2032.1306 L
+2167.8568 2032.1369 L
+[0 1 1 0]vc
+f	
+n
+1977.2503 1990.3708 m
+1980.05 1990.3708 1982.7386 1991.0242 1985.5322 1992.1408 C
+1981.3995 1978.2896 L
+1979.203 1977.8332 1976.7874 1977.5128 1974.4886 1977.5128 C
+1960.8564 1977.5128 1949.927 1985.9465 1949.927 2003.1595 C
+1949.927 2019.3356 1961.3264 2027.4237 1974.4886 2027.4237 C
+1978.8368 2027.4237 1981.4222 2026.8015 1985.6529 2025.9028 C
+1985.6529 2013.1832 L
+1983.0675 2014.151 1980.4233 2014.9805 1977.7791 2014.9805 C
+1971.0805 2014.9805 1966.0272 2010.7637 1966.0272 2002.883 C
+1966.0272 1994.5876 1970.728 1990.3708 1977.2503 1990.3708 C
+[0 0 0 1]vc
+true setoverprint
+f	
+false setoverprint
+n
+true eomode
+1985.961 1978.3424 m
+2001.6498 1978.3424 L
+2004.1765 1988.7808 L
+2017.4562 1988.7808 L
+2020.1591 1978.3424 L
+2036.6707 1978.3424 L
+2022.0395 2026.5941 L
+2000.3572 2026.5941 L
+1985.961 1978.3424 L
+h
+2010.8752 2016.2248 m
+2010.9926 2016.2248 L
+2015.4584 2000.3944 L
+2006.3506 2000.3944 L
+2010.8752 2016.2248 L
+true setoverprint
+f	
+false setoverprint
+n
+false eomode
+1854.507 1985.0967 m
+1853.3161 1984.5757 1852.1996 1984.1291 1850.6365 1984.1291 C
+1847.8081 1984.1291 1846.6916 1985.7666 1846.6916 1990.0837 C
+1846.6916 2012.4878 L
+1854.507 2012.4878 L
+1854.507 2017.5492 L
+1846.6916 2017.5492 L
+1846.6916 2030.9369 L
+1840.4393 2030.9369 L
+1840.4393 2017.5492 L
+1834.4102 2017.5492 L
+1834.4102 2012.4878 L
+1840.4393 2012.4878 L
+1840.4393 1988.074 L
+1840.4393 1981.3751 1843.491 1979.0677 1849.2223 1979.0677 C
+1850.9342 1979.0677 1853.0183 1979.5143 1854.507 1980.0353 C
+1854.507 1985.0967 L
+true setoverprint
+f	
+false setoverprint
+n
+1804.5001 1979.0887 m
+1829.6582 1979.0887 L
+1829.6582 1984.7456 L
+1811.0501 1984.7456 L
+1811.0501 2003.2048 L
+1827.8718 2003.2048 L
+1827.8718 2008.8616 L
+1811.0501 2008.8616 L
+1811.0501 2025.3856 L
+1828.6906 2025.3856 L
+1828.6906 2031.0425 L
+1804.5001 2031.0425 L
+1804.5001 1979.0887 L
+true setoverprint
+f	
+false setoverprint
+n
+1859.7811 1979.0887 m
+1866.0334 1979.0887 L
+1866.0334 2001.9394 L
+1866.0334 2008.7872 1869.1596 2012.2111 1874.0721 2012.2111 C
+1878.0915 2012.2111 1880.3244 2009.606 1880.3244 2003.577 C
+1880.3244 1979.0887 L
+1886.5768 1979.0887 L
+1886.5768 2005.4378 L
+1886.5768 2013.7742 1882.1108 2017.5702 1875.4863 2017.5702 C
+1871.0948 2017.5702 1867.8198 2015.0395 1866.1823 2011.8389 C
+1866.0334 2011.8389 L
+1866.0334 2030.9369 L
+1859.7811 2030.9369 L
+1859.7811 1979.0887 L
+true setoverprint
+f	
+false setoverprint
+n
+true eomode
+1921.7623 1996.2081 m
+1921.7623 1999.5576 L
+1921.7623 2010.7225 1916.9986 2017.5702 1908.4389 2017.5702 C
+1898.986 2017.5702 1893.7757 2009.9781 1893.7757 1998.069 C
+1893.7757 1986.1598 1898.986 1978.5677 1909.0344 1978.5677 C
+1912.8304 1978.5677 1916.7009 1979.3864 1919.6782 1980.8006 C
+1919.3805 1986.4575 L
+1917.2219 1984.8944 1913.798 1983.3313 1910.6719 1983.3313 C
+1903.7497 1983.3313 1900.3258 1987.4251 1900.3258 1996.2081 C
+1921.7623 1996.2081 L
+h
+1900.3258 2000.9718 m
+1900.4746 2009.8293 1904.0474 2012.8066 1908.0667 2012.8066 C
+1913.0537 2012.8066 1915.51 2008.8616 1915.51 2000.9718 C
+1900.3258 2000.9718 L
+true setoverprint
+f	
+false setoverprint
+n
+false eomode
+1928.6573 1979.0887 m
+1934.9096 1979.0887 L
+1934.9096 1999.1854 L
+1934.9096 2007.4474 1938.3335 2011.6156 1943.1716 2011.6156 C
+1943.9903 2011.6156 1944.8091 2011.5412 1945.5534 2011.3923 C
+1945.5534 2017.5702 L
+1939.971 2017.5702 1936.7704 2015.7094 1934.7607 2011.0946 C
+1934.6118 2011.0946 L
+1934.3885 2017.0492 L
+1928.3595 2017.0492 L
+1928.434 2014.3696 1928.6573 2011.6156 1928.6573 2008.8616 C
+1928.6573 1979.0887 L
+true setoverprint
+f	
+false setoverprint
+n
+true eomode
+2077.1054 1987.9334 m
+2078.4398 1987.9334 L
+2079.2051 1987.9334 2080.0686 1987.7764 2080.0686 1986.8345 C
+2080.0686 1985.7552 2079.3033 1985.6375 2078.4202 1985.6375 C
+2077.1054 1985.6375 L
+2077.1054 1987.9334 L
+h
+2075.6141 1981.0456 m
+2077.1054 1981.0456 L
+2077.1054 1984.4993 L
+2078.0081 1984.4993 L
+2080.0882 1981.0456 L
+2081.6189 1981.0456 L
+2079.4603 1984.5582 L
+2080.775 1984.676 2081.56 1985.3431 2081.56 1986.7168 C
+2081.56 1988.4044 2080.5199 1989.0716 2078.5968 1989.0716 C
+2075.6141 1989.0716 L
+2075.6141 1981.0456 L
+h
+2078.3418 1979.3187 m
+2075.3786 1979.3187 2072.9846 1981.7128 2072.9846 1985.0292 C
+2072.9846 1988.3455 2075.3786 1990.7396 2078.3418 1990.7396 C
+2081.3049 1990.7396 2083.6989 1988.3455 2083.6989 1985.0292 C
+2083.6989 1981.7128 2081.3049 1979.3187 2078.3418 1979.3187 C
+h
+2078.3418 1977.9451 m
+2082.2468 1977.9451 2085.4258 1981.1241 2085.4258 1985.0292 C
+2085.4258 1988.9342 2082.2468 1992.1132 2078.3418 1992.1132 C
+2074.4367 1992.1132 2071.2577 1988.9342 2071.2577 1985.0292 C
+2071.2577 1981.1241 2074.4367 1977.9451 2078.3418 1977.9451 C
+true setoverprint
+f	
+false setoverprint
+n
+false eomode
+2031.7963 2026.7097 m
+2082.82 2026.7097 L
+2082.82 2012.4154 L
+2065.1885 2012.4154 L
+2065.1885 1978.4009 L
+2049.4278 1978.4009 L
+2049.4278 2012.4154 L
+2031.7963 2012.4154 L
+2031.7963 2026.7097 L
+true setoverprint
+f	
+false setoverprint
+n
+vmr
+vmr
+end
+%%Trailer
diff --git a/doc/images/ethercat.pdf b/doc/images/ethercat.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..55a7076c715c4c6a2453cf32915f8bee46817d82
GIT binary patch
literal 2405
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
Jv9@|4{sgq5!=V5G

literal 0
HcmV?d00001

diff --git a/doc/images/fmmus.eps b/doc/images/fmmus.eps
new file mode 100644
index 00000000..14d70c47
--- /dev/null
+++ b/doc/images/fmmus.eps
@@ -0,0 +1,941 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: fmmus.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Sat Aug  5 16:55:20 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 555 299
+%%Magnification: 1.0000
+%%EndComments
+/MyAppDict 100 dict dup begin def
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+newpath 0 299 moveto 0 0 lineto 555 0 lineto 555 299 lineto closepath clip newpath
+-27.6 337.3 translate
+1 -1 scale
+
+% This junk string is used by the show operators
+/PATsstr 1 string def
+/PATawidthshow { 	% cx cy cchar rx ry string
+  % Loop over each character in the string
+  {  % cx cy cchar rx ry char
+    % Show the character
+    dup				% cx cy cchar rx ry char char
+    PATsstr dup 0 4 -1 roll put	% cx cy cchar rx ry char (char)
+    false charpath		% cx cy cchar rx ry char
+    /clip load PATdraw
+    % Move past the character (charpath modified the
+    % current point)
+    currentpoint			% cx cy cchar rx ry char x y
+    newpath
+    moveto			% cx cy cchar rx ry char
+    % Reposition by cx,cy if the character in the string is cchar
+    3 index eq {			% cx cy cchar rx ry
+      4 index 4 index rmoveto
+    } if
+    % Reposition all characters by rx ry
+    2 copy rmoveto		% cx cy cchar rx ry
+  } forall
+  pop pop pop pop pop		% -
+  currentpoint
+  newpath
+  moveto
+} bind def
+/PATcg {
+  7 dict dup begin
+    /lw currentlinewidth def
+    /lc currentlinecap def
+    /lj currentlinejoin def
+    /ml currentmiterlimit def
+    /ds [ currentdash ] def
+    /cc [ currentrgbcolor ] def
+    /cm matrix currentmatrix def
+  end
+} bind def
+% PATdraw - calculates the boundaries of the object and
+% fills it with the current pattern
+/PATdraw {			% proc
+  save exch
+    PATpcalc			% proc nw nh px py
+    5 -1 roll exec		% nw nh px py
+    newpath
+    PATfill			% -
+  restore
+} bind def
+% PATfill - performs the tiling for the shape
+/PATfill { % nw nh px py PATfill -
+  PATDict /CurrentPattern get dup begin
+    setfont
+    % Set the coordinate system to Pattern Space
+    PatternGState PATsg
+    % Set the color for uncolored pattezns
+    PaintType 2 eq { PATDict /PColor get PATsc } if
+    % Create the string for showing
+    3 index string		% nw nh px py str
+    % Loop for each of the pattern sources
+    0 1 Multi 1 sub {		% nw nh px py str source
+	% Move to the starting location
+	3 index 3 index		% nw nh px py str source px py
+	moveto			% nw nh px py str source
+	% For multiple sources, set the appropriate color
+	Multi 1 ne { dup PC exch get PATsc } if
+	% Set the appropriate string for the source
+	0 1 7 index 1 sub { 2 index exch 2 index put } for pop
+	% Loop over the number of vertical cells
+	3 index 		% nw nh px py str nh
+	{			% nw nh px py str
+	  currentpoint		% nw nh px py str cx cy
+	  2 index oldshow	% nw nh px py str cx cy
+	  YStep add moveto	% nw nh px py str
+	} repeat		% nw nh px py str
+    } for
+    5 { pop } repeat
+  end
+} bind def
+
+% PATkshow - kshow with the current pattezn
+/PATkshow {			% proc string
+  exch bind			% string proc
+  1 index 0 get			% string proc char
+  % Loop over all but the last character in the string
+  0 1 4 index length 2 sub {
+				% string proc char idx
+    % Find the n+1th character in the string
+    3 index exch 1 add get	% string proc char char+1
+    exch 2 copy			% strinq proc char+1 char char+1 char
+    % Now show the nth character
+    PATsstr dup 0 4 -1 roll put	% string proc chr+1 chr chr+1 (chr)
+    false charpath		% string proc char+1 char char+1
+    /clip load PATdraw
+    % Move past the character (charpath modified the current point)
+    currentpoint newpath moveto
+    % Execute the user proc (should consume char and char+1)
+    mark 3 1 roll		% string proc char+1 mark char char+1
+    4 index exec		% string proc char+1 mark...
+    cleartomark			% string proc char+1
+  } for
+  % Now display the last character
+  PATsstr dup 0 4 -1 roll put	% string proc (char+1)
+  false charpath		% string proc
+  /clip load PATdraw
+  neewath
+  pop pop			% -
+} bind def
+% PATmp - the makepattern equivalent
+/PATmp {			% patdict patmtx PATmp patinstance
+  exch dup length 7 add		% We will add 6 new entries plus 1 FID
+  dict copy			% Create a new dictionary
+  begin
+    % Matrix to install when painting the pattern
+    TilingType PATtcalc
+    /PatternGState PATcg def
+    PatternGState /cm 3 -1 roll put
+    % Check for multi pattern sources (Level 1 fast color patterns)
+    currentdict /Multi known not { /Multi 1 def } if
+    % Font dictionary definitions
+    /FontType 3 def
+    % Create a dummy encoding vector
+    /Encoding 256 array def
+    3 string 0 1 255 {
+      Encoding exch dup 3 index cvs cvn put } for pop
+    /FontMatrix matrix def
+    /FontBBox BBox def
+    /BuildChar {
+	mark 3 1 roll		% mark dict char
+	exch begin
+	Multi 1 ne {PaintData exch get}{pop} ifelse  % mark [paintdata]
+	  PaintType 2 eq Multi 1 ne or
+	  { XStep 0 FontBBox aload pop setcachedevice }
+	  { XStep 0 setcharwidth } ifelse
+	  currentdict		% mark [paintdata] dict
+	  /PaintProc load	% mark [paintdata] dict paintproc
+	end
+	gsave
+	  false PATredef exec true PATredef
+	grestore
+	cleartomark		% -
+    } bind def
+    currentdict
+  end				% newdict
+  /foo exch			% /foo newlict
+  definefont			% newfont
+} bind def
+% PATpcalc - calculates the starting point and width/height
+% of the tile fill for the shape
+/PATpcalc {	% - PATpcalc nw nh px py
+  PATDict /CurrentPattern get begin
+    gsave
+	% Set up the coordinate system to Pattern Space
+	% and lock down pattern
+	PatternGState /cm get setmatrix
+	BBox aload pop pop pop translate
+	% Determine the bounding box of the shape
+	pathbbox			% llx lly urx ury
+    grestore
+    % Determine (nw, nh) the # of cells to paint width and height
+    PatHeight div ceiling		% llx lly urx qh
+    4 1 roll				% qh llx lly urx
+    PatWidth div ceiling		% qh llx lly qw
+    4 1 roll				% qw qh llx lly
+    PatHeight div floor			% qw qh llx ph
+    4 1 roll				% ph qw qh llx
+    PatWidth div floor			% ph qw qh pw
+    4 1 roll				% pw ph qw qh
+    2 index sub cvi abs			% pw ph qs qh-ph
+    exch 3 index sub cvi abs exch	% pw ph nw=qw-pw nh=qh-ph
+    % Determine the starting point of the pattern fill
+    %(px, py)
+    4 2 roll				% nw nh pw ph
+    PatHeight mul			% nw nh pw py
+    exch				% nw nh py pw
+    PatWidth mul exch			% nw nh px py
+  end
+} bind def
+
+% Save the original routines so that we can use them later on
+/oldfill	/fill load def
+/oldeofill	/eofill load def
+/oldstroke	/stroke load def
+/oldshow	/show load def
+/oldashow	/ashow load def
+/oldwidthshow	/widthshow load def
+/oldawidthshow	/awidthshow load def
+/oldkshow	/kshow load def
+
+% These defs are necessary so that subsequent procs don't bind in
+% the originals
+/fill	   { oldfill } bind def
+/eofill	   { oldeofill } bind def
+/stroke	   { oldstroke } bind def
+/show	   { oldshow } bind def
+/ashow	   { oldashow } bind def
+/widthshow { oldwidthshow } bind def
+/awidthshow { oldawidthshow } bind def
+/kshow 	   { oldkshow } bind def
+/PATredef {
+  MyAppDict begin
+    {
+    /fill { /clip load PATdraw newpath } bind def
+    /eofill { /eoclip load PATdraw newpath } bind def
+    /stroke { PATstroke } bind def
+    /show { 0 0 null 0 0 6 -1 roll PATawidthshow } bind def
+    /ashow { 0 0 null 6 3 roll PATawidthshow }
+    bind def
+    /widthshow { 0 0 3 -1 roll PATawidthshow }
+    bind def
+    /awidthshow { PATawidthshow } bind def
+    /kshow { PATkshow } bind def
+  } {
+    /fill   { oldfill } bind def
+    /eofill { oldeofill } bind def
+    /stroke { oldstroke } bind def
+    /show   { oldshow } bind def
+    /ashow  { oldashow } bind def
+    /widthshow { oldwidthshow } bind def
+    /awidthshow { oldawidthshow } bind def
+    /kshow  { oldkshow } bind def
+    } ifelse
+  end
+} bind def
+false PATredef
+% Conditionally define setcmykcolor if not available
+/setcmykcolor where { pop } {
+  /setcmykcolor {
+    1 sub 4 1 roll
+    3 {
+	3 index add neg dup 0 lt { pop 0 } if 3 1 roll
+    } repeat
+    setrgbcolor - pop
+  } bind def
+} ifelse
+/PATsc {		% colorarray
+  aload length		% c1 ... cn length
+    dup 1 eq { pop setgray } { 3 eq { setrgbcolor } { setcmykcolor
+  } ifelse } ifelse
+} bind def
+/PATsg {		% dict
+  begin
+    lw setlinewidth
+    lc setlinecap
+    lj setlinejoin
+    ml setmiterlimit
+    ds aload pop setdash
+    cc aload pop setrgbcolor
+    cm setmatrix
+  end
+} bind def
+
+/PATDict 3 dict def
+/PATsp {
+  true PATredef
+  PATDict begin
+    /CurrentPattern exch def
+    % If it's an uncolored pattern, save the color
+    CurrentPattern /PaintType get 2 eq {
+      /PColor exch def
+    } if
+    /CColor [ currentrgbcolor ] def
+  end
+} bind def
+% PATstroke - stroke with the current pattern
+/PATstroke {
+  countdictstack
+  save
+  mark
+  {
+    currentpoint strokepath moveto
+    PATpcalc				% proc nw nh px py
+    clip newpath PATfill
+    } stopped {
+	(*** PATstroke Warning: Path is too complex, stroking
+	  with gray) =
+    cleartomark
+    restore
+    countdictstack exch sub dup 0 gt
+	{ { end } repeat } { pop } ifelse
+    gsave 0.5 setgray oldstroke grestore
+  } { pop restore pop } ifelse
+  newpath
+} bind def
+/PATtcalc {		% modmtx tilingtype PATtcalc tilematrix
+  % Note: tiling types 2 and 3 are not supported
+  gsave
+    exch concat					% tilingtype
+    matrix currentmatrix exch			% cmtx tilingtype
+    % Tiling type 1 and 3: constant spacing
+    2 ne {
+	% Distort the pattern so that it occupies
+	% an integral number of device pixels
+	dup 4 get exch dup 5 get exch		% tx ty cmtx
+	XStep 0 dtransform
+	round exch round exch			% tx ty cmtx dx.x dx.y
+	XStep div exch XStep div exch		% tx ty cmtx a b
+	0 YStep dtransform
+	round exch round exch			% tx ty cmtx a b dy.x dy.y
+	YStep div exch YStep div exch		% tx ty cmtx a b c d
+	7 -3 roll astore			% { a b c d tx ty }
+    } if
+  grestore
+} bind def
+/PATusp {
+  false PATredef
+  PATDict begin
+    CColor PATsc
+  end
+} bind def
+
+% right30
+11 dict begin
+/PaintType 1 def
+/PatternType 1 def
+/TilingType 1 def
+/BBox [0 0 1 1] def
+/XStep 1 def
+/YStep 1 def
+/PatWidth 1 def
+/PatHeight 1 def
+/Multi 2 def
+/PaintData [
+  { clippath } bind
+  { 32 16 true [ 32 0 0 -16 0 16 ]
+	{<00030003000c000c0030003000c000c0030003000c000c00
+	30003000c000c00000030003000c000c0030003000c000c0
+	030003000c000c0030003000c000c000>}
+     imagemask } bind
+] def
+/PaintProc {
+	pop
+	exec fill
+} def
+currentdict
+end
+/P2 exch def
+
+% crosshatch45
+11 dict begin
+/PaintType 1 def
+/PatternType 1 def
+/TilingType 1 def
+/BBox [0 0 1 1] def
+/XStep 1 def
+/YStep 1 def
+/PatWidth 1 def
+/PatHeight 1 def
+/Multi 2 def
+/PaintData [
+  { clippath } bind
+  { 20 20 true [ 20 0 0 -20 0 20 ]
+	{<8020004050102088201104400a02800401000a02
+	8011044020882040501080200040501020882011
+	04400a02800401000a0280110440208820405010>}
+     imagemask } bind
+] def
+/PaintProc {
+	pop
+	exec fill
+} def
+currentdict
+end
+/P6 exch def
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 52
+% Polyline
+7.500 slw
+ [60] 0 sd
+n 1215 1665 m
+ 1620 3870 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 81.00 111.00] PATmp PATsp ef gr PATusp gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 2296 1665 m
+ 2700 3870 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 153.07 111.00] PATmp PATsp ef gr PATusp gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 3735 1665 m
+ 2700 3870 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 4453 1664 m
+ 3420 3870 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 3735 1665 m
+ 5130 3870 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 249.00 111.00] PATmp PATsp ef gr PATusp gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 7650 1665 m
+ 5850 3870 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 8730 1665 m
+ 6930 3870 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 4455 1665 m
+ 5850 3870 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 297.00 111.00] PATmp PATsp ef gr PATusp gs col0 s gr  [] 0 sd
+% Polyline
+n 6675 2520 m 6570 2520 6570 2775 105 arcto 4 {pop} repeat
+  6570 2880 7995 2880 105 arcto 4 {pop} repeat
+  8100 2880 8100 2625 105 arcto 4 {pop} repeat
+  8100 2520 6675 2520 105 arcto 4 {pop} repeat
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 1440 2520 m 1350 2520 1350 2790 90 arcto 4 {pop} repeat
+  1350 2880 2520 2880 90 arcto 4 {pop} repeat
+  2610 2880 2610 2610 90 arcto 4 {pop} repeat
+  2610 2520 1440 2520 90 arcto 4 {pop} repeat
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 3090 2520 m 3015 2520 3015 2805 75 arcto 4 {pop} repeat
+  3015 2880 4065 2880 75 arcto 4 {pop} repeat
+  4140 2880 4140 2595 75 arcto 4 {pop} repeat
+  4140 2520 3090 2520 75 arcto 4 {pop} repeat
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 4260 2520 m 4185 2520 4185 2805 75 arcto 4 {pop} repeat
+  4185 2880 5235 2880 75 arcto 4 {pop} repeat
+  5310 2880 5310 2595 75 arcto 4 {pop} repeat
+  5310 2520 4260 2520 75 arcto 4 {pop} repeat
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Arc
+n 1755.0 1440.0 540.0 180.0 0.0 arc
+gs col7 1.00 shd ef gr gs col0 s gr
+
+% Arc
+n 4095.0 1440.0 360.0 180.0 0.0 arc
+gs col7 1.00 shd ef gr gs col0 s gr
+
+% Arc
+n 8190.0 1440.0 540.0 180.0 0.0 arc
+gs col7 1.00 shd ef gr gs col0 s gr
+
+% Polyline
+ [60] 0 sd
+n 1935 1440 m 2115 1440 l 2115 1665 l 1935 1665 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 129.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 1395 1440 m 1755 1440 l 1755 1665 l 1395 1665 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 93.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 3735 1440 m 4095 1440 l 4095 1665 l 3735 1665 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 249.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 1800 3870 m 2160 3870 l 2160 4095 l 1800 4095 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 120.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 2340 3870 m 2520 3870 l 2520 4095 l 2340 4095 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 156.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 2700 3870 m 3060 3870 l 3060 4095 l 2700 4095 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 180.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr  [] 0 sd
+% Polyline
+n 1620 3870 m
+ 1620 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 108.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 1800 3870 m
+ 1800 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 120.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 2160 3870 m
+ 2160 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 144.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 2340 3870 m
+ 2340 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 156.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 2520 3870 m
+ 2520 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 168.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 2700 3870 m
+ 2700 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 180.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 3060 3870 m
+ 3060 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 204.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 3240 3870 m
+ 3240 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 216.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 3420 3870 m
+ 3420 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 228.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 1440 3870 m
+ 1440 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 96.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 1260 3870 m
+ 1260 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 84.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 1080 3870 m
+ 3600 3870 l gs col0 s gr 
+% Polyline
+n 1080 4095 m
+ 3600 4095 l gs col0 s gr 
+% Polyline
+ [60] 0 sd
+n 5130 3870 m 5490 3870 l 5490 4095 l 5130 4095 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 342.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr  [] 0 sd
+% Polyline
+n 4590 3870 m
+ 4590 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 306.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4770 3870 m
+ 4770 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 318.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4950 3870 m
+ 4950 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 330.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 5130 3870 m
+ 5130 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 342.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 5490 3870 m
+ 5490 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 366.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 5670 3870 m
+ 5670 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 378.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 5850 3870 m
+ 5850 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 390.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 6030 3870 m
+ 6030 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 402.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 6210 3870 m
+ 6210 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 414.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4410 3870 m
+ 4410 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 294.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4230 3870 m
+ 4230 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 282.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4050 3870 m
+ 7470 3870 l gs col0 s gr 
+% Polyline
+n 4050 4095 m
+ 7470 4095 l gs col0 s gr 
+% Polyline
+n 6930 1440 m
+ 6930 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 462.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 7110 1440 m
+ 7110 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 474.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 7290 1440 m
+ 7290 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 486.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 7470 1440 m
+ 7470 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 498.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 7650 1440 m
+ 7650 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 510.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 7830 1440 m
+ 7830 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 522.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 8010 1440 m
+ 8010 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 534.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 8730 1440 m
+ 8730 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 582.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 8910 1440 m
+ 8910 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 594.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 6750 1440 m
+ 6750 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 450.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 6570 1440 m
+ 6570 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 438.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 6390 1440 m
+ 9090 1440 l gs col0 s gr 
+% Polyline
+n 6390 1665 m
+ 9090 1665 l gs col0 s gr 
+% Polyline
+n 8010 1440 m 8730 1440 l 8730 1665 l 8010 1665 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 534.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 6930 3870 m
+ 6930 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 462.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 6210 3870 m 6930 3870 l 6930 4095 l 6210 4095 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 414.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 6165 630 m 9225 630 l 9225 3015 l 6165 3015 l
+ cp gs col0 s gr 
+% Polyline
+n 450 630 m 5490 630 l 5490 3015 l 450 3015 l
+ cp gs col0 s gr 
+% Polyline
+n 1215 1440 m
+ 1215 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 81.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 1395 1440 m
+ 1395 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 93.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 1755 1440 m
+ 1755 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 117.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 1935 1440 m
+ 1935 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 129.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 2115 1440 m
+ 2115 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 141.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 2295 1440 m
+ 2295 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 153.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 2475 1440 m
+ 2475 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 165.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 2655 1440 m
+ 2655 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 177.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 2835 1440 m
+ 2835 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 189.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 3015 1440 m
+ 3015 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 201.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 3195 1440 m
+ 3195 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 213.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 3375 1440 m
+ 3375 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 225.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 3555 1440 m
+ 3555 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 237.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 3735 1440 m
+ 3735 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 249.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4095 1440 m
+ 4095 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 273.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4275 1440 m
+ 4275 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 285.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4455 1440 m
+ 4455 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 297.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4635 1440 m
+ 4635 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 309.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4815 1440 m
+ 4815 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 321.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 1035 1440 m
+ 1035 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 69.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 855 1440 m
+ 855 1665 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 57.00 96.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 675 1440 m
+ 4995 1440 l gs col0 s gr 
+% Polyline
+n 675 1665 m
+ 4995 1665 l gs col0 s gr 
+% Polyline
+n 7110 3870 m
+ 7110 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 474.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 7290 3870 m
+ 7290 4095 l gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 486.00 258.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+gs  clippath
+1830 4080 m 1770 4080 l 1770 4231 l 1800 4111 l 1830 4231 l cp
+eoclip
+n 1800 4410 m
+ 1800 4095 l gs col0 s gr gr
+
+% arrowhead
+n 1830 4231 m 1800 4111 l 1770 4231 l 1830 4231 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+2730 4080 m 2670 4080 l 2670 4231 l 2700 4111 l 2730 4231 l cp
+eoclip
+n 2700 4410 m
+ 2700 4095 l gs col0 s gr gr
+
+% arrowhead
+n 2730 4231 m 2700 4111 l 2670 4231 l 2730 4231 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+5160 4080 m 5100 4080 l 5100 4231 l 5130 4111 l 5160 4231 l cp
+eoclip
+n 5130 4410 m
+ 5130 4095 l gs col0 s gr gr
+
+% arrowhead
+n 5160 4231 m 5130 4111 l 5100 4231 l 5160 4231 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+6240 4080 m 6180 4080 l 6180 4231 l 6210 4111 l 6240 4231 l cp
+eoclip
+n 6210 4410 m
+ 6210 4095 l gs col0 s gr gr
+
+% arrowhead
+n 6240 4231 m 6210 4111 l 6180 4231 l 6240 4231 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+2370 4080 m 2310 4080 l 2310 4231 l 2340 4111 l 2370 4231 l cp
+eoclip
+n 2340 4410 m
+ 2340 4095 l gs col0 s gr gr
+
+% arrowhead
+n 2370 4231 m 2340 4111 l 2310 4231 l 2370 4231 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+3315 5235 m 3315 5295 l 3466 5295 l 3346 5265 l 3466 5235 l cp
+eoclip
+n 3645 5265 m
+ 3330 5265 l gs col0 s gr gr
+
+% arrowhead
+n 3466 5235 m 3346 5265 l 3466 5295 l 3466 5235 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+n 3465 4815 m 3645 4815 l 3645 5040 l 3465 5040 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 231.00 321.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+675 1395 m
+gs 1 -1 sc (RAM) col0 sh gr
+/Helvetica ff 180.00 scf sf
+4095 1350 m
+gs 1 -1 sc (SM1) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+6390 1395 m
+gs 1 -1 sc (RAM) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 855 m
+gs 1 -1 sc (Slave0) col0 sh gr
+/Helvetica ff 180.00 scf sf
+6255 855 m
+gs 1 -1 sc (Slave1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+7290 2745 m
+gs 1 -1 sc (FMMU0) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+1980 2745 m
+gs 1 -1 sc (FMMU0) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+3555 2745 m
+gs 1 -1 sc (FMMU1) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+4725 2745 m
+gs 1 -1 sc (FMMU2) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+1755 1305 m
+gs 1 -1 sc (SM0) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+8190 1305 m
+gs 1 -1 sc (SM3) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+1080 3825 m
+gs 1 -1 sc (Domain0 Image) col0 sh gr
+/Helvetica ff 180.00 scf sf
+4050 3825 m
+gs 1 -1 sc (Domain1 Image) col0 sh gr
+/Helvetica ff 180.00 scf sf
+3735 5310 m
+gs 1 -1 sc (Process data pointers) col0 sh gr
+/Helvetica ff 180.00 scf sf
+3735 4995 m
+gs 1 -1 sc (Registered PDOs) col0 sh gr
+% here ends figure;
+$F2psEnd
+rs
+end
+showpage
diff --git a/doc/images/fmmus.fig b/doc/images/fmmus.fig
new file mode 100644
index 00000000..08e997da
--- /dev/null
+++ b/doc/images/fmmus.fig
@@ -0,0 +1,223 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+5 1 0 1 0 7 50 -1 20 0.000 0 0 0 0 1755.000 1440.000 1215 1440 1755 900 2295 1440
+5 1 0 1 0 7 50 -1 20 0.000 0 0 0 0 4095.000 1440.000 3735 1440 4095 1080 4455 1440
+5 1 0 1 0 7 50 -1 20 0.000 0 0 0 0 8190.000 1440.000 7650 1440 8190 900 8730 1440
+2 1 1 1 0 7 52 -1 46 4.000 0 0 -1 0 0 2
+	 1215 1665 1620 3870
+2 1 1 1 0 7 52 -1 46 4.000 0 0 -1 0 0 2
+	 2296 1665 2700 3870
+2 1 1 1 0 7 52 -1 -1 4.000 0 0 -1 0 0 2
+	 3735 1665 2700 3870
+2 1 1 1 0 7 52 -1 -1 4.000 0 0 -1 0 0 2
+	 4453 1664 3420 3870
+2 2 1 1 0 7 50 -1 42 4.000 0 0 -1 0 0 5
+	 1935 1440 2115 1440 2115 1665 1935 1665 1935 1440
+2 2 1 1 0 7 50 -1 42 4.000 0 0 -1 0 0 5
+	 1395 1440 1755 1440 1755 1665 1395 1665 1395 1440
+2 2 1 1 0 7 50 -1 42 4.000 0 0 -1 0 0 5
+	 3735 1440 4095 1440 4095 1665 3735 1665 3735 1440
+2 1 1 1 0 7 52 -1 42 4.000 0 0 -1 0 0 2
+	 3735 1665 5130 3870
+2 2 1 1 0 7 50 -1 42 4.000 0 0 -1 0 0 5
+	 1800 3870 2160 3870 2160 4095 1800 4095 1800 3870
+2 2 1 1 0 7 50 -1 42 4.000 0 0 -1 0 0 5
+	 2340 3870 2520 3870 2520 4095 2340 4095 2340 3870
+2 2 1 1 0 7 50 -1 42 4.000 0 0 -1 0 0 5
+	 2700 3870 3060 3870 3060 4095 2700 4095 2700 3870
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 1620 3870 1620 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 1800 3870 1800 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 2160 3870 2160 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 2340 3870 2340 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 2520 3870 2520 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 2700 3870 2700 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 3060 3870 3060 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 3240 3870 3240 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 3420 3870 3420 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 1440 3870 1440 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 1260 3870 1260 4095
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 1080 3870 3600 3870
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 1080 4095 3600 4095
+2 2 1 1 0 7 50 -1 42 4.000 0 0 -1 0 0 5
+	 5130 3870 5490 3870 5490 4095 5130 4095 5130 3870
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 4590 3870 4590 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 4770 3870 4770 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 4950 3870 4950 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 5130 3870 5130 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 5490 3870 5490 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 5670 3870 5670 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 5850 3870 5850 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 6030 3870 6030 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 6210 3870 6210 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 4410 3870 4410 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 4230 3870 4230 4095
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 4050 3870 7470 3870
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 4050 4095 7470 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 6930 1440 6930 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 7110 1440 7110 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 7290 1440 7290 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 7470 1440 7470 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 7650 1440 7650 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 7830 1440 7830 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 8010 1440 8010 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 8730 1440 8730 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 8910 1440 8910 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 6750 1440 6750 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 6570 1440 6570 1665
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 6390 1440 9090 1440
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 6390 1665 9090 1665
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 8010 1440 8730 1440 8730 1665 8010 1665 8010 1440
+2 1 1 1 0 7 52 -1 -1 4.000 0 0 -1 0 0 2
+	 7650 1665 5850 3870
+2 1 1 1 0 7 52 -1 -1 4.000 0 0 -1 0 0 2
+	 8730 1665 6930 3870
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 6930 3870 6930 4095
+2 4 0 1 0 7 51 -1 20 0.000 0 0 7 0 0 5
+	 8100 2880 6570 2880 6570 2520 8100 2520 8100 2880
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 6210 3870 6930 3870 6930 4095 6210 4095 6210 3870
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 6165 630 9225 630 9225 3015 6165 3015 6165 630
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 450 630 5490 630 5490 3015 450 3015 450 630
+2 4 0 1 0 7 51 -1 20 0.000 0 0 6 0 0 5
+	 2610 2880 1350 2880 1350 2520 2610 2520 2610 2880
+2 4 0 1 0 7 51 -1 20 0.000 0 0 5 0 0 5
+	 4140 2880 3015 2880 3015 2520 4140 2520 4140 2880
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 1215 1440 1215 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 1395 1440 1395 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 1755 1440 1755 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 1935 1440 1935 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 2115 1440 2115 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 2295 1440 2295 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 2475 1440 2475 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 2655 1440 2655 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 2835 1440 2835 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 3015 1440 3015 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 3195 1440 3195 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 3375 1440 3375 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 3555 1440 3555 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 3735 1440 3735 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 4095 1440 4095 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 4275 1440 4275 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 4455 1440 4455 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 4635 1440 4635 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 4815 1440 4815 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 1035 1440 1035 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 855 1440 855 1665
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 675 1440 4995 1440
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 675 1665 4995 1665
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 7110 3870 7110 4095
+2 1 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 2
+	 7290 3870 7290 4095
+2 4 0 1 0 7 51 -1 20 0.000 0 0 5 0 0 5
+	 5310 2880 4185 2880 4185 2520 5310 2520 5310 2880
+2 1 1 1 0 7 52 -1 42 4.000 0 0 -1 0 0 2
+	 4455 1665 5850 3870
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 1800 4410 1800 4095
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 2700 4410 2700 4095
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 5130 4410 5130 4095
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 6210 4410 6210 4095
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 2340 4410 2340 4095
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 3645 5265 3330 5265
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 3465 4815 3645 4815 3645 5040 3465 5040 3465 4815
+4 0 0 50 -1 16 12 0.0000 4 120 720 675 1395 RAM\001
+4 1 0 50 -1 16 12 0.0000 4 120 660 4095 1350 SM1\001
+4 0 0 50 -1 16 12 0.0000 4 120 720 6390 1395 RAM\001
+4 0 0 50 -1 16 12 0.0000 4 120 1005 540 855 Slave0\001
+4 0 0 50 -1 16 12 0.0000 4 120 1005 6255 855 Slave1\001
+4 1 0 50 -1 16 12 0.0000 4 120 1125 7290 2745 FMMU0\001
+4 1 0 50 -1 16 12 0.0000 4 120 1125 1980 2745 FMMU0\001
+4 1 0 50 -1 16 12 0.0000 4 120 1125 3555 2745 FMMU1\001
+4 1 0 50 -1 16 12 0.0000 4 120 1125 4725 2745 FMMU2\001
+4 1 0 50 -1 16 12 0.0000 4 120 660 1755 1305 SM0\001
+4 1 0 50 -1 16 12 0.0000 4 120 660 8190 1305 SM3\001
+4 0 0 50 -1 16 12 0.0000 4 165 2235 1080 3825 Domain0 Image\001
+4 0 0 50 -1 16 12 0.0000 4 165 2235 4050 3825 Domain1 Image\001
+4 0 0 50 -1 16 12 0.0000 4 150 3090 3735 5310 Process data pointers\001
+4 0 0 50 -1 16 12 0.0000 4 165 2520 3735 4995 Registered PDOs\001
diff --git a/doc/images/fmmus.pdf b/doc/images/fmmus.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..fdf470a1e4afba06c25a0b7dac4970dafede43b0
GIT binary patch
literal 31022
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

literal 0
HcmV?d00001

diff --git a/doc/images/fsm-change.eps b/doc/images/fsm-change.eps
new file mode 100644
index 00000000..bd0aeffb
--- /dev/null
+++ b/doc/images/fsm-change.eps
@@ -0,0 +1,424 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: fsm-change.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Thu Jul 20 10:40:23 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 510 193
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.555 0.555 0.555 srgb} bind def
+
+end
+save
+newpath 0 193 moveto 0 0 lineto 510 0 lineto 510 193 lineto closepath clip newpath
+-24.3 221.9 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+	/endangle exch def
+	/startangle exch def
+	/yrad exch def
+	/xrad exch def
+	/y exch def
+	/x exch def
+	/savematrix mtrx currentmatrix def
+	x y tr xrad yrad sc 0 0 1 startangle endangle arc
+	closepath
+	savematrix setmatrix
+	} def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Ellipse
+7.500 slw
+n 1260 2745 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+1260 2790 m
+gs 1 -1 sc (CODE) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 3375 2745 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+3375 2790 m
+gs 1 -1 sc (ACK) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 5490 2745 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+5490 2790 m
+gs 1 -1 sc (CHECK ACK) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 7605 2745 855 360 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 7605 2738 765 322 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+7605 2790 m
+gs 1 -1 sc (ERROR) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 3375 1260 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+3375 1305 m
+gs 1 -1 sc (CHECK) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 5490 1260 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+5490 1305 m
+gs 1 -1 sc (STATUS) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 7605 1260 855 360 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 7605 1261 748 315 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+7605 1305 m
+gs 1 -1 sc (END) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 1260 1260 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+1260 1305 m
+gs 1 -1 sc (START) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 495 675 101 101 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
+
+% Polyline
+2 slj
+gs  clippath
+2535 1290 m 2535 1230 l 2384 1230 l 2504 1260 l 2384 1290 l cp
+eoclip
+n 2115 1260 m
+ 2520 1260 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 2384 1290 m 2504 1260 l 2384 1230 l 2384 1290 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4650 1290 m 4650 1230 l 4499 1230 l 4619 1260 l 4499 1290 l cp
+eoclip
+n 4230 1260 m
+ 4635 1260 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4499 1290 m 4619 1260 l 4499 1230 l 4499 1290 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+6765 1290 m 6765 1230 l 6614 1230 l 6734 1260 l 6614 1290 l cp
+eoclip
+n 6345 1260 m
+ 6750 1260 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 6614 1290 m 6734 1260 l 6614 1230 l 6614 1290 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5326 917 m 5386 912 l 5371 761 l 5353 884 l 5311 767 l cp
+eoclip
+n 5670 900 m 5671 897 l 5672 892 l 5674 882 l 5677 868 l 5681 849 l
+ 5686 827 l 5691 803 l 5695 776 l 5699 749 l 5702 721 l
+ 5704 693 l 5705 666 l 5703 639 l 5700 612 l 5693 586 l
+ 5683 562 l 5670 540 l 5657 525 l 5643 513 l 5628 504 l
+ 5614 496 l 5601 491 l 5588 487 l 5577 484 l 5567 482 l
+ 5557 481 l 5548 480 l 5539 480 l 5530 480 l 5520 481 l
+ 5510 482 l 5500 484 l 5488 487 l 5475 491 l 5461 496 l
+ 5446 504 l 5431 513 l 5415 525 l 5400 540 l 5384 562 l
+ 5371 586 l 5361 612 l 5354 639 l 5349 666 l 5346 693 l
+ 5345 721 l 5345 749 l 5345 776 l 5346 803 l 5348 827 l
+ 5350 849 l 5352 868 l
+ 5355 900 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5311 767 m 5353 884 l 5371 761 l 5311 767 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+2535 2775 m 2535 2715 l 2384 2715 l 2504 2745 l 2384 2775 l cp
+eoclip
+n 2115 2745 m
+ 2520 2745 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 2384 2775 m 2504 2745 l 2384 2715 l 2384 2775 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4650 2775 m 4650 2715 l 4499 2715 l 4619 2745 l 4499 2775 l cp
+eoclip
+n 4230 2745 m
+ 4635 2745 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4499 2775 m 4619 2745 l 4499 2715 l 4499 2775 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+6765 2775 m 6765 2715 l 6614 2715 l 6734 2745 l 6614 2775 l cp
+eoclip
+n 6345 2745 m
+ 6750 2745 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 6614 2775 m 6734 2745 l 6614 2715 l 6614 2775 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+1723 2417 m 1764 2462 l 1875 2360 l 1767 2419 l 1835 2316 l cp
+eoclip
+n 4905 1530 m 4905 1531 l 4905 1532 l 4905 1534 l 4905 1538 l 4906 1543 l
+ 4906 1549 l 4906 1558 l 4905 1568 l 4905 1579 l 4903 1592 l
+ 4901 1606 l 4899 1621 l 4895 1638 l 4890 1654 l 4884 1672 l
+ 4876 1690 l 4867 1708 l 4855 1727 l 4841 1746 l 4825 1765 l
+ 4806 1784 l 4783 1803 l 4757 1822 l 4727 1842 l 4692 1862 l
+ 4652 1882 l 4607 1902 l 4555 1922 l 4498 1942 l 4434 1961 l
+ 4365 1980 l 4306 1994 l 4246 2007 l 4186 2019 l 4126 2030 l
+ 4068 2040 l 4012 2048 l 3959 2055 l 3909 2060 l 3862 2064 l
+ 3818 2068 l 3778 2070 l 3740 2071 l 3706 2071 l 3673 2071 l
+ 3643 2070 l 3615 2068 l 3589 2066 l 3563 2064 l 3538 2061 l
+ 3514 2059 l 3489 2056 l 3464 2053 l 3438 2051 l 3411 2049 l
+ 3382 2047 l 3352 2046 l 3318 2045 l 3283 2045 l 3244 2045 l
+ 3201 2047 l 3156 2049 l 3106 2052 l 3053 2056 l 2997 2062 l
+ 2937 2068 l 2874 2076 l 2809 2084 l 2743 2094 l 2676 2104 l
+ 2610 2115 l 2525 2130 l 2446 2146 l 2373 2162 l 2306 2178 l
+ 2246 2193 l 2191 2208 l 2142 2223 l 2098 2238 l 2058 2252 l
+ 2022 2266 l 1989 2281 l 1959 2294 l 1932 2308 l 1907 2321 l
+ 1884 2334 l 1864 2347 l 1845 2359 l 1828 2371 l 1813 2382 l
+ 1800 2392 l 1789 2400 l 1780 2408 l 1772 2415 l 1766 2420 l
+
+ 1755 2430 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 1835 2316 m 1767 2419 l 1875 2360 l 1835 2316 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+656 1018 m 708 987 l 630 857 l 667 976 l 579 888 l cp
+eoclip
+n 540 765 m
+ 675 990 l gs 0.00 setgray ef gr gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 579 888 m 667 976 l 630 857 l 579 888 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+6914 2549 m 6963 2515 l 6876 2391 l 6921 2507 l 6827 2425 l cp
+eoclip
+n 4050 1485 m 4049 1485 l 4048 1485 l 4048 1486 l 4047 1486 l 4046 1487 l
+ 4045 1488 l 4044 1489 l 4044 1490 l 4045 1491 l 4046 1493 l
+ 4049 1495 l 4053 1498 l 4058 1500 l 4066 1504 l 4075 1507 l
+ 4087 1512 l 4102 1517 l 4119 1522 l 4141 1528 l 4166 1536 l
+ 4197 1544 l 4232 1553 l 4273 1564 l 4320 1576 l 4374 1589 l
+ 4434 1604 l 4500 1620 l 4553 1633 l 4608 1645 l 4662 1658 l
+ 4717 1670 l 4770 1682 l 4821 1693 l 4869 1703 l 4915 1712 l
+ 4958 1721 l 4998 1728 l 5035 1735 l 5070 1740 l 5102 1745 l
+ 5132 1750 l 5160 1753 l 5186 1756 l 5210 1759 l 5234 1762 l
+ 5257 1764 l 5280 1766 l 5303 1769 l 5326 1771 l 5350 1774 l
+ 5375 1777 l 5402 1781 l 5431 1786 l 5462 1791 l 5495 1798 l
+ 5531 1805 l 5571 1814 l 5613 1824 l 5659 1836 l 5708 1849 l
+ 5760 1863 l 5816 1879 l 5874 1897 l 5935 1916 l 5996 1936 l
+ 6058 1958 l 6120 1980 l 6199 2010 l 6273 2041 l 6341 2070 l
+ 6404 2100 l 6460 2128 l 6512 2155 l 6558 2182 l 6600 2207 l
+ 6637 2232 l 6672 2256 l 6703 2280 l 6732 2303 l 6758 2325 l
+ 6782 2347 l 6803 2368 l 6823 2389 l 6842 2408 l 6858 2427 l
+ 6872 2444 l 6885 2459 l 6896 2474 l 6906 2486 l 6913 2496 l
+ 6919 2504 l 6923 2510 l
+ 6930 2520 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 6827 2425 m 6921 2507 l 6876 2391 l 6827 2425 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+7089 2456 m 7143 2430 l 7079 2293 l 7103 2415 l 7025 2318 l cp
+eoclip
+n 6165 1485 m 6166 1486 l 6169 1487 l 6173 1490 l 6181 1495 l 6191 1501 l
+ 6204 1509 l 6220 1519 l 6238 1531 l 6259 1545 l 6282 1560 l
+ 6307 1576 l 6332 1593 l 6359 1612 l 6387 1631 l 6416 1651 l
+ 6445 1673 l 6475 1695 l 6506 1719 l 6538 1744 l 6570 1771 l
+ 6605 1800 l 6640 1831 l 6676 1864 l 6713 1899 l 6750 1935 l
+ 6788 1974 l 6824 2013 l 6857 2049 l 6886 2084 l 6913 2116 l
+ 6937 2147 l 6958 2176 l 6978 2203 l 6996 2230 l 7012 2255 l
+ 7027 2279 l 7041 2302 l 7054 2324 l 7065 2344 l 7075 2363 l
+ 7084 2380 l 7092 2394 l 7098 2406 l 7103 2415 l
+ 7110 2430 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 7025 2318 m 7103 2415 l 7079 2293 l 7025 2318 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+6822 2944 m 6793 2891 l 6661 2964 l 6781 2933 l 6690 3016 l cp
+eoclip
+n 3915 3060 m 3916 3060 l 3918 3061 l 3922 3062 l 3928 3064 l 3937 3067 l
+ 3949 3070 l 3965 3075 l 3983 3080 l 4006 3086 l 4031 3093 l
+ 4060 3101 l 4092 3110 l 4126 3119 l 4164 3129 l 4203 3139 l
+ 4245 3150 l 4289 3160 l 4334 3171 l 4381 3182 l 4429 3192 l
+ 4478 3203 l 4529 3213 l 4581 3223 l 4634 3232 l 4689 3241 l
+ 4745 3249 l 4802 3257 l 4862 3264 l 4923 3270 l 4987 3276 l
+ 5053 3281 l 5121 3285 l 5192 3287 l 5264 3289 l 5338 3289 l
+ 5414 3288 l 5490 3285 l 5569 3280 l 5647 3274 l 5721 3267 l
+ 5793 3258 l 5860 3248 l 5925 3237 l 5986 3226 l 6043 3214 l
+ 6098 3201 l 6150 3188 l 6200 3174 l 6247 3160 l 6292 3146 l
+ 6336 3131 l 6378 3116 l 6418 3101 l 6457 3085 l 6494 3070 l
+ 6530 3055 l 6563 3040 l 6595 3025 l 6625 3011 l 6653 2998 l
+ 6679 2985 l 6702 2974 l 6722 2963 l 6740 2954 l 6755 2946 l
+ 6767 2940 l 6777 2935 l 6784 2931 l
+ 6795 2925 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 6690 3016 m 6781 2933 l 6661 2964 l 6690 3016 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+7008 3019 m 6959 2985 l 6872 3109 l 6966 3028 l 6921 3143 l cp
+eoclip
+n 1890 3015 m 1891 3015 l 1892 3016 l 1895 3016 l 1900 3017 l 1907 3019 l
+ 1917 3021 l 1929 3024 l 1944 3027 l 1963 3031 l 1985 3036 l
+ 2011 3042 l 2040 3048 l 2073 3055 l 2109 3063 l 2149 3072 l
+ 2193 3081 l 2240 3091 l 2290 3102 l 2344 3113 l 2400 3125 l
+ 2459 3137 l 2520 3150 l 2584 3163 l 2650 3176 l 2717 3190 l
+ 2786 3204 l 2857 3218 l 2929 3232 l 3002 3246 l 3077 3260 l
+ 3152 3273 l 3228 3287 l 3305 3301 l 3382 3315 l 3460 3328 l
+ 3539 3341 l 3618 3354 l 3698 3366 l 3779 3378 l 3860 3390 l
+ 3942 3402 l 4025 3413 l 4109 3424 l 4193 3434 l 4279 3444 l
+ 4365 3453 l 4452 3462 l 4541 3470 l 4630 3478 l 4720 3485 l
+ 4811 3491 l 4902 3497 l 4994 3501 l 5085 3505 l 5176 3508 l
+ 5266 3509 l 5355 3510 l 5474 3509 l 5587 3506 l 5695 3501 l
+ 5796 3494 l 5890 3486 l 5978 3476 l 6060 3465 l 6136 3453 l
+ 6206 3440 l 6271 3426 l 6332 3411 l 6388 3395 l 6439 3379 l
+ 6487 3362 l 6532 3345 l 6574 3327 l 6612 3308 l 6649 3289 l
+ 6682 3270 l 6714 3251 l 6743 3232 l 6770 3212 l 6796 3193 l
+ 6819 3174 l 6841 3156 l 6861 3138 l 6879 3122 l 6895 3106 l
+ 6910 3091 l 6922 3077 l 6934 3065 l 6943 3054 l 6952 3044 l
+ 6958 3036 l 6964 3030 l 6968 3025 l
+ 6975 3015 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 6921 3143 m 6966 3028 l 6872 3109 l 6921 3143 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5326 2403 m 5386 2398 l 5371 2247 l 5353 2370 l 5311 2253 l cp
+eoclip
+n 5670 2386 m 5671 2383 l 5672 2378 l 5674 2368 l 5677 2354 l 5681 2335 l
+ 5686 2313 l 5691 2289 l 5695 2262 l 5699 2235 l 5702 2207 l
+ 5704 2179 l 5705 2152 l 5703 2125 l 5700 2098 l 5693 2072 l
+ 5683 2048 l 5670 2026 l 5657 2011 l 5643 1999 l 5628 1990 l
+ 5614 1982 l 5601 1977 l 5588 1973 l 5577 1970 l 5567 1968 l
+ 5557 1967 l 5548 1966 l 5539 1966 l 5530 1966 l 5520 1967 l
+ 5510 1968 l 5500 1970 l 5488 1973 l 5475 1977 l 5461 1982 l
+ 5446 1990 l 5431 1999 l 5415 2011 l 5400 2026 l 5384 2048 l
+ 5371 2072 l 5361 2098 l 5354 2125 l 5349 2152 l 5346 2179 l
+ 5345 2207 l 5345 2235 l 5345 2262 l 5346 2289 l 5348 2313 l
+ 5350 2335 l 5352 2354 l
+ 5355 2386 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5311 2253 m 5353 2370 l 5371 2247 l 5311 2253 l  cp gs 0.00 setgray ef gr  col0 s
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/fsm-change.fig b/doc/images/fsm-change.fig
new file mode 100644
index 00000000..fc9aec1c
--- /dev/null
+++ b/doc/images/fsm-change.fig
@@ -0,0 +1,101 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #8e8e8e
+6 398 2378 2122 3112
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 1260 2745 855 360 405 2385 2115 3105
+4 1 0 50 -1 16 12 0.0000 4 120 960 1260 2790 CODE\001
+-6
+6 2513 2378 4237 3112
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 3375 2745 855 360 2520 2385 4230 3105
+4 1 0 50 -1 16 12 0.0000 4 120 690 3375 2790 ACK\001
+-6
+6 4523 2378 6458 3112
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 5490 2745 855 360 4635 2385 6345 3105
+4 1 0 50 -1 16 12 0.0000 4 120 1935 5490 2790 CHECK ACK\001
+-6
+6 6705 2340 8505 3150
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 7605 2745 855 360 6750 2385 8460 3105
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 7605 2738 765 322 6840 2416 8370 3060
+4 1 0 50 -1 16 12 0.0000 4 120 1200 7605 2790 ERROR\001
+-6
+6 2513 893 4237 1627
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 3375 1260 855 360 2520 900 4230 1620
+4 1 0 50 -1 16 12 0.0000 4 120 1170 3375 1305 CHECK\001
+-6
+6 4628 893 6352 1627
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 5490 1260 855 360 4635 900 6345 1620
+4 1 0 50 -1 16 12 0.0000 4 120 1305 5490 1305 STATUS\001
+-6
+6 6705 855 8505 1665
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 7605 1260 855 360 6750 900 8460 1620
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 7605 1261 748 315 6857 946 8353 1576
+4 1 0 50 -1 16 12 0.0000 4 120 705 7605 1305 END\001
+-6
+6 360 855 2160 1665
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 1260 1260 855 360 405 900 2115 1620
+4 1 0 50 -1 16 12 0.0000 4 120 1080 1260 1305 START\001
+-6
+1 3 0 1 0 0 50 -1 20 0.000 1 0.0000 495 675 101 101 495 675 585 720
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 2115 1260 2520 1260
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4230 1260 4635 1260
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 6345 1260 6750 1260
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 5670 900 5670 540 5400 540 5355 900
+	 0.000 -1.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 2115 2745 2520 2745
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4230 2745 4635 2745
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 6345 2745 6750 2745
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 4905 1530 4365 1980 2610 2115 1755 2430
+	 0.000 -1.000 -1.000 0.000
+3 2 0 1 0 0 50 -1 20 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 540 765 675 990
+	 0.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 4050 1485 4500 1620 6120 1980 6930 2520
+	 0.000 -1.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 6165 1485 6750 1935 7110 2430
+	 0.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 3915 3060 5490 3285 6795 2925
+	 0.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 1890 3015 5355 3510 6975 3015
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 5670 2386 5670 2026 5400 2026 5355 2386
+	 0.000 -1.000 -1.000 0.000
diff --git a/doc/images/fsm-change.pdf b/doc/images/fsm-change.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..184e3c2bdadf4844173ae26bc4c00fa0d7dc74a0
GIT binary patch
literal 6686
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
LAP_Y@B<TMDHS*iN

literal 0
HcmV?d00001

diff --git a/doc/images/fsm-coedown.eps b/doc/images/fsm-coedown.eps
new file mode 100644
index 00000000..51702798
--- /dev/null
+++ b/doc/images/fsm-coedown.eps
@@ -0,0 +1,319 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: fsm-coedown.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Sat Aug  5 09:58:10 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 539 160
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.555 0.555 0.555 srgb} bind def
+
+end
+save
+newpath 0 160 moveto 0 0 lineto 539 0 lineto 539 160 lineto closepath clip newpath
+-15.8 192.8 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+	/endangle exch def
+	/startangle exch def
+	/yrad exch def
+	/xrad exch def
+	/y exch def
+	/x exch def
+	/savematrix mtrx currentmatrix def
+	x y tr xrad yrad sc 0 0 1 startangle endangle arc
+	closepath
+	savematrix setmatrix
+	} def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Ellipse
+7.500 slw
+n 360 675 101 101 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
+
+% Polyline
+2 slj
+gs  clippath
+521 1018 m 573 987 l 495 857 l 532 976 l 444 888 l cp
+eoclip
+n 405 765 m
+ 540 990 l gs 0.00 setgray ef gr gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 444 888 m 532 976 l 495 857 l 444 888 l  cp gs 0.00 setgray ef gr  col0 s
+% Ellipse
+n 1177 1253 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+1177 1298 m
+gs 1 -1 sc (START) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 3323 1253 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+3323 1298 m
+gs 1 -1 sc (REQUEST) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 5595 1253 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+5595 1298 m
+gs 1 -1 sc (CHECK) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 7845 1253 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+7845 1298 m
+gs 1 -1 sc (RESPONSE) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 7823 2693 855 360 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 7823 2700 748 315 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+7823 2738 m
+gs 1 -1 sc (END) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 4448 2693 855 360 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 4448 2700 748 315 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4448 2738 m
+gs 1 -1 sc (ERROR) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Polyline
+2 slj
+gs  clippath
+2490 1290 m 2490 1230 l 2339 1230 l 2459 1260 l 2339 1290 l cp
+eoclip
+n 2025 1260 m 2027 1260 l 2031 1260 l 2039 1260 l 2049 1260 l 2062 1260 l
+ 2076 1260 l 2094 1260 l 2114 1260 l 2139 1260 l 2169 1260 l
+ 2205 1260 l 2233 1260 l 2261 1260 l 2288 1260 l 2312 1260 l
+ 2336 1260 l 2358 1260 l 2379 1260 l 2399 1260 l 2418 1260 l
+ 2435 1260 l 2449 1260 l
+ 2475 1260 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 2339 1290 m 2459 1260 l 2339 1230 l 2339 1290 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4740 1290 m 4740 1230 l 4589 1230 l 4709 1260 l 4589 1290 l cp
+eoclip
+n 4185 1260 m
+ 4725 1260 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4589 1290 m 4709 1260 l 4589 1230 l 4589 1290 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+6990 1290 m 6990 1230 l 6839 1230 l 6959 1260 l 6839 1290 l cp
+eoclip
+n 6435 1260 m
+ 6975 1260 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 6839 1290 m 6959 1260 l 6839 1230 l 6839 1290 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5372 918 m 5431 910 l 5412 761 l 5398 884 l 5352 768 l cp
+eoclip
+n 5760 900 m 5760 897 l 5761 890 l 5763 879 l 5765 862 l 5767 842 l
+ 5768 818 l 5770 792 l 5770 765 l 5770 737 l 5768 710 l
+ 5763 683 l 5757 657 l 5747 631 l 5733 607 l 5715 585 l
+ 5698 571 l 5681 560 l 5664 551 l 5648 545 l 5634 540 l
+ 5621 537 l 5609 535 l 5599 533 l 5589 533 l 5580 533 l
+ 5571 533 l 5561 533 l 5551 535 l 5539 537 l 5526 540 l
+ 5512 545 l 5496 551 l 5479 560 l 5462 571 l 5445 585 l
+ 5427 607 l 5413 631 l 5403 657 l 5397 683 l 5392 710 l
+ 5390 737 l 5390 765 l 5390 792 l 5392 818 l 5393 842 l
+ 5395 862 l
+ 5400 900 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5352 768 m 5398 884 l 5412 761 l 5352 768 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+3900 2415 m 3948 2379 l 3857 2258 l 3905 2372 l 3809 2294 l cp
+eoclip
+n 3555 1620 m 3555 1622 l 3556 1625 l 3557 1631 l 3559 1640 l 3562 1652 l
+ 3566 1667 l 3570 1684 l 3575 1704 l 3580 1725 l 3587 1748 l
+ 3593 1772 l 3601 1798 l 3610 1824 l 3619 1853 l 3630 1883 l
+ 3643 1915 l 3657 1950 l 3673 1987 l 3690 2025 l 3708 2063 l
+ 3727 2098 l 3744 2131 l 3761 2161 l 3777 2189 l 3793 2214 l
+ 3808 2238 l 3823 2260 l 3837 2280 l 3850 2299 l 3863 2317 l
+ 3875 2333 l 3886 2347 l 3895 2359 l 3903 2369 l
+ 3915 2385 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 3809 2294 m 3905 2372 l 3857 2258 l 3809 2294 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5038 2379 m 5086 2415 l 5177 2294 l 5081 2372 l 5129 2258 l cp
+eoclip
+n 5431 1620 m 5431 1622 l 5430 1625 l 5429 1631 l 5427 1640 l 5424 1652 l
+ 5420 1667 l 5416 1684 l 5411 1704 l 5406 1725 l 5399 1748 l
+ 5393 1772 l 5385 1798 l 5376 1824 l 5367 1853 l 5356 1883 l
+ 5343 1915 l 5329 1950 l 5313 1987 l 5296 2025 l 5278 2063 l
+ 5259 2098 l 5242 2131 l 5225 2161 l 5209 2189 l 5193 2214 l
+ 5178 2238 l 5163 2260 l 5149 2280 l 5136 2299 l 5123 2317 l
+ 5111 2333 l 5100 2347 l 5091 2359 l 5083 2369 l
+ 5071 2385 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5129 2258 m 5081 2372 l 5177 2294 l 5129 2258 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+3655 2641 m 3664 2582 l 3514 2561 l 3629 2608 l 3505 2620 l cp
+eoclip
+n 1620 1575 m 1621 1576 l 1622 1577 l 1625 1581 l 1629 1586 l 1635 1593 l
+ 1643 1602 l 1653 1613 l 1665 1627 l 1680 1643 l 1696 1661 l
+ 1714 1680 l 1734 1702 l 1756 1725 l 1779 1748 l 1804 1773 l
+ 1830 1799 l 1858 1825 l 1887 1852 l 1918 1879 l 1950 1907 l
+ 1984 1935 l 2021 1964 l 2059 1993 l 2100 2023 l 2144 2054 l
+ 2191 2086 l 2241 2118 l 2295 2151 l 2352 2184 l 2413 2217 l
+ 2475 2250 l 2535 2280 l 2595 2308 l 2654 2335 l 2711 2359 l
+ 2767 2382 l 2821 2403 l 2874 2422 l 2925 2440 l 2974 2456 l
+ 3021 2471 l 3068 2485 l 3113 2498 l 3157 2510 l 3200 2521 l
+ 3242 2531 l 3283 2541 l 3323 2550 l 3362 2558 l 3399 2565 l
+ 3434 2572 l 3467 2579 l 3498 2585 l 3526 2590 l 3552 2594 l
+ 3574 2598 l 3593 2601 l 3609 2604 l 3621 2606 l 3631 2608 l
+
+ 3645 2610 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 3505 2620 m 3629 2608 l 3514 2561 l 3505 2620 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5295 2582 m 5304 2641 l 5454 2620 l 5331 2608 l 5445 2561 l cp
+eoclip
+n 7340 1575 m 7339 1576 l 7338 1577 l 7335 1581 l 7331 1586 l 7325 1593 l
+ 7317 1602 l 7307 1613 l 7295 1627 l 7280 1643 l 7264 1661 l
+ 7246 1680 l 7226 1702 l 7204 1725 l 7181 1748 l 7156 1773 l
+ 7130 1799 l 7102 1825 l 7073 1852 l 7042 1879 l 7010 1907 l
+ 6976 1935 l 6939 1964 l 6901 1993 l 6860 2023 l 6816 2054 l
+ 6769 2086 l 6719 2118 l 6665 2151 l 6608 2184 l 6547 2217 l
+ 6485 2250 l 6425 2280 l 6365 2308 l 6306 2335 l 6249 2359 l
+ 6193 2382 l 6139 2403 l 6086 2422 l 6035 2440 l 5986 2456 l
+ 5939 2471 l 5892 2485 l 5847 2498 l 5803 2510 l 5760 2521 l
+ 5718 2531 l 5677 2541 l 5637 2550 l 5598 2558 l 5561 2565 l
+ 5526 2572 l 5493 2579 l 5462 2585 l 5434 2590 l 5408 2594 l
+ 5386 2598 l 5367 2601 l 5351 2604 l 5339 2606 l 5329 2608 l
+
+ 5315 2610 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5445 2561 m 5331 2608 l 5454 2620 l 5445 2561 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+7800 2355 m 7860 2355 l 7860 2204 l 7830 2324 l 7800 2204 l cp
+eoclip
+n 7830 1620 m
+ 7830 2340 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 7800 2204 m 7830 2324 l 7860 2204 l 7800 2204 l  cp gs 0.00 setgray ef gr  col0 s
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/fsm-coedown.fig b/doc/images/fsm-coedown.fig
new file mode 100644
index 00000000..fbc197c8
--- /dev/null
+++ b/doc/images/fsm-coedown.fig
@@ -0,0 +1,79 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #8e8e8e
+6 225 540 540 990
+1 3 0 1 0 0 50 -1 20 0.000 1 0.0000 360 675 101 101 360 675 450 720
+3 2 0 1 0 0 50 -1 20 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 405 765 540 990
+	 0.000 0.000
+-6
+6 315 886 2039 1620
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 1177 1253 855 360 322 893 2032 1613
+4 1 0 50 -1 16 12 0.0000 4 120 1080 1177 1298 START\001
+-6
+6 2461 886 4185 1620
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 3323 1253 855 360 2468 893 4178 1613
+4 1 0 50 -1 16 12 0.0000 4 120 1605 3323 1298 REQUEST\001
+-6
+6 4733 886 6457 1620
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 5595 1253 855 360 4740 893 6450 1613
+4 1 0 50 -1 16 12 0.0000 4 120 1170 5595 1298 CHECK\001
+-6
+6 6915 886 8775 1620
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 7845 1253 855 360 6990 893 8700 1613
+4 1 0 50 -1 16 12 0.0000 4 120 1860 7845 1298 RESPONSE\001
+-6
+6 6930 2295 8685 3060
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 7823 2693 855 360 6968 2333 8678 3053
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 7823 2700 748 315 7075 2385 8571 3015
+4 1 0 50 -1 16 12 0.0000 4 120 705 7823 2738 END\001
+-6
+6 3555 2295 5310 3060
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4448 2693 855 360 3593 2333 5303 3053
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4448 2700 748 315 3700 2385 5196 3015
+4 1 0 50 -1 16 12 0.0000 4 120 1200 4448 2738 ERROR\001
+-6
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 2025 1260 2205 1260 2475 1260
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4185 1260 4725 1260
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 6435 1260 6975 1260
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 5760 900 5715 585 5445 585 5400 900
+	 0.000 -1.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 3555 1620 3690 2025 3915 2385
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5431 1620 5296 2025 5071 2385
+	 0.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 1620 1575 2475 2250 3645 2610
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 7340 1575 6485 2250 5315 2610
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 7830 1620 7830 2340
+	 0.000 0.000
diff --git a/doc/images/fsm-coedown.pdf b/doc/images/fsm-coedown.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..04ffa7ebbda6e1d9f2fc9bc50904a99d73355438
GIT binary patch
literal 4305
zcmZ`-c_37K8@9*TA|quxWbDjX#&T_8Y*S+}q7V&+84WYdjHRL^29cdhwnAK6X`y6a
zLL!5br7Y1xL?H?F&2+on@4Mgkoj=Ywzvp@1_xJwZ_dS0+2jYOR*3i<_0YSPKlZ!xb
z00xk}13<>c(8IVOe;OXpV<JvaYXXsmqX1BAB9?|j;Cx8FI8##)l}5o~13_VVFWped
z8a9G2r@RIa^%Rw>HZ*7LE;wj`>}iZY3b<TM+uf8Pc64RKuzTImq*!@18{F&dxfN3H
zp}F;CG`~<N^lQh*mTw#L=eGJSO`E@O^h-}oZGTM8{hf@w5u2=;2a(!<3}y^C3oXy7
z!(Sa+*q7w|BrjYh8LgkH6XO&M6nMgWJxmL?c+mGCso@qMop)n?J2E1)vpKJadY6Wy
z4U<hehnE_lL1*4vm6Q2ipR+3|)@-{)=5y>s_XOJDI{L}XVdKRz_lyTS9p}DA>ql6t
z&(Xd(4CUx}3OiuxFCX&%BaBZnzrI~T<@H)jS{{1&e(mo%T*xRhj8Muno641imhe;C
zt1g><N5T-p^D&y5?55M+Wo55WFHi>Owjrc*jS;KfWm_jl8t;CIi5OjPavq#2@Sf!H
zG`@4pOhM?uE5}P6OBuyyY(HA4Q;_ScoActx&Mj?7g~xPk)aGbt*aMWEZ4|iMf$g!p
zc%t;z+2O!!2KR7l^Y)o&aa)aJ-_}j!d+(j!Fhg(5h9*Y}zgsQim0$kY;C>N&9+1?2
z1vc9pwlk4gzULJYzP;2jdsFs&V?<b|2~YnDaa2kVveYOC)cE9oSUHknOrU0?d)U;o
zNwz4DL2zI9=>nB~N*_RU%dbMi*p6t;Y#yQWUP&<RWx;cwdI(>3atdWk!&jGLlOJPx
zTs_ug+%Q8zs(hd4zy=)bn9$RpdXM`jY%Tb5)aaGnv&KCcYsEs`FZcMw&X;4`zeGqF
zWO*g6>?;rz4p)7hQ`Wpa8w>reyCVi+gMN;?k`~hUuD4ge-!}PvY`QAIxJe$mI{a{H
zN^N!VmTXYfdw<zWWhCN6YI;Xe^XGt7e*-%CSdpj2yV=5)Zws@r{rWfZ*yYr?Zu&M8
zM1`|m*U3W2tml>k3(p`@2jpUR!b{InrY~*sWMUsOU<KVWG)%hf;iJ^U+_$c#WY$`p
zFRgqaa$Gxc5p<&rKY7Xg!pRhQUrx2r-C+ar0vei6@9;z$O1*wQ*rg+I`9^`;bIEI2
z!{Ot)iEo>^(IZ^8TvfcxhD8mECl;^!%T({vQt0TpHbc2Iz{iEirox71l<dTLWt+e5
zw2O=|OD7=k=zg2SvqJMXg0Ur4=iCLj%<p0!hI2kkQ!Ax^YYf8Meg)fe@6g|h>+qER
zN-Ifp8SCVx1>>6K;S}kqHj>@CA;H_;sPSGf8IQWHyY}|9xg{)!tSq5#oUG?_LgH5v
zaTg*rDk}$kre|i}$L`~9$(E=HExS;VT#~<m;;@hA=KzatD}FufBwZ{OR$4PXW`r8>
zrO$;IJh^<T`3Wj-$|e2dv6GZR%J;E+&vE_Fito=V9U)=Is`Kc91CV`2(E_(qw>4Fw
z8~Ur(d)1n`Bvt16AOAj0KkB9Vp;5K|`wLU(<q6|W`zw>LdOTyh&+VLg=W=shHwgw|
zFE2fP2j8@MNtpZcNcp){Ipon72kvgJRLp(5BiW=&qP{v?ekNgWjFFhOI0UWaL65$X
zTy5^`J)&eQ{{?ZvXk<dle5>zqW@1qRit#|9vB;m1pa#yz!CbgZGS8~VFRho`?XT>^
zAGyL69!FD|UA$(;=sL<t|D=d2;^~XZ(pnF7@L~JB(2-MX*Sbd7UvWctK*6_Sb4+#3
z%5o^g75}8)V#O2NAmnT92(vSA#GL{s2}Fucf?TXFzr-lVgcxa!=$uK9GZaLH6GBx%
zi7tyWx!??g20>XYx;C`LMa&SHL2Or8k#NoIYst7OQx{5vLl`}n&hf022NT7&pvY0f
zH~ylGf$Zm^gwU3G0X>h=jdhpDArpC{b0@}R1Nc*dt*2#7Zg0u~c?I>VB_Fcq?djf^
z8Xl)^ly&a7ad<r0Q&nkcVhUe;F3I?CtHoUo2GKeEreYtGy}zoT%kO?_Mf{XyTCnS|
zz-PMX^X>aBSr*Vci&vc4;zNhlO4F?9{CPZ&IRT0L{N<@>0<%@dzSA#L8y<A|10rwH
zHQHeF=-N=*x2;hJlk)2CU+nY})|)z#+=AU`xhG1uf3)9qmrF{NU@@JmYVf18qWLYw
zOb(Eq9e{9s%f?@C7cJ+dI`8ZS9tamhKnaz6pnQyWEIv@giC^C{(&}1ud0wM5{>C(e
zp^#JWMOLT{<7rr*LqH<)kOa}$2JXeGQF-C<X!XbH8Vk7!1qNYHc&naH&Nw`h-FIz(
zkZxDi)`LhJ7rO|F((-M*Qd?~yKAn%q_`^?oC{7FHO)Qp0GRhAOk|WcpHb}BBoAoOm
zl;CY+b3w!KI#&)4zT12Fm!E}8jUF#Lk6LV>XlfT?T#gfcl`G@)sZ~?3e)<YmeA<x6
z<=E^Ca=&?F=9X%!53Y)Mx;6EeDr1G?S}%qo1D4rLSCB<*s7Og@Q#_;eciR}{i}3Q7
zo>yBw3VrIl{?vQ;mYI$Dy*c4U#p>jTD*eZ-lQln{IS()O>fA|CRx&%o{E$?aZiqys
zmK+4xNcHQavI`U(n2gxfxCj66_8}=GHYxY`*}!EY_Vs*PqA{HBx0KAXlrTw5zp=DK
z%O__Ep;KsQThRj~h^j(+O<}yMfa=&D@Vjij(`t@_&;(-qZ{!F?RW6r7m!hI~;5ThZ
zXWOdr8wl=R>-H|BGvAXdS2F*2Rf!5^(g_-UiOj`Pq<awvv-c`&4_G746z%-<gj&6t
z<HH2UP9}K~u)K$`%8gGLU>ccePe(GD8GDDLenlV=F-Ryx)uQv#TcmTYX!|ZTjNFVM
zG3U}dhun<5!&WQc$<|(H+i0usQq^oLc{elkvy+LFUJ0|V-aGrp)N7VY7Es`kJDL-D
ztvu49$chLt4rB@as^<Pnsl?#0HN2FeZCh|Oou1UxD#H7o;4^bmY&0rw&P9r5*)7eX
zRfuUt^A#R$m#A((s-|e3sS+Mr+#8VQU1%4ee7R>Y#lY89@QhoMcxSL+-t||4MttY=
z&UVwlq9gA1zS6Vl8}_~@=BotI3)RZ`afnv-)D8vp3|J+(xho&<56}@tqFl(?_N*=V
znArL2=lT^2A304;G(AI#CgeSw@(xXCmyuXDqzYVDWZyxg&FPAD>`I#Lt?D$`GMHlw
z@;aG~4JsdOt_ip}arO|~$uX(6*7ergGbD%vo4ZH4!pRQN7Sqi-kcafU$YH$%lT==u
zb}Bs~(8`0$6EP(2voyWi`q%+CW&f&|oO4w#*l@dXigur$DHVlvhftDE$Qu_{>$7!=
zsa5NIY^rrixhlN+hPpz=%Hz4@C4^45qsAZKgoCQq;->KT-tQ^qtR!=3`F=u})qt-K
zsXTn683{kcw)o-c;-kFIXv<NYgy8y`neHLA>z^Y;Pw}#A%48q1o9P~;)HE%XsS_0!
z+D`kz8`mM@HtuU!U<eh}Z=w{go#%KeId61kw+YWzn*(y=HbyR1YU!3+-ZOz4$eu_U
zdd6`WuZsc~r#Vj(b@9=)U1L`-^VX1yt73W`Z>Jjmei%LNUu7*N-Rf$1KPGg)M9pht
z$`|vjF54{in}Rrr3l_YO((P_H&F)1wXIXzSHY&Q?k@$AQ?}?2gWvJxPK-=4Is-{h?
zHEQ0e>P-nn`i>A64<09*2~%O4Mgc_K2VJW8osfgUp}DB0h~tWZx^{-C&+jtCIdHpb
z86yf<PWRVg=IuOn%DKj~oo>cTdS~{Wlp}XFDUPTbH9PB79l;e#GVgEXvimsP$pu6M
z!#0;k`y7jvMk}V5?q1M%I&?p#ws+Yhu9~~9R}S-{%_RpN`Iz}WAMm10d>ekpK(pq^
zBs<LSg2pIYQq6^G9tM|c!HLQ^`8PWp?vParM~@SgGRLeG@|lmlC6c46)VMI?HW%q#
z&XOY)oW$1YnA(Nb{4XLWy{jYVOuOC6*M{kJPAR2}=fwL}@rw^hc(oWzvUFff66e%Q
zWiinSQ+xZnnTwiuHNJ==eUjrKvt#%d4Dn}jE5%(F?(q+G(RVW?0xj+_#1{@&(ympL
z)h}AA-<2M2jj1aN@X3j(Yme(Zu5lM^kZ4}R80m6vCgP2{-1!5$*8;9p$K6qxw3yJ!
zal@-cvv1LK8R96!%-c`#btBpeFBu`ay!?SNauV<9b&)AO{d>ogc(5H{z1N@nDK-=Q
z<1f6-i}#X)+mvz@cLv-hb?*#l?LXaJn_|PUOUJw${isYOep}XtSW;Rw6DQ4~z?)`w
zrC|L@Qti(Avow3|R71&zT{n>*ZU(IlWxpTEd(o0!A=_8;onyZ8K{77L_oqZ*zOiHt
zOU$sII@;QB&`(VFZ^`3)nv8=wVEu7W6wa4`wIGE7?l2||*D(aN^kBz9Op<~Nq5(QA
zQ3QfI;i#lwiVu#;luHg2k`D$)bB8ho6##X{h0&PiR$(+742>z70K-2$tVv97Emlk?
z5K}-wEtzX(Kq|lzUO%9pS+REbQ;0ExG1CHm<V6LbhX}q@z#YWO+6i<VU`7aLg=9th
z>8kb1^{1yLmWCyg{QnB^XYzmB>;I?y-${d@Xa^LaWor5}FzXCI#i5fvh~?(=ca$H8
z`inIH8T=>9TK*(0uv8qY3{YDfF$6~=_+Wpe31wj*C??pO#_9s=%*>ttI+OO_{>(!A
z2K(SB%2pT$zy?pE(x^TZ0+|LFXllV#m?dRuQW}92gkY9k8S$Go45kM&fWcvga06`^
zlSh$!{~zT{pb>G(e$+q>9}>=&6dI)INAUkEB#ENTTxt8_LI4*Wh05Fk(9zTe9I!MW
zJP{XyBLcciQ}bXNo@Gfs7!XV*ur#xWvNe%JAz*_52ND(Mp`!Auo?#T69|#6$X@OwB
zE<g_s*MS3mz)wtvHG4l;Am|sS4`=q6b^RNrYrveUe_%Q~|AoO|TFg=VryZ+#|G?k|
z%m)7h)B9hTHnX??w1fYfFO7mF5OEadF9iUKA)LW6&kI1ENF?UavStK;+6DQM09J#U
zUz8mJa90j9TSA>zvg_jSJm?K68JSo4Z{#>@-l;S!h4!O}I)-|>APB??Z4LStwiZfO

literal 0
HcmV?d00001

diff --git a/doc/images/fsm-eoe.eps b/doc/images/fsm-eoe.eps
new file mode 100644
index 00000000..db9f5e38
--- /dev/null
+++ b/doc/images/fsm-eoe.eps
@@ -0,0 +1,282 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: fsm-eoe.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Tue Aug  1 18:22:14 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 386 160
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.555 0.555 0.555 srgb} bind def
+
+end
+save
+newpath 0 160 moveto 0 0 lineto 386 0 lineto 386 160 lineto closepath clip newpath
+-23.6 189.9 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+	/endangle exch def
+	/startangle exch def
+	/yrad exch def
+	/xrad exch def
+	/y exch def
+	/x exch def
+	/savematrix mtrx currentmatrix def
+	x y tr xrad yrad sc 0 0 1 startangle endangle arc
+	closepath
+	savematrix setmatrix
+	} def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Ellipse
+7.500 slw
+n 1260 1260 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+1260 1305 m
+gs 1 -1 sc (RX_START) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 495 675 101 101 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
+
+% Polyline
+2 slj
+gs  clippath
+656 1018 m 708 987 l 630 857 l 667 976 l 579 888 l cp
+eoclip
+n 540 765 m
+ 675 990 l gs 0.00 setgray ef gr gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 579 888 m 667 976 l 630 857 l 579 888 l  cp gs 0.00 setgray ef gr  col0 s
+% Ellipse
+n 3457 1260 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+3457 1305 m
+gs 1 -1 sc (RX_CHECK) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 5610 1260 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+5610 1305 m
+gs 1 -1 sc (RX_FETCH) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 2347 2648 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+2347 2693 m
+gs 1 -1 sc (TX_START) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 4538 2648 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4538 2693 m
+gs 1 -1 sc (TX_SENT) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Polyline
+2 slj
+gs  clippath
+2625 1290 m 2625 1230 l 2474 1230 l 2594 1260 l 2474 1290 l cp
+eoclip
+n 2115 1260 m
+ 2610 1260 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 2474 1290 m 2594 1260 l 2474 1230 l 2474 1290 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4785 1290 m 4785 1230 l 4634 1230 l 4754 1260 l 4634 1290 l cp
+eoclip
+n 4230 1260 m
+ 4770 1260 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4634 1290 m 4754 1260 l 4634 1230 l 4634 1290 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+1816 972 m 1848 1023 l 1976 941 l 1859 981 l 1944 891 l cp
+eoclip
+n 5040 990 m 5039 990 l 5037 988 l 5034 987 l 5029 983 l 5021 979 l
+ 5011 973 l 4998 966 l 4982 957 l 4964 946 l 4942 934 l
+ 4917 920 l 4889 905 l 4859 888 l 4826 871 l 4791 853 l
+ 4754 833 l 4714 814 l 4673 794 l 4631 773 l 4587 753 l
+ 4541 733 l 4494 713 l 4446 693 l 4397 674 l 4346 655 l
+ 4294 637 l 4240 619 l 4184 603 l 4126 587 l 4067 571 l
+ 4005 557 l 3940 544 l 3873 532 l 3803 522 l 3731 513 l
+ 3656 505 l 3579 500 l 3500 496 l 3420 495 l 3340 496 l
+ 3262 500 l 3185 505 l 3111 513 l 3039 522 l 2970 532 l
+ 2904 544 l 2841 557 l 2780 571 l 2722 587 l 2666 603 l
+ 2611 619 l 2559 637 l 2508 655 l 2459 674 l 2412 693 l
+ 2365 713 l 2320 733 l 2277 753 l 2235 773 l 2194 794 l
+ 2155 814 l 2117 833 l 2082 853 l 2048 871 l 2017 888 l
+ 1988 905 l 1962 920 l 1938 934 l 1917 946 l 1900 957 l
+ 1885 966 l 1872 973 l 1863 979 l 1856 983 l
+ 1845 990 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 1944 891 m 1859 981 l 1976 941 l 1944 891 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+2716 2322 m 2748 2373 l 2876 2291 l 2759 2331 l 2844 2241 l cp
+eoclip
+n 4950 1485 m 4949 1485 l 4947 1486 l 4942 1487 l 4936 1488 l 4926 1490 l
+ 4914 1493 l 4898 1497 l 4879 1501 l 4856 1506 l 4831 1512 l
+ 4802 1519 l 4771 1526 l 4737 1535 l 4702 1543 l 4664 1553 l
+ 4625 1562 l 4585 1573 l 4543 1584 l 4500 1595 l 4456 1607 l
+ 4410 1620 l 4363 1633 l 4315 1647 l 4266 1662 l 4215 1678 l
+ 4162 1694 l 4106 1712 l 4049 1731 l 3990 1752 l 3928 1773 l
+ 3865 1796 l 3800 1820 l 3735 1845 l 3667 1872 l 3601 1899 l
+ 3537 1925 l 3478 1951 l 3421 1976 l 3368 2000 l 3318 2023 l
+ 3271 2045 l 3227 2067 l 3185 2088 l 3145 2109 l 3107 2129 l
+ 3071 2148 l 3036 2167 l 3003 2186 l 2971 2204 l 2941 2221 l
+ 2913 2238 l 2886 2253 l 2862 2268 l 2839 2282 l 2819 2294 l
+ 2801 2305 l 2786 2314 l 2774 2322 l 2764 2328 l 2756 2333 l
+
+ 2745 2340 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 2844 2241 m 2759 2331 l 2876 2291 l 2844 2241 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+1926 1452 m 1914 1511 l 2062 1542 l 1951 1488 l 2074 1483 l cp
+eoclip
+n 4095 2340 m 4094 2339 l 4093 2338 l 4089 2336 l 4085 2333 l 4078 2328 l
+ 4068 2322 l 4057 2314 l 4043 2305 l 4026 2294 l 4008 2282 l
+ 3987 2268 l 3964 2253 l 3939 2238 l 3912 2221 l 3884 2204 l
+ 3854 2186 l 3823 2167 l 3790 2148 l 3756 2129 l 3720 2109 l
+ 3682 2088 l 3642 2067 l 3600 2045 l 3555 2023 l 3507 2000 l
+ 3456 1976 l 3401 1951 l 3343 1925 l 3281 1899 l 3217 1872 l
+ 3150 1845 l 3086 1820 l 3023 1796 l 2960 1773 l 2899 1752 l
+ 2841 1731 l 2784 1712 l 2729 1694 l 2676 1678 l 2625 1662 l
+ 2575 1647 l 2527 1633 l 2481 1620 l 2435 1607 l 2391 1595 l
+ 2347 1584 l 2305 1573 l 2264 1562 l 2225 1553 l 2187 1543 l
+ 2150 1535 l 2117 1526 l 2085 1519 l 2056 1512 l 2030 1506 l
+ 2007 1501 l 1988 1497 l 1972 1493 l 1959 1490 l 1949 1488 l
+
+ 1935 1485 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 2074 1483 m 1951 1488 l 2062 1542 l 2074 1483 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+3705 2685 m 3705 2625 l 3554 2625 l 3674 2655 l 3554 2685 l cp
+eoclip
+n 3195 2655 m
+ 3690 2655 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3554 2685 m 3674 2655 l 3554 2625 l 3554 2685 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5286 2450 m 5304 2508 l 5448 2462 l 5325 2470 l 5430 2405 l cp
+eoclip
+n 5310 2835 m 5313 2836 l 5318 2838 l 5328 2841 l 5342 2845 l 5361 2850 l
+ 5383 2856 l 5407 2863 l 5434 2869 l 5461 2874 l 5489 2878 l
+ 5517 2881 l 5544 2881 l 5571 2880 l 5598 2874 l 5624 2866 l
+ 5648 2853 l 5670 2835 l 5686 2816 l 5699 2794 l 5709 2773 l
+ 5716 2752 l 5721 2733 l 5725 2715 l 5727 2699 l 5729 2684 l
+ 5730 2669 l 5730 2655 l 5730 2641 l 5729 2626 l 5727 2611 l
+ 5725 2595 l 5721 2577 l 5716 2558 l 5709 2537 l 5699 2516 l
+ 5686 2494 l 5670 2475 l 5648 2457 l 5624 2444 l 5598 2436 l
+ 5571 2430 l 5544 2429 l 5517 2429 l 5489 2432 l 5461 2436 l
+ 5434 2441 l 5407 2447 l 5383 2454 l 5361 2460 l 5342 2465 l
+
+ 5310 2475 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5430 2405 m 5325 2470 l 5448 2462 l 5430 2405 l  cp gs 0.00 setgray ef gr  col0 s
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/fsm-eoe.fig b/doc/images/fsm-eoe.fig
new file mode 100644
index 00000000..09c1a631
--- /dev/null
+++ b/doc/images/fsm-eoe.fig
@@ -0,0 +1,65 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #8e8e8e
+6 398 893 2123 1627
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 1260 1260 855 360 405 900 2115 1620
+4 1 0 50 -1 16 12 0.0000 4 150 1725 1260 1305 RX_START\001
+-6
+6 360 540 675 990
+1 3 0 1 0 0 50 -1 20 0.000 1 0.0000 495 675 101 101 495 675 585 720
+3 2 0 1 0 0 50 -1 20 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 540 765 675 990
+	 0.000 0.000
+-6
+6 2550 893 4365 1627
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 3457 1260 855 360 2602 900 4312 1620
+4 1 0 50 -1 16 12 0.0000 4 150 1815 3457 1305 RX_CHECK\001
+-6
+6 4740 893 6480 1627
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 5610 1260 855 360 4755 900 6465 1620
+4 1 0 50 -1 16 12 0.0000 4 150 1740 5610 1305 RX_FETCH\001
+-6
+6 1485 2250 3240 3015
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 2347 2648 855 360 1492 2288 3202 3008
+4 1 0 50 -1 16 12 0.0000 4 150 1680 2347 2693 TX_START\001
+-6
+6 3676 2281 5400 3015
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4538 2648 855 360 3683 2288 5393 3008
+4 1 0 50 -1 16 12 0.0000 4 150 1485 4538 2693 TX_SENT\001
+-6
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 2115 1260 2610 1260
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4230 1260 4770 1260
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5040 990 3420 495 1845 990
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 4950 1485 3735 1845 2745 2340
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 4095 2340 3150 1845 1935 1485
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 3195 2655 3690 2655
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 5310 2835 5670 2835 5670 2475 5310 2475
+	 0.000 -1.000 -1.000 0.000
diff --git a/doc/images/fsm-eoe.pdf b/doc/images/fsm-eoe.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..991034d590a32eeec42b18222eeb00b98fe22a78
GIT binary patch
literal 4068
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

literal 0
HcmV?d00001

diff --git a/doc/images/fsm-idle.eps b/doc/images/fsm-idle.eps
new file mode 100644
index 00000000..8a26be0f
--- /dev/null
+++ b/doc/images/fsm-idle.eps
@@ -0,0 +1,479 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: fsm-idle.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Wed Jul 19 16:13:27 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 391 279
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.555 0.555 0.555 srgb} bind def
+/col33 {0.000 0.000 0.000 srgb} bind def
+
+end
+save
+newpath 0 279 moveto 0 0 lineto 391 0 lineto 391 279 lineto closepath clip newpath
+-73.9 314.6 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+	/endangle exch def
+	/startangle exch def
+	/yrad exch def
+	/xrad exch def
+	/y exch def
+	/x exch def
+	/savematrix mtrx currentmatrix def
+	x y tr xrad yrad sc 0 0 1 startangle endangle arc
+	closepath
+	savematrix setmatrix
+	} def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Ellipse
+7.500 slw
+n 4275 1260 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4275 1305 m
+gs 1 -1 sc (START) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 4282 3503 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4282 3465 m
+gs 1 -1 sc (READ) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+4282 3690 m
+gs 1 -1 sc (STATES) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 2482 4628 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+2482 4590 m
+gs 1 -1 sc (CONFIGURE) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+2482 4815 m
+gs 1 -1 sc (SLAVES) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 4275 2378 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4275 2423 m
+gs 1 -1 sc (BROADCAST) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 6082 4628 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+6082 4590 m
+gs 1 -1 sc (WRITE) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+6082 4815 m
+gs 1 -1 sc (EEPROM) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 6068 1838 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+6068 1800 m
+gs 1 -1 sc (SCAN FOR) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+6068 2025 m
+gs 1 -1 sc (SLAVES) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 3510 675 101 101 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
+
+% Polyline
+2 slj
+gs  clippath
+3671 1018 m 3723 987 l 3645 857 l 3682 976 l 3594 888 l cp
+eoclip
+n 3555 765 m
+ 3690 990 l gs 0.00 setgray ef gr gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3594 888 m 3682 976 l 3645 857 l 3594 888 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4245 2040 m 4305 2040 l 4305 1889 l 4275 2009 l 4245 1889 l cp
+eoclip
+n 4275 1620 m
+ 4275 2025 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4245 1889 m 4275 2009 l 4305 1889 l 4245 1889 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4245 3165 m 4305 3165 l 4305 3014 l 4275 3134 l 4245 3014 l cp
+eoclip
+n 4275 2745 m
+ 4275 3150 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4245 3014 m 4275 3134 l 4305 3014 l 4245 3014 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+3517 3362 m 3532 3304 l 3385 3266 l 3494 3326 l 3370 3325 l cp
+eoclip
+n 3510 3690 m 3508 3691 l 3502 3692 l 3493 3694 l 3479 3698 l 3461 3702 l
+ 3439 3707 l 3413 3713 l 3385 3718 l 3355 3724 l 3325 3729 l
+ 3293 3733 l 3262 3735 l 3231 3737 l 3201 3736 l 3170 3733 l
+ 3140 3727 l 3112 3718 l 3084 3706 l 3060 3690 l 3041 3672 l
+ 3026 3653 l 3015 3634 l 3005 3615 l 2999 3597 l 2994 3580 l
+ 2990 3564 l 2988 3550 l 2986 3536 l 2985 3523 l 2985 3510 l
+ 2985 3497 l 2986 3484 l 2988 3470 l 2990 3456 l 2994 3440 l
+ 2999 3423 l 3005 3405 l 3015 3386 l 3026 3367 l 3041 3348 l
+ 3060 3330 l 3084 3314 l 3112 3302 l 3140 3293 l 3170 3287 l
+ 3201 3284 l 3231 3283 l 3262 3285 l 3293 3287 l 3325 3291 l
+ 3355 3296 l 3385 3302 l 3413 3307 l 3439 3313 l 3461 3318 l
+ 3479 3322 l
+ 3510 3330 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3370 3325 m 3494 3326 l 3385 3266 l 3370 3325 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+4383 920 m 4442 908 l 4411 760 l 4407 884 l 4353 772 l cp
+eoclip
+n 4770 945 m 4771 942 l 4773 935 l 4777 924 l 4782 907 l 4787 887 l
+ 4794 863 l 4800 837 l 4805 810 l 4809 782 l 4811 755 l
+ 4810 728 l 4807 702 l 4799 676 l 4787 652 l 4770 630 l
+ 4751 614 l 4730 603 l 4710 594 l 4691 588 l 4673 584 l
+ 4657 582 l 4643 581 l 4629 581 l 4616 581 l 4603 582 l
+ 4590 584 l 4575 586 l 4558 589 l 4540 593 l 4520 599 l
+ 4499 606 l 4476 617 l 4455 630 l 4437 646 l 4422 665 l
+ 4411 684 l 4404 704 l 4399 725 l 4396 745 l 4394 766 l
+ 4395 787 l 4396 807 l 4398 827 l 4400 846 l 4403 862 l
+ 4405 876 l
+ 4410 900 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 4353 772 m 4407 884 l 4411 760 l 4353 772 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+3212 4435 m 3240 4488 l 3374 4417 l 3254 4447 l 3346 4364 l cp
+eoclip
+n 3825 3825 m 3825 3826 l 3825 3829 l 3825 3833 l 3825 3840 l 3825 3849 l
+ 3825 3860 l 3824 3873 l 3823 3888 l 3821 3904 l 3818 3921 l
+ 3813 3939 l 3807 3959 l 3800 3979 l 3789 4002 l 3777 4025 l
+ 3761 4051 l 3741 4079 l 3718 4109 l 3690 4140 l 3662 4168 l
+ 3633 4196 l 3604 4222 l 3575 4246 l 3546 4268 l 3518 4289 l
+ 3490 4308 l 3463 4327 l 3435 4344 l 3408 4361 l 3382 4376 l
+ 3357 4391 l 3333 4405 l 3311 4417 l 3291 4428 l 3275 4437 l
+ 3261 4444 l
+ 3240 4455 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3346 4364 m 3254 4447 l 3374 4417 l 3346 4364 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+3946 1587 m 3906 1542 l 3793 1643 l 3903 1586 l 3833 1688 l cp
+eoclip
+n 3870 2070 m 3869 2069 l 3866 2067 l 3860 2063 l 3853 2057 l 3843 2050 l
+ 3832 2041 l 3820 2030 l 3807 2018 l 3794 2005 l 3781 1991 l
+ 3770 1975 l 3759 1959 l 3750 1940 l 3742 1920 l 3737 1897 l
+ 3734 1872 l 3735 1845 l 3739 1818 l 3747 1791 l 3756 1766 l
+ 3768 1743 l 3781 1721 l 3795 1701 l 3809 1682 l 3825 1664 l
+ 3840 1647 l 3856 1631 l 3871 1616 l 3884 1603 l 3895 1593 l
+
+ 3915 1575 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 3833 1688 m 3903 1586 l 3793 1643 l 3833 1688 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+3677 1494 m 3633 1453 l 3530 1564 l 3634 1497 l 3574 1605 l cp
+eoclip
+n 3600 3285 m 3599 3284 l 3597 3282 l 3593 3278 l 3586 3273 l 3577 3264 l
+ 3566 3254 l 3552 3240 l 3535 3224 l 3516 3205 l 3495 3184 l
+ 3472 3161 l 3448 3135 l 3424 3108 l 3399 3080 l 3374 3050 l
+ 3349 3018 l 3325 2985 l 3301 2951 l 3279 2915 l 3257 2877 l
+ 3237 2838 l 3218 2796 l 3201 2752 l 3186 2705 l 3173 2656 l
+ 3162 2603 l 3155 2547 l 3151 2490 l 3150 2430 l 3153 2374 l
+ 3160 2318 l 3169 2264 l 3181 2212 l 3195 2163 l 3211 2115 l
+ 3228 2070 l 3247 2026 l 3267 1984 l 3289 1944 l 3311 1905 l
+ 3334 1868 l 3358 1832 l 3383 1797 l 3408 1763 l 3433 1730 l
+ 3458 1698 l 3482 1668 l 3506 1640 l 3528 1613 l 3550 1589 l
+ 3569 1567 l 3587 1548 l 3602 1531 l 3615 1517 l 3625 1506 l
+ 3633 1498 l
+ 3645 1485 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 3574 1605 m 3634 1497 l 3530 1564 l 3574 1605 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5112 1231 m 5117 1291 l 5268 1276 l 5146 1258 l 5262 1216 l cp
+eoclip
+n 5625 1530 m 5624 1528 l 5623 1523 l 5619 1516 l 5615 1505 l 5609 1491 l
+ 5601 1475 l 5593 1457 l 5582 1438 l 5571 1419 l 5557 1400 l
+ 5541 1381 l 5523 1362 l 5501 1342 l 5475 1323 l 5445 1305 l
+ 5413 1290 l 5382 1278 l 5352 1269 l 5324 1262 l 5297 1258 l
+ 5271 1256 l 5245 1255 l 5221 1254 l 5199 1255 l 5179 1256 l
+ 5161 1257 l
+ 5130 1260 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5262 1216 m 5146 1258 l 5268 1276 l 5262 1216 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5658 2156 m 5602 2135 l 5549 2277 l 5619 2175 l 5605 2297 l cp
+eoclip
+n 5130 2385 m 5133 2386 l 5138 2387 l 5148 2390 l 5161 2393 l 5179 2397 l
+ 5199 2402 l 5221 2406 l 5245 2410 l 5271 2413 l 5297 2414 l
+ 5324 2414 l 5352 2411 l 5382 2406 l 5413 2397 l 5445 2385 l
+ 5475 2369 l 5501 2352 l 5523 2334 l 5541 2315 l 5557 2296 l
+ 5571 2276 l 5582 2257 l 5593 2237 l 5601 2219 l 5609 2202 l
+ 5615 2187 l
+ 5625 2160 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5605 2297 m 5619 2175 l 5549 2277 l 5605 2297 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5324 4488 m 5352 4435 l 5218 4364 l 5311 4447 l 5190 4417 l cp
+eoclip
+n 4740 3825 m 4740 3826 l 4740 3829 l 4740 3833 l 4740 3840 l 4740 3849 l
+ 4740 3860 l 4741 3873 l 4742 3888 l 4744 3904 l 4747 3921 l
+ 4752 3939 l 4758 3959 l 4765 3979 l 4776 4002 l 4788 4025 l
+ 4804 4051 l 4824 4079 l 4847 4109 l 4875 4140 l 4903 4168 l
+ 4932 4196 l 4961 4222 l 4990 4246 l 5019 4268 l 5047 4289 l
+ 5075 4308 l 5102 4327 l 5130 4344 l 5157 4361 l 5183 4376 l
+ 5208 4391 l 5232 4405 l 5254 4417 l 5274 4428 l 5290 4437 l
+ 5304 4444 l
+ 5325 4455 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5190 4417 m 5311 4447 l 5218 4364 l 5190 4417 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5235 4665 m 5235 4605 l 5084 4605 l 5204 4635 l 5084 4665 l cp
+eoclip
+n 3330 4635 m
+ 5220 4635 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5084 4665 m 5204 4635 l 5084 4605 l 5084 4665 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+1717 4487 m 1732 4429 l 1585 4391 l 1694 4451 l 1570 4450 l cp
+eoclip
+n 1710 4815 m 1708 4816 l 1702 4817 l 1693 4819 l 1679 4823 l 1661 4827 l
+ 1639 4832 l 1613 4838 l 1585 4843 l 1555 4849 l 1525 4854 l
+ 1493 4858 l 1462 4860 l 1431 4862 l 1401 4861 l 1370 4858 l
+ 1340 4852 l 1312 4843 l 1284 4831 l 1260 4815 l 1241 4797 l
+ 1226 4778 l 1215 4759 l 1205 4740 l 1199 4722 l 1194 4705 l
+ 1190 4689 l 1188 4675 l 1186 4661 l 1185 4648 l 1185 4635 l
+ 1185 4622 l 1186 4609 l 1188 4595 l 1190 4581 l 1194 4565 l
+ 1199 4548 l 1205 4530 l 1215 4511 l 1226 4492 l 1241 4473 l
+ 1260 4455 l 1284 4439 l 1312 4427 l 1340 4418 l 1370 4412 l
+ 1401 4409 l 1431 4408 l 1462 4410 l 1493 4412 l 1525 4416 l
+ 1555 4421 l 1585 4427 l 1613 4432 l 1639 4438 l 1661 4443 l
+ 1679 4447 l
+ 1710 4455 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 1570 4450 m 1694 4451 l 1585 4391 l 1570 4450 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+3445 1417 m 3422 1361 l 3282 1417 l 3405 1401 l 3304 1473 l cp
+eoclip
+n 2475 4275 m 2475 4274 l 2475 4272 l 2475 4268 l 2475 4262 l 2475 4253 l
+ 2475 4241 l 2475 4226 l 2475 4208 l 2475 4186 l 2475 4160 l
+ 2475 4130 l 2475 4098 l 2476 4061 l 2476 4022 l 2477 3979 l
+ 2478 3934 l 2478 3887 l 2480 3837 l 2481 3786 l 2483 3733 l
+ 2485 3679 l 2487 3623 l 2490 3567 l 2493 3510 l 2497 3452 l
+ 2501 3393 l 2505 3334 l 2510 3274 l 2516 3213 l 2523 3152 l
+ 2530 3090 l 2538 3028 l 2547 2965 l 2557 2900 l 2568 2835 l
+ 2580 2769 l 2593 2702 l 2608 2634 l 2624 2566 l 2641 2498 l
+ 2659 2429 l 2679 2361 l 2700 2295 l 2729 2212 l 2758 2135 l
+ 2788 2062 l 2819 1996 l 2849 1935 l 2879 1879 l 2909 1829 l
+ 2939 1783 l 2968 1742 l 2997 1704 l 3026 1670 l 3055 1638 l
+ 3083 1610 l 3111 1584 l 3139 1560 l 3167 1539 l 3194 1519 l
+ 3220 1501 l 3245 1484 l 3270 1469 l 3293 1456 l 3315 1444 l
+ 3335 1434 l 3353 1425 l 3369 1417 l 3382 1411 l 3394 1406 l
+ 3403 1402 l 3410 1399 l
+ 3420 1395 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3304 1473 m 3405 1401 l 3282 1417 l 3304 1473 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5065 1097 m 5074 1156 l 5224 1135 l 5101 1123 l 5215 1076 l cp
+eoclip
+n 6660 4365 m 6660 4364 l 6661 4362 l 6663 4359 l 6666 4353 l 6670 4344 l
+ 6676 4333 l 6683 4318 l 6692 4300 l 6703 4278 l 6715 4253 l
+ 6729 4223 l 6746 4189 l 6763 4152 l 6783 4111 l 6804 4066 l
+ 6826 4017 l 6850 3966 l 6875 3911 l 6900 3854 l 6927 3794 l
+ 6954 3732 l 6981 3668 l 7009 3603 l 7036 3536 l 7064 3468 l
+ 7091 3399 l 7117 3329 l 7143 3259 l 7168 3188 l 7192 3116 l
+ 7215 3045 l 7237 2973 l 7258 2901 l 7277 2829 l 7295 2757 l
+ 7311 2685 l 7325 2613 l 7337 2540 l 7348 2468 l 7356 2395 l
+ 7361 2322 l 7364 2250 l 7364 2177 l 7362 2104 l 7356 2032 l
+ 7347 1960 l 7334 1889 l 7318 1819 l 7297 1750 l 7273 1684 l
+ 7245 1620 l 7210 1555 l 7171 1493 l 7128 1437 l 7082 1384 l
+ 7033 1337 l 6983 1293 l 6930 1254 l 6876 1220 l 6820 1188 l
+ 6763 1161 l 6704 1137 l 6645 1116 l 6585 1098 l 6524 1082 l
+ 6462 1070 l 6399 1059 l 6335 1051 l 6271 1044 l 6207 1039 l
+ 6142 1036 l 6077 1035 l 6012 1035 l 5947 1036 l 5882 1038 l
+ 5818 1041 l 5755 1045 l 5693 1049 l 5633 1054 l 5574 1060 l
+ 5518 1066 l 5464 1072 l 5413 1078 l 5365 1084 l 5321 1089 l
+ 5281 1095 l 5244 1100 l 5211 1105 l 5183 1109 l 5158 1113 l
+ 5138 1116 l 5121 1119 l 5109 1121 l 5099 1123 l
+ 5085 1125 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5215 1076 m 5101 1123 l 5224 1135 l 5215 1076 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+6817 4429 m 6832 4487 l 6979 4450 l 6856 4451 l 6964 4391 l cp
+eoclip
+n 6840 4815 m 6842 4816 l 6848 4817 l 6857 4819 l 6871 4823 l 6889 4827 l
+ 6911 4832 l 6937 4838 l 6965 4843 l 6995 4849 l 7025 4854 l
+ 7057 4858 l 7088 4860 l 7119 4862 l 7149 4861 l 7180 4858 l
+ 7210 4852 l 7238 4843 l 7266 4831 l 7290 4815 l 7309 4797 l
+ 7324 4778 l 7335 4759 l 7345 4740 l 7351 4722 l 7356 4705 l
+ 7360 4689 l 7362 4675 l 7364 4661 l 7365 4648 l 7365 4635 l
+ 7365 4622 l 7364 4609 l 7362 4595 l 7360 4581 l 7356 4565 l
+ 7351 4548 l 7345 4530 l 7335 4511 l 7324 4492 l 7309 4473 l
+ 7290 4455 l 7266 4439 l 7238 4427 l 7210 4418 l 7180 4412 l
+ 7149 4409 l 7119 4408 l 7088 4410 l 7057 4412 l 7025 4416 l
+ 6995 4421 l 6965 4427 l 6937 4432 l 6911 4438 l 6889 4443 l
+ 6871 4447 l
+ 6840 4455 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 6964 4391 m 6856 4451 l 6979 4450 l 6964 4391 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+6267 1492 m 6325 1506 l 6360 1359 l 6304 1469 l 6302 1345 l cp
+eoclip
+n 6615 1575 m 6616 1572 l 6619 1566 l 6623 1555 l 6629 1539 l 6636 1519 l
+ 6644 1496 l 6652 1471 l 6659 1445 l 6666 1418 l 6671 1391 l
+ 6675 1364 l 6676 1337 l 6674 1310 l 6669 1284 l 6660 1260 l
+ 6650 1243 l 6638 1230 l 6627 1219 l 6615 1210 l 6604 1203 l
+ 6595 1198 l 6586 1195 l 6578 1192 l 6570 1190 l 6562 1189 l
+ 6555 1188 l 6547 1187 l 6538 1187 l 6528 1187 l 6516 1188 l
+ 6503 1190 l 6488 1193 l 6471 1198 l 6453 1205 l 6435 1215 l
+ 6413 1231 l 6394 1250 l 6378 1271 l 6364 1294 l 6352 1317 l
+ 6342 1340 l 6333 1364 l 6325 1388 l 6318 1411 l 6313 1432 l
+ 6308 1451 l
+ 6300 1485 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 6302 1345 m 6304 1469 l 6360 1359 l 6302 1345 l  cp gs 0.00 setgray ef gr  col0 s
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/fsm-idle.fig b/doc/images/fsm-idle.fig
new file mode 100644
index 00000000..62b66c9c
--- /dev/null
+++ b/doc/images/fsm-idle.fig
@@ -0,0 +1,110 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #8e8e8e
+0 33 #000000
+6 3375 855 5175 1665
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4275 1260 855 360 3420 900 5130 1620
+4 1 0 50 -1 16 12 0.0000 4 120 1080 4275 1305 START\001
+-6
+6 3420 3105 5175 3870
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4282 3503 855 360 3427 3143 5137 3863
+4 1 0 50 -1 16 12 0.0000 4 120 930 4282 3465 READ\001
+4 1 0 50 -1 16 12 0.0000 4 120 1290 4282 3690 STATES\001
+-6
+6 1500 4261 3465 4995
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 2482 4628 855 360 1627 4268 3337 4988
+4 1 0 50 -1 16 12 0.0000 4 120 1965 2482 4590 CONFIGURE\001
+4 1 0 50 -1 16 12 0.0000 4 120 1305 2482 4815 SLAVES\001
+-6
+6 4950 1800 4950 1800
+-6
+6 3240 2011 5310 2745
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4275 2378 855 360 3420 2018 5130 2738
+4 1 0 50 -1 16 12 0.0000 4 120 2070 4275 2423 BROADCAST\001
+-6
+6 5220 4261 6944 4995
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 6082 4628 855 360 5227 4268 6937 4988
+4 1 0 50 -1 16 12 0.0000 4 120 1035 6082 4590 WRITE\001
+4 1 0 50 -1 16 12 0.0000 4 120 1425 6082 4815 EEPROM\001
+-6
+6 5206 1471 6930 2205
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 6068 1838 855 360 5213 1478 6923 2198
+4 1 0 50 -1 16 12 0.0000 4 120 1695 6068 1800 SCAN FOR\001
+4 1 0 50 -1 16 12 0.0000 4 120 1305 6068 2025 SLAVES\001
+-6
+1 3 0 1 0 0 50 -1 20 0.000 1 0.0000 3510 675 101 101 3510 675 3600 720
+3 2 0 1 0 0 50 -1 20 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 3555 765 3690 990
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4275 1620 4275 2025
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4275 2745 4275 3150
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 3510 3690 3060 3690 3060 3330 3510 3330
+	 0.000 -1.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 4770 945 4770 630 4455 630 4410 900
+	 0.000 -1.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 3825 3825 3690 4140 3240 4455
+	 0.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 3870 2070 3735 1845 3915 1575
+	 0.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 3600 3285 3150 2430 3645 1485
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5625 1530 5445 1305 5130 1260
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5130 2385 5445 2385 5625 2160
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 4740 3825 4875 4140 5325 4455
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 3330 4635 5220 4635
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 1710 4815 1260 4815 1260 4455 1710 4455
+	 0.000 -1.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 2475 4275 2700 2295 3420 1395
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 6660 4365 7245 1620 5085 1125
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 6840 4815 7290 4815 7290 4455 6840 4455
+	 0.000 -1.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 6615 1575 6660 1260 6435 1215 6300 1485
+	 0.000 -1.000 -1.000 0.000
diff --git a/doc/images/fsm-idle.pdf b/doc/images/fsm-idle.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..3c5dbe61bc1f6339267a417ea295f5da0ca5c208
GIT binary patch
literal 7642
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

literal 0
HcmV?d00001

diff --git a/doc/images/fsm-op.eps b/doc/images/fsm-op.eps
new file mode 100644
index 00000000..6adb0fa0
--- /dev/null
+++ b/doc/images/fsm-op.eps
@@ -0,0 +1,524 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: /home/fp/diplom/diplom/bilder/fsm-op.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Wed Jul 19 12:25:28 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 394 421
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.555 0.555 0.555 srgb} bind def
+
+end
+save
+newpath 0 421 moveto 0 0 lineto 394 0 lineto 394 421 lineto closepath clip newpath
+-73.9 456.4 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+	/endangle exch def
+	/startangle exch def
+	/yrad exch def
+	/xrad exch def
+	/y exch def
+	/x exch def
+	/savematrix mtrx currentmatrix def
+	x y tr xrad yrad sc 0 0 1 startangle endangle arc
+	closepath
+	savematrix setmatrix
+	} def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Ellipse
+7.500 slw
+n 4275 1260 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4275 1305 m
+gs 1 -1 sc (START) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 4275 2378 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4275 2423 m
+gs 1 -1 sc (BROADCAST) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 4282 3503 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4282 3465 m
+gs 1 -1 sc (READ) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+4282 3690 m
+gs 1 -1 sc (STATES) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 6097 4628 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+6097 4590 m
+gs 1 -1 sc (VALIDATE) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+6097 4815 m
+gs 1 -1 sc (VENDOR) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 6112 5753 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+6112 5715 m
+gs 1 -1 sc (VALIDATE) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+6112 5925 m
+gs 1 -1 sc (PRODUCT) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 6127 6878 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+6127 6840 m
+gs 1 -1 sc (REWRITE) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+6127 7050 m
+gs 1 -1 sc (ADDRESSES) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 2467 4628 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+2467 4590 m
+gs 1 -1 sc (CONFIGURE) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+2467 4800 m
+gs 1 -1 sc (SLAVES) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 3510 675 101 101 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
+
+% Polyline
+2 slj
+gs  clippath
+3671 1018 m 3723 987 l 3645 857 l 3682 976 l 3594 888 l cp
+eoclip
+n 3555 765 m
+ 3690 990 l gs 0.00 setgray ef gr gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3594 888 m 3682 976 l 3645 857 l 3594 888 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4245 2040 m 4305 2040 l 4305 1889 l 4275 2009 l 4245 1889 l cp
+eoclip
+n 4275 1620 m
+ 4275 2025 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4245 1889 m 4275 2009 l 4305 1889 l 4245 1889 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4245 3165 m 4305 3165 l 4305 3014 l 4275 3134 l 4245 3014 l cp
+eoclip
+n 4275 2745 m
+ 4275 3150 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4245 3014 m 4275 3134 l 4305 3014 l 4245 3014 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+3212 4435 m 3241 4488 l 3373 4415 l 3254 4447 l 3344 4362 l cp
+eoclip
+n 3825 3825 m 3824 3826 l 3823 3830 l 3821 3835 l 3817 3844 l 3813 3855 l
+ 3807 3869 l 3799 3885 l 3791 3904 l 3781 3923 l 3771 3944 l
+ 3759 3966 l 3746 3989 l 3732 4013 l 3716 4038 l 3698 4065 l
+ 3678 4093 l 3654 4122 l 3628 4153 l 3600 4185 l 3570 4216 l
+ 3541 4244 l 3512 4271 l 3485 4294 l 3459 4315 l 3434 4334 l
+ 3410 4352 l 3387 4368 l 3364 4382 l 3343 4396 l 3322 4408 l
+ 3303 4420 l 3286 4429 l 3271 4438 l 3260 4444 l
+ 3240 4455 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3344 4362 m 3254 4447 l 3373 4415 l 3344 4362 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5289 4488 m 5318 4435 l 5186 4362 l 5277 4447 l 5157 4415 l cp
+eoclip
+n 4706 3825 m 4707 3826 l 4708 3830 l 4710 3835 l 4714 3844 l 4718 3855 l
+ 4724 3869 l 4732 3885 l 4740 3904 l 4750 3923 l 4760 3944 l
+ 4772 3966 l 4785 3989 l 4799 4013 l 4815 4038 l 4833 4065 l
+ 4853 4093 l 4877 4122 l 4903 4153 l 4931 4185 l 4961 4216 l
+ 4990 4244 l 5019 4271 l 5046 4294 l 5072 4315 l 5097 4334 l
+ 5121 4352 l 5144 4368 l 5167 4382 l 5188 4396 l 5209 4408 l
+ 5228 4420 l 5245 4429 l 5260 4438 l 5271 4444 l
+ 5291 4455 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5157 4415 m 5277 4447 l 5186 4362 l 5157 4415 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5653 5474 m 5703 5440 l 5619 5315 l 5661 5432 l 5569 5348 l cp
+eoclip
+n 5715 4950 m 5713 4951 l 5710 4954 l 5704 4960 l 5696 4967 l 5685 4977 l
+ 5673 4989 l 5660 5002 l 5647 5017 l 5634 5033 l 5622 5051 l
+ 5611 5070 l 5600 5092 l 5591 5117 l 5584 5145 l 5580 5175 l
+ 5579 5206 l 5581 5235 l 5585 5263 l 5591 5288 l 5598 5311 l
+ 5607 5333 l 5616 5354 l 5626 5373 l 5636 5391 l 5646 5407 l
+ 5654 5421 l
+ 5670 5445 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5569 5348 m 5661 5432 l 5619 5315 l 5569 5348 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+6586 4920 m 6536 4954 l 6620 5079 l 6579 4963 l 6670 5046 l cp
+eoclip
+n 6525 5445 m 6527 5444 l 6530 5441 l 6536 5435 l 6544 5428 l 6555 5418 l
+ 6567 5406 l 6580 5393 l 6593 5378 l 6606 5362 l 6618 5344 l
+ 6629 5325 l 6640 5303 l 6649 5278 l 6656 5250 l 6660 5220 l
+ 6661 5189 l 6659 5160 l 6655 5132 l 6649 5107 l 6642 5084 l
+ 6633 5062 l 6624 5041 l 6614 5022 l 6604 5004 l 6594 4988 l
+ 6586 4974 l
+ 6570 4950 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 6670 5046 m 6579 4963 l 6620 5079 l 6670 5046 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+6090 6540 m 6150 6540 l 6150 6389 l 6120 6509 l 6090 6389 l cp
+eoclip
+n 6120 6120 m
+ 6120 6525 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 6090 6389 m 6120 6509 l 6150 6389 l 6090 6389 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+3490 1417 m 3467 1361 l 3327 1417 l 3450 1401 l 3349 1473 l cp
+eoclip
+n 2475 4275 m 2475 4274 l 2475 4272 l 2475 4268 l 2475 4262 l 2475 4253 l
+ 2476 4241 l 2476 4226 l 2477 4208 l 2477 4186 l 2478 4160 l
+ 2479 4130 l 2480 4098 l 2481 4061 l 2483 4022 l 2485 3979 l
+ 2486 3934 l 2489 3887 l 2491 3837 l 2494 3786 l 2497 3733 l
+ 2500 3679 l 2504 3623 l 2508 3567 l 2513 3510 l 2518 3452 l
+ 2523 3393 l 2529 3334 l 2536 3274 l 2543 3213 l 2551 3152 l
+ 2560 3090 l 2569 3028 l 2579 2965 l 2591 2900 l 2603 2835 l
+ 2616 2769 l 2631 2702 l 2647 2634 l 2664 2566 l 2682 2498 l
+ 2702 2429 l 2723 2361 l 2745 2295 l 2775 2212 l 2805 2135 l
+ 2837 2062 l 2868 1996 l 2899 1935 l 2929 1879 l 2960 1829 l
+ 2989 1783 l 3019 1742 l 3048 1704 l 3077 1670 l 3105 1638 l
+ 3134 1610 l 3161 1584 l 3189 1560 l 3216 1539 l 3243 1519 l
+ 3269 1501 l 3294 1484 l 3318 1469 l 3341 1456 l 3362 1444 l
+ 3382 1434 l 3399 1425 l 3415 1417 l 3428 1411 l 3439 1406 l
+ 3448 1402 l 3455 1399 l
+ 3465 1395 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3349 1473 m 3450 1401 l 3327 1417 l 3349 1473 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+4778 1542 m 4738 1587 l 4851 1688 l 4782 1586 l 4891 1643 l cp
+eoclip
+n 4815 2070 m 4816 2069 l 4819 2067 l 4825 2063 l 4832 2057 l 4842 2050 l
+ 4853 2041 l 4865 2030 l 4878 2018 l 4891 2005 l 4904 1991 l
+ 4915 1975 l 4926 1959 l 4935 1940 l 4943 1920 l 4948 1897 l
+ 4951 1872 l 4950 1845 l 4946 1818 l 4938 1791 l 4929 1766 l
+ 4917 1743 l 4904 1721 l 4890 1701 l 4876 1682 l 4860 1664 l
+ 4845 1647 l 4829 1631 l 4814 1616 l 4801 1603 l 4790 1593 l
+
+ 4770 1575 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 4891 1643 m 4782 1586 l 4851 1688 l 4891 1643 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+4916 1453 m 4872 1494 l 4975 1605 l 4916 1497 l 5019 1564 l cp
+eoclip
+n 4950 3285 m 4951 3284 l 4953 3282 l 4957 3278 l 4964 3273 l 4973 3264 l
+ 4984 3254 l 4998 3240 l 5015 3224 l 5034 3205 l 5055 3184 l
+ 5078 3161 l 5102 3135 l 5126 3108 l 5151 3080 l 5176 3050 l
+ 5201 3018 l 5225 2985 l 5249 2951 l 5271 2915 l 5293 2877 l
+ 5313 2838 l 5332 2796 l 5349 2752 l 5364 2705 l 5377 2656 l
+ 5388 2603 l 5395 2547 l 5399 2490 l 5400 2430 l 5397 2374 l
+ 5390 2318 l 5381 2264 l 5369 2212 l 5355 2163 l 5339 2115 l
+ 5322 2070 l 5303 2026 l 5283 1984 l 5261 1944 l 5239 1905 l
+ 5216 1868 l 5192 1832 l 5167 1797 l 5142 1763 l 5117 1730 l
+ 5092 1698 l 5068 1668 l 5044 1640 l 5022 1613 l 5000 1589 l
+ 4981 1567 l 4963 1548 l 4948 1531 l 4935 1517 l 4925 1506 l
+ 4917 1498 l
+ 4905 1485 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 5019 1564 m 4916 1497 l 4975 1605 l 5019 1564 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+5048 1407 m 5008 1452 l 5121 1553 l 5052 1451 l 5161 1508 l cp
+eoclip
+n 6120 4275 m 6120 4274 l 6120 4272 l 6120 4268 l 6120 4262 l 6120 4253 l
+ 6120 4242 l 6120 4227 l 6119 4209 l 6119 4187 l 6118 4162 l
+ 6118 4134 l 6117 4102 l 6116 4068 l 6115 4030 l 6113 3991 l
+ 6111 3949 l 6109 3905 l 6106 3859 l 6103 3812 l 6100 3764 l
+ 6096 3714 l 6091 3664 l 6086 3612 l 6080 3559 l 6073 3505 l
+ 6066 3451 l 6057 3395 l 6048 3337 l 6037 3279 l 6026 3219 l
+ 6013 3157 l 5998 3094 l 5982 3029 l 5965 2962 l 5945 2894 l
+ 5924 2824 l 5901 2753 l 5876 2681 l 5850 2610 l 5819 2532 l
+ 5788 2457 l 5755 2385 l 5723 2317 l 5690 2253 l 5658 2192 l
+ 5626 2136 l 5594 2083 l 5563 2033 l 5532 1986 l 5501 1941 l
+ 5470 1899 l 5440 1859 l 5410 1821 l 5380 1785 l 5351 1750 l
+ 5322 1717 l 5293 1686 l 5265 1656 l 5238 1628 l 5212 1602 l
+ 5187 1577 l 5164 1554 l 5142 1533 l 5122 1515 l 5105 1498 l
+ 5089 1484 l 5076 1472 l 5065 1462 l 5056 1454 l 5050 1449 l
+
+ 5040 1440 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 5161 1508 m 5052 1451 l 5121 1553 l 5161 1508 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+3517 3362 m 3532 3304 l 3385 3266 l 3494 3326 l 3370 3325 l cp
+eoclip
+n 3510 3690 m 3508 3691 l 3502 3692 l 3493 3694 l 3479 3698 l 3461 3702 l
+ 3439 3707 l 3413 3713 l 3385 3718 l 3355 3724 l 3325 3729 l
+ 3293 3733 l 3262 3735 l 3231 3737 l 3201 3736 l 3170 3733 l
+ 3140 3727 l 3112 3718 l 3084 3706 l 3060 3690 l 3041 3672 l
+ 3026 3653 l 3015 3634 l 3005 3615 l 2999 3597 l 2994 3580 l
+ 2990 3564 l 2988 3550 l 2986 3536 l 2985 3523 l 2985 3510 l
+ 2985 3497 l 2986 3484 l 2988 3470 l 2990 3456 l 2994 3440 l
+ 2999 3423 l 3005 3405 l 3015 3386 l 3026 3367 l 3041 3348 l
+ 3060 3330 l 3084 3314 l 3112 3302 l 3140 3293 l 3170 3287 l
+ 3201 3284 l 3231 3283 l 3262 3285 l 3293 3287 l 3325 3291 l
+ 3355 3296 l 3385 3302 l 3413 3307 l 3439 3313 l 3461 3318 l
+ 3479 3322 l
+ 3510 3330 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3370 3325 m 3494 3326 l 3385 3266 l 3370 3325 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+4383 920 m 4442 908 l 4411 760 l 4407 884 l 4353 772 l cp
+eoclip
+n 4770 945 m 4771 942 l 4773 935 l 4777 924 l 4782 907 l 4787 887 l
+ 4794 863 l 4800 837 l 4805 810 l 4809 782 l 4811 755 l
+ 4810 728 l 4807 702 l 4799 676 l 4787 652 l 4770 630 l
+ 4751 614 l 4730 603 l 4710 594 l 4691 588 l 4673 584 l
+ 4657 582 l 4643 581 l 4629 581 l 4616 581 l 4603 582 l
+ 4590 584 l 4575 586 l 4558 589 l 4540 593 l 4520 599 l
+ 4499 606 l 4476 617 l 4455 630 l 4437 646 l 4422 665 l
+ 4411 684 l 4404 704 l 4399 725 l 4396 745 l 4394 766 l
+ 4395 787 l 4396 807 l 4398 827 l 4400 846 l 4403 862 l
+ 4405 876 l
+ 4410 900 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 4353 772 m 4407 884 l 4411 760 l 4353 772 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+5138 1317 m 5098 1362 l 5211 1463 l 5142 1361 l 5251 1418 l cp
+eoclip
+n 6840 5580 m 6840 5579 l 6841 5578 l 6842 5576 l 6845 5572 l 6848 5566 l
+ 6852 5558 l 6857 5548 l 6863 5536 l 6871 5521 l 6880 5503 l
+ 6889 5483 l 6900 5460 l 6912 5435 l 6925 5407 l 6938 5377 l
+ 6952 5345 l 6967 5310 l 6981 5274 l 6996 5236 l 7011 5195 l
+ 7026 5154 l 7040 5110 l 7053 5066 l 7066 5019 l 7079 4972 l
+ 7090 4923 l 7100 4873 l 7109 4821 l 7117 4767 l 7123 4712 l
+ 7128 4656 l 7130 4597 l 7131 4536 l 7130 4473 l 7127 4408 l
+ 7121 4339 l 7113 4269 l 7102 4195 l 7087 4118 l 7070 4038 l
+ 7049 3955 l 7025 3870 l 6997 3782 l 6965 3692 l 6930 3600 l
+ 6896 3519 l 6859 3437 l 6821 3357 l 6780 3278 l 6739 3200 l
+ 6696 3124 l 6653 3050 l 6608 2978 l 6564 2908 l 6518 2840 l
+ 6472 2773 l 6426 2708 l 6379 2645 l 6332 2584 l 6285 2524 l
+ 6238 2465 l 6190 2407 l 6142 2351 l 6094 2296 l 6046 2242 l
+ 5997 2188 l 5949 2136 l 5901 2085 l 5853 2035 l 5805 1986 l
+ 5757 1938 l 5710 1891 l 5664 1845 l 5618 1801 l 5574 1758 l
+ 5531 1717 l 5489 1677 l 5449 1640 l 5411 1604 l 5375 1571 l
+ 5341 1540 l 5309 1511 l 5280 1484 l 5254 1460 l 5230 1439 l
+ 5209 1420 l 5191 1404 l 5176 1390 l 5163 1379 l 5153 1370 l
+ 5145 1363 l 5139 1358 l
+ 5130 1350 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 5251 1418 m 5142 1361 l 5211 1463 l 5251 1418 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5086 1136 m 5057 1188 l 5189 1262 l 5099 1178 l 5218 1210 l cp
+eoclip
+n 6885 6705 m 6885 6704 l 6886 6703 l 6887 6700 l 6889 6696 l 6892 6690 l
+ 6896 6681 l 6901 6670 l 6907 6656 l 6914 6640 l 6922 6620 l
+ 6932 6597 l 6943 6571 l 6955 6542 l 6969 6510 l 6983 6474 l
+ 6999 6435 l 7016 6394 l 7033 6349 l 7052 6302 l 7071 6252 l
+ 7090 6200 l 7110 6145 l 7130 6089 l 7151 6030 l 7171 5970 l
+ 7191 5909 l 7211 5846 l 7231 5781 l 7250 5716 l 7269 5649 l
+ 7287 5581 l 7304 5512 l 7320 5443 l 7335 5372 l 7350 5300 l
+ 7363 5227 l 7375 5152 l 7385 5077 l 7394 5000 l 7402 4922 l
+ 7408 4842 l 7412 4761 l 7414 4678 l 7414 4594 l 7412 4508 l
+ 7408 4419 l 7401 4329 l 7392 4237 l 7380 4143 l 7365 4048 l
+ 7348 3951 l 7327 3853 l 7303 3754 l 7276 3654 l 7245 3555 l
+ 7211 3457 l 7175 3360 l 7136 3266 l 7095 3173 l 7052 3084 l
+ 7008 2998 l 6962 2914 l 6915 2834 l 6867 2756 l 6818 2681 l
+ 6769 2609 l 6719 2540 l 6668 2473 l 6616 2409 l 6564 2347 l
+ 6512 2287 l 6459 2229 l 6406 2173 l 6352 2119 l 6298 2066 l
+ 6244 2015 l 6189 1965 l 6134 1917 l 6080 1870 l 6025 1824 l
+ 5970 1780 l 5915 1736 l 5861 1695 l 5808 1654 l 5754 1615 l
+ 5702 1577 l 5651 1540 l 5601 1505 l 5553 1471 l 5506 1439 l
+ 5461 1409 l 5417 1380 l 5377 1353 l 5338 1328 l 5303 1305 l
+ 5269 1284 l 5239 1265 l 5212 1248 l 5187 1232 l 5166 1219 l
+ 5147 1208 l 5131 1198 l 5118 1190 l 5108 1184 l 5100 1179 l
+ 5094 1175 l
+ 5085 1170 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5218 1210 m 5099 1178 l 5189 1262 l 5218 1210 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+1717 4487 m 1732 4429 l 1585 4391 l 1694 4451 l 1570 4450 l cp
+eoclip
+n 1710 4815 m 1708 4816 l 1702 4817 l 1693 4819 l 1679 4823 l 1661 4827 l
+ 1639 4832 l 1613 4838 l 1585 4843 l 1555 4849 l 1525 4854 l
+ 1493 4858 l 1462 4860 l 1431 4862 l 1401 4861 l 1370 4858 l
+ 1340 4852 l 1312 4843 l 1284 4831 l 1260 4815 l 1241 4797 l
+ 1226 4778 l 1215 4759 l 1205 4740 l 1199 4722 l 1194 4705 l
+ 1190 4689 l 1188 4675 l 1186 4661 l 1185 4648 l 1185 4635 l
+ 1185 4622 l 1186 4609 l 1188 4595 l 1190 4581 l 1194 4565 l
+ 1199 4548 l 1205 4530 l 1215 4511 l 1226 4492 l 1241 4473 l
+ 1260 4455 l 1284 4439 l 1312 4427 l 1340 4418 l 1370 4412 l
+ 1401 4409 l 1431 4408 l 1462 4410 l 1493 4412 l 1525 4416 l
+ 1555 4421 l 1585 4427 l 1613 4432 l 1639 4438 l 1661 4443 l
+ 1679 4447 l
+ 1710 4455 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 1570 4450 m 1694 4451 l 1585 4391 l 1570 4450 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5362 6737 m 5377 6679 l 5230 6641 l 5339 6701 l 5215 6700 l cp
+eoclip
+n 5355 7065 m 5353 7066 l 5347 7067 l 5338 7069 l 5324 7073 l 5306 7077 l
+ 5284 7082 l 5258 7088 l 5230 7093 l 5200 7099 l 5170 7104 l
+ 5138 7108 l 5107 7110 l 5076 7112 l 5046 7111 l 5015 7108 l
+ 4985 7102 l 4957 7093 l 4929 7081 l 4905 7065 l 4886 7047 l
+ 4871 7028 l 4860 7009 l 4850 6990 l 4844 6972 l 4839 6955 l
+ 4835 6939 l 4833 6925 l 4831 6911 l 4830 6898 l 4830 6885 l
+ 4830 6872 l 4831 6859 l 4833 6845 l 4835 6831 l 4839 6815 l
+ 4844 6798 l 4850 6780 l 4860 6761 l 4871 6742 l 4886 6723 l
+ 4905 6705 l 4929 6689 l 4957 6677 l 4985 6668 l 5015 6662 l
+ 5046 6659 l 5076 6658 l 5107 6660 l 5138 6662 l 5170 6666 l
+ 5200 6671 l 5230 6677 l 5258 6682 l 5284 6688 l 5306 6693 l
+ 5324 6697 l
+ 5355 6705 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5215 6700 m 5339 6701 l 5230 6641 l 5215 6700 l  cp gs 0.00 setgray ef gr  col0 s
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/fsm-op.fig b/doc/images/fsm-op.fig
new file mode 100644
index 00000000..972e8d7c
--- /dev/null
+++ b/doc/images/fsm-op.fig
@@ -0,0 +1,116 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #8e8e8e
+6 3375 855 5175 1665
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4275 1260 855 360 3420 900 5130 1620
+4 1 0 50 -1 16 12 0.0000 4 120 1080 4275 1305 START\001
+-6
+6 3240 2011 5310 2745
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4275 2378 855 360 3420 2018 5130 2738
+4 1 0 50 -1 16 12 0.0000 4 120 2070 4275 2423 BROADCAST\001
+-6
+6 3420 3105 5175 3870
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4282 3503 855 360 3427 3143 5137 3863
+4 1 0 50 -1 16 12 0.0000 4 120 930 4282 3465 READ\001
+4 1 0 50 -1 16 12 0.0000 4 120 1290 4282 3690 STATES\001
+-6
+6 5220 4230 6975 4995
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 6097 4628 855 360 5242 4268 6952 4988
+4 1 0 50 -1 16 12 0.0000 4 120 1590 6097 4590 VALIDATE\001
+4 1 0 50 -1 16 12 0.0000 4 120 1425 6097 4815 VENDOR\001
+-6
+6 5220 5355 6975 6120
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 6112 5753 855 360 5257 5393 6967 6113
+4 1 0 50 -1 16 12 0.0000 4 120 1590 6112 5715 VALIDATE\001
+4 1 0 50 -1 16 12 0.0000 4 120 1635 6112 5925 PRODUCT\001
+-6
+6 5092 6511 7162 7245
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 6127 6878 855 360 5272 6518 6982 7238
+4 1 0 50 -1 16 12 0.0000 4 120 1500 6127 6840 REWRITE\001
+4 1 0 50 -1 16 12 0.0000 4 120 2070 6127 7050 ADDRESSES\001
+-6
+6 1485 4261 3450 4995
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 2467 4628 855 360 1612 4268 3322 4988
+4 1 0 50 -1 16 12 0.0000 4 120 1965 2467 4590 CONFIGURE\001
+4 1 0 50 -1 16 12 0.0000 4 120 1305 2467 4800 SLAVES\001
+-6
+1 3 0 1 0 0 50 -1 20 0.000 1 0.0000 3510 675 101 101 3510 675 3600 720
+3 2 0 1 0 0 50 -1 20 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 3555 765 3690 990
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4275 1620 4275 2025
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4275 2745 4275 3150
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 3825 3825 3600 4185 3240 4455
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 4706 3825 4931 4185 5291 4455
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5715 4950 5580 5175 5670 5445
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 6525 5445 6660 5220 6570 4950
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 6120 6120 6120 6525
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 2475 4275 2745 2295 3465 1395
+	 0.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 4815 2070 4950 1845 4770 1575
+	 0.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 4950 3285 5400 2430 4905 1485
+	 0.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 6120 4275 5850 2610 5040 1440
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 3510 3690 3060 3690 3060 3330 3510 3330
+	 0.000 -1.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 4770 945 4770 630 4455 630 4410 900
+	 0.000 -1.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 6840 5580 6930 3600 5130 1350
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 6885 6705 7245 3555 5085 1170
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 1710 4815 1260 4815 1260 4455 1710 4455
+	 0.000 -1.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 5355 7065 4905 7065 4905 6705 5355 6705
+	 0.000 -1.000 -1.000 0.000
diff --git a/doc/images/fsm-op.pdf b/doc/images/fsm-op.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..70a44a2180a23119d4be7cb6effd20d0c5523428
GIT binary patch
literal 9001
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

literal 0
HcmV?d00001

diff --git a/doc/images/fsm-sii.eps b/doc/images/fsm-sii.eps
new file mode 100644
index 00000000..6f396f09
--- /dev/null
+++ b/doc/images/fsm-sii.eps
@@ -0,0 +1,376 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: fsm-sii.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Wed Jul 19 12:40:51 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 529 201
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.555 0.555 0.555 srgb} bind def
+
+end
+save
+newpath 0 201 moveto 0 0 lineto 529 0 lineto 529 201 lineto closepath clip newpath
+-5.2 236.5 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+	/endangle exch def
+	/startangle exch def
+	/yrad exch def
+	/xrad exch def
+	/y exch def
+	/x exch def
+	/savematrix mtrx currentmatrix def
+	x y tr xrad yrad sc 0 0 1 startangle endangle arc
+	closepath
+	savematrix setmatrix
+	} def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Ellipse
+7.500 slw
+n 3375 1260 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+3375 1305 m
+gs 1 -1 sc (READ_CHECK) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 5490 1260 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+5490 1305 m
+gs 1 -1 sc (READ_FETCH) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 1260 1260 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+1260 1305 m
+gs 1 -1 sc (READ_START) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 7605 2115 855 360 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 7605 2116 748 315 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+7605 2160 m
+gs 1 -1 sc (END) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 1260 3015 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+1260 3060 m
+gs 1 -1 sc (WRITE_START) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 3375 3015 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+3375 3060 m
+gs 1 -1 sc (WRITE_CHECK) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 5490 3015 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+5490 3060 m
+gs 1 -1 sc (WRITE_CHECK2) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 4455 2115 855 360 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 4455 2108 765 322 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4455 2160 m
+gs 1 -1 sc (ERROR) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 495 675 101 101 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
+
+% Polyline
+2 slj
+gs  clippath
+656 1018 m 708 987 l 630 857 l 667 976 l 579 888 l cp
+eoclip
+n 540 765 m
+ 675 990 l gs 0.00 setgray ef gr gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 579 888 m 667 976 l 630 857 l 579 888 l  cp gs 0.00 setgray ef gr  col0 s
+% Ellipse
+n 495 2430 101 101 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
+
+% Polyline
+2 slj
+gs  clippath
+656 2773 m 708 2742 l 630 2612 l 667 2731 l 579 2643 l cp
+eoclip
+n 540 2520 m
+ 675 2745 l gs 0.00 setgray ef gr gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 579 2643 m 667 2731 l 630 2612 l 579 2643 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+2535 1290 m 2535 1230 l 2384 1230 l 2504 1260 l 2384 1290 l cp
+eoclip
+n 2115 1260 m
+ 2520 1260 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 2384 1290 m 2504 1260 l 2384 1230 l 2384 1290 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4650 1290 m 4650 1230 l 4499 1230 l 4619 1260 l 4499 1290 l cp
+eoclip
+n 4230 1260 m
+ 4635 1260 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4499 1290 m 4619 1260 l 4499 1230 l 4499 1290 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+2535 3045 m 2535 2985 l 2384 2985 l 2504 3015 l 2384 3045 l cp
+eoclip
+n 2115 3015 m
+ 2520 3015 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 2384 3045 m 2504 3015 l 2384 2985 l 2384 3045 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4650 3045 m 4650 2985 l 4499 2985 l 4619 3015 l 4499 3045 l cp
+eoclip
+n 4230 3015 m
+ 4635 3015 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4499 3045 m 4619 3015 l 4499 2985 l 4499 3045 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+3746 1966 m 3753 1906 l 3602 1890 l 3719 1933 l 3596 1950 l cp
+eoclip
+n 3375 1620 m 3375 1623 l 3375 1629 l 3376 1639 l 3377 1653 l 3378 1670 l
+ 3381 1689 l 3384 1709 l 3390 1730 l 3398 1752 l 3408 1775 l
+ 3423 1798 l 3441 1822 l 3465 1845 l 3489 1863 l 3513 1879 l
+ 3537 1892 l 3561 1902 l 3584 1910 l 3607 1916 l 3629 1921 l
+ 3651 1925 l 3671 1928 l 3690 1931 l 3706 1932 l
+ 3735 1935 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 3596 1950 m 3719 1933 l 3602 1890 l 3596 1950 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5201 1906 m 5208 1966 l 5358 1949 l 5236 1933 l 5351 1889 l cp
+eoclip
+n 5490 1620 m 5490 1623 l 5491 1629 l 5492 1639 l 5494 1653 l 5495 1670 l
+ 5496 1689 l 5495 1709 l 5494 1730 l 5490 1752 l 5484 1775 l
+ 5475 1798 l 5462 1822 l 5445 1845 l 5424 1866 l 5402 1883 l
+ 5380 1896 l 5358 1907 l 5336 1914 l 5314 1921 l 5293 1925 l
+ 5273 1929 l 5255 1931 l
+ 5220 1935 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5351 1889 m 5236 1933 l 5358 1949 l 5351 1889 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+3753 2323 m 3746 2263 l 3596 2279 l 3719 2297 l 3602 2339 l cp
+eoclip
+n 3375 2610 m 3375 2607 l 3375 2601 l 3376 2591 l 3377 2577 l 3378 2560 l
+ 3381 2541 l 3384 2521 l 3390 2500 l 3398 2478 l 3408 2455 l
+ 3423 2432 l 3441 2408 l 3465 2385 l 3489 2367 l 3513 2351 l
+ 3537 2338 l 3561 2328 l 3584 2320 l 3607 2314 l 3629 2309 l
+ 3651 2305 l 3671 2302 l 3690 2299 l 3706 2298 l
+ 3735 2295 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 3602 2339 m 3719 2297 l 3596 2279 l 3602 2339 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5208 2263 m 5201 2323 l 5351 2340 l 5236 2297 l 5358 2280 l cp
+eoclip
+n 5490 2610 m 5490 2607 l 5491 2601 l 5492 2591 l 5494 2577 l 5495 2560 l
+ 5496 2541 l 5495 2521 l 5494 2500 l 5490 2478 l 5484 2455 l
+ 5475 2432 l 5462 2408 l 5445 2385 l 5424 2364 l 5402 2347 l
+ 5380 2334 l 5358 2323 l 5336 2316 l 5314 2309 l 5293 2305 l
+ 5273 2301 l 5255 2299 l
+ 5220 2295 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5358 2280 m 5236 2297 l 5351 2340 l 5358 2280 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+7003 1874 m 7053 1840 l 6969 1715 l 7011 1832 l 6919 1748 l cp
+eoclip
+n 6255 1440 m 6257 1440 l 6260 1441 l 6267 1443 l 6277 1446 l 6290 1449 l
+ 6307 1454 l 6327 1459 l 6349 1466 l 6374 1473 l 6400 1481 l
+ 6427 1489 l 6456 1498 l 6485 1508 l 6515 1518 l 6545 1529 l
+ 6577 1541 l 6610 1555 l 6644 1569 l 6679 1585 l 6715 1602 l
+ 6750 1620 l 6791 1643 l 6827 1664 l 6858 1685 l 6885 1704 l
+ 6908 1722 l 6928 1739 l 6945 1755 l 6960 1770 l 6974 1785 l
+ 6985 1798 l 6995 1810 l 7003 1821 l 7010 1830 l
+ 7020 1845 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 6919 1748 m 7011 1832 l 6969 1715 l 6919 1748 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+7053 2381 m 6997 2360 l 6942 2500 l 7014 2400 l 6998 2522 l cp
+eoclip
+n 6210 2835 m 6212 2835 l 6216 2835 l 6223 2834 l 6234 2833 l 6249 2832 l
+ 6267 2830 l 6289 2828 l 6314 2825 l 6341 2822 l 6370 2818 l
+ 6401 2814 l 6432 2808 l 6464 2802 l 6496 2795 l 6530 2787 l
+ 6564 2777 l 6600 2766 l 6637 2753 l 6674 2737 l 6712 2720 l
+ 6750 2700 l 6789 2677 l 6824 2653 l 6854 2630 l 6881 2607 l
+ 6903 2584 l 6922 2563 l 6939 2541 l 6954 2521 l 6967 2500 l
+ 6978 2481 l 6988 2462 l 6996 2444 l 7003 2428 l 7009 2415 l
+ 7013 2403 l
+ 7020 2385 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 6998 2522 m 7014 2400 l 6942 2500 l 6998 2522 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5375 923 m 5433 905 l 5387 761 l 5395 885 l 5330 779 l cp
+eoclip
+n 5670 900 m 5671 897 l 5673 892 l 5676 882 l 5680 868 l 5685 850 l
+ 5690 829 l 5695 807 l 5700 784 l 5703 761 l 5705 737 l
+ 5704 714 l 5701 692 l 5695 670 l 5685 649 l 5670 630 l
+ 5654 617 l 5636 606 l 5618 599 l 5602 594 l 5586 590 l
+ 5572 588 l 5559 586 l 5547 585 l 5535 585 l 5523 585 l
+ 5511 586 l 5498 588 l 5484 590 l 5468 594 l 5452 599 l
+ 5434 606 l 5416 617 l 5400 630 l 5385 649 l 5375 670 l
+ 5369 692 l 5366 714 l 5365 737 l 5367 761 l 5370 784 l
+ 5375 807 l 5380 829 l 5385 850 l 5390 868 l
+ 5400 900 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5330 779 m 5395 885 l 5387 761 l 5330 779 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5343 3370 m 5286 3350 l 5236 3492 l 5305 3390 l 5292 3513 l cp
+eoclip
+n 5670 3375 m 5671 3377 l 5673 3382 l 5676 3391 l 5680 3403 l 5685 3419 l
+ 5691 3439 l 5698 3460 l 5704 3483 l 5709 3507 l 5713 3531 l
+ 5716 3556 l 5716 3580 l 5715 3603 l 5709 3627 l 5701 3649 l
+ 5688 3671 l 5670 3690 l 5651 3704 l 5629 3715 l 5608 3724 l
+ 5587 3730 l 5568 3735 l 5550 3738 l 5534 3740 l 5519 3742 l
+ 5504 3742 l 5490 3742 l 5476 3742 l 5461 3742 l 5446 3740 l
+ 5430 3738 l 5412 3735 l 5393 3730 l 5372 3724 l 5351 3715 l
+ 5329 3704 l 5310 3690 l 5292 3671 l 5279 3649 l 5271 3627 l
+ 5265 3603 l 5264 3580 l 5264 3556 l 5267 3531 l 5271 3507 l
+ 5276 3483 l 5282 3460 l 5289 3439 l 5295 3419 l 5300 3403 l
+
+ 5310 3375 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5292 3513 m 5305 3390 l 5236 3492 l 5292 3513 l  cp gs 0.00 setgray ef gr  col0 s
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/fsm-sii.fig b/doc/images/fsm-sii.fig
new file mode 100644
index 00000000..331a0820
--- /dev/null
+++ b/doc/images/fsm-sii.fig
@@ -0,0 +1,106 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #8e8e8e
+6 2235 893 4515 1627
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 3375 1260 855 360 2520 900 4230 1620
+4 1 0 50 -1 16 12 0.0000 4 150 2280 3375 1305 READ_CHECK\001
+-6
+6 4388 893 6593 1627
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 5490 1260 855 360 4635 900 6345 1620
+4 1 0 50 -1 16 12 0.0000 4 150 2205 5490 1305 READ_FETCH\001
+-6
+6 165 893 2355 1627
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 1260 1260 855 360 405 900 2115 1620
+4 1 0 50 -1 16 12 0.0000 4 150 2190 1260 1305 READ_START\001
+-6
+6 6705 1710 8505 2520
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 7605 2115 855 360 6750 1755 8460 2475
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 7605 2116 748 315 6857 1801 8353 2431
+4 1 0 50 -1 16 12 0.0000 4 120 705 7605 2160 END\001
+-6
+6 113 2648 2408 3382
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 1260 3015 855 360 405 2655 2115 3375
+4 1 0 50 -1 16 12 0.0000 4 150 2295 1260 3060 WRITE_START\001
+-6
+6 2183 2648 4568 3382
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 3375 3015 855 360 2520 2655 4230 3375
+4 1 0 50 -1 16 12 0.0000 4 150 2385 3375 3060 WRITE_CHECK\001
+-6
+6 4208 2648 6773 3382
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 5490 3015 855 360 4635 2655 6345 3375
+4 1 0 50 -1 16 12 0.0000 4 150 2565 5490 3060 WRITE_CHECK2\001
+-6
+6 3555 1710 5355 2520
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4455 2115 855 360 3600 1755 5310 2475
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4455 2108 765 322 3690 1786 5220 2430
+4 1 0 50 -1 16 12 0.0000 4 120 1200 4455 2160 ERROR\001
+-6
+6 360 540 675 990
+1 3 0 1 0 0 50 -1 20 0.000 1 0.0000 495 675 101 101 495 675 585 720
+3 2 0 1 0 0 50 -1 20 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 540 765 675 990
+	 0.000 0.000
+-6
+6 360 2295 675 2745
+1 3 0 1 0 0 50 -1 20 0.000 1 0.0000 495 2430 101 101 495 2430 585 2475
+3 2 0 1 0 0 50 -1 20 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 540 2520 675 2745
+	 0.000 0.000
+-6
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 2115 1260 2520 1260
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4230 1260 4635 1260
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 2115 3015 2520 3015
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4230 3015 4635 3015
+	 0.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 3375 1620 3465 1845 3735 1935
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5490 1620 5445 1845 5220 1935
+	 0.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 3375 2610 3465 2385 3735 2295
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5490 2610 5445 2385 5220 2295
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 6255 1440 6750 1620 7020 1845
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 6210 2835 6750 2700 7020 2385
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 5670 900 5670 630 5400 630 5400 900
+	 0.000 -1.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 5670 3375 5670 3690 5310 3690 5310 3375
+	 0.000 -1.000 -1.000 0.000
diff --git a/doc/images/fsm-sii.pdf b/doc/images/fsm-sii.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..f4b37d71b5858acac80ebf855b9ee6259ecd69f3
GIT binary patch
literal 4799
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
bjW`_kI*E)Xl7AHu4o4^eL`1YrbO8Sc&~r_w

literal 0
HcmV?d00001

diff --git a/doc/images/fsm-slaveconf.eps b/doc/images/fsm-slaveconf.eps
new file mode 100644
index 00000000..7fdea351
--- /dev/null
+++ b/doc/images/fsm-slaveconf.eps
@@ -0,0 +1,567 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: fsm-slaveconf.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Sat Aug  5 09:10:48 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 316 492
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.555 0.555 0.555 srgb} bind def
+
+end
+save
+newpath 0 492 moveto 0 0 lineto 316 0 lineto 316 492 lineto closepath clip newpath
+-177.8 527.2 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+	/endangle exch def
+	/startangle exch def
+	/yrad exch def
+	/xrad exch def
+	/y exch def
+	/x exch def
+	/savematrix mtrx currentmatrix def
+	x y tr xrad yrad sc 0 0 1 startangle endangle arc
+	closepath
+	savematrix setmatrix
+	} def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Ellipse
+7.500 slw
+n 4275 1260 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4275 1305 m
+gs 1 -1 sc (INIT) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 4275 2378 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4275 2423 m
+gs 1 -1 sc (SYNC) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 4275 3503 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4275 3548 m
+gs 1 -1 sc (PREOP) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 4275 4628 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4275 4673 m
+gs 1 -1 sc (FMMU) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 4275 5753 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4275 5798 m
+gs 1 -1 sc (SDO_CONF) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 4275 6878 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4275 6923 m
+gs 1 -1 sc (SAVEOP) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 4275 8003 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4275 8048 m
+gs 1 -1 sc (OP) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 6968 4628 855 360 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 6968 4635 748 315 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+6968 4673 m
+gs 1 -1 sc (END) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 3510 675 101 101 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
+
+% Polyline
+2 slj
+gs  clippath
+3671 1018 m 3723 987 l 3645 857 l 3682 976 l 3594 888 l cp
+eoclip
+n 3555 765 m
+ 3690 990 l gs 0.00 setgray ef gr gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3594 888 m 3682 976 l 3645 857 l 3594 888 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4245 2040 m 4305 2040 l 4305 1889 l 4275 2009 l 4245 1889 l cp
+eoclip
+n 4275 1620 m
+ 4275 2025 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4245 1889 m 4275 2009 l 4305 1889 l 4245 1889 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4245 3165 m 4305 3165 l 4305 3014 l 4275 3134 l 4245 3014 l cp
+eoclip
+n 4275 2745 m
+ 4275 3150 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4245 3014 m 4275 3134 l 4305 3014 l 4245 3014 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4245 4290 m 4305 4290 l 4305 4139 l 4275 4259 l 4245 4139 l cp
+eoclip
+n 4275 3870 m
+ 4275 4275 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4245 4139 m 4275 4259 l 4305 4139 l 4245 4139 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+6684 4301 m 6738 4275 l 6671 4140 l 6698 4261 l 6617 4167 l cp
+eoclip
+n 5085 2520 m 5086 2520 l 5088 2521 l 5092 2522 l 5099 2523 l 5108 2526 l
+ 5120 2529 l 5134 2533 l 5152 2538 l 5173 2544 l 5195 2551 l
+ 5221 2560 l 5248 2569 l 5277 2580 l 5307 2592 l 5339 2605 l
+ 5372 2620 l 5406 2636 l 5441 2655 l 5478 2675 l 5516 2698 l
+ 5555 2723 l 5596 2751 l 5639 2783 l 5684 2818 l 5732 2858 l
+ 5781 2902 l 5833 2950 l 5886 3003 l 5940 3060 l 5985 3110 l
+ 6029 3160 l 6071 3212 l 6112 3263 l 6150 3313 l 6187 3363 l
+ 6223 3412 l 6256 3461 l 6288 3508 l 6318 3555 l 6347 3601 l
+ 6375 3647 l 6402 3692 l 6428 3736 l 6453 3780 l 6477 3824 l
+ 6500 3866 l 6522 3908 l 6544 3949 l 6564 3988 l 6583 4026 l
+ 6602 4062 l 6618 4096 l 6634 4127 l 6648 4156 l 6660 4182 l
+ 6671 4204 l 6680 4223 l 6688 4239 l 6694 4251 l 6698 4261 l
+
+ 6705 4275 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 6617 4167 m 6698 4261 l 6671 4140 l 6617 4167 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+6135 4665 m 6135 4605 l 5984 4605 l 6104 4635 l 5984 4665 l cp
+eoclip
+n 5130 4635 m 5132 4635 l 5135 4635 l 5141 4635 l 5151 4635 l 5164 4635 l
+ 5180 4635 l 5200 4635 l 5222 4635 l 5247 4635 l 5273 4635 l
+ 5301 4635 l 5331 4635 l 5361 4635 l 5393 4635 l 5427 4635 l
+ 5462 4635 l 5499 4635 l 5539 4635 l 5581 4635 l 5625 4635 l
+ 5670 4635 l 5719 4635 l 5764 4635 l 5806 4635 l 5845 4635 l
+ 5879 4635 l 5911 4635 l 5940 4635 l 5967 4635 l 5992 4635 l
+ 6016 4635 l 6038 4635 l 6057 4635 l 6075 4635 l 6089 4635 l
+ 6101 4635 l
+ 6120 4635 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 5984 4665 m 6104 4635 l 5984 4605 l 5984 4665 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+6947 4294 m 7007 4284 l 6981 4135 l 6972 4259 l 6922 4145 l cp
+eoclip
+n 5130 1304 m 5131 1304 l 5132 1305 l 5136 1307 l 5141 1310 l 5148 1315 l
+ 5158 1321 l 5170 1329 l 5185 1338 l 5203 1349 l 5224 1362 l
+ 5247 1377 l 5273 1394 l 5301 1413 l 5332 1433 l 5364 1455 l
+ 5398 1478 l 5434 1503 l 5470 1530 l 5508 1557 l 5547 1587 l
+ 5587 1617 l 5627 1649 l 5667 1682 l 5709 1717 l 5750 1753 l
+ 5792 1791 l 5835 1831 l 5878 1873 l 5922 1917 l 5966 1963 l
+ 6012 2013 l 6057 2065 l 6104 2121 l 6151 2179 l 6199 2241 l
+ 6247 2307 l 6295 2375 l 6343 2447 l 6390 2520 l 6433 2591 l
+ 6474 2663 l 6513 2734 l 6550 2804 l 6584 2873 l 6616 2940 l
+ 6646 3006 l 6673 3070 l 6699 3132 l 6722 3193 l 6744 3252 l
+ 6764 3311 l 6783 3367 l 6800 3423 l 6816 3478 l 6831 3532 l
+ 6845 3584 l 6858 3636 l 6870 3687 l 6882 3737 l 6892 3786 l
+ 6902 3833 l 6911 3879 l 6919 3924 l 6927 3966 l 6934 4007 l
+ 6941 4045 l 6946 4080 l 6952 4113 l 6956 4143 l 6960 4170 l
+ 6964 4193 l 6967 4213 l 6969 4230 l 6971 4244 l 6972 4255 l
+ 6973 4263 l
+ 6975 4275 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 6922 4145 m 6972 4259 l 6981 4135 l 6922 4145 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+7007 4988 m 6950 4972 l 6910 5118 l 6971 5011 l 6968 5134 l cp
+eoclip
+n 5130 8010 m 5131 8010 l 5132 8009 l 5135 8007 l 5139 8004 l 5145 8000 l
+ 5153 7995 l 5163 7988 l 5176 7980 l 5191 7970 l 5208 7958 l
+ 5228 7945 l 5250 7930 l 5273 7913 l 5299 7895 l 5326 7875 l
+ 5355 7853 l 5386 7830 l 5417 7806 l 5449 7781 l 5482 7754 l
+ 5516 7726 l 5551 7696 l 5586 7665 l 5622 7632 l 5659 7598 l
+ 5696 7562 l 5734 7524 l 5773 7483 l 5812 7440 l 5852 7395 l
+ 5894 7347 l 5936 7295 l 5979 7240 l 6024 7182 l 6069 7120 l
+ 6115 7055 l 6162 6986 l 6208 6914 l 6255 6840 l 6296 6771 l
+ 6337 6701 l 6375 6632 l 6412 6563 l 6448 6495 l 6481 6428 l
+ 6513 6363 l 6543 6299 l 6571 6236 l 6598 6175 l 6623 6115 l
+ 6647 6056 l 6670 5998 l 6692 5942 l 6712 5886 l 6732 5831 l
+ 6751 5777 l 6769 5724 l 6786 5671 l 6802 5620 l 6818 5569 l
+ 6833 5520 l 6847 5471 l 6861 5424 l 6874 5379 l 6886 5335 l
+ 6898 5293 l 6909 5253 l 6919 5216 l 6928 5182 l 6936 5150 l
+ 6944 5121 l 6950 5095 l 6956 5073 l 6961 5053 l 6965 5037 l
+ 6968 5024 l 6970 5014 l 6972 5006 l
+ 6975 4995 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 6968 5134 m 6971 5011 l 6910 5118 l 6968 5134 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+6376 4350 m 6422 4311 l 6323 4197 l 6379 4308 l 6278 4236 l cp
+eoclip
+n 5085 3600 m 5086 3600 l 5089 3601 l 5095 3601 l 5103 3602 l 5114 3604 l
+ 5129 3606 l 5147 3608 l 5169 3612 l 5193 3616 l 5219 3620 l
+ 5247 3625 l 5278 3631 l 5309 3638 l 5342 3645 l 5376 3653 l
+ 5411 3663 l 5448 3673 l 5486 3685 l 5526 3699 l 5567 3714 l
+ 5611 3732 l 5657 3751 l 5705 3774 l 5755 3798 l 5805 3825 l
+ 5855 3853 l 5902 3882 l 5947 3911 l 5988 3940 l 6027 3968 l
+ 6062 3995 l 6096 4021 l 6127 4048 l 6156 4073 l 6183 4098 l
+ 6209 4123 l 6233 4147 l 6256 4171 l 6278 4194 l 6298 4215 l
+ 6317 4236 l 6333 4254 l 6348 4271 l 6360 4285 l 6370 4297 l
+ 6378 4306 l
+ 6390 4320 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 6278 4236 m 6379 4308 l 6323 4197 l 6278 4236 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+6738 4993 m 6683 4969 l 6624 5108 l 6699 5010 l 6679 5132 l cp
+eoclip
+n 5085 6750 m 5086 6750 l 5088 6749 l 5092 6749 l 5098 6747 l 5106 6745 l
+ 5117 6743 l 5131 6739 l 5147 6735 l 5167 6730 l 5188 6724 l
+ 5212 6717 l 5238 6709 l 5266 6700 l 5296 6690 l 5327 6678 l
+ 5359 6666 l 5392 6652 l 5426 6637 l 5461 6620 l 5497 6602 l
+ 5534 6581 l 5573 6559 l 5612 6533 l 5653 6505 l 5696 6474 l
+ 5740 6440 l 5787 6402 l 5834 6359 l 5884 6313 l 5934 6263 l
+ 5985 6210 l 6030 6160 l 6073 6110 l 6115 6058 l 6155 6007 l
+ 6192 5957 l 6228 5907 l 6262 5858 l 6294 5809 l 6324 5762 l
+ 6353 5715 l 6381 5669 l 6407 5623 l 6432 5578 l 6456 5534 l
+ 6478 5490 l 6500 5446 l 6522 5404 l 6542 5362 l 6561 5321 l
+ 6580 5282 l 6597 5244 l 6613 5208 l 6628 5174 l 6642 5143 l
+ 6655 5114 l 6666 5088 l 6675 5066 l 6683 5047 l 6690 5031 l
+ 6695 5019 l 6699 5009 l
+ 6705 4995 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 6679 5132 m 6699 5010 l 6624 5108 l 6679 5132 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+3496 3360 m 3542 3322 l 3446 3206 l 3500 3318 l 3400 3245 l cp
+eoclip
+n 3510 1440 m 3509 1441 l 3508 1443 l 3505 1446 l 3500 1452 l 3493 1460 l
+ 3485 1471 l 3474 1484 l 3461 1500 l 3447 1519 l 3430 1540 l
+ 3413 1563 l 3394 1589 l 3374 1616 l 3354 1646 l 3333 1676 l
+ 3312 1708 l 3291 1742 l 3271 1776 l 3251 1812 l 3232 1849 l
+ 3214 1888 l 3196 1928 l 3180 1970 l 3165 2013 l 3150 2060 l
+ 3138 2108 l 3127 2159 l 3118 2213 l 3111 2268 l 3107 2326 l
+ 3105 2385 l 3107 2444 l 3111 2502 l 3118 2557 l 3127 2611 l
+ 3138 2662 l 3150 2710 l 3165 2757 l 3180 2800 l 3196 2842 l
+ 3214 2882 l 3232 2921 l 3251 2958 l 3271 2994 l 3291 3028 l
+ 3312 3062 l 3333 3094 l 3354 3124 l 3374 3154 l 3394 3181 l
+ 3413 3207 l 3430 3230 l 3447 3251 l 3461 3270 l 3474 3286 l
+ 3485 3299 l 3493 3310 l 3500 3318 l
+ 3510 3330 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3400 3245 m 3500 3318 l 3446 3206 l 3400 3245 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+3496 5610 m 3542 5572 l 3446 5456 l 3500 5568 l 3400 5495 l cp
+eoclip
+n 3510 3690 m 3509 3691 l 3508 3693 l 3505 3696 l 3500 3702 l 3493 3710 l
+ 3485 3721 l 3474 3734 l 3461 3750 l 3447 3769 l 3430 3790 l
+ 3413 3813 l 3394 3839 l 3374 3866 l 3354 3896 l 3333 3926 l
+ 3312 3958 l 3291 3992 l 3271 4026 l 3251 4062 l 3232 4099 l
+ 3214 4138 l 3196 4178 l 3180 4220 l 3165 4263 l 3150 4310 l
+ 3138 4358 l 3127 4409 l 3118 4463 l 3111 4518 l 3107 4576 l
+ 3105 4635 l 3107 4694 l 3111 4752 l 3118 4807 l 3127 4861 l
+ 3138 4912 l 3150 4960 l 3165 5007 l 3180 5050 l 3196 5092 l
+ 3214 5132 l 3232 5171 l 3251 5208 l 3271 5244 l 3291 5278 l
+ 3312 5312 l 3333 5344 l 3354 5374 l 3374 5404 l 3394 5431 l
+ 3413 5457 l 3430 5480 l 3447 5501 l 3461 5520 l 3474 5536 l
+ 3485 5549 l 3493 5560 l 3500 5568 l
+ 3510 5580 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3400 5495 m 3500 5568 l 3446 5456 l 3400 5495 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4692 953 m 4751 966 l 4784 818 l 4729 929 l 4725 805 l cp
+eoclip
+n 4950 1035 m 4952 1033 l 4956 1027 l 4964 1019 l 4974 1006 l 4987 990 l
+ 5002 971 l 5018 951 l 5033 929 l 5047 907 l 5060 884 l
+ 5072 861 l 5080 837 l 5086 813 l 5088 789 l 5085 765 l
+ 5078 746 l 5068 730 l 5057 717 l 5046 706 l 5035 697 l
+ 5024 690 l 5014 684 l 5005 679 l 4995 675 l 4985 671 l
+ 4975 668 l 4963 665 l 4950 663 l 4935 661 l 4919 661 l
+ 4900 663 l 4880 667 l 4860 675 l 4838 689 l 4819 706 l
+ 4803 726 l 4789 748 l 4777 771 l 4767 795 l 4758 819 l
+ 4750 844 l 4743 868 l 4738 890 l 4733 909 l
+ 4725 945 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4725 805 m 4729 929 l 4784 818 l 4725 805 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4692 3203 m 4751 3216 l 4784 3068 l 4729 3179 l 4725 3055 l cp
+eoclip
+n 4950 3285 m 4952 3283 l 4956 3277 l 4964 3269 l 4974 3256 l 4987 3240 l
+ 5002 3221 l 5018 3201 l 5033 3179 l 5047 3157 l 5060 3134 l
+ 5072 3111 l 5080 3087 l 5086 3063 l 5088 3039 l 5085 3015 l
+ 5078 2996 l 5068 2980 l 5057 2967 l 5046 2956 l 5035 2947 l
+ 5024 2940 l 5014 2934 l 5005 2929 l 4995 2925 l 4985 2921 l
+ 4975 2918 l 4963 2915 l 4950 2913 l 4935 2911 l 4919 2911 l
+ 4900 2913 l 4880 2917 l 4860 2925 l 4838 2939 l 4819 2956 l
+ 4803 2976 l 4789 2998 l 4777 3021 l 4767 3045 l 4758 3069 l
+ 4750 3094 l 4743 3118 l 4738 3140 l 4733 3159 l
+ 4725 3195 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4725 3055 m 4729 3179 l 4784 3068 l 4725 3055 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4245 5415 m 4305 5415 l 4305 5264 l 4275 5384 l 4245 5264 l cp
+eoclip
+n 4275 4995 m
+ 4275 5400 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4245 5264 m 4275 5384 l 4305 5264 l 4245 5264 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4245 6540 m 4305 6540 l 4305 6389 l 4275 6509 l 4245 6389 l cp
+eoclip
+n 4275 6120 m
+ 4275 6525 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4245 6389 m 4275 6509 l 4305 6389 l 4245 6389 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4245 7665 m 4305 7665 l 4305 7514 l 4275 7634 l 4245 7514 l cp
+eoclip
+n 4275 7245 m
+ 4275 7650 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4245 7514 m 4275 7634 l 4305 7514 l 4245 7514 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4692 6578 m 4751 6591 l 4784 6443 l 4729 6554 l 4725 6430 l cp
+eoclip
+n 4950 6660 m 4952 6658 l 4956 6652 l 4964 6644 l 4974 6631 l 4987 6615 l
+ 5002 6596 l 5018 6576 l 5033 6554 l 5047 6532 l 5060 6509 l
+ 5072 6486 l 5080 6462 l 5086 6438 l 5088 6414 l 5085 6390 l
+ 5078 6371 l 5068 6355 l 5057 6342 l 5046 6331 l 5035 6322 l
+ 5024 6315 l 5014 6309 l 5005 6304 l 4995 6300 l 4985 6296 l
+ 4975 6293 l 4963 6290 l 4950 6288 l 4935 6286 l 4919 6286 l
+ 4900 6288 l 4880 6292 l 4860 6300 l 4838 6314 l 4819 6331 l
+ 4803 6351 l 4789 6373 l 4777 6396 l 4767 6420 l 4758 6444 l
+ 4750 6469 l 4743 6493 l 4738 6515 l 4733 6534 l
+ 4725 6570 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4725 6430 m 4729 6554 l 4784 6443 l 4725 6430 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4692 7703 m 4751 7716 l 4784 7568 l 4729 7679 l 4725 7555 l cp
+eoclip
+n 4950 7785 m 4952 7783 l 4956 7777 l 4964 7769 l 4974 7756 l 4987 7740 l
+ 5002 7721 l 5018 7701 l 5033 7679 l 5047 7657 l 5060 7634 l
+ 5072 7611 l 5080 7587 l 5086 7563 l 5088 7539 l 5085 7515 l
+ 5078 7496 l 5068 7480 l 5057 7467 l 5046 7456 l 5035 7447 l
+ 5024 7440 l 5014 7434 l 5005 7429 l 4995 7425 l 4985 7421 l
+ 4975 7418 l 4963 7415 l 4950 7413 l 4935 7411 l 4919 7411 l
+ 4900 7413 l 4880 7417 l 4860 7425 l 4838 7439 l 4819 7456 l
+ 4803 7476 l 4789 7498 l 4777 7521 l 4767 7545 l 4758 7569 l
+ 4750 7594 l 4743 7618 l 4738 7640 l 4733 7659 l
+ 4725 7695 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4725 7555 m 4729 7679 l 4784 7568 l 4725 7555 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+3449 6779 m 3498 6744 l 3408 6622 l 3455 6737 l 3360 6657 l cp
+eoclip
+n 3465 3645 m 3464 3646 l 3463 3647 l 3461 3650 l 3457 3655 l 3451 3662 l
+ 3443 3671 l 3434 3683 l 3422 3698 l 3409 3715 l 3393 3735 l
+ 3376 3758 l 3357 3784 l 3336 3812 l 3313 3842 l 3290 3875 l
+ 3266 3909 l 3241 3946 l 3215 3984 l 3189 4023 l 3164 4064 l
+ 3138 4107 l 3112 4150 l 3087 4195 l 3063 4242 l 3039 4289 l
+ 3016 4339 l 2993 4389 l 2972 4442 l 2951 4497 l 2932 4553 l
+ 2914 4612 l 2898 4674 l 2882 4738 l 2869 4805 l 2857 4875 l
+ 2848 4947 l 2841 5021 l 2837 5098 l 2835 5175 l 2837 5252 l
+ 2841 5329 l 2848 5404 l 2857 5477 l 2869 5547 l 2882 5615 l
+ 2898 5680 l 2914 5743 l 2932 5804 l 2951 5862 l 2972 5918 l
+ 2993 5972 l 3016 6024 l 3039 6075 l 3063 6125 l 3087 6173 l
+ 3112 6219 l 3138 6265 l 3164 6309 l 3189 6352 l 3215 6393 l
+ 3241 6433 l 3266 6472 l 3290 6508 l 3313 6542 l 3336 6574 l
+ 3357 6603 l 3376 6630 l 3393 6654 l 3409 6676 l 3422 6694 l
+ 3434 6709 l 3443 6722 l 3451 6732 l 3457 6739 l
+ 3465 6750 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3360 6657 m 3455 6737 l 3408 6622 l 3360 6657 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4692 5453 m 4751 5466 l 4784 5318 l 4729 5429 l 4725 5305 l cp
+eoclip
+n 4950 5535 m 4952 5533 l 4956 5527 l 4964 5519 l 4974 5506 l 4987 5490 l
+ 5002 5471 l 5018 5451 l 5033 5429 l 5047 5407 l 5060 5384 l
+ 5072 5361 l 5080 5337 l 5086 5313 l 5088 5289 l 5085 5265 l
+ 5078 5246 l 5068 5230 l 5057 5217 l 5046 5206 l 5035 5197 l
+ 5024 5190 l 5014 5184 l 5005 5179 l 4995 5175 l 4985 5171 l
+ 4975 5168 l 4963 5165 l 4950 5163 l 4935 5161 l 4919 5161 l
+ 4900 5163 l 4880 5167 l 4860 5175 l 4838 5189 l 4819 5206 l
+ 4803 5226 l 4789 5248 l 4777 5271 l 4767 5295 l 4758 5319 l
+ 4750 5344 l 4743 5368 l 4738 5390 l 4733 5409 l
+ 4725 5445 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4725 5305 m 4729 5429 l 4784 5318 l 4725 5305 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+6422 4913 m 6376 4874 l 6278 4988 l 6379 4917 l 6323 5027 l cp
+eoclip
+n 5085 5629 m 5086 5629 l 5089 5629 l 5095 5628 l 5103 5627 l 5114 5625 l
+ 5129 5623 l 5147 5621 l 5169 5618 l 5193 5614 l 5219 5609 l
+ 5247 5604 l 5278 5598 l 5309 5592 l 5342 5585 l 5376 5576 l
+ 5411 5567 l 5448 5556 l 5486 5544 l 5526 5531 l 5567 5515 l
+ 5611 5498 l 5657 5478 l 5705 5456 l 5755 5431 l 5805 5404 l
+ 5855 5376 l 5902 5346 l 5947 5317 l 5988 5289 l 6027 5260 l
+ 6062 5233 l 6096 5206 l 6127 5180 l 6156 5154 l 6183 5129 l
+ 6209 5104 l 6233 5079 l 6256 5055 l 6278 5032 l 6298 5011 l
+ 6317 4990 l 6333 4971 l 6348 4955 l 6360 4940 l 6370 4928 l
+ 6378 4919 l
+ 6390 4905 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 6323 5027 m 6379 4917 l 6278 4988 l 6323 5027 l  cp gs 0.00 setgray ef gr  col0 s
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/fsm-slaveconf.fig b/doc/images/fsm-slaveconf.fig
new file mode 100644
index 00000000..534210d6
--- /dev/null
+++ b/doc/images/fsm-slaveconf.fig
@@ -0,0 +1,132 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #8e8e8e
+6 3413 893 5137 1627
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4275 1260 855 360 3420 900 5130 1620
+4 1 0 50 -1 16 12 0.0000 4 120 585 4275 1305 INIT\001
+-6
+6 3413 2011 5137 2745
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4275 2378 855 360 3420 2018 5130 2738
+4 1 0 50 -1 16 12 0.0000 4 120 930 4275 2423 SYNC\001
+-6
+6 3413 3136 5137 3870
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4275 3503 855 360 3420 3143 5130 3863
+4 1 0 50 -1 16 12 0.0000 4 120 1170 4275 3548 PREOP\001
+-6
+6 3413 4261 5137 4995
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4275 4628 855 360 3420 4268 5130 4988
+4 1 0 50 -1 16 12 0.0000 4 120 945 4275 4673 FMMU\001
+-6
+6 3360 5386 5190 6120
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4275 5753 855 360 3420 5393 5130 6113
+4 1 0 50 -1 16 12 0.0000 4 150 1830 4275 5798 SDO_CONF\001
+-6
+6 3413 6511 5137 7245
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4275 6878 855 360 3420 6518 5130 7238
+4 1 0 50 -1 16 12 0.0000 4 120 1380 4275 6923 SAVEOP\001
+-6
+6 3413 7636 5137 8370
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4275 8003 855 360 3420 7643 5130 8363
+4 1 0 50 -1 16 12 0.0000 4 120 480 4275 8048 OP\001
+-6
+6 6075 4230 7830 4995
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 6968 4628 855 360 6113 4268 7823 4988
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 6968 4635 748 315 6220 4320 7716 4950
+4 1 0 50 -1 16 12 0.0000 4 120 705 6968 4673 END\001
+-6
+1 3 0 1 0 0 50 -1 20 0.000 1 0.0000 3510 675 101 101 3510 675 3600 720
+3 2 0 1 0 0 50 -1 20 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 3555 765 3690 990
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4275 1620 4275 2025
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4275 2745 4275 3150
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4275 3870 4275 4275
+	 0.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5085 2520 5940 3060 6705 4275
+	 0.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5130 4635 5670 4635 6120 4635
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5130 1304 6390 2520 6975 4275
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5130 8010 6255 6840 6975 4995
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5085 3600 5805 3825 6390 4320
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5085 6750 5985 6210 6705 4995
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 3510 1440 3105 2385 3510 3330
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 3510 3690 3105 4635 3510 5580
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 4950 1035 5085 765 4860 675 4725 945
+	 0.000 -1.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 4950 3285 5085 3015 4860 2925 4725 3195
+	 0.000 -1.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4275 4995 4275 5400
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4275 6120 4275 6525
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4275 7245 4275 7650
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 4950 6660 5085 6390 4860 6300 4725 6570
+	 0.000 -1.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 4950 7785 5085 7515 4860 7425 4725 7695
+	 0.000 -1.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 3465 3645 2835 5175 3465 6750
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 4950 5535 5085 5265 4860 5175 4725 5445
+	 0.000 -1.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5085 5629 5805 5404 6390 4905
+	 0.000 -1.000 0.000
diff --git a/doc/images/fsm-slaveconf.pdf b/doc/images/fsm-slaveconf.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..095a35ceabff2ccaf2058fbf260eb257c01d95d2
GIT binary patch
literal 9093
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

literal 0
HcmV?d00001

diff --git a/doc/images/fsm-slavescan.eps b/doc/images/fsm-slavescan.eps
new file mode 100644
index 00000000..8326eedb
--- /dev/null
+++ b/doc/images/fsm-slavescan.eps
@@ -0,0 +1,414 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: fsm-slavescan.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Thu Jul 20 11:33:08 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 303 492
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.555 0.555 0.555 srgb} bind def
+
+end
+save
+newpath 0 492 moveto 0 0 lineto 303 0 lineto 303 492 lineto closepath clip newpath
+-190.6 527.2 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+	/endangle exch def
+	/startangle exch def
+	/yrad exch def
+	/xrad exch def
+	/y exch def
+	/x exch def
+	/savematrix mtrx currentmatrix def
+	x y tr xrad yrad sc 0 0 1 startangle endangle arc
+	closepath
+	savematrix setmatrix
+	} def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Ellipse
+7.500 slw
+n 4275 1260 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4275 1305 m
+gs 1 -1 sc (START) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 4275 3503 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4275 3548 m
+gs 1 -1 sc (STATE) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 4275 4628 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4275 4673 m
+gs 1 -1 sc (BASE) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 4275 5753 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4275 5798 m
+gs 1 -1 sc (DATALINK) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 4275 6878 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4275 6923 m
+gs 1 -1 sc (EEPROM SIZE) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 4275 2378 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4275 2423 m
+gs 1 -1 sc (ADDRESS) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 4275 8003 855 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4275 8048 m
+gs 1 -1 sc (EEPROM DATA) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 6968 4628 855 360 0 360 DrawEllipse gs col0 s gr
+
+% Ellipse
+n 6968 4635 748 315 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+6968 4673 m
+gs 1 -1 sc (END) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 3510 675 101 101 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
+
+% Polyline
+2 slj
+gs  clippath
+3671 1018 m 3723 987 l 3645 857 l 3682 976 l 3594 888 l cp
+eoclip
+n 3555 765 m
+ 3690 990 l gs 0.00 setgray ef gr gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3594 888 m 3682 976 l 3645 857 l 3594 888 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4245 2040 m 4305 2040 l 4305 1889 l 4275 2009 l 4245 1889 l cp
+eoclip
+n 4275 1620 m
+ 4275 2025 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4245 1889 m 4275 2009 l 4305 1889 l 4245 1889 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4245 3165 m 4305 3165 l 4305 3014 l 4275 3134 l 4245 3014 l cp
+eoclip
+n 4275 2745 m
+ 4275 3150 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4245 3014 m 4275 3134 l 4305 3014 l 4245 3014 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4245 4290 m 4305 4290 l 4305 4139 l 4275 4259 l 4245 4139 l cp
+eoclip
+n 4275 3870 m
+ 4275 4275 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4245 4139 m 4275 4259 l 4305 4139 l 4245 4139 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4245 5415 m 4305 5415 l 4305 5264 l 4275 5384 l 4245 5264 l cp
+eoclip
+n 4275 4995 m
+ 4275 5400 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4245 5264 m 4275 5384 l 4305 5264 l 4245 5264 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4245 6540 m 4305 6540 l 4305 6389 l 4275 6509 l 4245 6389 l cp
+eoclip
+n 4275 6120 m
+ 4275 6525 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4245 6389 m 4275 6509 l 4305 6389 l 4245 6389 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4245 7665 m 4305 7665 l 4305 7514 l 4275 7634 l 4245 7514 l cp
+eoclip
+n 4275 7245 m
+ 4275 7650 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4245 7514 m 4275 7634 l 4305 7514 l 4245 7514 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+6548 4300 m 6603 4276 l 6544 4137 l 6564 4260 l 6489 4161 l cp
+eoclip
+n 5085 2520 m 5086 2520 l 5088 2522 l 5091 2524 l 5096 2527 l 5104 2532 l
+ 5114 2538 l 5126 2546 l 5141 2556 l 5159 2567 l 5179 2581 l
+ 5202 2595 l 5226 2612 l 5252 2629 l 5280 2648 l 5309 2669 l
+ 5340 2690 l 5371 2713 l 5403 2736 l 5436 2761 l 5469 2787 l
+ 5504 2814 l 5538 2842 l 5574 2872 l 5611 2904 l 5648 2937 l
+ 5687 2972 l 5727 3010 l 5768 3050 l 5810 3092 l 5853 3137 l
+ 5897 3184 l 5941 3234 l 5985 3285 l 6031 3340 l 6074 3395 l
+ 6115 3449 l 6154 3501 l 6190 3551 l 6223 3600 l 6254 3647 l
+ 6282 3692 l 6309 3735 l 6334 3777 l 6357 3818 l 6378 3858 l
+ 6399 3897 l 6418 3934 l 6436 3971 l 6453 4006 l 6469 4041 l
+ 6484 4073 l 6498 4104 l 6511 4133 l 6523 4160 l 6533 4184 l
+ 6542 4206 l 6549 4224 l 6556 4239 l 6561 4252 l 6564 4261 l
+
+ 6570 4275 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 6489 4161 m 6564 4260 l 6544 4137 l 6489 4161 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+6286 4440 m 6332 4401 l 6233 4287 l 6289 4398 l 6188 4326 l cp
+eoclip
+n 5130 3600 m 5131 3601 l 5134 3602 l 5139 3604 l 5147 3607 l 5158 3612 l
+ 5173 3618 l 5190 3626 l 5211 3635 l 5234 3645 l 5259 3656 l
+ 5287 3668 l 5316 3682 l 5346 3696 l 5377 3711 l 5409 3727 l
+ 5443 3743 l 5477 3761 l 5513 3780 l 5550 3801 l 5589 3823 l
+ 5629 3847 l 5671 3872 l 5715 3900 l 5760 3929 l 5805 3960 l
+ 5853 3994 l 5898 4027 l 5940 4059 l 5978 4090 l 6013 4119 l
+ 6046 4146 l 6075 4173 l 6102 4198 l 6127 4222 l 6151 4245 l
+ 6173 4268 l 6193 4289 l 6212 4310 l 6230 4329 l 6245 4346 l
+ 6259 4362 l 6271 4376 l 6281 4387 l 6288 4396 l
+ 6300 4410 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 6188 4326 m 6289 4398 l 6233 4287 l 6188 4326 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+6135 4665 m 6135 4605 l 5984 4605 l 6104 4635 l 5984 4665 l cp
+eoclip
+n 5130 4635 m
+ 6120 4635 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 5984 4665 m 6104 4635 l 5984 4605 l 5984 4665 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+6332 4878 m 6286 4839 l 6188 4953 l 6289 4882 l 6233 4992 l cp
+eoclip
+n 5130 5680 m 5131 5679 l 5134 5678 l 5139 5676 l 5147 5673 l 5158 5668 l
+ 5173 5662 l 5190 5654 l 5211 5645 l 5234 5635 l 5259 5624 l
+ 5287 5612 l 5316 5598 l 5346 5584 l 5377 5569 l 5409 5553 l
+ 5443 5537 l 5477 5519 l 5513 5500 l 5550 5479 l 5589 5457 l
+ 5629 5433 l 5671 5408 l 5715 5380 l 5760 5351 l 5805 5320 l
+ 5853 5286 l 5898 5253 l 5940 5221 l 5978 5190 l 6013 5161 l
+ 6046 5134 l 6075 5107 l 6102 5082 l 6127 5058 l 6151 5035 l
+ 6173 5012 l 6193 4991 l 6212 4970 l 6230 4951 l 6245 4934 l
+ 6259 4918 l 6271 4904 l 6281 4893 l 6288 4884 l
+ 6300 4870 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 6233 4992 m 6289 4882 l 6188 4953 l 6233 4992 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+ [60] 0 sd
+gs  clippath
+6603 4974 m 6548 4950 l 6489 5089 l 6564 4991 l 6544 5113 l cp
+eoclip
+n 5085 6731 m 5086 6731 l 5088 6729 l 5091 6727 l 5096 6724 l 5104 6719 l
+ 5114 6713 l 5126 6705 l 5141 6695 l 5159 6684 l 5179 6670 l
+ 5202 6656 l 5226 6639 l 5252 6622 l 5280 6603 l 5309 6582 l
+ 5340 6561 l 5371 6538 l 5403 6515 l 5436 6490 l 5469 6464 l
+ 5504 6437 l 5538 6409 l 5574 6379 l 5611 6347 l 5648 6314 l
+ 5687 6279 l 5727 6241 l 5768 6201 l 5810 6159 l 5853 6114 l
+ 5897 6067 l 5941 6017 l 5985 5966 l 6031 5911 l 6074 5856 l
+ 6115 5802 l 6154 5750 l 6190 5700 l 6223 5651 l 6254 5604 l
+ 6282 5559 l 6309 5516 l 6334 5474 l 6357 5433 l 6378 5393 l
+ 6399 5354 l 6418 5317 l 6436 5280 l 6453 5245 l 6469 5210 l
+ 6484 5178 l 6498 5147 l 6511 5118 l 6523 5091 l 6533 5067 l
+ 6542 5045 l 6549 5027 l 6556 5012 l 6561 4999 l 6564 4990 l
+
+ 6570 4976 l gs col0 s gr gr
+ [] 0 sd
+% arrowhead
+0 slj
+n 6544 5113 m 6564 4991 l 6489 5089 l 6544 5113 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+6961 4982 m 6901 4977 l 6888 5127 l 6929 5011 l 6948 5133 l cp
+eoclip
+n 5130 7920 m 5131 7919 l 5132 7918 l 5135 7916 l 5139 7912 l 5146 7907 l
+ 5155 7900 l 5166 7890 l 5179 7879 l 5195 7866 l 5214 7850 l
+ 5235 7832 l 5258 7812 l 5284 7789 l 5312 7765 l 5342 7739 l
+ 5373 7711 l 5406 7681 l 5441 7650 l 5476 7618 l 5513 7584 l
+ 5550 7549 l 5588 7513 l 5626 7476 l 5665 7437 l 5704 7398 l
+ 5744 7357 l 5784 7315 l 5825 7271 l 5865 7226 l 5907 7179 l
+ 5949 7131 l 5991 7080 l 6034 7028 l 6078 6973 l 6122 6916 l
+ 6167 6856 l 6212 6794 l 6257 6729 l 6302 6663 l 6346 6594 l
+ 6390 6525 l 6434 6452 l 6476 6379 l 6515 6308 l 6552 6239 l
+ 6586 6172 l 6617 6107 l 6646 6044 l 6672 5984 l 6697 5926 l
+ 6719 5870 l 6740 5815 l 6758 5763 l 6775 5712 l 6791 5662 l
+ 6806 5614 l 6819 5567 l 6831 5521 l 6843 5476 l 6853 5432 l
+ 6863 5390 l 6871 5349 l 6879 5310 l 6887 5272 l 6893 5236 l
+ 6899 5202 l 6905 5170 l 6909 5141 l 6913 5114 l 6917 5090 l
+ 6920 5069 l 6923 5051 l 6925 5035 l 6926 5023 l 6928 5013 l
+ 6929 5006 l
+ 6930 4995 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 6948 5133 m 6929 5011 l 6888 5127 l 6948 5133 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+3516 6737 m 3532 6679 l 3385 6641 l 3494 6701 l 3370 6699 l cp
+eoclip
+n 3510 7020 m 3508 7021 l 3503 7022 l 3495 7024 l 3483 7027 l 3466 7030 l
+ 3446 7035 l 3423 7040 l 3398 7045 l 3371 7050 l 3343 7054 l
+ 3315 7057 l 3287 7060 l 3259 7061 l 3231 7060 l 3204 7058 l
+ 3177 7053 l 3151 7045 l 3127 7034 l 3105 7020 l 3088 7005 l
+ 3075 6988 l 3064 6971 l 3056 6954 l 3050 6938 l 3045 6924 l
+ 3042 6910 l 3040 6897 l 3039 6885 l 3038 6874 l 3038 6862 l
+ 3038 6851 l 3039 6840 l 3040 6828 l 3042 6815 l 3045 6801 l
+ 3050 6787 l 3056 6771 l 3064 6754 l 3075 6737 l 3088 6720 l
+ 3105 6705 l 3127 6691 l 3151 6680 l 3177 6672 l 3204 6667 l
+ 3231 6665 l 3259 6664 l 3287 6665 l 3315 6668 l 3343 6671 l
+ 3371 6675 l 3398 6680 l 3423 6685 l 3446 6690 l 3466 6695 l
+ 3483 6698 l
+ 3510 6705 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3370 6699 m 3494 6701 l 3385 6641 l 3370 6699 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+3516 7862 m 3532 7804 l 3385 7766 l 3494 7826 l 3370 7824 l cp
+eoclip
+n 3510 8145 m 3508 8146 l 3503 8147 l 3495 8149 l 3483 8152 l 3466 8155 l
+ 3446 8160 l 3423 8165 l 3398 8170 l 3371 8175 l 3343 8179 l
+ 3315 8182 l 3287 8185 l 3259 8186 l 3231 8185 l 3204 8183 l
+ 3177 8178 l 3151 8170 l 3127 8159 l 3105 8145 l 3088 8130 l
+ 3075 8113 l 3064 8096 l 3056 8079 l 3050 8063 l 3045 8049 l
+ 3042 8035 l 3040 8022 l 3039 8010 l 3038 7999 l 3038 7987 l
+ 3038 7976 l 3039 7965 l 3040 7953 l 3042 7940 l 3045 7926 l
+ 3050 7912 l 3056 7896 l 3064 7879 l 3075 7862 l 3088 7845 l
+ 3105 7830 l 3127 7816 l 3151 7805 l 3177 7797 l 3204 7792 l
+ 3231 7790 l 3259 7789 l 3287 7790 l 3315 7793 l 3343 7796 l
+ 3371 7800 l 3398 7805 l 3423 7810 l 3446 7815 l 3466 7820 l
+ 3483 7823 l
+ 3510 7830 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3370 7824 m 3494 7826 l 3385 7766 l 3370 7824 l  cp gs 0.00 setgray ef gr  col0 s
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/fsm-slavescan.fig b/doc/images/fsm-slavescan.fig
new file mode 100644
index 00000000..e10cadfd
--- /dev/null
+++ b/doc/images/fsm-slavescan.fig
@@ -0,0 +1,104 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #8e8e8e
+6 3413 893 5137 1627
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4275 1260 855 360 3420 900 5130 1620
+4 1 0 50 -1 16 12 0.0000 4 120 1080 4275 1305 START\001
+-6
+6 3413 3136 5137 3870
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4275 3503 855 360 3420 3143 5130 3863
+4 1 0 50 -1 16 12 0.0000 4 120 1065 4275 3548 STATE\001
+-6
+6 3413 4261 5137 4995
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4275 4628 855 360 3420 4268 5130 4988
+4 1 0 50 -1 16 12 0.0000 4 120 900 4275 4673 BASE\001
+-6
+6 3413 5386 5137 6120
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4275 5753 855 360 3420 5393 5130 6113
+4 1 0 50 -1 16 12 0.0000 4 120 1605 4275 5798 DATALINK\001
+-6
+6 3165 6511 5385 7245
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4275 6878 855 360 3420 6518 5130 7238
+4 1 0 50 -1 16 12 0.0000 4 120 2220 4275 6923 EEPROM SIZE\001
+-6
+6 3413 2011 5137 2745
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4275 2378 855 360 3420 2018 5130 2738
+4 1 0 50 -1 16 12 0.0000 4 120 1620 4275 2423 ADDRESS\001
+-6
+6 3083 7636 5468 8370
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4275 8003 855 360 3420 7643 5130 8363
+4 1 0 50 -1 16 12 0.0000 4 120 2385 4275 8048 EEPROM DATA\001
+-6
+6 6075 4230 7830 4995
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 6968 4628 855 360 6113 4268 7823 4988
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 6968 4635 748 315 6220 4320 7716 4950
+4 1 0 50 -1 16 12 0.0000 4 120 705 6968 4673 END\001
+-6
+1 3 0 1 0 0 50 -1 20 0.000 1 0.0000 3510 675 101 101 3510 675 3600 720
+3 2 0 1 0 0 50 -1 20 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 3555 765 3690 990
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4275 1620 4275 2025
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4275 2745 4275 3150
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4275 3870 4275 4275
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4275 4995 4275 5400
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4275 6120 4275 6525
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 4275 7245 4275 7650
+	 0.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5085 2520 5985 3285 6570 4275
+	 0.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5130 3600 5805 3960 6300 4410
+	 0.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 5130 4635 6120 4635
+	 0.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5130 5680 5805 5320 6300 4870
+	 0.000 -1.000 0.000
+3 2 1 1 0 7 50 -1 -1 4.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5085 6731 5985 5966 6570 4976
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5130 7920 6390 6525 6930 4995
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 3510 7020 3105 7020 3105 6705 3510 6705
+	 0.000 -1.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 3510 8145 3105 8145 3105 7830 3510 7830
+	 0.000 -1.000 -1.000 0.000
diff --git a/doc/images/fsm-slavescan.pdf b/doc/images/fsm-slavescan.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..4a02090b013544ac9ad07551565105466da09e21
GIT binary patch
literal 5867
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
PFc?%0AR=<ZP!sS!0uxp*

literal 0
HcmV?d00001

diff --git a/doc/images/ighsign.eps b/doc/images/ighsign.eps
new file mode 100644
index 00000000..3557e638
--- /dev/null
+++ b/doc/images/ighsign.eps
@@ -0,0 +1,183 @@
+%!PS-Adobe-2.0 EPSF-1.2
+%%BoundingBox: 0 0 91 62
+userdict begin /AltsysDict 245 dict def end
+AltsysDict begin
+/bdf{bind def}bind def
+
+/n{newpath}bdf
+
+/fps{
+ currentflat   
+ exch     
+ dup 0 le{pop 1}if 
+ {
+dup setflat 3 index stopped
+{1.3 mul dup 3 index gt{pop setflat pop pop stop}if} 
+{exit} 
+ifelse
+ }loop 
+ pop setflat pop pop
+}bdf
+
+/fp{100 currentflat fps}bdf
+
+/filler{fill}bdf 
+
+/F{gsave {filler}fp grestore}bdf
+
+/f{closepath F}bdf
+
+/h{closepath}bdf
+
+/C{curveto}bdf
+
+/L{lineto}bdf
+
+/m{moveto}bdf
+
+/cvc [0 0 0 1] def 
+/vc{
+ AltsysDict /cvc 2 index put 
+ aload length 4 eq
+ {setcmykcolor}
+ {setspotcolor}
+ ifelse
+}bdf 
+
+end
+
+AltsysDict begin
+
+-2076 -1773 translate
+
+[0 0 0 1]  vc
+n
+2078.3088 1791.6006 m
+2079.7873 1791.7829 2080.8812 1792.1475 2081.5905 1792.6945 C
+2082.2989 1793.2414 2082.8866 1794.3657 2083.3529 1796.0673 C
+2090.9798 1823.992 L
+2091.202 1824.782 2091.3643 1825.44 2091.4659 1825.9671 C
+2091.5875 1826.514 2091.6482 1826.9897 2091.6482 1827.3952 C
+2091.6482 1828.4483 2091.3539 1829.1063 2090.767 1829.3703 C
+2090.1793 1829.6533 2088.9534 1829.8764 2087.0903 1830.0388 C
+2087.0903 1831.6493 L
+2105.5954 1831.6493 L
+2105.5954 1830.0388 L
+2104.0761 1829.8356 2102.9717 1829.471 2102.2833 1828.9449 C
+2101.6148 1828.4179 2101.047 1827.2936 2100.5817 1825.5721 C
+2092.9245 1797.6474 L
+2092.4383 1795.49 L
+2092.3974 1795.2868 2092.3566 1795.0741 2092.3167 1794.8519 C
+2092.2958 1794.6487 2092.2863 1794.4568 2092.2863 1794.2745 C
+2092.2863 1793.2205 2092.5693 1792.552 2093.1371 1792.2691 C
+2093.7041 1791.9852 2094.929 1791.762 2096.8138 1791.6006 C
+2096.8138 1790.0205 L
+2078.3088 1790.0205 L
+2078.3088 1791.6006 L
+f 
+n
+2108.6234 1791.5533 m
+2114.5553 1791.5533 2115.3693 1792.157 2116.0179 1792.7249 C
+2116.6864 1793.2917 2117.2533 1794.4056 2117.7195 1796.0673 C
+2125.3768 1823.992 L
+2125.5382 1824.6396 2125.6797 1825.2673 2125.8022 1825.8759 C
+2125.9436 1826.4837 2126.0139 1826.9897 2126.0149 1827.3952 C
+2126.0149 1828.4483 2125.731 1829.1063 2125.164 1829.3703 C
+2124.5962 1829.6533 2123.3713 1829.8764 2121.4874 1830.0388 C
+2121.4874 1831.6493 L
+2141.2078 1831.6493 L
+2141.2078 1830.0388 L
+2139.04 1829.8156 2137.5815 1829.471 2136.8323 1829.0057 C
+2136.0821 1828.5594 2135.4545 1827.4152 2134.9483 1825.5721 C
+2131.5451 1813.205 L
+2146.4038 1813.205 L
+2149.3513 1823.992 L
+2149.5336 1824.7004 2149.6855 1825.3385 2149.8071 1825.9063 C
+2149.9286 1826.4931 2149.9894 1826.9897 2149.9894 1827.3952 C
+2149.9894 1828.4891 2149.584 1829.2079 2148.7739 1829.5526 C
+2148.2469 1829.7748 2147.1426 1829.9372 2145.4619 1830.0388 C
+2145.4619 1831.6493 L
+2163.9669 1831.6493 L
+2163.9669 1830.0388 L
+2162.5283 1829.8565 2161.5256 1829.5726 2160.9587 1829.188 C
+2160.087 1828.5594 2159.409 1827.3544 2158.9229 1825.5721 C
+2151.296 1797.6474 L
+2150.7794 1795.49 L
+2150.6778 1795.0237 2150.6171 1794.7303 2150.5971 1794.6088 C
+2150.5762 1794.5072 2150.5667 1794.3752 2150.5667 1794.2138 C
+2150.5667 1793.1398 2151.0225 1792.421 2151.9341 1792.0564 C
+2152.4811 1791.8332 2153.5645 1791.6813 2155.1854 1791.6006 C
+2155.1854 1790.0205 L
+2135.4346 1790.0205 L
+2135.4346 1791.6006 L
+2137.6014 1791.8228 2139.0599 1792.157 2139.8101 1792.6033 C
+2140.5792 1793.0686 2141.2173 1794.2233 2141.7244 1796.0673 C
+2145.6746 1810.4703 L
+2130.8462 1810.4703 L
+2127.3214 1797.6474 L
+2127.0784 1796.695 2126.916 1796.0161 2126.8353 1795.6115 C
+2126.7536 1795.2061 2126.7137 1794.7094 2126.7137 1794.1226 C
+2126.7137 1793.1294 2126.9872 1792.5017 2127.5342 1792.2387 C
+2128.0811 1791.9747 2129.306 1791.762 2131.2109 1791.6006 C
+2131.2109 1790.0205 L
+2112.6754 1790.0205 L
+2108.6234 1791.5533 L
+f
+n
+2109.4208 1783.5683 m
+2108.833 1784.1362 2108.023 1784.6318 2106.9899 1785.0573 C
+2106.2806 1785.3411 2105.1364 1785.7466 2103.5563 1786.2727 C
+2101.9962 1786.7797 2101.0646 1787.0323 2100.7608 1787.0323 C
+2100.7608 1787.3362 2099.9498 1786.9013 2098.3299 1785.7257 C
+2096.709 1784.5511 2095.899 1783.1838 2095.899 1781.6236 C
+2095.899 1780.6513 2096.2731 1779.7606 2097.0233 1778.9497 C
+2098.2587 1777.5728 2100.304 1776.8844 2103.1613 1776.8834 C
+2105.4098 1776.8834 2107.1618 1777.2889 2108.4181 1778.0989 C
+2109.6942 1778.9098 2110.3324 1779.9524 2110.3324 1781.2286 C
+2110.3324 1782.2218 2110.0285 1783.0014 2109.4208 1783.5683 C
+h
+2110.4539 1802.8938 m
+2111.7301 1805.5469 2112.3682 1808.0793 2112.3682 1810.4903 C
+2112.3682 1811.5841 2112.1451 1812.4853 2111.6997 1813.1946 C
+2111.2534 1813.903 2110.5242 1814.2572 2109.5119 1814.2581 C
+2107.5872 1814.2581 2106.0375 1812.8395 2104.8629 1810.0041 C
+2103.7082 1807.1678 2103.1309 1804.6353 2103.1309 1802.4076 C
+2103.1309 1801.2729 2103.3939 1800.4116 2103.9209 1799.8248 C
+2104.447 1799.237 2105.1155 1798.9436 2105.9264 1798.9436 C
+2107.6888 1798.9436 2109.1976 1800.2597 2110.4539 1802.8938 C
+h
+2096.3244 1789.0986 m
+2095.392 1789.8677 2094.9267 1790.8904 2094.9267 1792.1675 C
+2094.9267 1793.2007 2095.3521 1794.1322 2096.2029 1794.9631 C
+2097.0537 1795.8139 2098.6129 1796.847 2100.8823 1798.0624 C
+2099.2007 1798.6701 2097.9548 1799.5912 2097.1448 1800.8275 C
+2096.3339 1802.0629 2095.9294 1803.5518 2095.9294 1805.2943 C
+2095.9294 1807.9075 2097.1543 1810.3782 2099.6061 1812.7085 C
+2102.0569 1815.0377 2105.2873 1816.2019 2109.2992 1816.2028 C
+2111.3854 1816.2028 2113.2085 1815.8686 2114.7687 1815.2001 C
+2116.3488 1814.5316 2116.9625 1814.0148 2117.6794 1813.2212 C
+2123.5167 1813.2212 L
+2123.5167 1810.475 L
+2119.3435 1810.475 L
+2119.4651 1809.9479 2119.5393 1809.6898 2119.6001 1809.3052 C
+2119.6608 1808.9197 2119.6912 1808.4848 2119.6912 1807.9986 C
+2119.6912 1804.9999 2118.5062 1802.4276 2116.1361 1800.2806 C
+2113.7859 1798.1536 2110.4738 1797.0901 2106.1998 1797.0901 C
+2105.2674 1797.0901 2104.1535 1797.2012 2102.8574 1797.4243 C
+2102.5327 1797.4243 2102.1889 1797.1708 2101.8243 1796.6647 C
+2101.4796 1796.1576 2101.3077 1795.7227 2101.3077 1795.3581 C
+2101.3077 1794.6896 2101.8034 1794.0913 2102.7966 1793.5653 C
+2103.2619 1793.3013 2103.8288 1793.0687 2104.4983 1792.8664 C
+2107.8103 1791.9245 L
+2110.7065 1791.0936 2112.7623 1790.2836 2113.9786 1789.4936 C
+2116.0648 1788.1566 2117.1075 1786.3135 2117.1084 1783.9633 C
+2117.1084 1781.3302 2115.7202 1779.1424 2112.9456 1777.4 C
+2110.17 1775.6585 2106.7259 1774.7877 2102.6143 1774.7868 C
+2099.9195 1774.7868 2097.5797 1775.1115 2095.5952 1775.7592 C
+2092.172 1776.853 2090.4609 1778.7778 2090.4599 1781.5325 C
+2090.4599 1783.3157 2091.3715 1784.7638 2093.1947 1785.8777 C
+2094.2069 1786.4854 2095.9997 1787.1643 2098.573 1787.9135 C
+2097.5598 1788.2782 2096.8106 1788.6732 2096.3244 1789.0986 C
+f 
+
+end
diff --git a/doc/images/ighsign.pdf b/doc/images/ighsign.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..493740defc791ba4692c94208a6682e506d6a313
GIT binary patch
literal 2754
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
KP0iE_5BfJ+isd{2

literal 0
HcmV?d00001

diff --git a/doc/images/interrupt.eps b/doc/images/interrupt.eps
new file mode 100644
index 00000000..1fe43fca
--- /dev/null
+++ b/doc/images/interrupt.eps
@@ -0,0 +1,635 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: interrupt.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Mon Aug  7 13:51:08 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 538 278
+%%Magnification: 1.0000
+%%EndComments
+/MyAppDict 100 dict dup begin def
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+newpath 0 278 moveto 0 0 lineto 538 0 lineto 538 278 lineto closepath clip newpath
+-12.2 386.3 translate
+1 -1 scale
+
+% This junk string is used by the show operators
+/PATsstr 1 string def
+/PATawidthshow { 	% cx cy cchar rx ry string
+  % Loop over each character in the string
+  {  % cx cy cchar rx ry char
+    % Show the character
+    dup				% cx cy cchar rx ry char char
+    PATsstr dup 0 4 -1 roll put	% cx cy cchar rx ry char (char)
+    false charpath		% cx cy cchar rx ry char
+    /clip load PATdraw
+    % Move past the character (charpath modified the
+    % current point)
+    currentpoint			% cx cy cchar rx ry char x y
+    newpath
+    moveto			% cx cy cchar rx ry char
+    % Reposition by cx,cy if the character in the string is cchar
+    3 index eq {			% cx cy cchar rx ry
+      4 index 4 index rmoveto
+    } if
+    % Reposition all characters by rx ry
+    2 copy rmoveto		% cx cy cchar rx ry
+  } forall
+  pop pop pop pop pop		% -
+  currentpoint
+  newpath
+  moveto
+} bind def
+/PATcg {
+  7 dict dup begin
+    /lw currentlinewidth def
+    /lc currentlinecap def
+    /lj currentlinejoin def
+    /ml currentmiterlimit def
+    /ds [ currentdash ] def
+    /cc [ currentrgbcolor ] def
+    /cm matrix currentmatrix def
+  end
+} bind def
+% PATdraw - calculates the boundaries of the object and
+% fills it with the current pattern
+/PATdraw {			% proc
+  save exch
+    PATpcalc			% proc nw nh px py
+    5 -1 roll exec		% nw nh px py
+    newpath
+    PATfill			% -
+  restore
+} bind def
+% PATfill - performs the tiling for the shape
+/PATfill { % nw nh px py PATfill -
+  PATDict /CurrentPattern get dup begin
+    setfont
+    % Set the coordinate system to Pattern Space
+    PatternGState PATsg
+    % Set the color for uncolored pattezns
+    PaintType 2 eq { PATDict /PColor get PATsc } if
+    % Create the string for showing
+    3 index string		% nw nh px py str
+    % Loop for each of the pattern sources
+    0 1 Multi 1 sub {		% nw nh px py str source
+	% Move to the starting location
+	3 index 3 index		% nw nh px py str source px py
+	moveto			% nw nh px py str source
+	% For multiple sources, set the appropriate color
+	Multi 1 ne { dup PC exch get PATsc } if
+	% Set the appropriate string for the source
+	0 1 7 index 1 sub { 2 index exch 2 index put } for pop
+	% Loop over the number of vertical cells
+	3 index 		% nw nh px py str nh
+	{			% nw nh px py str
+	  currentpoint		% nw nh px py str cx cy
+	  2 index oldshow	% nw nh px py str cx cy
+	  YStep add moveto	% nw nh px py str
+	} repeat		% nw nh px py str
+    } for
+    5 { pop } repeat
+  end
+} bind def
+
+% PATkshow - kshow with the current pattezn
+/PATkshow {			% proc string
+  exch bind			% string proc
+  1 index 0 get			% string proc char
+  % Loop over all but the last character in the string
+  0 1 4 index length 2 sub {
+				% string proc char idx
+    % Find the n+1th character in the string
+    3 index exch 1 add get	% string proc char char+1
+    exch 2 copy			% strinq proc char+1 char char+1 char
+    % Now show the nth character
+    PATsstr dup 0 4 -1 roll put	% string proc chr+1 chr chr+1 (chr)
+    false charpath		% string proc char+1 char char+1
+    /clip load PATdraw
+    % Move past the character (charpath modified the current point)
+    currentpoint newpath moveto
+    % Execute the user proc (should consume char and char+1)
+    mark 3 1 roll		% string proc char+1 mark char char+1
+    4 index exec		% string proc char+1 mark...
+    cleartomark			% string proc char+1
+  } for
+  % Now display the last character
+  PATsstr dup 0 4 -1 roll put	% string proc (char+1)
+  false charpath		% string proc
+  /clip load PATdraw
+  neewath
+  pop pop			% -
+} bind def
+% PATmp - the makepattern equivalent
+/PATmp {			% patdict patmtx PATmp patinstance
+  exch dup length 7 add		% We will add 6 new entries plus 1 FID
+  dict copy			% Create a new dictionary
+  begin
+    % Matrix to install when painting the pattern
+    TilingType PATtcalc
+    /PatternGState PATcg def
+    PatternGState /cm 3 -1 roll put
+    % Check for multi pattern sources (Level 1 fast color patterns)
+    currentdict /Multi known not { /Multi 1 def } if
+    % Font dictionary definitions
+    /FontType 3 def
+    % Create a dummy encoding vector
+    /Encoding 256 array def
+    3 string 0 1 255 {
+      Encoding exch dup 3 index cvs cvn put } for pop
+    /FontMatrix matrix def
+    /FontBBox BBox def
+    /BuildChar {
+	mark 3 1 roll		% mark dict char
+	exch begin
+	Multi 1 ne {PaintData exch get}{pop} ifelse  % mark [paintdata]
+	  PaintType 2 eq Multi 1 ne or
+	  { XStep 0 FontBBox aload pop setcachedevice }
+	  { XStep 0 setcharwidth } ifelse
+	  currentdict		% mark [paintdata] dict
+	  /PaintProc load	% mark [paintdata] dict paintproc
+	end
+	gsave
+	  false PATredef exec true PATredef
+	grestore
+	cleartomark		% -
+    } bind def
+    currentdict
+  end				% newdict
+  /foo exch			% /foo newlict
+  definefont			% newfont
+} bind def
+% PATpcalc - calculates the starting point and width/height
+% of the tile fill for the shape
+/PATpcalc {	% - PATpcalc nw nh px py
+  PATDict /CurrentPattern get begin
+    gsave
+	% Set up the coordinate system to Pattern Space
+	% and lock down pattern
+	PatternGState /cm get setmatrix
+	BBox aload pop pop pop translate
+	% Determine the bounding box of the shape
+	pathbbox			% llx lly urx ury
+    grestore
+    % Determine (nw, nh) the # of cells to paint width and height
+    PatHeight div ceiling		% llx lly urx qh
+    4 1 roll				% qh llx lly urx
+    PatWidth div ceiling		% qh llx lly qw
+    4 1 roll				% qw qh llx lly
+    PatHeight div floor			% qw qh llx ph
+    4 1 roll				% ph qw qh llx
+    PatWidth div floor			% ph qw qh pw
+    4 1 roll				% pw ph qw qh
+    2 index sub cvi abs			% pw ph qs qh-ph
+    exch 3 index sub cvi abs exch	% pw ph nw=qw-pw nh=qh-ph
+    % Determine the starting point of the pattern fill
+    %(px, py)
+    4 2 roll				% nw nh pw ph
+    PatHeight mul			% nw nh pw py
+    exch				% nw nh py pw
+    PatWidth mul exch			% nw nh px py
+  end
+} bind def
+
+% Save the original routines so that we can use them later on
+/oldfill	/fill load def
+/oldeofill	/eofill load def
+/oldstroke	/stroke load def
+/oldshow	/show load def
+/oldashow	/ashow load def
+/oldwidthshow	/widthshow load def
+/oldawidthshow	/awidthshow load def
+/oldkshow	/kshow load def
+
+% These defs are necessary so that subsequent procs don't bind in
+% the originals
+/fill	   { oldfill } bind def
+/eofill	   { oldeofill } bind def
+/stroke	   { oldstroke } bind def
+/show	   { oldshow } bind def
+/ashow	   { oldashow } bind def
+/widthshow { oldwidthshow } bind def
+/awidthshow { oldawidthshow } bind def
+/kshow 	   { oldkshow } bind def
+/PATredef {
+  MyAppDict begin
+    {
+    /fill { /clip load PATdraw newpath } bind def
+    /eofill { /eoclip load PATdraw newpath } bind def
+    /stroke { PATstroke } bind def
+    /show { 0 0 null 0 0 6 -1 roll PATawidthshow } bind def
+    /ashow { 0 0 null 6 3 roll PATawidthshow }
+    bind def
+    /widthshow { 0 0 3 -1 roll PATawidthshow }
+    bind def
+    /awidthshow { PATawidthshow } bind def
+    /kshow { PATkshow } bind def
+  } {
+    /fill   { oldfill } bind def
+    /eofill { oldeofill } bind def
+    /stroke { oldstroke } bind def
+    /show   { oldshow } bind def
+    /ashow  { oldashow } bind def
+    /widthshow { oldwidthshow } bind def
+    /awidthshow { oldawidthshow } bind def
+    /kshow  { oldkshow } bind def
+    } ifelse
+  end
+} bind def
+false PATredef
+% Conditionally define setcmykcolor if not available
+/setcmykcolor where { pop } {
+  /setcmykcolor {
+    1 sub 4 1 roll
+    3 {
+	3 index add neg dup 0 lt { pop 0 } if 3 1 roll
+    } repeat
+    setrgbcolor - pop
+  } bind def
+} ifelse
+/PATsc {		% colorarray
+  aload length		% c1 ... cn length
+    dup 1 eq { pop setgray } { 3 eq { setrgbcolor } { setcmykcolor
+  } ifelse } ifelse
+} bind def
+/PATsg {		% dict
+  begin
+    lw setlinewidth
+    lc setlinecap
+    lj setlinejoin
+    ml setmiterlimit
+    ds aload pop setdash
+    cc aload pop setrgbcolor
+    cm setmatrix
+  end
+} bind def
+
+/PATDict 3 dict def
+/PATsp {
+  true PATredef
+  PATDict begin
+    /CurrentPattern exch def
+    % If it's an uncolored pattern, save the color
+    CurrentPattern /PaintType get 2 eq {
+      /PColor exch def
+    } if
+    /CColor [ currentrgbcolor ] def
+  end
+} bind def
+% PATstroke - stroke with the current pattern
+/PATstroke {
+  countdictstack
+  save
+  mark
+  {
+    currentpoint strokepath moveto
+    PATpcalc				% proc nw nh px py
+    clip newpath PATfill
+    } stopped {
+	(*** PATstroke Warning: Path is too complex, stroking
+	  with gray) =
+    cleartomark
+    restore
+    countdictstack exch sub dup 0 gt
+	{ { end } repeat } { pop } ifelse
+    gsave 0.5 setgray oldstroke grestore
+  } { pop restore pop } ifelse
+  newpath
+} bind def
+/PATtcalc {		% modmtx tilingtype PATtcalc tilematrix
+  % Note: tiling types 2 and 3 are not supported
+  gsave
+    exch concat					% tilingtype
+    matrix currentmatrix exch			% cmtx tilingtype
+    % Tiling type 1 and 3: constant spacing
+    2 ne {
+	% Distort the pattern so that it occupies
+	% an integral number of device pixels
+	dup 4 get exch dup 5 get exch		% tx ty cmtx
+	XStep 0 dtransform
+	round exch round exch			% tx ty cmtx dx.x dx.y
+	XStep div exch XStep div exch		% tx ty cmtx a b
+	0 YStep dtransform
+	round exch round exch			% tx ty cmtx a b dy.x dy.y
+	YStep div exch YStep div exch		% tx ty cmtx a b c d
+	7 -3 roll astore			% { a b c d tx ty }
+    } if
+  grestore
+} bind def
+/PATusp {
+  false PATredef
+  PATDict begin
+    CColor PATsc
+  end
+} bind def
+
+% right45
+11 dict begin
+/PaintType 1 def
+/PatternType 1 def
+/TilingType 1 def
+/BBox [0 0 1 1] def
+/XStep 1 def
+/YStep 1 def
+/PatWidth 1 def
+/PatHeight 1 def
+/Multi 2 def
+/PaintData [
+  { clippath } bind
+  { 20 20 true [ 20 0 0 -20 0 20 ]
+	{<0040100080200100400200800401000802001004
+	0020080040100080200000401000802001004002
+	0080040100080200100400200800401000802000>}
+     imagemask } bind
+] def
+/PaintProc {
+	pop
+	exec fill
+} def
+currentdict
+end
+/P5 exch def
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/reencdict 12 dict def /ReEncode { reencdict begin
+/newcodesandnames exch def /newfontname exch def /basefontname exch def
+/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
+basefontdict { exch dup /FID ne { dup /Encoding eq
+{ exch dup length array copy newfont 3 1 roll put }
+{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall
+newfont /FontName newfontname put newcodesandnames aload pop
+128 1 255 { newfont /Encoding get exch /.notdef put } for
+newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat
+newfontname newfont definefont pop end } def
+/isovec [
+8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde
+8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis
+8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron
+8#220 /dotlessi 8#230 /oe 8#231 /OE
+8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling
+8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis
+8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot
+8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus
+8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph
+8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine
+8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf
+8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute
+8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring
+8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute
+8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute
+8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve
+8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply
+8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex
+8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave
+8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring
+8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute
+8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute
+8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve
+8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide
+8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex
+8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def
+/Helvetica /Helvetica-iso isovec ReEncode
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Polyline
+7.500 slw
+gs  clippath
+3450 4020 m 3450 4080 l 3602 4080 l 3482 4050 l 3602 4020 l cp
+eoclip
+n 4230 3915 m 3825 3915 l 3960 4050 l
+ 3465 4050 l gs col0 s gr gr
+
+% arrowhead
+n 3602 4020 m 3482 4050 l 3602 4080 l  col0 s
+% Polyline
+gs  clippath
+330 5910 m 390 5910 l 390 5759 l 360 5879 l 330 5759 l cp
+eoclip
+n 360 2295 m
+ 360 5895 l gs col0 s gr gr
+
+% arrowhead
+n 330 5759 m 360 5879 l 390 5759 l 330 5759 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+n 3465 2160 m
+ 3465 6120 l gs col0 s gr 
+% Polyline
+n 1215 2160 m
+ 1215 6120 l gs col0 s gr 
+% Polyline
+n 1215 3375 m
+ 3465 3375 l gs col0 s gr 
+% Polyline
+n 1215 4050 m
+ 3465 4050 l gs col0 s gr 
+% Polyline
+n 1215 4770 m
+ 3465 4770 l gs col0 s gr 
+% Polyline
+n 1215 3375 m 3465 3375 l 3465 4050 l 1215 4050 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P5 [16 0 0 -16 81.00 225.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 1215 4410 m
+ 3465 4410 l gs col0 s gr 
+% Polyline
+n 1215 3015 m
+ 3465 3015 l gs col0 s gr 
+% Polyline
+n 855 2295 m
+ 3465 2295 l gs col0 s gr 
+% Polyline
+n 1215 2655 m
+ 3465 2655 l gs col0 s gr 
+% Polyline
+n 1215 4770 m 3465 4770 l 3465 5445 l 1215 5445 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P5 [16 0 0 -16 81.00 318.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 855 5445 m
+ 3465 5445 l gs col0 s gr 
+% Polyline
+n 1215 5805 m
+ 3465 5805 l gs col0 s gr 
+% Polyline
+n 7560 2160 m
+ 7560 6120 l gs col0 s gr 
+% Polyline
+n 5310 2160 m
+ 5310 6120 l gs col0 s gr 
+% Polyline
+n 5310 3375 m
+ 7560 3375 l gs col0 s gr 
+% Polyline
+n 5310 4770 m
+ 7560 4770 l gs col0 s gr 
+% Polyline
+n 5310 3015 m
+ 7560 3015 l gs col0 s gr 
+% Polyline
+n 4950 2295 m
+ 7560 2295 l gs col0 s gr 
+% Polyline
+n 5310 2655 m
+ 7560 2655 l gs col0 s gr 
+% Polyline
+n 5310 5805 m
+ 7560 5805 l gs col0 s gr 
+% Polyline
+n 5310 3735 m
+ 7560 3735 l gs col0 s gr 
+% Polyline
+n 5310 4095 m 7560 4095 l 7560 5445 l 5310 5445 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P5 [16 0 0 -16 354.00 273.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4950 5445 m
+ 7560 5445 l gs col0 s gr 
+/Helvetica-iso ff 180.00 scf sf
+3555 3870 m
+gs 1 -1 sc (Interrupt) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+315 4320 m
+gs 1 -1 sc  90.0 rot (Time) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+2340 2880 m
+gs 1 -1 sc (Frame Assembly) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+2340 3240 m
+gs 1 -1 sc (Frame Sending) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+2340 4275 m
+gs 1 -1 sc (ISR) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+2340 4635 m
+gs 1 -1 sc (Frame Dissection) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+2340 2520 m
+gs 1 -1 sc (Data Processing) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+2340 5670 m
+gs 1 -1 sc (Data Processing) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+2340 6030 m
+gs 1 -1 sc (...) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+2340 2160 m
+gs 1 -1 sc (...) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1215 1845 m
+gs 1 -1 sc (Interrupt Operation) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+6435 5670 m
+gs 1 -1 sc (ISR) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+6435 6030 m
+gs 1 -1 sc (...) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+6435 2160 m
+gs 1 -1 sc (...) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+6435 3240 m
+gs 1 -1 sc (Data Processing) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+6435 2520 m
+gs 1 -1 sc (ISR) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+6435 2880 m
+gs 1 -1 sc (Frame Dissection) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+6435 3600 m
+gs 1 -1 sc (Frame Assembly) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+6435 3960 m
+gs 1 -1 sc (Frame Sending) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5130 3870 m
+gs 1 -1 sc  90.0 rot (Realtime Cycle) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5310 1845 m
+gs 1 -1 sc (Interrupt-less Operation) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1035 3870 m
+gs 1 -1 sc  90.0 rot (Realtime Cycle) dup sw pop 2 div neg 0 rm  col0 sh gr
+% here ends figure;
+$F2psEnd
+rs
+end
+showpage
diff --git a/doc/images/interrupt.fig b/doc/images/interrupt.fig
new file mode 100644
index 00000000..363518a3
--- /dev/null
+++ b/doc/images/interrupt.fig
@@ -0,0 +1,85 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
+	0 0 1.00 60.00 120.00
+	 4230 3915 3825 3915 3960 4050 3465 4050
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 360 2295 360 5895
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 3465 2160 3465 6120
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 1215 2160 1215 6120
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 1215 3375 3465 3375
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 1215 4050 3465 4050
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 1215 4770 3465 4770
+2 2 0 1 0 7 50 -1 45 0.000 0 0 -1 0 0 5
+	 1215 3375 3465 3375 3465 4050 1215 4050 1215 3375
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 1215 4410 3465 4410
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 1215 3015 3465 3015
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 855 2295 3465 2295
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 1215 2655 3465 2655
+2 2 0 1 0 7 50 -1 45 0.000 0 0 -1 0 0 5
+	 1215 4770 3465 4770 3465 5445 1215 5445 1215 4770
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 855 5445 3465 5445
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 1215 5805 3465 5805
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 7560 2160 7560 6120
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 5310 2160 5310 6120
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 5310 3375 7560 3375
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 5310 4770 7560 4770
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 5310 3015 7560 3015
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 4950 2295 7560 2295
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 5310 2655 7560 2655
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 5310 5805 7560 5805
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 5310 3735 7560 3735
+2 2 0 1 0 7 50 -1 45 0.000 0 0 -1 0 0 5
+	 5310 4095 7560 4095 7560 5445 5310 5445 5310 4095
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 4950 5445 7560 5445
+4 0 0 50 -1 16 12 0.0000 4 150 1155 3555 3870 Interrupt\001
+4 0 0 50 -1 16 12 1.5708 4 120 705 315 4320 Time\001
+4 1 0 50 -1 16 12 0.0000 4 165 2400 2340 2880 Frame Assembly\001
+4 1 0 50 -1 16 12 0.0000 4 165 2190 2340 3240 Frame Sending\001
+4 1 0 50 -1 16 12 0.0000 4 120 540 2340 4275 ISR\001
+4 1 0 50 -1 16 12 0.0000 4 120 2490 2340 4635 Frame Dissection\001
+4 1 0 50 -1 16 12 0.0000 4 165 2370 2340 2520 Data Processing\001
+4 1 0 50 -1 16 12 0.0000 4 165 2370 2340 5670 Data Processing\001
+4 1 0 50 -1 16 12 0.0000 4 15 225 2340 6030 ...\001
+4 1 0 50 -1 16 12 0.0000 4 15 225 2340 2160 ...\001
+4 0 0 50 -1 16 12 0.0000 4 150 2640 1215 1845 Interrupt Operation\001
+4 1 0 50 -1 16 12 0.0000 4 120 540 6435 5670 ISR\001
+4 1 0 50 -1 16 12 0.0000 4 15 225 6435 6030 ...\001
+4 1 0 50 -1 16 12 0.0000 4 15 225 6435 2160 ...\001
+4 1 0 50 -1 16 12 0.0000 4 165 2370 6435 3240 Data Processing\001
+4 1 0 50 -1 16 12 0.0000 4 120 540 6435 2520 ISR\001
+4 1 0 50 -1 16 12 0.0000 4 120 2490 6435 2880 Frame Dissection\001
+4 1 0 50 -1 16 12 0.0000 4 165 2400 6435 3600 Frame Assembly\001
+4 1 0 50 -1 16 12 0.0000 4 165 2190 6435 3960 Frame Sending\001
+4 1 0 50 -1 16 12 1.5708 4 165 2160 5130 3870 Realtime Cycle\001
+4 0 0 50 -1 16 12 0.0000 4 150 3330 5310 1845 Interrupt-less Operation\001
+4 1 0 50 -1 16 12 1.5708 4 165 2160 1035 3870 Realtime Cycle\001
diff --git a/doc/images/interrupt.pdf b/doc/images/interrupt.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..3a4ae685b99c13873e6bf35773d9de5aa3fef56a
GIT binary patch
literal 4219
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

literal 0
HcmV?d00001

diff --git a/doc/images/master-locks.eps b/doc/images/master-locks.eps
new file mode 100644
index 00000000..3ed96e21
--- /dev/null
+++ b/doc/images/master-locks.eps
@@ -0,0 +1,254 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: master-locks.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Fri Jul 21 18:34:19 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 365 161
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+newpath 0 161 moveto 0 0 lineto 365 0 lineto 365 161 lineto closepath clip newpath
+-61.6 306.9 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+	/endangle exch def
+	/startangle exch def
+	/yrad exch def
+	/xrad exch def
+	/y exch def
+	/x exch def
+	/savematrix mtrx currentmatrix def
+	x y tr xrad yrad sc 0 0 1 startangle endangle arc
+	closepath
+	savematrix setmatrix
+	} def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 51
+% Polyline
+7.500 slw
+n 1140 2520 m 990 2520 990 3900 150 arcto 4 {pop} repeat
+  990 4050 3180 4050 150 arcto 4 {pop} repeat
+  3330 4050 3330 2670 150 arcto 4 {pop} repeat
+  3330 2520 1140 2520 150 arcto 4 {pop} repeat
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 4260 2340 m 4140 2340 4140 4740 120 arcto 4 {pop} repeat
+  4140 4860 6630 4860 120 arcto 4 {pop} repeat
+  6750 4860 6750 2460 120 arcto 4 {pop} repeat
+  6750 2340 4260 2340 120 arcto 4 {pop} repeat
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Ellipse
+n 1665 3278 360 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+1665 3323 m
+gs 1 -1 sc (RT) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Arc
+n 2745.0 3645.0 180.0 180.0 0.0 arc
+gs col0 s gr
+
+% Arc
+n 2745.0 3645.0 90.0 180.0 0.0 arc
+gs col0 s gr
+
+% Ellipse
+n 2745 3780 45 45 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
+
+% Polyline
+n 2565 3645 m 2520 3645 2520 3915 45 arcto 4 {pop} repeat
+  2520 3960 2925 3960 45 arcto 4 {pop} repeat
+  2970 3960 2970 3690 45 arcto 4 {pop} repeat
+  2970 3645 2565 3645 45 arcto 4 {pop} repeat
+ cp gs col0 s gr 
+% Polyline
+n 2745 3780 m 2700 3915 l 2790 3915 l
+ cp gs 0.00 setgray ef gr gs col0 s gr 
+% Ellipse
+n 5445 4320 360 360 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+5445 4365 m
+gs 1 -1 sc (EoE) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 5938 3231 631 444 0 360 DrawEllipse gs col0 s gr
+
+% Polyline
+2 slj
+gs  clippath
+2506 3765 m 2552 3727 l 2457 3610 l 2510 3722 l 2410 3648 l cp
+eoclip
+n 2025 3375 m 2027 3375 l 2031 3375 l 2039 3376 l 2049 3377 l 2062 3378 l
+ 2077 3381 l 2094 3384 l 2113 3390 l 2134 3398 l 2158 3408 l
+ 2185 3423 l 2216 3441 l 2250 3465 l 2277 3486 l 2304 3507 l
+ 2329 3529 l 2352 3550 l 2374 3571 l 2394 3592 l 2413 3612 l
+ 2431 3631 l 2448 3651 l 2464 3669 l 2479 3686 l 2492 3701 l
+ 2502 3713 l
+ 2520 3735 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 2410 3648 m 2510 3722 l 2457 3610 l 2410 3648 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+2942 3715 m 2971 3768 l 3103 3696 l 2984 3727 l 3075 3643 l cp
+eoclip
+n 5220 4005 m 5219 4004 l 5217 4002 l 5214 3998 l 5209 3992 l 5202 3984 l
+ 5192 3972 l 5180 3959 l 5165 3942 l 5148 3923 l 5128 3902 l
+ 5106 3879 l 5082 3854 l 5055 3829 l 5027 3802 l 4998 3774 l
+ 4967 3747 l 4934 3719 l 4899 3692 l 4863 3665 l 4826 3638 l
+ 4786 3612 l 4744 3587 l 4700 3563 l 4652 3539 l 4602 3517 l
+ 4549 3496 l 4492 3477 l 4431 3459 l 4367 3443 l 4300 3430 l
+ 4230 3420 l 4167 3414 l 4105 3410 l 4043 3409 l 3983 3411 l
+ 3925 3414 l 3868 3419 l 3814 3426 l 3761 3434 l 3710 3444 l
+ 3661 3455 l 3613 3467 l 3567 3480 l 3521 3494 l 3477 3508 l
+ 3434 3523 l 3391 3539 l 3350 3555 l 3310 3572 l 3272 3588 l
+ 3234 3605 l 3199 3621 l 3165 3637 l 3134 3652 l 3105 3666 l
+ 3078 3679 l 3055 3691 l 3034 3701 l 3017 3710 l 3003 3718 l
+ 2991 3724 l 2983 3728 l
+ 2970 3735 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3075 3643 m 2984 3727 l 3103 3696 l 3075 3643 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5327 3223 m 5322 3163 l 5171 3176 l 5294 3196 l 5177 3236 l cp
+eoclip
+n 2025 3285 m 2026 3285 l 2028 3285 l 2031 3285 l 2037 3285 l 2045 3285 l
+ 2056 3286 l 2070 3286 l 2087 3286 l 2108 3287 l 2132 3287 l
+ 2159 3288 l 2189 3288 l 2223 3289 l 2259 3289 l 2298 3290 l
+ 2339 3291 l 2383 3291 l 2428 3292 l 2475 3293 l 2524 3293 l
+ 2574 3294 l 2626 3295 l 2678 3295 l 2732 3296 l 2787 3296 l
+ 2843 3296 l 2900 3296 l 2958 3297 l 3018 3297 l 3079 3297 l
+ 3142 3296 l 3207 3296 l 3273 3296 l 3342 3295 l 3412 3294 l
+ 3485 3293 l 3559 3292 l 3635 3290 l 3713 3289 l 3792 3287 l
+ 3870 3285 l 3960 3282 l 4048 3280 l 4133 3277 l 4213 3273 l
+ 4289 3270 l 4361 3267 l 4430 3264 l 4494 3260 l 4555 3257 l
+ 4612 3253 l 4667 3250 l 4719 3247 l 4769 3243 l 4816 3240 l
+ 4862 3236 l 4906 3233 l 4948 3229 l 4988 3226 l 5026 3223 l
+ 5063 3219 l 5097 3216 l 5129 3213 l 5159 3210 l 5186 3208 l
+ 5211 3205 l 5233 3203 l 5252 3201 l 5268 3199 l 5281 3198 l
+ 5291 3197 l 5299 3196 l
+ 5310 3195 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5177 3236 m 5294 3196 l 5171 3176 l 5177 3236 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5520 3567 m 5481 3522 l 5367 3621 l 5478 3566 l 5406 3667 l cp
+eoclip
+n 5355 3960 m 5354 3958 l 5353 3952 l 5351 3944 l 5348 3932 l 5345 3917 l
+ 5342 3900 l 5340 3881 l 5338 3861 l 5338 3839 l 5338 3816 l
+ 5341 3791 l 5347 3764 l 5355 3735 l 5366 3707 l 5378 3682 l
+ 5391 3660 l 5404 3641 l 5417 3624 l 5430 3609 l 5444 3596 l
+ 5456 3584 l 5468 3574 l
+ 5490 3555 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5406 3667 m 5478 3566 l 5367 3621 l 5406 3667 l  cp gs 0.00 setgray ef gr  col0 s
+/Helvetica ff 180.00 scf sf
+1080 2745 m
+gs 1 -1 sc (Realtime Module) col0 sh gr
+/Helvetica ff 180.00 scf sf
+4230 2565 m
+gs 1 -1 sc (Master Module) col0 sh gr
+/Helvetica ff 180.00 scf sf
+5940 3285 m
+gs 1 -1 sc (Master0) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Arc
+n 4140.0 3285.0 360.0 -90.0 90.0 arc
+gs col7 1.00 shd ef gr gs col0 s gr
+
+/Helvetica ff 150.00 scf sf
+4230 3285 m
+gs 1 -1 sc  270.0 rot (ecrt) dup sw pop 2 div neg 0 rm  col0 sh gr
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/master-locks.fig b/doc/images/master-locks.fig
new file mode 100644
index 00000000..8e69330e
--- /dev/null
+++ b/doc/images/master-locks.fig
@@ -0,0 +1,54 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+6 1298 2911 2032 3645
+1 4 0 1 0 7 50 -1 -1 0.000 1 0.0000 1665 3278 360 360 1305 3278 2025 3278
+4 1 0 50 -1 16 12 0.0000 4 120 435 1665 3323 RT\001
+-6
+6 4095 2880 4545 3690
+5 1 0 1 0 7 49 -1 20 0.000 0 0 0 0 4140.000 3285.000 4140 2925 4500 3285 4140 3645
+4 1 0 48 -1 16 10 4.7124 4 90 420 4230 3285 ecrt\001
+-6
+6 2520 3420 2970 3960
+5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2745.000 3645.000 2565 3645 2745 3465 2925 3645
+5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 2745.000 3645.000 2655 3645 2745 3555 2835 3645
+1 3 0 1 0 -1 50 -1 20 0.000 1 0.0000 2745 3780 45 45 2745 3780 2790 3780
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 3 0 0 5
+	 2970 3960 2520 3960 2520 3645 2970 3645 2970 3960
+2 3 0 1 0 -1 50 -1 20 0.000 0 0 -1 0 0 4
+	 2745 3780 2700 3915 2790 3915 2745 3780
+-6
+6 5040 3915 5850 4725
+1 4 0 1 0 7 50 -1 -1 0.000 1 0.0000 5445 4320 360 360 5085 4320 5805 4320
+4 1 0 50 -1 16 12 0.0000 4 120 630 5445 4365 EoE\001
+-6
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 5938 3231 631 444 5307 2787 6570 3676
+2 4 0 1 0 7 51 -1 20 0.000 0 0 10 0 0 5
+	 3330 4050 990 4050 990 2520 3330 2520 3330 4050
+2 4 0 1 0 7 51 -1 20 0.000 0 0 8 0 0 5
+	 6750 4860 4140 4860 4140 2340 6750 2340 6750 4860
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 2025 3375 2250 3465 2520 3735
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5220 4005 4230 3420 2970 3735
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 2025 3285 3870 3285 5310 3195
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5355 3960 5355 3735 5490 3555
+	 0.000 -1.000 0.000
+4 0 0 50 -1 16 12 0.0000 4 120 2385 1080 2745 Realtime Module\001
+4 0 0 50 -1 16 12 0.0000 4 120 2085 4230 2565 Master Module\001
+4 1 0 50 -1 16 12 0.0000 4 120 1140 5940 3285 Master0\001
diff --git a/doc/images/master-locks.pdf b/doc/images/master-locks.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..d76430db8bca036a8505fbef9e55f88b5215e6db
GIT binary patch
literal 3795
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
Y8lFtSk|^JcsHuh0f+{GO*_cEB0|0JU&;S4c

literal 0
HcmV?d00001

diff --git a/doc/images/masterarch.eps b/doc/images/masterarch.eps
new file mode 100644
index 00000000..c353cf86
--- /dev/null
+++ b/doc/images/masterarch.eps
@@ -0,0 +1,432 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: masterarch.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Thu Jul 27 11:10:35 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 393 517
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+newpath 0 517 moveto 0 0 lineto 393 0 lineto 393 517 lineto closepath clip newpath
+-98.5 598.1 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/reencdict 12 dict def /ReEncode { reencdict begin
+/newcodesandnames exch def /newfontname exch def /basefontname exch def
+/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
+basefontdict { exch dup /FID ne { dup /Encoding eq
+{ exch dup length array copy newfont 3 1 roll put }
+{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall
+newfont /FontName newfontname put newcodesandnames aload pop
+128 1 255 { newfont /Encoding get exch /.notdef put } for
+newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat
+newfontname newfont definefont pop end } def
+/isovec [
+8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde
+8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis
+8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron
+8#220 /dotlessi 8#230 /oe 8#231 /OE
+8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling
+8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis
+8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot
+8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus
+8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph
+8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine
+8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf
+8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute
+8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring
+8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute
+8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute
+8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve
+8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply
+8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex
+8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave
+8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring
+8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute
+8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute
+8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve
+8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide
+8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex
+8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def
+/Helvetica /Helvetica-iso isovec ReEncode
+/Courier /Courier-iso isovec ReEncode
+ /DrawEllipse {
+	/endangle exch def
+	/startangle exch def
+	/yrad exch def
+	/xrad exch def
+	/y exch def
+	/x exch def
+	/savematrix mtrx currentmatrix def
+	x y tr xrad yrad sc 0 0 1 startangle endangle arc
+	closepath
+	savematrix setmatrix
+	} def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Polyline
+7.500 slw
+n 5175 7965 m 5760 7965 l 5760 8775 l 5175 8775 l 5175 8415 l 5085 8415 l
+ 5085 7965 l
+ cp gs col0 s gr 
+% Polyline
+n 5490 8190 m 5670 8190 l 5670 8370 l 5490 8370 l
+ cp gs col0 s gr 
+% Polyline
+n 5310 8505 m 5400 8505 l 5400 8595 l 5310 8595 l
+ cp gs col0 s gr 
+% Polyline
+n 5175 8055 m
+ 5085 8055 l gs col0 s gr 
+% Polyline
+n 5175 8145 m
+ 5085 8145 l gs col0 s gr 
+% Polyline
+n 5175 8190 m
+ 5085 8190 l gs col0 s gr 
+% Polyline
+n 5175 8280 m
+ 5085 8280 l gs col0 s gr 
+% Polyline
+n 5175 8235 m
+ 5085 8235 l gs col0 s gr 
+% Polyline
+n 5175 8100 m
+ 5085 8100 l gs col0 s gr 
+% Polyline
+n 5175 8010 m
+ 5085 8010 l gs col0 s gr 
+% Polyline
+n 5175 8325 m
+ 5085 8325 l gs col0 s gr 
+% Polyline
+n 5175 8370 m
+ 5085 8370 l gs col0 s gr 
+% Polyline
+n 5850 8775 m 5085 8775 l 5085 8815 l 5850 8815 l
+ cp gs col0 s gr 
+% Polyline
+n 6525 7965 m 7110 7965 l 7110 8775 l 6525 8775 l 6525 8415 l 6435 8415 l
+ 6435 7965 l
+ cp gs col0 s gr 
+% Polyline
+n 6840 8190 m 7020 8190 l 7020 8370 l 6840 8370 l
+ cp gs col0 s gr 
+% Polyline
+n 6660 8505 m 6750 8505 l 6750 8595 l 6660 8595 l
+ cp gs col0 s gr 
+% Polyline
+n 6525 8055 m
+ 6435 8055 l gs col0 s gr 
+% Polyline
+n 6525 8145 m
+ 6435 8145 l gs col0 s gr 
+% Polyline
+n 6525 8190 m
+ 6435 8190 l gs col0 s gr 
+% Polyline
+n 6525 8280 m
+ 6435 8280 l gs col0 s gr 
+% Polyline
+n 6525 8235 m
+ 6435 8235 l gs col0 s gr 
+% Polyline
+n 6525 8100 m
+ 6435 8100 l gs col0 s gr 
+% Polyline
+n 6525 8010 m
+ 6435 8010 l gs col0 s gr 
+% Polyline
+n 6525 8325 m
+ 6435 8325 l gs col0 s gr 
+% Polyline
+n 6525 8370 m
+ 6435 8370 l gs col0 s gr 
+% Polyline
+n 7200 8775 m 6435 8775 l 6435 8815 l 7200 8815 l
+ cp gs col0 s gr 
+% Arc
+n 5445.0 5985.0 495.0 180.0 0.0 arc
+gs col0 s gr
+
+/Helvetica-iso ff 150.00 scf sf
+5445 5760 m
+gs 1 -1 sc (Device) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 150.00 scf sf
+5445 5925 m
+gs 1 -1 sc (Interface) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Arc
+n 3958.1 4815.0 496.9 -95.0 95.0 arc
+gs col0 s gr
+
+/Helvetica-iso ff 150.00 scf sf
+4162 4822 m
+gs 1 -1 sc  270.0 rot (Realtime) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 150.00 scf sf
+3997 4822 m
+gs 1 -1 sc  270.0 rot (Interface) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Arc
+n 5175.0 2655.0 630.0 0.0 180.0 arc
+gs col0 s gr
+
+/Helvetica-iso ff 180.00 scf sf
+5175 3105 m
+gs 1 -1 sc (Interface) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5175 2880 m
+gs 1 -1 sc (Sysfs) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Polyline
+ [60] 0 sd
+n 7785 2655 m
+ 1575 2655 l gs col0 s gr  [] 0 sd
+/Helvetica-iso ff 180.00 scf sf
+1665 2880 m
+gs 1 -1 sc (Kernel-Space) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1665 2565 m
+gs 1 -1 sc (User-Space) col0 sh gr
+% Ellipse
+n 5175 1800 495 495 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica-iso ff 180.00 scf sf
+5175 1845 m
+gs 1 -1 sc (lsec) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Arc
+n 7245.0 5985.0 270.0 180.0 0.0 arc
+gs col0 s gr
+
+% Ellipse
+n 5445 4815 810 495 0 360 DrawEllipse gs col0 s gr
+
+% Polyline
+n 5445 7965 m
+ 5445 7425 l gs col0 s gr 
+% Polyline
+n 6795 7965 m
+ 6795 7425 l gs col0 s gr 
+% Polyline
+n 5445 6885 m
+ 5445 5985 l gs col0 s gr 
+% Polyline
+n 5535 8820 m 5625 8820 l 5625 8910 l 5535 8910 l
+ cp gs col0 s gr 
+% Polyline
+n 6885 8820 m 6975 8820 l 6975 8910 l 6885 8910 l
+ cp gs col0 s gr 
+% Polyline
+n 7245 6885 m
+ 7245 5985 l gs col0 s gr 
+% Polyline
+n 4740 6345 m 4635 6345 4635 7500 105 arcto 4 {pop} repeat
+  4635 7605 7500 7605 105 arcto 4 {pop} repeat
+  7605 7605 7605 6450 105 arcto 4 {pop} repeat
+  7605 6345 4740 6345 105 arcto 4 {pop} repeat
+ cp gs col0 s gr 
+% Polyline
+n 4905 6885 m 5985 6885 l 5985 7425 l 4905 7425 l
+ cp gs col0 s gr 
+% Polyline
+n 6255 6885 m 7335 6885 l 7335 7425 l 6255 7425 l
+ cp gs col0 s gr 
+% Polyline
+n 5445 5490 m
+ 5445 5310 l gs col0 s gr 
+% Polyline
+n 4035 3645 m 3915 3645 3915 5865 120 arcto 4 {pop} repeat
+  3915 5985 6315 5985 120 arcto 4 {pop} repeat
+  6435 5985 6435 3765 120 arcto 4 {pop} repeat
+  6435 3645 4035 3645 120 arcto 4 {pop} repeat
+ cp gs col0 s gr 
+% Polyline
+n 4635 4815 m
+ 4455 4815 l gs col0 s gr 
+% Polyline
+n 3915 4815 m
+ 3465 4815 l gs col0 s gr 
+% Polyline
+n 7605 3645 m 6885 3645 l 6885 5985 l 7605 5985 l
+ cp gs col0 s gr 
+% Polyline
+ [60] 0 sd
+n 1575 7785 m
+ 7785 7785 l gs col0 s gr  [] 0 sd
+% Polyline
+n 1890 3645 m 1755 3645 1755 5850 135 arcto 4 {pop} repeat
+  1755 5985 3330 5985 135 arcto 4 {pop} repeat
+  3465 5985 3465 3780 135 arcto 4 {pop} repeat
+  3465 3645 1890 3645 135 arcto 4 {pop} repeat
+ cp gs col0 s gr 
+% Polyline
+ [60] 0 sd
+n 1575 8280 m
+ 1575 2205 l gs col0 s gr  [] 0 sd
+% Polyline
+n 5175 3285 m
+ 5175 3645 l gs col0 s gr 
+% Polyline
+ [60] 0 sd
+n 7785 8280 m
+ 7785 2205 l gs col0 s gr  [] 0 sd
+% Polyline
+n 5175 2655 m
+ 5175 2295 l gs col0 s gr 
+% Polyline
+2 slj
+n 5580 8910 m 5580 8911 l 5579 8912 l 5579 8915 l 5577 8918 l 5575 8923 l
+ 5572 8929 l 5568 8936 l 5564 8944 l 5557 8952 l 5550 8961 l
+ 5541 8970 l 5530 8979 l 5516 8988 l 5500 8997 l 5480 9007 l
+ 5456 9016 l 5427 9026 l 5393 9036 l 5355 9045 l 5320 9052 l
+ 5284 9059 l 5248 9064 l 5213 9069 l 5178 9073 l 5144 9076 l
+ 5110 9079 l 5077 9081 l 5044 9083 l 5012 9085 l 4981 9086 l
+ 4950 9087 l 4920 9088 l 4892 9089 l 4866 9089 l 4843 9089 l
+ 4822 9090 l 4805 9090 l 4791 9090 l 4782 9090 l 4775 9090 l
+ 4772 9090 l
+ 4770 9090 l gs col0 s gr 
+% Polyline
+n 6931 8910 m 6931 8912 l 6931 8914 l 6931 8917 l 6930 8921 l 6929 8927 l
+ 6928 8934 l 6926 8943 l 6924 8953 l 6921 8964 l 6917 8976 l
+ 6911 8989 l 6905 9003 l 6897 9017 l 6887 9032 l 6876 9047 l
+ 6862 9062 l 6846 9078 l 6827 9094 l 6805 9110 l 6780 9126 l
+ 6750 9143 l 6716 9160 l 6676 9178 l 6631 9196 l 6580 9214 l
+ 6523 9233 l 6459 9252 l 6390 9270 l 6335 9283 l 6278 9296 l
+ 6220 9308 l 6161 9319 l 6103 9330 l 6044 9339 l 5986 9349 l
+ 5929 9357 l 5872 9365 l 5815 9372 l 5759 9379 l 5704 9385 l
+ 5649 9391 l 5594 9396 l 5540 9401 l 5486 9406 l 5432 9410 l
+ 5380 9414 l 5327 9418 l 5276 9422 l 5226 9425 l 5177 9428 l
+ 5130 9431 l 5084 9434 l 5041 9436 l 5000 9439 l 4962 9441 l
+ 4927 9442 l 4896 9444 l 4868 9445 l 4844 9447 l 4824 9448 l
+ 4807 9448 l 4794 9449 l 4784 9449 l 4778 9450 l 4773 9450 l
+ 4771 9450 l
+ 4770 9450 l gs col0 s gr 
+/Helvetica-iso ff 150.00 scf sf
+5445 7200 m
+gs 1 -1 sc (net_device) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 150.00 scf sf
+6795 7200 m
+gs 1 -1 sc (net_device) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Courier-iso ff 150.00 scf sf
+5355 6210 m
+gs 1 -1 sc (ecdev_*\(\)) dup sw pop neg 0 rm  col0 sh gr
+/Courier-iso ff 150.00 scf sf
+7110 6210 m
+gs 1 -1 sc (netif_*\(\)) dup sw pop neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+6345 6570 m
+gs 1 -1 sc (EtherCAT Network) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+6345 6750 m
+gs 1 -1 sc (Driver Module) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5445 4860 m
+gs 1 -1 sc (Master0) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4005 3870 m
+gs 1 -1 sc (EtherCAT Master Module) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+7290 4815 m
+gs 1 -1 sc  90.0 rot (Network Stack) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 9135 m
+gs 1 -1 sc (EtherCAT) dup sw pop neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 9495 m
+gs 1 -1 sc (Ethernet) dup sw pop neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4995 8100 m
+gs 1 -1 sc (NIC) dup sw pop neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+6345 8100 m
+gs 1 -1 sc (NIC) dup sw pop neg 0 rm  col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1665 8010 m
+gs 1 -1 sc (Hardware) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1845 3870 m
+gs 1 -1 sc (Realtime Module) col0 sh gr
+/Courier-iso ff 150.00 scf sf
+3645 4725 m
+gs 1 -1 sc  270.0 rot (ecrt_*\(\)) dup sw pop neg 0 rm  col0 sh gr
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/masterarch.fig b/doc/images/masterarch.fig
new file mode 100644
index 00000000..e59f9ee4
--- /dev/null
+++ b/doc/images/masterarch.fig
@@ -0,0 +1,156 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 7245.000 5985.000 6975 5985 7245 5715 7515 5985
+6 5085 7965 5850 8820
+2 3 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 8
+	 5175 7965 5760 7965 5760 8775 5175 8775 5175 8415 5085 8415
+	 5085 7965 5175 7965
+2 2 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 5
+	 5490 8190 5670 8190 5670 8370 5490 8370 5490 8190
+2 2 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 5
+	 5310 8505 5400 8505 5400 8595 5310 8595 5310 8505
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 5175 8055 5085 8055
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 5175 8145 5085 8145
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 5175 8190 5085 8190
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 5175 8280 5085 8280
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 5175 8235 5085 8235
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 5175 8100 5085 8100
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 5175 8010 5085 8010
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 5175 8325 5085 8325
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 5175 8370 5085 8370
+2 2 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 5
+	 5850 8775 5085 8775 5085 8815 5850 8815 5850 8775
+-6
+6 6435 7965 7200 8820
+2 3 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 8
+	 6525 7965 7110 7965 7110 8775 6525 8775 6525 8415 6435 8415
+	 6435 7965 6525 7965
+2 2 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 5
+	 6840 8190 7020 8190 7020 8370 6840 8370 6840 8190
+2 2 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 5
+	 6660 8505 6750 8505 6750 8595 6660 8595 6660 8505
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 6525 8055 6435 8055
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 6525 8145 6435 8145
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 6525 8190 6435 8190
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 6525 8280 6435 8280
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 6525 8235 6435 8235
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 6525 8100 6435 8100
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 6525 8010 6435 8010
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 6525 8325 6435 8325
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 6525 8370 6435 8370
+2 2 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 5
+	 7200 8775 6435 8775 6435 8815 7200 8815 7200 8775
+-6
+6 4905 5445 5985 6030
+5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5445.000 5985.000 4950 5985 5445 5490 5940 5985
+4 1 0 50 -1 16 10 0.0000 4 105 795 5445 5760 Device\001
+4 1 0 50 -1 16 10 0.0000 4 105 975 5445 5925 Interface\001
+-6
+6 3870 4275 4500 5355
+5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 3958.125 4815.000 3915 4320 4455 4815 3915 5310
+4 1 0 50 -1 16 10 4.7124 4 105 1020 4162 4822 Realtime\001
+4 1 0 50 -1 16 10 4.7124 4 105 975 3997 4822 Interface\001
+-6
+6 4500 2610 5850 3330
+5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5175.000 2655.000 5805 2655 5175 3285 4545 2655
+4 1 0 50 -1 16 12 0.0000 4 120 1215 5175 3105 Interface\001
+4 1 0 50 -1 16 12 0.0000 4 165 795 5175 2880 Sysfs\001
+-6
+6 1575 2430 7785 2925
+2 1 1 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 7785 2655 1575 2655
+4 0 0 50 -1 16 12 0.0000 4 150 1980 1665 2880 Kernel-Space\001
+4 0 0 50 -1 16 12 0.0000 4 150 1725 1665 2565 User-Space\001
+-6
+6 4635 1260 5715 2340
+1 2 0 1 0 7 50 -1 -1 4.000 1 0.0000 5175 1800 495 495 5670 2295 4680 1305
+4 1 0 50 -1 16 12 0.0000 4 120 585 5175 1845 lsec\001
+-6
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 5445 4815 810 495 4635 4320 6255 5310
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 5445 7965 5445 7425
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 6795 7965 6795 7425
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 5445 6885 5445 5985
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 5535 8820 5625 8820 5625 8910 5535 8910 5535 8820
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 6885 8820 6975 8820 6975 8910 6885 8910 6885 8820
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 7245 6885 7245 5985
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+	 7605 7605 7605 6345 4635 6345 4635 7605 7605 7605
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 4905 6885 5985 6885 5985 7425 4905 7425 4905 6885
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 6255 6885 7335 6885 7335 7425 6255 7425 6255 6885
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 5445 5490 5445 5310
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 8 0 0 5
+	 6435 5985 6435 3645 3915 3645 3915 5985 6435 5985
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 4635 4815 4455 4815
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 3915 4815 3465 4815
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 7605 3645 6885 3645 6885 5985 7605 5985 7605 3645
+2 1 1 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 1575 7785 7785 7785
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 9 0 0 5
+	 1755 5985 1755 3645 3465 3645 3465 5985 1755 5985
+2 1 1 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 1575 8280 1575 2205
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 5175 3285 5175 3645
+2 1 1 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 7785 8280 7785 2205
+2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
+	 5175 2655 5175 2295
+3 2 0 1 0 7 50 -1 -1 0.000 0 0 0 3
+	 5580 8910 5355 9045 4770 9090
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 0 0 3
+	 6931 8910 6390 9270 4770 9450
+	 0.000 -1.000 0.000
+4 1 0 50 -1 16 10 0.0000 4 135 1215 5445 7200 net_device\001
+4 1 0 50 -1 16 10 0.0000 4 135 1215 6795 7200 net_device\001
+4 2 0 50 -1 12 10 0.0000 4 105 1080 5355 6210 ecdev_*()\001
+4 2 0 50 -1 12 10 0.0000 4 105 1080 7110 6210 netif_*()\001
+4 1 0 50 -1 16 12 0.0000 4 120 2685 6345 6570 EtherCAT Network\001
+4 1 0 50 -1 16 12 0.0000 4 120 1995 6345 6750 Driver Module\001
+4 1 0 50 -1 16 12 0.0000 4 120 1140 5445 4860 Master0\001
+4 0 0 50 -1 16 12 0.0000 4 120 3585 4005 3870 EtherCAT Master Module\001
+4 1 0 50 -1 16 12 1.5708 4 120 2070 7290 4815 Network Stack\001
+4 2 0 50 -1 16 12 0.0000 4 120 1425 4725 9135 EtherCAT\001
+4 2 0 50 -1 16 12 0.0000 4 120 1200 4725 9495 Ethernet\001
+4 2 0 50 -1 16 12 0.0000 4 120 555 4995 8100 NIC\001
+4 2 0 50 -1 16 12 0.0000 4 120 555 6345 8100 NIC\001
+4 0 0 50 -1 16 12 0.0000 4 120 1410 1665 8010 Hardware\001
+4 0 0 50 -1 16 12 0.0000 4 120 2385 1845 3870 Realtime Module\001
+4 2 0 50 -1 12 10 4.7124 4 105 960 3645 4725 ecrt_*()\001
diff --git a/doc/images/masterarch.pdf b/doc/images/masterarch.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..a00c7fd8a264ed0e60ba204f3a74858a5268976a
GIT binary patch
literal 3828
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

literal 0
HcmV?d00001

diff --git a/doc/images/masters.eps b/doc/images/masters.eps
new file mode 100644
index 00000000..07208372
--- /dev/null
+++ b/doc/images/masters.eps
@@ -0,0 +1,140 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: masters.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Thu Jul 27 11:18:48 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 278 143
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+newpath 0 143 moveto 0 0 lineto 278 0 lineto 278 143 lineto closepath clip newpath
+-98.5 221.9 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+	/endangle exch def
+	/startangle exch def
+	/yrad exch def
+	/xrad exch def
+	/y exch def
+	/x exch def
+	/savematrix mtrx currentmatrix def
+	x y tr xrad yrad sc 0 0 1 startangle endangle arc
+	closepath
+	savematrix setmatrix
+	} def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Ellipse
+7.500 slw
+n 3037 2700 697 337 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+3015 2790 m
+gs 1 -1 sc (master 0) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Ellipse
+n 4747 2700 697 337 0 360 DrawEllipse gs col0 s gr
+
+/Helvetica ff 180.00 scf sf
+4770 2790 m
+gs 1 -1 sc (master 1) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Polyline
+n 2265 1890 m 2160 1890 2160 3135 105 arcto 4 {pop} repeat
+  2160 3240 5520 3240 105 arcto 4 {pop} repeat
+  5625 3240 5625 1995 105 arcto 4 {pop} repeat
+  5625 1890 2265 1890 105 arcto 4 {pop} repeat
+ cp gs col0 s gr 
+% Polyline
+ [60] 0 sd
+n 1575 1275 m 5895 1275 l 5895 3510 l 1575 3510 l
+ cp gs col0 s gr  [] 0 sd
+/Helvetica ff 180.00 scf sf
+2295 2115 m
+gs 1 -1 sc (EtherCAT master module) col0 sh gr
+/Helvetica ff 180.00 scf sf
+1710 1530 m
+gs 1 -1 sc (Kernel space) col0 sh gr
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/masters.fig b/doc/images/masters.fig
new file mode 100644
index 00000000..40296796
--- /dev/null
+++ b/doc/images/masters.fig
@@ -0,0 +1,23 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+6 2295 2340 3780 3060
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 3037 2700 697 337 2340 2700 3734 2700
+4 1 0 50 -1 16 12 0.0000 4 120 1215 3015 2790 master 0\001
+-6
+6 4005 2340 5490 3060
+1 2 0 1 0 7 50 -1 -1 0.000 1 0.0000 4747 2700 697 337 4050 2700 5444 2700
+4 1 0 50 -1 16 12 0.0000 4 120 1215 4770 2790 master 1\001
+-6
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+	 5625 3240 5625 1890 2160 1890 2160 3240 5625 3240
+2 2 1 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 5
+	 1575 1275 5895 1275 5895 3510 1575 3510 1575 1275
+4 0 0 50 -1 16 12 0.0000 4 120 3585 2295 2115 EtherCAT master module\001
+4 0 0 50 -1 16 12 0.0000 4 150 1890 1710 1530 Kernel space\001
diff --git a/doc/images/masters.pdf b/doc/images/masters.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..6c55d567ff813efdd130e65e6e3d9c6c395f35e2
GIT binary patch
literal 1546
zcmZ`(drVVT7&jZnc_-}Ua5i%ud1yOEZ*NO!i_i&_A_$>tVbiq?FYRf$P<qR~x1`|E
z`4|&2c`VVvz_4_}G~(24=ulkDmcT-$3>k_j8weY0AtRd2xW&oN!2%K8`RCsA`@ZjY
zzQ^yJaDz@CNl6t%c-LgLk5B>`U~}_{*jO?Rx*S3th(?H!)H6;2a)8u3X#wh>m9;^w
zmf!^r(uIV#ala{!9g;1({&$4BC2>pbKQA?eO#C1@a@v<TJRTM}d8&j=n%@4K<F%k&
z(w$2x9JL+mQ!^&^_8!YIcP-Xlw{^T4|M4sFA@>${u6Ap8tD1I}b&ox!mxf73F4Yd#
zH9Bk;s}ka;Li%6c++5Q)9b8?Ldg$=Fz@^QG^pkI#7$|*z>&9CjRUBwK*VlGCD7bp-
zi_54g^Sy$=(Ae`=*533!m2v*s*O8;UKHNQM%oLU61iZI?U@|vt|Jxr_u6d@*;@&)*
z+a4E}kt|G=Cx0ax7KQEE(3n$a-<uM=wEmK-LOpb12Q3;8JJeq8POGpC6|y&_-8E~^
z{L&D9nO0p;|M}d$(F4<Oerq3W=(u4ya%;NvhAZod))hSkajWtV=l8E18LVCTO?O9U
z)t%OWwyb0CrdDlhtt_)#Q0S7xCB33mMfIQOu<X(LCr^q~MtgJH)@80a-BcIvyItKL
z`s^pJ{Nq<gFJ~1*jeVasHQo`rZ`<*!U;g!3<WJ7&7Lnx2J3sdiJU&q<Z43C(@$|u%
zh%MfO&o6<#km^2ja<hU<iI_OMN#pwBOzHNzswQpFK>4Y=F?Z`f^>9;VJ|DZh=jdA(
zM;5KfX&LQdI{T)s75zSXu6)O&=hw5)W%G|0{b5O9A>eORw1)6QQS)laEOA59Ksz9r
z4s8sbz<PmMhRkx68c<P+YyufM=n{Ye>xm$ZkY_!d74k@F29C9wpkOAE76F+Fy#jJi
z@(Rf&0jUjW?nmfZ6is1HBZ0I>CZate<N?;~4CK!WpKxEphzz9#X7b_zxrwpyz)aw*
zjYKv;3?590+5Dl@T&O=Xkrrqt>zJjupZvVP>OuecqzN*^kPaxV)=!LU@ZT$=iojvU
zd6t=?X02*M{h$?Z{l)~Ehqw*oM(8Yt0%N6T(j+lPkS0&AfTw_KMkmkKB%hB*jkbBL
zkP|1F3?Mm=<pti#F>V2<rIb>FT8gf-z_2bIYP(n$BbUjdWh%LfqA0aef$Zt5?f*=f
zjNpXgLYha<1TVESj#)aE6QiBn28+S#$b{H|LMjIaTCnChVKH=qDC8RN5%RF7dqcj*
z&ETiTBGx-uj-g$^!1B-{k<9hd%RxIK0~AHb<`#%nDium#2eX(;jq1h=xaKg82916J
zrjnzXF2IzkhcOw2WVX;x`7obaffTyHPxA;&twLH`=!deM!vv0IoRC8=F(6G$DMa-G
z(#Wz%uvi~}OmW#+fQO52Q;H6l#g*SJf59SI6!yoz(RcLLvDHPAM?l$F?Yuy9!b}?}
NxePu1;Yk^K;y<_271#g(

literal 0
HcmV?d00001

diff --git a/doc/images/modes.eps b/doc/images/modes.eps
new file mode 100644
index 00000000..89443585
--- /dev/null
+++ b/doc/images/modes.eps
@@ -0,0 +1,254 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: modes.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Sat Aug  5 17:19:24 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 428 87
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.555 0.555 0.555 srgb} bind def
+
+end
+save
+newpath 0 87 moveto 0 0 lineto 428 0 lineto 428 87 lineto closepath clip newpath
+-69.2 130.4 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+	/endangle exch def
+	/startangle exch def
+	/yrad exch def
+	/xrad exch def
+	/y exch def
+	/x exch def
+	/savematrix mtrx currentmatrix def
+	x y tr xrad yrad sc 0 0 1 startangle endangle arc
+	closepath
+	savematrix setmatrix
+	} def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 100
+% Polyline
+7.500 slw
+n 1500 1125 m 1395 1125 1395 1560 105 arcto 4 {pop} repeat
+  1395 1665 2370 1665 105 arcto 4 {pop} repeat
+  2475 1665 2475 1230 105 arcto 4 {pop} repeat
+  2475 1125 1500 1125 105 arcto 4 {pop} repeat
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+1935 1462 m
+gs 1 -1 sc (Orphaned) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Polyline
+n 4110 1125 m 4005 1125 4005 1560 105 arcto 4 {pop} repeat
+  4005 1665 4980 1665 105 arcto 4 {pop} repeat
+  5085 1665 5085 1230 105 arcto 4 {pop} repeat
+  5085 1125 4110 1125 105 arcto 4 {pop} repeat
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+4545 1462 m
+gs 1 -1 sc (Idle) dup sw pop 2 div neg 0 rm  col0 sh gr
+% Polyline
+n 6720 1125 m 6615 1125 6615 1560 105 arcto 4 {pop} repeat
+  6615 1665 7590 1665 105 arcto 4 {pop} repeat
+  7695 1665 7695 1230 105 arcto 4 {pop} repeat
+  7695 1125 6720 1125 105 arcto 4 {pop} repeat
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+7155 1462 m
+gs 1 -1 sc (Operation) dup sw pop 2 div neg 0 rm  col0 sh gr
+% here ends figure;
+% 
+% here starts figure with depth 50
+% Ellipse
+7.500 slw
+n 1170 810 64 64 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
+
+% Polyline
+2 slj
+gs  clippath
+4049 1158 m 4077 1105 l 3944 1034 l 4036 1117 l 3916 1087 l cp
+eoclip
+n 2430 1125 m 2431 1124 l 2434 1123 l 2438 1121 l 2445 1117 l 2455 1112 l
+ 2468 1105 l 2484 1097 l 2502 1087 l 2524 1077 l 2548 1065 l
+ 2574 1053 l 2603 1040 l 2633 1027 l 2664 1013 l 2697 1000 l
+ 2731 988 l 2767 975 l 2804 963 l 2843 952 l 2884 942 l
+ 2927 932 l 2973 923 l 3021 916 l 3072 909 l 3126 904 l
+ 3182 901 l 3240 900 l 3298 901 l 3354 904 l 3408 909 l
+ 3459 916 l 3507 923 l 3553 932 l 3596 942 l 3637 952 l
+ 3676 963 l 3713 975 l 3749 988 l 3783 1000 l 3816 1013 l
+ 3848 1027 l 3877 1040 l 3906 1053 l 3932 1065 l 3956 1077 l
+ 3978 1087 l 3996 1097 l 4012 1105 l 4025 1112 l 4035 1117 l
+
+ 4050 1125 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3916 1087 m 4036 1117 l 3944 1034 l 3916 1087 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+6659 1158 m 6687 1105 l 6554 1034 l 6646 1117 l 6526 1087 l cp
+eoclip
+n 5040 1125 m 5041 1124 l 5044 1123 l 5048 1121 l 5055 1117 l 5065 1112 l
+ 5078 1105 l 5094 1097 l 5112 1087 l 5134 1077 l 5158 1065 l
+ 5184 1053 l 5213 1040 l 5243 1027 l 5274 1013 l 5307 1000 l
+ 5341 988 l 5377 975 l 5414 963 l 5453 952 l 5494 942 l
+ 5537 932 l 5583 923 l 5631 916 l 5682 909 l 5736 904 l
+ 5792 901 l 5850 900 l 5908 901 l 5964 904 l 6018 909 l
+ 6069 916 l 6117 923 l 6163 932 l 6206 942 l 6247 952 l
+ 6286 963 l 6323 975 l 6359 988 l 6393 1000 l 6426 1013 l
+ 6458 1027 l 6487 1040 l 6516 1053 l 6542 1065 l 6566 1077 l
+ 6588 1087 l 6606 1097 l 6622 1105 l 6635 1112 l 6645 1117 l
+
+ 6660 1125 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 6526 1087 m 6646 1117 l 6554 1034 l 6526 1087 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+1426 1155 m 1472 1116 l 1373 1002 l 1429 1113 l 1328 1041 l cp
+eoclip
+n 1170 810 m
+ 1440 1125 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 1328 1041 m 1429 1113 l 1373 1002 l 1328 1041 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+2430 1631 m 2402 1684 l 2535 1755 l 2444 1673 l 2564 1703 l cp
+eoclip
+n 4050 1665 m 4049 1666 l 4046 1667 l 4042 1669 l 4035 1673 l 4025 1678 l
+ 4012 1685 l 3996 1693 l 3978 1703 l 3956 1713 l 3932 1725 l
+ 3906 1737 l 3877 1750 l 3847 1763 l 3816 1777 l 3783 1790 l
+ 3749 1802 l 3713 1815 l 3676 1827 l 3637 1838 l 3596 1848 l
+ 3553 1858 l 3507 1867 l 3459 1874 l 3408 1881 l 3354 1886 l
+ 3298 1889 l 3240 1890 l 3182 1889 l 3126 1886 l 3072 1881 l
+ 3021 1874 l 2973 1867 l 2927 1858 l 2884 1848 l 2843 1838 l
+ 2804 1827 l 2767 1815 l 2731 1802 l 2697 1790 l 2664 1777 l
+ 2632 1763 l 2603 1750 l 2574 1737 l 2548 1725 l 2524 1713 l
+ 2502 1703 l 2484 1693 l 2468 1685 l 2455 1678 l 2445 1673 l
+
+ 2430 1665 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 2564 1703 m 2444 1673 l 2535 1755 l 2564 1703 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5040 1631 m 5012 1684 l 5145 1755 l 5054 1673 l 5174 1703 l cp
+eoclip
+n 6660 1665 m 6659 1666 l 6656 1667 l 6652 1669 l 6645 1673 l 6635 1678 l
+ 6622 1685 l 6606 1693 l 6588 1703 l 6566 1713 l 6542 1725 l
+ 6516 1737 l 6487 1750 l 6457 1763 l 6426 1777 l 6393 1790 l
+ 6359 1802 l 6323 1815 l 6286 1827 l 6247 1838 l 6206 1848 l
+ 6163 1858 l 6117 1867 l 6069 1874 l 6018 1881 l 5964 1886 l
+ 5908 1889 l 5850 1890 l 5792 1889 l 5736 1886 l 5682 1881 l
+ 5631 1874 l 5583 1867 l 5537 1858 l 5494 1848 l 5453 1838 l
+ 5414 1827 l 5377 1815 l 5341 1802 l 5307 1790 l 5274 1777 l
+ 5242 1763 l 5213 1750 l 5184 1737 l 5158 1725 l 5134 1713 l
+ 5112 1703 l 5094 1693 l 5078 1685 l 5065 1678 l 5055 1673 l
+
+ 5040 1665 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5174 1703 m 5054 1673 l 5145 1755 l 5174 1703 l  cp gs 0.00 setgray ef gr  col0 s
+/Helvetica ff 180.00 scf sf
+3240 810 m
+gs 1 -1 sc (Device connection) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+5850 810 m
+gs 1 -1 sc (Master request) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+3240 2070 m
+gs 1 -1 sc (Device disconnection) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+5850 2070 m
+gs 1 -1 sc (Master release) dup sw pop 2 div neg 0 rm  col0 sh gr
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/modes.fig b/doc/images/modes.fig
new file mode 100644
index 00000000..87c202ce
--- /dev/null
+++ b/doc/images/modes.fig
@@ -0,0 +1,50 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #8e8e8e
+6 1215 1125 2655 1665
+2 4 0 1 0 7 100 0 20 4.000 0 0 7 0 0 5
+	 2475 1665 2475 1125 1395 1125 1395 1665 2475 1665
+4 1 0 100 0 16 12 0.0000 4 150 1440 1935 1462 Orphaned\001
+-6
+6 4005 1125 5085 1665
+2 4 0 1 0 7 100 0 20 4.000 0 0 7 0 0 5
+	 5085 1665 5085 1125 4005 1125 4005 1665 5085 1665
+4 1 0 100 0 16 12 0.0000 4 120 510 4545 1462 Idle\001
+-6
+6 6450 1125 7860 1665
+2 4 0 1 0 7 100 0 20 4.000 0 0 7 0 0 5
+	 7695 1665 7695 1125 6615 1125 6615 1665 7695 1665
+4 1 0 100 0 16 12 0.0000 4 150 1410 7155 1462 Operation\001
+-6
+1 3 0 1 0 0 50 -1 20 0.000 1 0.0000 1170 810 64 64 1170 810 1125 765
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 2430 1125 3240 900 4050 1125
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5040 1125 5850 900 6660 1125
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 1170 810 1440 1125
+	 0.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 4050 1665 3240 1890 2430 1665
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 6660 1665 5850 1890 5040 1665
+	 0.000 -1.000 0.000
+4 1 0 50 -1 16 12 0.0000 4 120 2640 3240 810 Device connection\001
+4 1 0 50 -1 16 12 0.0000 4 150 2100 5850 810 Master request\001
+4 1 0 50 -1 16 12 0.0000 4 120 3060 3240 2070 Device disconnection\001
+4 1 0 50 -1 16 12 0.0000 4 120 2100 5850 2070 Master release\001
diff --git a/doc/images/modes.pdf b/doc/images/modes.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..51b5e93ecaaf7005f4b48681abf55e4ff37dfc77
GIT binary patch
literal 3305
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%0D0BYyXWnn=N%eIkZ028E<
zeyV(H>U$Ie!~8ueI4%cwlUbl(42Zp;_i>O-b0>c*6CuE02wRRDTW|@2o}o8??@8xp
zJ~U_w#~ozC&25Rm9x8*yX1OzIK5PJ^jY4ZdBZb^5o5rA<L1TxT?a)CY^^q7P8fAbo
z)I~yZ0)z7ZLUuH^HwZrl*<O~m2hH=l7=sCiPC69uIB)=DvLJ0hS6c@llG*N5Z}2$i
z4d_8s9EVL6FnzFI93Ps%N4voB-V7#<Ob3Vz7U-g-^<$ELOwa>{1W+g#^2Y<{qtUu(
zzynyubkKUxO$r`>{sS{WL$~(}riX#1^9!b{`wt!xiGr5wS03sgJRLL!y69hc`u~RM
zLVNrx5B)#6Y$loJ4Kks>834kT<_|*s0tga=0j;ZGI{?H!x(5RgTrKol+Ghqh!_R}J
s`Sue*gIzB4v6FSOw_M;_|Ax5=ww=W$Guht;sbi>*glTG;TjOE>1;B`le*gdg

literal 0
HcmV?d00001

diff --git a/doc/images/statetrans.eps b/doc/images/statetrans.eps
new file mode 100644
index 00000000..51c01784
--- /dev/null
+++ b/doc/images/statetrans.eps
@@ -0,0 +1,287 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: statetrans.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Wed Aug  9 13:16:04 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 296 178
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.555 0.555 0.555 srgb} bind def
+
+end
+save
+newpath 0 178 moveto 0 0 lineto 296 0 lineto 296 178 lineto closepath clip newpath
+-109.4 255.3 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+ /DrawEllipse {
+	/endangle exch def
+	/startangle exch def
+	/yrad exch def
+	/xrad exch def
+	/y exch def
+	/x exch def
+	/savematrix mtrx currentmatrix def
+	x y tr xrad yrad sc 0 0 1 startangle endangle arc
+	closepath
+	savematrix setmatrix
+	} def
+
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 100
+% Ellipse
+7.500 slw
+n 1845 2025 101 101 0 360 DrawEllipse gs col7 0.00 shd ef gr gs col0 s gr
+
+% Polyline
+2 slj
+gs  clippath
+2715 2055 m 2715 1995 l 2564 1995 l 2684 2025 l 2564 2055 l cp
+eoclip
+n 1840 2025 m
+ 2700 2025 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 2564 2055 m 2684 2025 l 2564 1995 l 2564 2055 l  cp gs 0.00 setgray ef gr  col0 s
+% here ends figure;
+% 
+% here starts figure with depth 50
+% Ellipse
+7.500 slw
+n 3150 2025 445 445 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr
+
+% Ellipse
+n 4280 3600 445 445 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr
+
+% Ellipse
+n 5405 2025 445 445 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr
+
+% Polyline
+2 slj
+gs  clippath
+4022 3214 m 4081 3205 l 4059 3055 l 4048 3179 l 4000 3064 l cp
+eoclip
+n 3465 2340 m 3466 2341 l 3469 2343 l 3475 2346 l 3483 2351 l 3495 2358 l
+ 3509 2366 l 3526 2377 l 3545 2389 l 3565 2402 l 3587 2417 l
+ 3610 2434 l 3634 2451 l 3658 2470 l 3683 2490 l 3708 2513 l
+ 3734 2537 l 3760 2564 l 3787 2594 l 3815 2626 l 3843 2662 l
+ 3870 2700 l 3896 2739 l 3918 2778 l 3939 2815 l 3956 2850 l
+ 3971 2884 l 3984 2916 l 3995 2947 l 4005 2976 l 4013 3005 l
+ 4020 3032 l 4026 3059 l 4031 3084 l 4036 3107 l 4040 3128 l
+ 4043 3147 l 4045 3162 l 4047 3175 l
+ 4050 3195 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4000 3064 m 4048 3179 l 4059 3055 l 4000 3064 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4997 1878 m 5020 1822 l 4880 1765 l 4980 1839 l 4857 1821 l cp
+eoclip
+n 3600 1935 m 3601 1934 l 3604 1933 l 3608 1930 l 3615 1926 l 3625 1920 l
+ 3637 1913 l 3652 1904 l 3670 1894 l 3691 1883 l 3714 1871 l
+ 3738 1858 l 3765 1845 l 3792 1832 l 3822 1819 l 3852 1806 l
+ 3884 1793 l 3918 1781 l 3954 1769 l 3992 1758 l 4032 1747 l
+ 4075 1737 l 4121 1728 l 4170 1721 l 4222 1714 l 4275 1710 l
+ 4328 1708 l 4381 1707 l 4431 1708 l 4478 1711 l 4523 1715 l
+ 4566 1721 l 4606 1727 l 4644 1734 l 4680 1742 l 4715 1750 l
+ 4748 1759 l 4780 1768 l 4811 1778 l 4840 1787 l 4867 1796 l
+ 4893 1805 l 4916 1814 l 4936 1821 l 4953 1828 l 4967 1834 l
+ 4978 1838 l
+ 4995 1845 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4857 1821 m 4980 1839 l 4880 1765 l 4857 1821 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+4467 3201 m 4524 3217 l 4565 3071 l 4504 3179 l 4507 3055 l cp
+eoclip
+n 5130 2385 m 5129 2386 l 5126 2388 l 5120 2391 l 5112 2396 l 5102 2404 l
+ 5088 2413 l 5072 2424 l 5053 2437 l 5033 2451 l 5012 2467 l
+ 4989 2483 l 4966 2501 l 4943 2521 l 4918 2541 l 4893 2563 l
+ 4867 2588 l 4840 2614 l 4812 2643 l 4783 2675 l 4754 2709 l
+ 4725 2745 l 4697 2782 l 4672 2818 l 4649 2853 l 4629 2886 l
+ 4611 2917 l 4596 2946 l 4582 2974 l 4569 3000 l 4558 3026 l
+ 4548 3051 l 4539 3074 l 4531 3096 l 4524 3117 l 4518 3136 l
+ 4513 3152 l 4508 3166 l 4505 3177 l
+ 4500 3195 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 4507 3055 m 4504 3179 l 4565 3071 l 4507 3055 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+3597 2126 m 3574 2182 l 3715 2238 l 3615 2166 l 3737 2182 l cp
+eoclip
+n 4950 2115 m 4949 2116 l 4946 2117 l 4942 2119 l 4935 2122 l 4925 2127 l
+ 4912 2133 l 4896 2141 l 4877 2149 l 4856 2158 l 4833 2168 l
+ 4808 2179 l 4781 2190 l 4753 2200 l 4723 2211 l 4692 2222 l
+ 4660 2232 l 4626 2242 l 4590 2251 l 4553 2260 l 4513 2269 l
+ 4470 2276 l 4425 2283 l 4377 2288 l 4327 2292 l 4275 2295 l
+ 4223 2296 l 4173 2295 l 4125 2293 l 4080 2289 l 4037 2284 l
+ 3997 2279 l 3960 2272 l 3924 2265 l 3890 2258 l 3858 2250 l
+ 3827 2241 l 3797 2232 l 3769 2223 l 3742 2214 l 3717 2205 l
+ 3694 2197 l 3673 2189 l 3654 2182 l 3638 2176 l 3625 2171 l
+ 3615 2166 l
+ 3600 2160 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3737 2182 m 3615 2166 l 3715 2238 l 3737 2182 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+3268 2457 m 3208 2463 l 3224 2613 l 3242 2491 l 3283 2607 l cp
+eoclip
+n 3870 3420 m 3869 3419 l 3866 3418 l 3861 3416 l 3854 3413 l 3843 3408 l
+ 3830 3402 l 3814 3394 l 3796 3385 l 3776 3375 l 3755 3364 l
+ 3732 3351 l 3709 3337 l 3684 3322 l 3660 3306 l 3635 3288 l
+ 3609 3268 l 3583 3247 l 3557 3223 l 3530 3196 l 3503 3167 l
+ 3475 3134 l 3447 3098 l 3420 3060 l 3395 3020 l 3372 2980 l
+ 3352 2941 l 3335 2903 l 3319 2867 l 3306 2831 l 3295 2798 l
+ 3286 2765 l 3278 2733 l 3271 2702 l 3265 2672 l 3260 2642 l
+ 3255 2614 l 3252 2588 l 3249 2564 l 3246 2542 l 3244 2523 l
+ 3243 2507 l 3242 2495 l
+ 3240 2475 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 3283 2607 m 3242 2491 l 3224 2613 l 3283 2607 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+2 slj
+gs  clippath
+5681 1668 m 5737 1689 l 5791 1548 l 5721 1650 l 5735 1527 l cp
+eoclip
+n 5805 1800 m 5807 1800 l 5813 1800 l 5822 1799 l 5836 1799 l 5855 1798 l
+ 5879 1797 l 5907 1795 l 5938 1793 l 5970 1791 l 6005 1787 l
+ 6039 1783 l 6074 1779 l 6107 1773 l 6140 1766 l 6171 1758 l
+ 6200 1748 l 6227 1736 l 6251 1722 l 6272 1705 l 6289 1686 l
+ 6300 1665 l 6305 1642 l 6305 1618 l 6300 1594 l 6292 1572 l
+ 6283 1550 l 6271 1530 l 6259 1511 l 6246 1493 l 6233 1476 l
+ 6220 1460 l 6206 1444 l 6192 1428 l 6177 1413 l 6161 1398 l
+ 6145 1383 l 6126 1367 l 6107 1353 l 6085 1338 l 6062 1326 l
+ 6038 1315 l 6012 1308 l 5985 1305 l 5956 1308 l 5929 1318 l
+ 5904 1332 l 5881 1350 l 5861 1372 l 5842 1395 l 5824 1421 l
+ 5808 1449 l 5792 1478 l 5778 1508 l 5765 1537 l 5753 1565 l
+ 5743 1591 l 5734 1614 l 5727 1633 l
+ 5715 1665 l gs col0 s gr gr
+
+% arrowhead
+0 slj
+n 5735 1527 m 5721 1650 l 5791 1548 l 5735 1527 l  cp gs 0.00 setgray ef gr  col0 s
+/Helvetica ff 240.00 scf sf
+3150 2115 m
+gs 1 -1 sc (s0) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 240.00 scf sf
+5400 2115 m
+gs 1 -1 sc (s1) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 240.00 scf sf
+4275 3690 m
+gs 1 -1 sc (s2) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Symbol ff 240.00 scf sf
+3915 2610 m
+gs 1 -1 sc (e) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Symbol ff 240.00 scf sf
+3375 3240 m
+gs 1 -1 sc (e) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Symbol ff 240.00 scf sf
+4320 2250 m
+gs 1 -1 sc (e) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 240.00 scf sf
+3015 3240 m
+gs 1 -1 sc (a, b,) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 240.00 scf sf
+4590 2745 m
+gs 1 -1 sc (a) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 240.00 scf sf
+6300 1395 m
+gs 1 -1 sc (b) dup sw pop 2 div neg 0 rm  col0 sh gr
+/Helvetica ff 240.00 scf sf
+4185 1665 m
+gs 1 -1 sc (a, b) dup sw pop 2 div neg 0 rm  col0 sh gr
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/statetrans.fig b/doc/images/statetrans.fig
new file mode 100644
index 00000000..e8a2332e
--- /dev/null
+++ b/doc/images/statetrans.fig
@@ -0,0 +1,52 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #8e8e8e
+1 3 0 1 0 7 50 -1 20 0.000 1 0.0000 3150 2025 445 445 3150 2025 3595 2025
+1 3 0 1 0 7 50 -1 20 0.000 1 0.0000 4280 3600 445 445 4280 3600 4725 3600
+1 3 0 1 0 7 50 -1 20 0.000 1 0.0000 5405 2025 445 445 5405 2025 5850 2025
+1 3 0 1 0 7 100 0 0 4.000 1 0.0000 1845 2025 101 101 1845 2025 1935 2070
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 3465 2340 3870 2700 4050 3195
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 3600 1935 4275 1710 4995 1845
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 5130 2385 4725 2745 4500 3195
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 4950 2115 4275 2295 3600 2160
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 3
+	1 1 1.00 60.00 120.00
+	 3870 3420 3420 3060 3240 2475
+	 0.000 -1.000 0.000
+3 2 0 1 0 7 50 -1 -1 0.000 0 1 0 4
+	1 1 1.00 60.00 120.00
+	 5805 1800 6300 1665 5985 1305 5715 1665
+	 0.000 -1.000 -1.000 0.000
+3 2 0 1 0 7 100 0 -1 0.000 0 1 0 2
+	1 1 1.00 60.00 120.00
+	 1840 2025 2700 2025
+	 0.000 0.000
+4 1 0 50 -1 16 16 0.0000 4 150 465 3150 2115 s0\001
+4 1 0 50 -1 16 16 0.0000 4 150 465 5400 2115 s1\001
+4 1 0 50 -1 16 16 0.0000 4 150 465 4275 3690 s2\001
+4 1 0 50 -1 32 16 0.0000 4 120 180 3915 2610 e\001
+4 1 0 50 -1 32 16 0.0000 4 120 180 3375 3240 e\001
+4 1 0 50 -1 32 16 0.0000 4 120 180 4320 2250 e\001
+4 1 0 50 -1 16 16 0.0000 4 195 840 3015 3240 a, b,\001
+4 1 0 50 -1 16 16 0.0000 4 120 240 4590 2745 a\001
+4 1 0 50 -1 16 16 0.0000 4 165 240 6300 1395 b\001
+4 1 0 50 -1 16 16 0.0000 4 195 720 4185 1665 a, b\001
diff --git a/doc/images/statetrans.pdf b/doc/images/statetrans.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..9017a8bfc97d837870bf3bf3a8e2a4a4d25f4f30
GIT binary patch
literal 4550
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

literal 0
HcmV?d00001

diff --git a/doc/images/uml-all.eps b/doc/images/uml-all.eps
new file mode 100644
index 00000000..794b43d1
--- /dev/null
+++ b/doc/images/uml-all.eps
@@ -0,0 +1,539 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: uml-all.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Mon Aug  7 21:30:07 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 551 542
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.555 0.555 0.555 srgb} bind def
+
+end
+save
+newpath 0 542 moveto 0 0 lineto 551 0 lineto 551 542 lineto closepath clip newpath
+-16.3 556.3 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 101
+% Polyline
+7.500 slw
+n 270 292 m 2556 292 l 2556 720 l 270 720 l
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 270 8392 m 2556 8392 l 2556 8820 l 270 8820 l
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 270 7492 m 2556 7492 l 2556 7920 l 270 7920 l
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 3465 292 m 5751 292 l 5751 720 l 3465 720 l
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 3465 2092 m 5751 2092 l 5751 2520 l 3465 2520 l
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 3465 1192 m 5751 1192 l 5751 1620 l 3465 1620 l
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 3465 5377 m 5751 5377 l 5751 5805 l 3465 5805 l
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 3465 6277 m 5751 6277 l 5751 6705 l 3465 6705 l
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 6705 292 m 8991 292 l 8991 720 l 6705 720 l
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 6705 2092 m 8991 2092 l 8991 2520 l 6705 2520 l
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 3465 3307 m 5751 3307 l 5751 3735 l 3465 3735 l
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 3465 4207 m 5751 4207 l 5751 4635 l 3465 4635 l
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 270 4207 m 2556 4207 l 2556 4635 l 270 4635 l
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 3465 7492 m 5751 7492 l 5751 7920 l 3465 7920 l
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 3465 8392 m 5751 8392 l 5751 8820 l 3465 8820 l
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 270 577 m
+ 2556 577 l gs col0 s gr 
+% Polyline
+n 270 649 m
+ 2556 649 l gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+341 506 m
+gs 1 -1 sc (ec_master_t) col0 sh gr
+% Polyline
+n 270 8677 m
+ 2556 8677 l gs col0 s gr 
+% Polyline
+n 270 8749 m
+ 2556 8749 l gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+341 8606 m
+gs 1 -1 sc (ec_sii_pdo_entry_t) col0 sh gr
+% Polyline
+n 270 7777 m
+ 2556 7777 l gs col0 s gr 
+% Polyline
+n 270 7849 m
+ 2556 7849 l gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+341 7706 m
+gs 1 -1 sc (ec_sii_pdo_t) col0 sh gr
+% Polyline
+n 3465 577 m
+ 5751 577 l gs col0 s gr 
+% Polyline
+n 3465 649 m
+ 5751 649 l gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+3536 506 m
+gs 1 -1 sc (ec_device_t) col0 sh gr
+% Polyline
+n 3465 2377 m
+ 5751 2377 l gs col0 s gr 
+% Polyline
+n 3465 2449 m
+ 5751 2449 l gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+3536 2306 m
+gs 1 -1 sc (ec_eoe_t) col0 sh gr
+% Polyline
+n 3465 1477 m
+ 5751 1477 l gs col0 s gr 
+% Polyline
+n 3465 1549 m
+ 5751 1549 l gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+3536 1406 m
+gs 1 -1 sc (ec_fsm_t) col0 sh gr
+% Polyline
+n 3465 5662 m
+ 5751 5662 l gs col0 s gr 
+% Polyline
+n 3465 5734 m
+ 5751 5734 l gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+3536 5591 m
+gs 1 -1 sc (ec_sii_sync_t) col0 sh gr
+% Polyline
+n 3465 6562 m
+ 5751 6562 l gs col0 s gr 
+% Polyline
+n 3465 6634 m
+ 5751 6634 l gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+3536 6491 m
+gs 1 -1 sc (ec_fmmu_t) col0 sh gr
+% Polyline
+n 6705 577 m
+ 8991 577 l gs col0 s gr 
+% Polyline
+n 6705 649 m
+ 8991 649 l gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+6776 506 m
+gs 1 -1 sc (ec_debug_t) col0 sh gr
+% Polyline
+n 6705 2377 m
+ 8991 2377 l gs col0 s gr 
+% Polyline
+n 6705 2449 m
+ 8991 2449 l gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+6776 2306 m
+gs 1 -1 sc (ec_datagram_t) col0 sh gr
+% Polyline
+n 3465 3592 m
+ 5751 3592 l gs col0 s gr 
+% Polyline
+n 3465 3664 m
+ 5751 3664 l gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+3536 3521 m
+gs 1 -1 sc (ec_domain_t) col0 sh gr
+% Polyline
+n 3465 4492 m
+ 5751 4492 l gs col0 s gr 
+% Polyline
+n 3465 4564 m
+ 5751 4564 l gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+3536 4421 m
+gs 1 -1 sc (ec_data_reg_t) col0 sh gr
+% Polyline
+n 270 4492 m
+ 2556 4492 l gs col0 s gr 
+% Polyline
+n 270 4564 m
+ 2556 4564 l gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+341 4421 m
+gs 1 -1 sc (ec_slave_t) col0 sh gr
+% Polyline
+n 3465 7777 m
+ 5751 7777 l gs col0 s gr 
+% Polyline
+n 3465 7849 m
+ 5751 7849 l gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+3536 7706 m
+gs 1 -1 sc (ec_sdo_t) col0 sh gr
+% Polyline
+n 3465 8677 m
+ 5751 8677 l gs col0 s gr 
+% Polyline
+n 3465 8749 m
+ 5751 8749 l gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+3536 8606 m
+gs 1 -1 sc (ec_sdo_entry_t) col0 sh gr
+% here ends figure;
+% 
+% here starts figure with depth 50
+% Polyline
+7.500 slw
+n 1395 7920 m 1305 8055 l 1395 8190 l 1485 8055 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 1395 8190 m
+ 1395 8370 l gs col0 s gr 
+% Polyline
+n 4590 7920 m 4500 8055 l 4590 8190 l 4680 8055 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 4590 8190 m
+ 4590 8370 l gs col0 s gr 
+% Polyline
+n 2565 540 m
+ 3465 540 l gs col0 s gr 
+% Polyline
+n 1890 990 m 1890 2340 l
+ 3465 2340 l gs col0 s gr 
+% Polyline
+n 1440 990 m 1440 3375 l
+ 3465 3375 l gs col0 s gr 
+% Polyline
+n 2340 720 m 2250 855 l 2340 990 l 2430 855 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 1440 720 m 1350 855 l 1440 990 l 1530 855 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 1890 720 m 1800 855 l 1890 990 l 1980 855 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 990 720 m 900 855 l 990 990 l 1080 855 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+gs  clippath
+2550 4425 m 2550 4485 l 2702 4485 l 2582 4455 l 2702 4425 l cp
+eoclip
+n 3465 4455 m
+ 2565 4455 l gs col0 s gr gr
+
+% arrowhead
+n 2702 4425 m 2582 4455 l 2702 4485 l  col0 s
+% Polyline
+n 2340 4905 m 2340 5625 l
+ 3465 5625 l gs col0 s gr 
+% Polyline
+n 1890 4905 m 1890 6615 l
+ 3465 6615 l gs col0 s gr 
+% Polyline
+n 990 4905 m
+ 990 7470 l gs col0 s gr 
+% Polyline
+n 1440 4905 m 1440 7065 l 4590 7065 l
+ 4590 7470 l gs col0 s gr 
+% Polyline
+n 2340 990 m 2340 1440 l
+ 3465 1440 l gs col0 s gr 
+% Polyline
+n 990 990 m
+ 990 4185 l gs col0 s gr 
+% Polyline
+n 5760 2340 m 5895 2250 l 6030 2340 l 5895 2430 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 5760 1440 m 5895 1350 l 6030 1440 l 5895 1530 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 5760 540 m 5895 450 l 6030 540 l 5895 630 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 5760 3555 m 5895 3465 l 6030 3555 l 5895 3645 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+gs  clippath
+4560 5415 m 4620 5415 l 4620 5263 l 4590 5383 l 4560 5263 l cp
+eoclip
+n 4590 4635 m
+ 4590 5400 l gs col0 s gr gr
+
+% arrowhead
+n 4560 5263 m 4590 5383 l 4620 5263 l  col0 s
+% Polyline
+n 4590 3735 m 4500 3870 l 4590 4005 l 4680 3870 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 4590 4005 m
+ 4590 4185 l gs col0 s gr 
+% Polyline
+gs  clippath
+4620 5790 m 4560 5790 l 4560 5942 l 4590 5822 l 4620 5942 l cp
+eoclip
+n 4590 6255 m
+ 4590 5805 l gs col0 s gr gr
+
+% arrowhead
+n 4620 5942 m 4590 5822 l 4560 5942 l  col0 s
+% Polyline
+n 6030 3555 m 6930 3555 l
+ 6930 2520 l gs col0 s gr 
+% Polyline
+n 6030 2340 m
+ 6705 2340 l gs col0 s gr 
+% Polyline
+n 6030 1440 m 6930 1440 l
+ 6930 2070 l gs col0 s gr 
+% Polyline
+gs  clippath
+6720 570 m 6720 510 l 6568 510 l 6688 540 l 6568 570 l cp
+eoclip
+n 6030 540 m
+ 6705 540 l gs col0 s gr gr
+
+% arrowhead
+n 6568 570 m 6688 540 l 6568 510 l  col0 s
+% Polyline
+gs  clippath
+3480 3675 m 3480 3615 l 3328 3615 l 3448 3645 l 3328 3675 l cp
+eoclip
+n 3465 6345 m 3060 6345 l 3060 3645 l
+ 3465 3645 l gs col0 s gr gr
+
+% arrowhead
+n 3328 3675 m 3448 3645 l 3328 3615 l  col0 s
+% Polyline
+n 2340 4663 m 2250 4798 l 2340 4933 l 2430 4798 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 1890 4663 m 1800 4798 l 1890 4933 l 1980 4798 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 1440 4663 m 1350 4798 l 1440 4933 l 1530 4798 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 990 4663 m 900 4798 l 990 4933 l 1080 4798 l
+ cp gs col32 1.00 shd ef gr gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+2655 450 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+2070 900 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+2520 900 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+1620 900 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+1170 900 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+1080 7380 m
+gs 1 -1 sc (*) col0 sh gr
+/Helvetica ff 180.00 scf sf
+1575 8100 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+1575 8325 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+3375 450 m
+gs 1 -1 sc (1) dup sw pop neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+3375 2250 m
+gs 1 -1 sc (*) dup sw pop neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+3375 1350 m
+gs 1 -1 sc (1) dup sw pop neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+5850 360 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+5850 1260 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+5850 2160 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+3375 3330 m
+gs 1 -1 sc (*) dup sw pop neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+3375 3825 m
+gs 1 -1 sc (1) dup sw pop neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+5850 3375 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+4770 4140 m
+gs 1 -1 sc (*) col0 sh gr
+/Helvetica ff 180.00 scf sf
+3375 4365 m
+gs 1 -1 sc (*) dup sw pop neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+4770 5310 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+4770 5985 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+4770 6210 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+3375 5535 m
+gs 1 -1 sc (*) dup sw pop neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+3375 6795 m
+gs 1 -1 sc (*) dup sw pop neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+3375 6300 m
+gs 1 -1 sc (1) dup sw pop neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+7020 1980 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+7020 2745 m
+gs 1 -1 sc (*) col0 sh gr
+/Helvetica ff 180.00 scf sf
+4770 8325 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+4770 8100 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+4770 7380 m
+gs 1 -1 sc (*) col0 sh gr
+/Helvetica ff 180.00 scf sf
+4770 3915 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+1080 4095 m
+gs 1 -1 sc (*) col0 sh gr
+/Helvetica ff 180.00 scf sf
+1170 4815 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+1620 4815 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+2070 4815 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+2520 4815 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+2655 4365 m
+gs 1 -1 sc (1) col0 sh gr
+/Helvetica ff 180.00 scf sf
+4770 4815 m
+gs 1 -1 sc (*) col0 sh gr
+/Helvetica ff 180.00 scf sf
+6615 360 m
+gs 1 -1 sc (1) dup sw pop neg 0 rm  col0 sh gr
+/Helvetica ff 180.00 scf sf
+6615 2160 m
+gs 1 -1 sc (1) dup sw pop neg 0 rm  col0 sh gr
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/uml-all.fig b/doc/images/uml-all.fig
new file mode 100644
index 00000000..63358e3f
--- /dev/null
+++ b/doc/images/uml-all.fig
@@ -0,0 +1,264 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #8e8e8e
+6 270 292 2556 720
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 270 577 2556 577
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 270 649 2556 649
+2 2 0 1 0 7 101 0 20 4.000 0 0 7 0 0 5
+	 270 292 2556 292 2556 720 270 720 270 292
+4 0 0 100 0 16 12 0.0000 4 150 1740 341 506 ec_master_t\001
+-6
+6 270 8392 3041 8820
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 270 8677 2556 8677
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 270 8749 2556 8749
+2 2 0 1 0 7 101 0 20 4.000 0 0 7 0 0 5
+	 270 8392 2556 8392 2556 8820 270 8820 270 8392
+4 0 0 100 0 16 12 0.0000 4 165 2700 341 8606 ec_sii_pdo_entry_t\001
+-6
+6 1305 7920 1485 8370
+2 3 0 1 0 32 50 -1 20 0.000 0 0 -1 0 0 5
+	 1395 7920 1305 8055 1395 8190 1485 8055 1395 7920
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 1395 8190 1395 8370
+-6
+6 270 7492 2556 7920
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 270 7777 2556 7777
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 270 7849 2556 7849
+2 2 0 1 0 7 101 0 20 4.000 0 0 7 0 0 5
+	 270 7492 2556 7492 2556 7920 270 7920 270 7492
+4 0 0 100 0 16 12 0.0000 4 150 1815 341 7706 ec_sii_pdo_t\001
+-6
+6 3465 292 5751 720
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3465 577 5751 577
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3465 649 5751 649
+2 2 0 1 0 7 101 0 20 4.000 0 0 7 0 0 5
+	 3465 292 5751 292 5751 720 3465 720 3465 292
+4 0 0 100 0 16 12 0.0000 4 150 1725 3536 506 ec_device_t\001
+-6
+6 3465 2092 5751 2520
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3465 2377 5751 2377
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3465 2449 5751 2449
+2 2 0 1 0 7 101 0 20 4.000 0 0 7 0 0 5
+	 3465 2092 5751 2092 5751 2520 3465 2520 3465 2092
+4 0 0 100 0 16 12 0.0000 4 150 1320 3536 2306 ec_eoe_t\001
+-6
+6 3465 1192 5751 1620
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3465 1477 5751 1477
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3465 1549 5751 1549
+2 2 0 1 0 7 101 0 20 4.000 0 0 7 0 0 5
+	 3465 1192 5751 1192 5751 1620 3465 1620 3465 1192
+4 0 0 100 0 16 12 0.0000 4 150 1275 3536 1406 ec_fsm_t\001
+-6
+6 3465 5377 5751 5805
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3465 5662 5751 5662
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3465 5734 5751 5734
+2 2 0 1 0 7 101 0 20 4.000 0 0 7 0 0 5
+	 3465 5377 5751 5377 5751 5805 3465 5805 3465 5377
+4 0 0 100 0 16 12 0.0000 4 165 1950 3536 5591 ec_sii_sync_t\001
+-6
+6 3465 6277 5751 6705
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3465 6562 5751 6562
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3465 6634 5751 6634
+2 2 0 1 0 7 101 0 20 4.000 0 0 7 0 0 5
+	 3465 6277 5751 6277 5751 6705 3465 6705 3465 6277
+4 0 0 100 0 16 12 0.0000 4 150 1545 3536 6491 ec_fmmu_t\001
+-6
+6 6705 292 8991 720
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 6705 577 8991 577
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 6705 649 8991 649
+2 2 0 1 0 7 101 0 20 4.000 0 0 7 0 0 5
+	 6705 292 8991 292 8991 720 6705 720 6705 292
+4 0 0 100 0 16 12 0.0000 4 165 1680 6776 506 ec_debug_t\001
+-6
+6 6705 2092 8991 2520
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 6705 2377 8991 2377
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 6705 2449 8991 2449
+2 2 0 1 0 7 101 0 20 4.000 0 0 7 0 0 5
+	 6705 2092 8991 2092 8991 2520 6705 2520 6705 2092
+4 0 0 100 0 16 12 0.0000 4 165 2115 6776 2306 ec_datagram_t\001
+-6
+6 3465 3307 5751 3735
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3465 3592 5751 3592
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3465 3664 5751 3664
+2 2 0 1 0 7 101 0 20 4.000 0 0 7 0 0 5
+	 3465 3307 5751 3307 5751 3735 3465 3735 3465 3307
+4 0 0 100 0 16 12 0.0000 4 150 1830 3536 3521 ec_domain_t\001
+-6
+6 3465 4207 5751 4635
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3465 4492 5751 4492
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3465 4564 5751 4564
+2 2 0 1 0 7 101 0 20 4.000 0 0 7 0 0 5
+	 3465 4207 5751 4207 5751 4635 3465 4635 3465 4207
+4 0 0 100 0 16 12 0.0000 4 165 2040 3536 4421 ec_data_reg_t\001
+-6
+6 270 4207 2556 4635
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 270 4492 2556 4492
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 270 4564 2556 4564
+2 2 0 1 0 7 101 0 20 4.000 0 0 7 0 0 5
+	 270 4207 2556 4207 2556 4635 270 4635 270 4207
+4 0 0 100 0 16 12 0.0000 4 150 1545 341 4421 ec_slave_t\001
+-6
+6 3465 7492 5751 7920
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3465 7777 5751 7777
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3465 7849 5751 7849
+2 2 0 1 0 7 101 0 20 4.000 0 0 7 0 0 5
+	 3465 7492 5751 7492 5751 7920 3465 7920 3465 7492
+4 0 0 100 0 16 12 0.0000 4 150 1305 3536 7706 ec_sdo_t\001
+-6
+6 3465 8392 5751 8820
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3465 8677 5751 8677
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3465 8749 5751 8749
+2 2 0 1 0 7 101 0 20 4.000 0 0 7 0 0 5
+	 3465 8392 5751 8392 5751 8820 3465 8820 3465 8392
+4 0 0 100 0 16 12 0.0000 4 165 2190 3536 8606 ec_sdo_entry_t\001
+-6
+6 4500 7920 4680 8370
+2 3 0 1 0 32 50 -1 20 0.000 0 0 -1 0 0 5
+	 4590 7920 4500 8055 4590 8190 4680 8055 4590 7920
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 4590 8190 4590 8370
+-6
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 2565 540 3465 540
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
+	 1890 990 1890 2340 3465 2340
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
+	 1440 990 1440 3375 3465 3375
+2 3 0 1 0 32 50 -1 20 0.000 0 0 -1 0 0 5
+	 2340 720 2250 855 2340 990 2430 855 2340 720
+2 3 0 1 0 32 50 -1 20 0.000 0 0 -1 0 0 5
+	 1440 720 1350 855 1440 990 1530 855 1440 720
+2 3 0 1 0 32 50 -1 20 0.000 0 0 -1 0 0 5
+	 1890 720 1800 855 1890 990 1980 855 1890 720
+2 3 0 1 0 32 50 -1 20 0.000 0 0 -1 0 0 5
+	 990 720 900 855 990 990 1080 855 990 720
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	0 0 1.00 60.00 120.00
+	 3465 4455 2565 4455
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
+	 2340 4905 2340 5625 3465 5625
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
+	 1890 4905 1890 6615 3465 6615
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 990 4905 990 7470
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
+	 1440 4905 1440 7065 4590 7065 4590 7470
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
+	 2340 990 2340 1440 3465 1440
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 990 990 990 4185
+2 3 0 1 0 32 50 -1 20 0.000 0 0 -1 0 0 5
+	 5760 2340 5895 2250 6030 2340 5895 2430 5760 2340
+2 3 0 1 0 32 50 -1 20 0.000 0 0 -1 0 0 5
+	 5760 1440 5895 1350 6030 1440 5895 1530 5760 1440
+2 3 0 1 0 32 50 -1 20 0.000 0 0 -1 0 0 5
+	 5760 540 5895 450 6030 540 5895 630 5760 540
+2 3 0 1 0 32 50 -1 20 0.000 0 0 -1 0 0 5
+	 5760 3555 5895 3465 6030 3555 5895 3645 5760 3555
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	0 0 1.00 60.00 120.00
+	 4590 4635 4590 5400
+2 3 0 1 0 32 50 -1 20 0.000 0 0 -1 0 0 5
+	 4590 3735 4500 3870 4590 4005 4680 3870 4590 3735
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 4590 4005 4590 4185
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	0 0 1.00 60.00 120.00
+	 4590 6255 4590 5805
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
+	 6030 3555 6930 3555 6930 2520
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 6030 2340 6705 2340
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
+	 6030 1440 6930 1440 6930 2070
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	0 0 1.00 60.00 120.00
+	 6030 540 6705 540
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
+	0 0 1.00 60.00 120.00
+	 3465 6345 3060 6345 3060 3645 3465 3645
+2 3 0 1 0 32 50 -1 20 0.000 0 0 -1 0 0 5
+	 2340 4663 2250 4798 2340 4933 2430 4798 2340 4663
+2 3 0 1 0 32 50 -1 20 0.000 0 0 -1 0 0 5
+	 1890 4663 1800 4798 1890 4933 1980 4798 1890 4663
+2 3 0 1 0 32 50 -1 20 0.000 0 0 -1 0 0 5
+	 1440 4663 1350 4798 1440 4933 1530 4798 1440 4663
+2 3 0 1 0 32 50 -1 20 0.000 0 0 -1 0 0 5
+	 990 4663 900 4798 990 4933 1080 4798 990 4663
+4 0 0 50 -1 16 12 0.0000 4 120 180 2655 450 1\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 2070 900 1\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 2520 900 1\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 1620 900 1\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 1170 900 1\001
+4 0 0 50 -1 16 12 0.0000 4 45 120 1080 7380 *\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 1575 8100 1\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 1575 8325 1\001
+4 2 0 50 -1 16 12 0.0000 4 120 180 3375 450 1\001
+4 2 0 50 -1 16 12 0.0000 4 45 120 3375 2250 *\001
+4 2 0 50 -1 16 12 0.0000 4 120 180 3375 1350 1\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 5850 360 1\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 5850 1260 1\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 5850 2160 1\001
+4 2 0 50 -1 16 12 0.0000 4 45 120 3375 3330 *\001
+4 2 0 50 -1 16 12 0.0000 4 120 180 3375 3825 1\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 5850 3375 1\001
+4 0 0 50 -1 16 12 0.0000 4 45 120 4770 4140 *\001
+4 2 0 50 -1 16 12 0.0000 4 45 120 3375 4365 *\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 4770 5310 1\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 4770 5985 1\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 4770 6210 1\001
+4 2 0 50 -1 16 12 0.0000 4 45 120 3375 5535 *\001
+4 2 0 50 -1 16 12 0.0000 4 45 120 3375 6795 *\001
+4 2 0 50 -1 16 12 0.0000 4 120 180 3375 6300 1\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 7020 1980 1\001
+4 0 0 50 -1 16 12 0.0000 4 45 120 7020 2745 *\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 4770 8325 1\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 4770 8100 1\001
+4 0 0 50 -1 16 12 0.0000 4 45 120 4770 7380 *\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 4770 3915 1\001
+4 0 0 50 -1 16 12 0.0000 4 45 120 1080 4095 *\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 1170 4815 1\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 1620 4815 1\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 2070 4815 1\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 2520 4815 1\001
+4 0 0 50 -1 16 12 0.0000 4 120 180 2655 4365 1\001
+4 0 0 50 -1 16 12 0.0000 4 45 120 4770 4815 *\001
+4 2 0 50 -1 16 12 0.0000 4 120 180 6615 360 1\001
+4 2 0 50 -1 16 12 0.0000 4 120 180 6615 2160 1\001
diff --git a/doc/images/uml-all.pdf b/doc/images/uml-all.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..f12be1aa0d2f331d6640a95e1546f3be29c8bf12
GIT binary patch
literal 3070
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
N8VA$VwE4vr_8;zm3Jw4O

literal 0
HcmV?d00001

diff --git a/doc/images/uml-datagram.eps b/doc/images/uml-datagram.eps
new file mode 100644
index 00000000..3d3bed36
--- /dev/null
+++ b/doc/images/uml-datagram.eps
@@ -0,0 +1,179 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: uml-datagram.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Mon Aug  7 20:49:08 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 178 297
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.555 0.555 0.555 srgb} bind def
+
+end
+save
+newpath 0 297 moveto 0 0 lineto 273 0 lineto 273 297 lineto closepath clip newpath
+-27.6 323.9 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 110
+% Polyline
+7.500 slw
+n 450 450 m 3240 450 l 3240 5130 l 450 5130 l
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 100
+% Polyline
+7.500 slw
+n 450 765 m
+ 3240 765 l gs col0 s gr 
+% Polyline
+n 450 2925 m
+ 3240 2925 l gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+540 675 m
+gs 1 -1 sc (ec_datagram_t) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 990 m
+gs 1 -1 sc (list: struct list_head) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 1170 m
+gs 1 -1 sc (queue: struct list_head) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 1350 m
+gs 1 -1 sc (type: ec_datagram_type_t) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 1530 m
+gs 1 -1 sc (address: ec_address_t) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 1710 m
+gs 1 -1 sc (data: uint8_t *) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 1890 m
+gs 1 -1 sc (mem_size: size_t) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 2070 m
+gs 1 -1 sc (data_size: size_t) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 2250 m
+gs 1 -1 sc (index: uint8_t) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 2430 m
+gs 1 -1 sc (working_counter: uint16_t) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 2610 m
+gs 1 -1 sc (state: ec_datagram_state_t) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 2790 m
+gs 1 -1 sc (t_sent: cylces_t) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 3150 m
+gs 1 -1 sc (+ ec_datagram_init\(\)) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 3330 m
+gs 1 -1 sc (+ ec_datagram_clear\(\)) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 3540 m
+gs 1 -1 sc (+ ec_datagram_prealloc\(\): int) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 3750 m
+gs 1 -1 sc (+ ec_datagram_nprd\(\):int) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 3960 m
+gs 1 -1 sc (+ ec_datagram_npwr\(\): int) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 4170 m
+gs 1 -1 sc (+ ec_datagram_aprd\(\): int) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 4380 m
+gs 1 -1 sc (+ ec_datagram_apwr\(\): int) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 4590 m
+gs 1 -1 sc (+ ec_datagram_brd\(\): int) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 4800 m
+gs 1 -1 sc (+ ec_datagram_bwr\(\): int) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 5010 m
+gs 1 -1 sc (+ ec_datagram_lrw\(\): int) col0 sh gr
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/uml-datagram.fig b/doc/images/uml-datagram.fig
new file mode 100644
index 00000000..f6241a4f
--- /dev/null
+++ b/doc/images/uml-datagram.fig
@@ -0,0 +1,38 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #8e8e8e
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 450 765 3240 765
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 450 2925 3240 2925
+2 2 0 1 0 7 110 -1 20 0.000 0 0 -1 0 0 5
+	 450 450 3240 450 3240 5130 450 5130 450 450
+4 0 0 100 0 16 12 0.0000 4 165 2115 540 675 ec_datagram_t\001
+4 0 0 100 0 16 12 0.0000 4 150 2670 540 990 list: struct list_head\001
+4 0 0 100 -1 16 12 0.0000 4 150 3180 540 1170 queue: struct list_head\001
+4 0 0 100 -1 16 12 0.0000 4 165 3645 540 1350 type: ec_datagram_type_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 3240 540 1530 address: ec_address_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 1905 540 1710 data: uint8_t *\001
+4 0 0 100 -1 16 12 0.0000 4 150 2445 540 1890 mem_size: size_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 2370 540 2070 data_size: size_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 1875 540 2250 index: uint8_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 3645 540 2430 working_counter: uint16_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 3795 540 2610 state: ec_datagram_state_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 2175 540 2790 t_sent: cylces_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 2910 540 3150 + ec_datagram_init()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3210 540 3330 + ec_datagram_clear()\001
+4 0 0 100 -1 16 12 0.0000 4 165 4125 540 3540 + ec_datagram_prealloc(): int\001
+4 0 0 100 -1 16 12 0.0000 4 165 3555 540 3750 + ec_datagram_nprd():int\001
+4 0 0 100 -1 16 12 0.0000 4 165 3690 540 3960 + ec_datagram_npwr(): int\001
+4 0 0 100 -1 16 12 0.0000 4 165 3630 540 4170 + ec_datagram_aprd(): int\001
+4 0 0 100 -1 16 12 0.0000 4 165 3690 540 4380 + ec_datagram_apwr(): int\001
+4 0 0 100 -1 16 12 0.0000 4 165 3450 540 4590 + ec_datagram_brd(): int\001
+4 0 0 100 -1 16 12 0.0000 4 165 3510 540 4800 + ec_datagram_bwr(): int\001
+4 0 0 100 -1 16 12 0.0000 4 165 3405 540 5010 + ec_datagram_lrw(): int\001
diff --git a/doc/images/uml-datagram.pdf b/doc/images/uml-datagram.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..9ec3d03531d3bbc5f2c456beec69d0f02227e9fa
GIT binary patch
literal 1466
zcmZ`(ZERCj7&a;hXK_eaFeGFij2#_;-Fy3WZ|A6N>$-1O+c6wnC3o#<d&gaGx%YIG
zCXx^qvSr9NB{PA=IK~(O9k7gP{2>|H(wIzfeg`xdP5eTsBCwdS=s8`tNzwb~-t)Zg
z`<(Z@&vUNMX?JYl3XDLP__g~4Fhdq9%`Kp)h^ay0APzwbL0pVOk}*;t<B&y+?8vA1
zk<A7)tRk@$#QI<EDXu%n<|LAHImsVRReGxj&JT9}@!ix1Gwpcj`JAsBsv`U2p7%cF
z_)psV{!Y%u&dK7TmD68eO^%k#W@VpU&Q0eJZonPe4#Xc@Ti4-RyS)A3#LVWE&9G=}
z^|E8^k=Gs?D>+x*Ss0oHt8=;aiNwjG3l%+f!N2i~4SV{MZ|w+mbv&2k8z)LzhA$RQ
z6hGmvxZZnd*?|?t%P+1ljZY7N+N0B|I9b)T$@uB*HNB4}4o~*j1}hs)f$Udi-Zp*v
z(&#GPt)Cyi_0+1kbnQ%ocPuaP&ISL+m-EKE(bHEhwj9e%Uda{qX1Bg@Trfs%oT%E~
z=)U)E!QH=x=d!vAcU(_2zm9j$ZU5|S&B(Q@`rp=d7RiU%;3Ic?hx2yVw<ejrL-qTG
zsy&l~r!UQZ^XACutUoRLj=wS2Kk!Vo?)C&=hx&J&x9sd3ZK~e*(ZrD(ht_Sn<M?sw
z`z6nAb#2a``ttYC9d#^b-Rb$|=26?JpQc83#g%&k3j5O%kS{756^p)&JP*>4X-U!g
zeG$Ys#UNs8kzW!^lo<4|B+T&wG+22rU|b3&`a+gusVI!0k%~`Xq$yF=hcsdfr>gke
z2zwY}9LUt87$$XPF<kCWm0IU3915xCD7gy|qcEjpO$aqe4VHq^?a>|P4M)gGe=yac
z2AOKfuR#x>?Yn>%5{4+Hq-^O@Zm~37St?>tR)Px@^UW{i^Y`a3H4T_LXD#Gxwlpz4
zL;4c9ctFcsODw5FEkp$%+#jXObg)F!5FG<kf#f!XC7+mTlc5-3+|g!C<)CLKJ1?Bc
zuvAY5?T`A9sxNapVR=Z=u;x>x2!=udXU-=hC3g=?O4v>m)7uLTENfu}mN#$)v)M}G
zwTl1$LiG}skv`fgZ}F3n1y!-NARq-7I2Bb-Rt7(6gAGX4$QIC8V1P~$`$95mLozgx
z)Z!=((agxUmS{wxKZhp0LsnEt3`3`)p{D%&#ev3D6ad6$9AFn8Xfd0OW*C4An8ixw
zP9GRv#H<_<IRmqph^;a(lki|3%Mq_-=2^&qGcevn6wbhe|G;>Gh?|+m{i_zMq9h}g
z{5v7zmg0z<7m^#L5Z6+ZK&CPrP#{&9T&YSs^yqJ{m%9hXYYy7JfAaG)edDj@KZtm#
U;WaF(I5k9$s0(zuvN{L&2OD7LPyhe`

literal 0
HcmV?d00001

diff --git a/doc/images/uml-debug.eps b/doc/images/uml-debug.eps
new file mode 100644
index 00000000..5385ba23
--- /dev/null
+++ b/doc/images/uml-debug.eps
@@ -0,0 +1,134 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: /home/fp/diplom/diplom/bilder/uml-debug.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Mon Aug  7 17:57:04 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 177 121
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.555 0.555 0.555 srgb} bind def
+
+end
+save
+newpath 0 121 moveto 0 0 lineto 269 0 lineto 269 121 lineto closepath clip newpath
+-27.6 148.2 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 110
+% Polyline
+7.500 slw
+n 450 450 m 3240 450 l 3240 2340 l 450 2340 l
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 100
+% Polyline
+7.500 slw
+n 450 765 m
+ 3240 765 l gs col0 s gr 
+% Polyline
+n 450 1575 m
+ 3240 1575 l gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+540 990 m
+gs 1 -1 sc (dev: struct net_device *) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 1215 m
+gs 1 -1 sc (stats: struct net_device_stats) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 1440 m
+gs 1 -1 sc (opened: uint8_t) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 675 m
+gs 1 -1 sc (ec_debug_t) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 1800 m
+gs 1 -1 sc (+ ec_debug_init\(\): int) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 2010 m
+gs 1 -1 sc (+ ec_debug_clear\(\)) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 2220 m
+gs 1 -1 sc (+ ec_debug_send\(\)) col0 sh gr
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/uml-debug.fig b/doc/images/uml-debug.fig
new file mode 100644
index 00000000..fa1f1dd8
--- /dev/null
+++ b/doc/images/uml-debug.fig
@@ -0,0 +1,23 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #8e8e8e
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 450 765 3240 765
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 450 1575 3240 1575
+2 2 0 1 0 7 110 -1 20 0.000 0 0 -1 0 0 5
+	 450 450 3240 450 3240 2340 450 2340 450 450
+4 0 0 100 0 16 12 0.0000 4 150 3270 540 990 dev: struct net_device *\001
+4 0 0 100 -1 16 12 0.0000 4 150 4050 540 1215 stats: struct net_device_stats\001
+4 0 0 100 -1 16 12 0.0000 4 150 2175 540 1440 opened: uint8_t\001
+4 0 0 100 0 16 12 0.0000 4 165 1680 540 675 ec_debug_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 2955 540 1800 + ec_debug_init(): int\001
+4 0 0 100 -1 16 12 0.0000 4 165 2775 540 2010 + ec_debug_clear()\001
+4 0 0 100 -1 16 12 0.0000 4 165 2775 540 2220 + ec_debug_send()\001
diff --git a/doc/images/uml-debug.pdf b/doc/images/uml-debug.pdf
new file mode 100644
index 00000000..7478f351
--- /dev/null
+++ b/doc/images/uml-debug.pdf
@@ -0,0 +1,75 @@
+%PDF-1.3
+%Ç쏢
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xœmOOÃ0Åïþ¾ÑdâüiÒ‘.Œ'M[¦¢µ°6ƒ¯»iBȇ—<ÿòììQ£šê¬u÷Û,ymµÃo`láÈàâ	<YgXc %␽K#s¥È1	^/+%Á;`_Z
+áâì®(*ªTyEý:uš<la|:Ÿ¥îð!ʶÊdLÐßàôÆ’,[ë08
+¦
+;(šô5Ç1‡:cŸòJîmðv߁-±7Ÿ¡ó:ÿ€«ccvÅÇgêS3ÇCÛç°Êb)Y™8x‡±"ÕòdsØJK¢½¢P̾ÃK¯íÛ¼,–³9JŠD°!­ÿÅê]Z7
¾òÇÔ7gû1‹Ôåq¥endstream
+endobj
+6 0 obj
+277
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 177 121]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /Text]
+/ExtGState 9 0 R
+/Font 10 0 R
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+>>
+endobj
+7 0 obj
+<</Type/ExtGState
+/OPM 1>>endobj
+9 0 obj
+<</R7
+7 0 R>>
+endobj
+10 0 obj
+<</R8
+8 0 R>>
+endobj
+8 0 obj
+<</BaseFont/Helvetica/Type/Font
+/Subtype/Type1>>
+endobj
+2 0 obj
+<</Producer(ESP Ghostscript 8.15)
+/CreationDate(D:20060807175937)
+/ModDate(D:20060807175937)
+/Title(/home/fp/diplom/diplom/bilder/uml-debug.fig)
+/Creator(fig2dev Version 3.2 Patchlevel 4)
+/Author(fp@jupiter \(Florian Pose\))>>endobj
+xref
+0 11
+0000000000 65535 f 
+0000000599 00000 n 
+0000000811 00000 n 
+0000000540 00000 n 
+0000000381 00000 n 
+0000000015 00000 n 
+0000000362 00000 n 
+0000000647 00000 n 
+0000000747 00000 n 
+0000000688 00000 n 
+0000000717 00000 n 
+trailer
+<< /Size 11 /Root 1 0 R /Info 2 0 R
+/ID [(ËîÍúâNv;O*YQ–0½’)(ËîÍúâNv;O*YQ–0½’)]
+>>
+startxref
+1052
+%%EOF
diff --git a/doc/images/uml-device.eps b/doc/images/uml-device.eps
new file mode 100644
index 00000000..4f020c29
--- /dev/null
+++ b/doc/images/uml-device.eps
@@ -0,0 +1,167 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: uml-device.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Mon Aug  7 17:47:24 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 176 280
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.555 0.555 0.555 srgb} bind def
+
+end
+save
+newpath 0 280 moveto 0 0 lineto 294 0 lineto 294 280 lineto closepath clip newpath
+-27.6 306.9 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 110
+% Polyline
+7.500 slw
+n 450 450 m 3240 450 l 3240 4860 l 450 4860 l
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 100
+% Polyline
+7.500 slw
+n 450 765 m
+ 3240 765 l gs col0 s gr 
+% Polyline
+n 450 2700 m
+ 3240 2700 l gs col0 s gr 
+/Helvetica ff 180.00 scf sf
+540 990 m
+gs 1 -1 sc (master: ec_master_t *) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 1215 m
+gs 1 -1 sc (dev: struct net_device *) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 1440 m
+gs 1 -1 sc (open: uint8_t) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 1665 m
+gs 1 -1 sc (tx_skb: struct sk_buff *) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 1890 m
+gs 1 -1 sc (isr: ec_isr_t *) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 2115 m
+gs 1 -1 sc (module: struct module *) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 2340 m
+gs 1 -1 sc (link_state: uint8_t) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 2565 m
+gs 1 -1 sc (dbg: ec_debug_t) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 3150 m
+gs 1 -1 sc (+ ec_device_clear\(\)) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 2925 m
+gs 1 -1 sc (+ ec_device_init\(\): int) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 3375 m
+gs 1 -1 sc (+ ec_device_open\(\): int) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 3600 m
+gs 1 -1 sc (+ ec_device_close\(\): int) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 3825 m
+gs 1 -1 sc (+ ec_device_call_isr\(\)) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 4050 m
+gs 1 -1 sc (+ ec_device_tx_data\(\): uint8_t *) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 675 m
+gs 1 -1 sc (ec_device_t) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 4275 m
+gs 1 -1 sc (+ ec_device_send\(\)) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 4500 m
+gs 1 -1 sc (+ ecdev_receive\(\)) col0 sh gr
+/Helvetica ff 180.00 scf sf
+540 4725 m
+gs 1 -1 sc (+ ecdev_link_state\(\)) col0 sh gr
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/uml-device.fig b/doc/images/uml-device.fig
new file mode 100644
index 00000000..a6a4b1e6
--- /dev/null
+++ b/doc/images/uml-device.fig
@@ -0,0 +1,34 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #8e8e8e
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 450 765 3240 765
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 450 2700 3240 2700
+2 2 0 1 0 7 110 -1 20 0.000 0 0 -1 0 0 5
+	 450 450 3240 450 3240 4860 450 4860 450 450
+4 0 0 100 0 16 12 0.0000 4 150 3045 540 990 master: ec_master_t *\001
+4 0 0 100 -1 16 12 0.0000 4 150 3270 540 1215 dev: struct net_device *\001
+4 0 0 100 -1 16 12 0.0000 4 150 1815 540 1440 open: uint8_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 3135 540 1665 tx_skb: struct sk_buff *\001
+4 0 0 100 -1 16 12 0.0000 4 150 1815 540 1890 isr: ec_isr_t *\001
+4 0 0 100 -1 16 12 0.0000 4 120 3285 540 2115 module: struct module *\001
+4 0 0 100 -1 16 12 0.0000 4 150 2445 540 2340 link_state: uint8_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 2370 540 2565 dbg: ec_debug_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 2820 540 3150 + ec_device_clear()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3000 540 2925 + ec_device_init(): int\001
+4 0 0 100 -1 16 12 0.0000 4 165 3315 540 3375 + ec_device_open(): int\001
+4 0 0 100 -1 16 12 0.0000 4 165 3360 540 3600 + ec_device_close(): int\001
+4 0 0 100 -1 16 12 0.0000 4 165 3135 540 3825 + ec_device_call_isr()\001
+4 0 0 100 -1 16 12 0.0000 4 165 4440 540 4050 + ec_device_tx_data(): uint8_t *\001
+4 0 0 100 0 16 12 0.0000 4 150 1725 540 675 ec_device_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 2820 540 4275 + ec_device_send()\001
+4 0 0 100 -1 16 12 0.0000 4 165 2565 540 4500 + ecdev_receive()\001
+4 0 0 100 -1 16 12 0.0000 4 165 2865 540 4725 + ecdev_link_state()\001
diff --git a/doc/images/uml-device.pdf b/doc/images/uml-device.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..1e0c78db4d703e4d8ee55f9e5195dc0350333404
GIT binary patch
literal 1484
zcmZ`(ZERCj7&fR;?-tyTDg+0fh+A4ddhhM`U=-N8*2yNd-CVYAA-C=6df8oXz4zR$
zFht0R#AO>$VM~~a1IE}iY=Ti2SR`tc;MbzYIWtG56sPe6oInUL^qj6;rRe?Bp67kv
z=e*~Ao^x`XHv39etEY0#{<h~ZWdsZmy_>20e7XdNYEclFFyf-^ynvttXuH56XoEh{
z53N>8MiS)esmQA^`hIAf$$aV3R_gr0fqNF5iyn<xy2oIrVtq6#+w;)y*fVwKY92qc
z|Kh1H<}Ft5d+o~KJu{Ri_GVjMd->V-*7BAuxzA>3RJVNDi%jh0E3feTmtB}=_$k-D
zda_FM{qtE>b%wmm_L)j>sMX%G_`<5r;Ac_3LNy{a7Yz1|l=MWW!`{KxV>8*W&)=?!
zb%fh11NW&M9j7Mu9*Mb@Ww{PVok;llfOUv_c;F;ocki~-^lhDX->;c1n*{gich_8J
zTFZBwzkkD2ue598#OD`3y4tj`%ewF}?-RqG7p*IX*N%S}$<H17v-ss7pDgVE!?owQ
z=Q1ie`pz#Sqq}uO%Xi)gA6(Ku!R43suW&4F^iJQ{`}CLH$Ezylk918ndHZI@vf2jw
z2K#%(f?e0vEjl4{%n>pCSG908W7zj;v-#wLOQVy@+rqeI$9LbBw*@LX50x}dbsVb{
z)`xet-0u5%yTVN`mwGnEKHlB<!kRa3i3c8BJ@koD4E?^e_e`&~VoAoeuF(gK1K&7c
z$e)k}|07Zo0m-jE&rBsCLrUecEn!GIxmrk<LO;(Hh!NmnaF{ilfX>3yP_#=#SaZPO
zED44X&=W&o7|Nm|`Jjxg;*><68zK*l%>?K&7(uwMD1sdBcxm2jg<ZteEFpJM*gSM0
zUSmQT5Yxq>M0;e1SrcM1+#iTHC<A%}@0WpxBJI1V8h{xTLP^*XrR-d3qOy=foFLXF
zDQ25b<(u!!Pc==^8=a+qwOSLz<P3?6;WAUC%#~t^A1WEOP?kHRWSIySa55xgpr3+5
z14O)!i?>M=jH2C&7ZEwgneooaGwD+Gc+h^u2PJip+X);&QAV;);=>47w5(BsM~d$w
z;>C~+E2g%s(lLyQu`p)VY-Efqj+cu5{|lAzNPudkURdde4ZII(1AJ|gQIynprNaU6
z9F%0d0nlr8z{w$BP=F0k00x}8UO_>U8D6(p3G?K+s8-trQR2A}aEdal)@bI&8IfRs
z!Y*SeX6^$fqfu`J0g%MZES@^~Kxhuj(_@L#Fp~+JDh)F-cjqxIc3N7V!Ggz|hM7%R
z-!#nfUl@a>P0!Q+s}@NdFF*;urhs<yTOmF#!1qbSo+TCmba5yk0-`UzP{lUjQGd0q
o{)6sEy1X}|&2LSpntssSjnojk%ZQUue26S-z>jxM(MCJ<56-sr;s5{u

literal 0
HcmV?d00001

diff --git a/doc/images/uml-domain.eps b/doc/images/uml-domain.eps
new file mode 100644
index 00000000..03705c53
--- /dev/null
+++ b/doc/images/uml-domain.eps
@@ -0,0 +1,220 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: uml-domain.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Mon Aug  7 21:01:39 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 236 294
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.555 0.555 0.555 srgb} bind def
+
+end
+save
+newpath 0 294 moveto 0 0 lineto 399 0 lineto 399 294 lineto closepath clip newpath
+-27.6 321.1 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/reencdict 12 dict def /ReEncode { reencdict begin
+/newcodesandnames exch def /newfontname exch def /basefontname exch def
+/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
+basefontdict { exch dup /FID ne { dup /Encoding eq
+{ exch dup length array copy newfont 3 1 roll put }
+{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall
+newfont /FontName newfontname put newcodesandnames aload pop
+128 1 255 { newfont /Encoding get exch /.notdef put } for
+newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat
+newfontname newfont definefont pop end } def
+/isovec [
+8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde
+8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis
+8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron
+8#220 /dotlessi 8#230 /oe 8#231 /OE
+8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling
+8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis
+8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot
+8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus
+8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph
+8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine
+8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf
+8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute
+8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring
+8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute
+8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute
+8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve
+8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply
+8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex
+8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave
+8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring
+8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute
+8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute
+8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve
+8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide
+8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex
+8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def
+/Helvetica /Helvetica-iso isovec ReEncode
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 110
+% Polyline
+7.500 slw
+n 450 450 m 4140 450 l 4140 5085 l 450 5085 l
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 100
+% Polyline
+7.500 slw
+n 450 765 m
+ 4140 765 l gs col0 s gr 
+% Polyline
+n 450 2925 m
+ 4140 2925 l gs col0 s gr 
+/Helvetica-iso ff 180.00 scf sf
+540 675 m
+gs 1 -1 sc (ec_domain_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 990 m
+gs 1 -1 sc (kobj: struct kobject) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 1170 m
+gs 1 -1 sc (list: struct list_head) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 1350 m
+gs 1 -1 sc (index: unsigned int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 1530 m
+gs 1 -1 sc (master: ec_master_t *) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 1710 m
+gs 1 -1 sc (data_size: size_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 1890 m
+gs 1 -1 sc (datagrams: struct list_head) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 2070 m
+gs 1 -1 sc (base_address: uint32_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 2250 m
+gs 1 -1 sc (response_count: unsigned int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 2430 m
+gs 1 -1 sc (data_regs: struct list_head) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 2610 m
+gs 1 -1 sc (working_counter_changes: unsigned int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 2790 m
+gs 1 -1 sc (t_last: cycles_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 3150 m
+gs 1 -1 sc (+ ec_domain_init\(\): int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 3330 m
+gs 1 -1 sc (+ ec_domain_clear\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 3510 m
+gs 1 -1 sc (+ ec_domain_alloc\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 3690 m
+gs 1 -1 sc (+ ec_domain_queue\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 3870 m
+gs 1 -1 sc (- ec_domain_reg_pdo_entry\(\): int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 4050 m
+gs 1 -1 sc (- ec_domain_clear_data_regs\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 4230 m
+gs 1 -1 sc (- ec_domain_add_datagram\(\): int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 4410 m
+gs 1 -1 sc (+ ecrt_domain_register_pdo\(\): ec_slave_t *) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 4590 m
+gs 1 -1 sc (+ ecrt_domain_register_pdo_list\(\): int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 4770 m
+gs 1 -1 sc (+ ecrt_domain_process\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 4950 m
+gs 1 -1 sc (+ ecrt_domain_state\(\): int) col0 sh gr
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/uml-domain.fig b/doc/images/uml-domain.fig
new file mode 100644
index 00000000..e6f0c4f5
--- /dev/null
+++ b/doc/images/uml-domain.fig
@@ -0,0 +1,39 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #8e8e8e
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 450 765 4140 765
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 450 2925 4140 2925
+2 2 0 1 0 7 110 -1 20 0.000 0 0 -1 0 0 5
+	 450 450 4140 450 4140 5085 450 5085 450 450
+4 0 0 100 0 16 12 0.0000 4 150 1830 540 675 ec_domain_t\001
+4 0 0 100 0 16 12 0.0000 4 165 2610 540 990 kobj: struct kobject\001
+4 0 0 100 -1 16 12 0.0000 4 150 2670 540 1170 list: struct list_head\001
+4 0 0 100 -1 16 12 0.0000 4 165 2655 540 1350 index: unsigned int\001
+4 0 0 100 -1 16 12 0.0000 4 150 3045 540 1530 master: ec_master_t *\001
+4 0 0 100 -1 16 12 0.0000 4 150 2370 540 1710 data_size: size_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 3780 540 1890 datagrams: struct list_head\001
+4 0 0 100 -1 16 12 0.0000 4 150 3315 540 2070 base_address: uint32_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 4170 540 2250 response_count: unsigned int\001
+4 0 0 100 -1 16 12 0.0000 4 165 3705 540 2430 data_regs: struct list_head\001
+4 0 0 100 -1 16 12 0.0000 4 165 5655 540 2610 working_counter_changes: unsigned int\001
+4 0 0 100 -1 16 12 0.0000 4 165 2070 540 2790 t_last: cycles_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 3105 540 3150 + ec_domain_init(): int\001
+4 0 0 100 -1 16 12 0.0000 4 165 2925 540 3330 + ec_domain_clear()\001
+4 0 0 100 -1 16 12 0.0000 4 165 2895 540 3510 + ec_domain_alloc()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3120 540 3690 + ec_domain_queue()\001
+4 0 0 100 -1 16 12 0.0000 4 165 4695 540 3870 - ec_domain_reg_pdo_entry(): int\001
+4 0 0 100 -1 16 12 0.0000 4 165 4455 540 4050 - ec_domain_clear_data_regs()\001
+4 0 0 100 -1 16 12 0.0000 4 165 4680 540 4230 - ec_domain_add_datagram(): int\001
+4 0 0 100 -1 16 12 0.0000 4 165 6075 540 4410 + ecrt_domain_register_pdo(): ec_slave_t *\001
+4 0 0 100 -1 16 12 0.0000 4 165 5235 540 4590 + ecrt_domain_register_pdo_list(): int\001
+4 0 0 100 -1 16 12 0.0000 4 165 3540 540 4770 + ecrt_domain_process()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3555 540 4950 + ecrt_domain_state(): int\001
diff --git a/doc/images/uml-domain.pdf b/doc/images/uml-domain.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..43ef1d1c14f76edcf57f021cd4d7a0726982a3f5
GIT binary patch
literal 1628
zcmZ`(eNYr-7-wpb+@Uaa<mk&cmGN!}cJE{F!|W2dJ0Lwc?vRGBY`J^ySh?HfcK0s8
z5dSC(IKv4>3{o3RVJgE+87WM1rmV>@GU<aqiYci9GA9|v8AEzsIJh`%|GC@W^ZcHD
z-sksw-ejA}lB!Ho6Ui4QnmPy?P=GJnL2TSeZiSpjDhFDG*hvfPm7oAfi<gn02|9Tf
zG#Uv}5+LIvs@|;4`-&T;mi668nJVZt%bII$$=>?oXzMZK5+G~Xb|9<8YPVkQ{>y&y
zkyt-*&x;cm2cCGL>BQ0a9{<6dE6wA>%ZqYVMSq8WzrIx_Q~7_HdRW2k?+j&RkCzpD
z`W=S`HL=fq*fvV*t-B6o_x(mg#pFw!iX*W0H7RA)md1wB9~(}a)>H(8sfOj+pL1Us
z8*w*XDd?9K*!(}tthqtTR%)Du`;V+9%w6m23p$c&*!S*hpI-ZE&AXv(CuVY9?;N@9
zk29Xhi+wfW`1#QlZ@hfD{@bM011&d~B@}71o(cIT4?h|jY9AU~6589FP1b(H#g#v~
z-MstKgXOM$=iARcbhR>(S=y5`b^GLnvy(+%9P|IQ)@f>Nxl}JR#IMSuL)t#lDTp6U
zZ@O7snfrN<s2%Eh>}}uay6zRG_0G8O8plo@?lW|n3s*XJe$rpDb1yxT);m0r(>tzx
zzgoVobe(0I1|M^_*4@8$WuA?BHYMh1`2$~rQ}<tke@^eAlN!X#w53ebXR1csh7aNs
z3wF8N6m0{Vmg@)qIo_(MyO`*YnHe;mNgp}z{Y+hK?Y{Kx=5yD+OemR&so(Q>0_0p_
zA<;i9K9(H+YBV|`3~3_1$gi%1q>b@F(h6NHvze~~#S{vw)LNi2Xi5pv&P&K8fI?XU
z<RqZR7D6x-`GDYrA~Kgv;GGUA6_dz*fXs(g65^Swq)f*w)iB4f@QAI%#q9*L8<~OL
zQ9%)4o6bVv_V5?xY>SGa{=jU5A|SW0E)f(HxP3cO3Q&arE{Us!smcXvn3=&yjF<P!
zmzZlllCN8wA8DE(b8S|jG#bN&@fpIaWY-axW{*^vJ=A<uPv{p%@oPA^nGqo#1DOTA
zK`60KX0}ZdV`yR=+C-M~03|+#opc1sBrFe}0qSJoj8TVN;E^WQ?S@Dsqzal6P5M|a
zAeKg$sz@hDGFQL}1-aQ_1DWN#D2Yyit(1U1O-U<|IOr~rSe`Q>?d7HoDvHuldP=8K
zs<cWqid%Wt|Aq2d$qVHHpEuRT`xur>bF-fLio764Zz>lIf&wUr=mS8VrUEuba+Z5x
z5PE?IrKSg@a-3PYX-A-v#aC5{+~Va0mf?Vn7h#D)u^>#90Nn%ylq!N+cz~9s)iiK}
zc}%B8`r!v~^O%yNk?$5`lnyHyh0!#ccN9h`@8r^IG~TE@y%ISk3NzdV)6>W#QF(g(
zUATt-V3NSFUMQg39gq&T2BH}Nw5>ea2y7ofW^-;HV9n9GW}85<ys+l^r#h}yn7p^%
fX&t<Gdr)yFQi_*Jlo&yp9W0VtM<gekb1lTbW>p<j

literal 0
HcmV?d00001

diff --git a/doc/images/uml-eoe.eps b/doc/images/uml-eoe.eps
new file mode 100644
index 00000000..12880a17
--- /dev/null
+++ b/doc/images/uml-eoe.eps
@@ -0,0 +1,259 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: uml-eoe.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Mon Aug  7 20:40:53 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 178 439
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.555 0.555 0.555 srgb} bind def
+
+end
+save
+newpath 0 439 moveto 0 0 lineto 299 0 lineto 299 439 lineto closepath clip newpath
+-27.6 465.6 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/reencdict 12 dict def /ReEncode { reencdict begin
+/newcodesandnames exch def /newfontname exch def /basefontname exch def
+/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
+basefontdict { exch dup /FID ne { dup /Encoding eq
+{ exch dup length array copy newfont 3 1 roll put }
+{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall
+newfont /FontName newfontname put newcodesandnames aload pop
+128 1 255 { newfont /Encoding get exch /.notdef put } for
+newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat
+newfontname newfont definefont pop end } def
+/isovec [
+8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde
+8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis
+8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron
+8#220 /dotlessi 8#230 /oe 8#231 /OE
+8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling
+8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis
+8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot
+8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus
+8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph
+8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine
+8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf
+8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute
+8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring
+8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute
+8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute
+8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve
+8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply
+8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex
+8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave
+8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring
+8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute
+8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute
+8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve
+8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide
+8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex
+8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def
+/Helvetica /Helvetica-iso isovec ReEncode
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 110
+% Polyline
+7.500 slw
+n 450 450 m 3240 450 l 3240 7380 l 450 7380 l
+ cp gs col7 1.00 shd ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 100
+% Polyline
+7.500 slw
+n 450 765 m
+ 3240 765 l gs col0 s gr 
+% Polyline
+n 450 5220 m
+ 3240 5220 l gs col0 s gr 
+/Helvetica-iso ff 180.00 scf sf
+540 675 m
+gs 1 -1 sc (ec_eoe_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 990 m
+gs 1 -1 sc (list: struct list_head) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 1170 m
+gs 1 -1 sc (slave: ec_slave_t *) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 1350 m
+gs 1 -1 sc (datagram: ec_datagram_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 1530 m
+gs 1 -1 sc (state: void \(*\)\(ec_eoe_t *\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 1710 m
+gs 1 -1 sc (dev: struct net_device *) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 1890 m
+gs 1 -1 sc (stats: struct net_device_stats) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 2070 m
+gs 1 -1 sc (opened: unsigned int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 2250 m
+gs 1 -1 sc (t_last: cycles_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 2430 m
+gs 1 -1 sc (rx_skb: struct sk_buff *) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 2610 m
+gs 1 -1 sc (rx_skb_offset: off_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 2790 m
+gs 1 -1 sc (rx_skb_size: size_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 2970 m
+gs 1 -1 sc (rx_expected_fragment: uint8_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 3150 m
+gs 1 -1 sc (rx_counter: uint32_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 3330 m
+gs 1 -1 sc (rx_rate: uint32_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 3510 m
+gs 1 -1 sc (tx_queue: struct list_head) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 3690 m
+gs 1 -1 sc (tx_queue_active: unsigned int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 3870 m
+gs 1 -1 sc (tx_queued_frames: unsigned int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 4050 m
+gs 1 -1 sc (tx_queue_lock: spinlock_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 4230 m
+gs 1 -1 sc (tx_frame: ec_eoe_frame_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 4410 m
+gs 1 -1 sc (tx_frame_number: uint8_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 4590 m
+gs 1 -1 sc (tx_fragment_number: uint8_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 4770 m
+gs 1 -1 sc (tx_offset: size_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 4950 m
+gs 1 -1 sc (tx_counter: uint32_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 5130 m
+gs 1 -1 sc (tx_rate: uint32_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 5445 m
+gs 1 -1 sc (+ ec_eoe_init\(\): int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 5625 m
+gs 1 -1 sc (+ ec_eoe_clear\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 5805 m
+gs 1 -1 sc (+ ec_eoe_run\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 5985 m
+gs 1 -1 sc (+ ec_eoe_active\(\): int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 6165 m
+gs 1 -1 sc (- ec_eoe_flush\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 6345 m
+gs 1 -1 sc (- ec_eoe_send\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 6525 m
+gs 1 -1 sc (- ec_eoe_state_rx_start\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 6705 m
+gs 1 -1 sc (- ec_eoe_state_rx_check\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 6885 m
+gs 1 -1 sc (- ec_eoe_state_rx_fetch\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 7065 m
+gs 1 -1 sc (- ec_eoe_state_tx_start\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 7245 m
+gs 1 -1 sc (- ec_eoe_state_tx_sent\(\)) col0 sh gr
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/uml-eoe.fig b/doc/images/uml-eoe.fig
new file mode 100644
index 00000000..6d5018d8
--- /dev/null
+++ b/doc/images/uml-eoe.fig
@@ -0,0 +1,52 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #8e8e8e
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 450 765 3240 765
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 450 5220 3240 5220
+2 2 0 1 0 7 110 -1 20 0.000 0 0 -1 0 0 5
+	 450 450 3240 450 3240 7380 450 7380 450 450
+4 0 0 100 0 16 12 0.0000 4 150 1320 540 675 ec_eoe_t\001
+4 0 0 100 0 16 12 0.0000 4 150 2670 540 990 list: struct list_head\001
+4 0 0 100 -1 16 12 0.0000 4 150 2655 540 1170 slave: ec_slave_t *\001
+4 0 0 100 -1 16 12 0.0000 4 165 3600 540 1350 datagram: ec_datagram_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 3555 540 1530 state: void (*)(ec_eoe_t *)\001
+4 0 0 100 -1 16 12 0.0000 4 150 3270 540 1710 dev: struct net_device *\001
+4 0 0 100 -1 16 12 0.0000 4 150 4050 540 1890 stats: struct net_device_stats\001
+4 0 0 100 -1 16 12 0.0000 4 165 2955 540 2070 opened: unsigned int\001
+4 0 0 100 -1 16 12 0.0000 4 165 2070 540 2250 t_last: cycles_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 3165 540 2430 rx_skb: struct sk_buff *\001
+4 0 0 100 -1 16 12 0.0000 4 150 2625 540 2610 rx_skb_offset: off_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 2715 540 2790 rx_skb_size: size_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 4260 540 2970 rx_expected_fragment: uint8_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 2790 540 3150 rx_counter: uint32_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 2265 540 3330 rx_rate: uint32_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 3600 540 3510 tx_queue: struct list_head\001
+4 0 0 100 -1 16 12 0.0000 4 165 4215 540 3690 tx_queue_active: unsigned int\001
+4 0 0 100 -1 16 12 0.0000 4 165 4515 540 3870 tx_queued_frames: unsigned int\001
+4 0 0 100 -1 16 12 0.0000 4 150 3675 540 4050 tx_queue_lock: spinlock_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 3660 540 4230 tx_frame: ec_eoe_frame_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 3570 540 4410 tx_frame_number: uint8_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 4005 540 4590 tx_fragment_number: uint8_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 2160 540 4770 tx_offset: size_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 2760 540 4950 tx_counter: uint32_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 2235 540 5130 tx_rate: uint32_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 2595 540 5445 + ec_eoe_init(): int\001
+4 0 0 100 -1 16 12 0.0000 4 165 2415 540 5625 + ec_eoe_clear()\001
+4 0 0 100 -1 16 12 0.0000 4 165 2175 540 5805 + ec_eoe_run()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3030 540 5985 + ec_eoe_active(): int\001
+4 0 0 100 -1 16 12 0.0000 4 165 2310 540 6165 - ec_eoe_flush()\001
+4 0 0 100 -1 16 12 0.0000 4 165 2340 540 6345 - ec_eoe_send()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3540 540 6525 - ec_eoe_state_rx_start()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3795 540 6705 - ec_eoe_state_rx_check()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3615 540 6885 - ec_eoe_state_rx_fetch()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3510 540 7065 - ec_eoe_state_tx_start()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3510 540 7245 - ec_eoe_state_tx_sent()\001
diff --git a/doc/images/uml-eoe.pdf b/doc/images/uml-eoe.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..220db2fd16632e54d45552fb40990bbb9315d51f
GIT binary patch
literal 1694
zcmZ`)eNYr-7>{abTw$;hZHCepjp1$#cK5zd7&JK!2~Uo@(?FzH?%v~8m)&FcJ-(SS
zG4qQ^(8eYt!->*LGpBJVQE(D96s8O;z>m=)60IReFwyE=I3Um3fA048Jip&Q@ALeg
z-6*Tc97D&diKtUIsv8I`pn#COhKP?Rmq9)cd4LWhHqy*;2#SC-a}0te=oDNqA%T#P
z2$_7MxURz1{$>v~^Wx}&-wrVQOTD>Eb29f`Z+v%o=Df_-rl7Er#W$=y2M^wyp%1qv
zZK>!qj@(qARaQ2Q@*jS3W-yB=vluMSIpmdSX3wSzExj+-*p4mD2vJ&UR<ynL!Sv}T
zTWWt^-xjj)`9<qD9o}Jod$A?s%bzsukJ>Db7cv`Bc$#DWRYzh!pVqM<bfh<O?VY2C
zx>gwvpLEgOODfcwlVZG99u&WPpf6p!*-CKfyMFB7{aN@qLwnAxD$~yI+@U?FS#u?%
zpylYU3Xs_M^;Wd=Rd1+n<MC;akt?4JZ#pxQ{Ysfz!x5=$ZNy*!yCSG}0LJxhBwAKo
ziXbBkD$N;LDbLP}E4sffyxzNIcthx{wF42K4i5+KAKF~?k$7SIy{HA>C(;*J3|x!d
za6b9aV7qu)<86pZt?E8kZ=d^qm(aU$^oeH<M(+roo?iIpv9`9-+q#ljkAHqMqVnP+
z(FHAWi)xgf16TW;)nT(|WNc5}+jsBx(&lO9O6~Pui1aW1@EoplT;n6Z8o4zneLU2C
zyv}pCR6kr}F<!p=bZK4x<)(L{ope~6s-k}GsUFAPv$~#+?jzleo$5_DzPZ)0Z}q^s
z!V2k)(D}QAw<WwzJDL-=%?axIVdlu5vi=jz;k8Bm#+Wcgb?2{7Rh7T>?fL${Tc69H
zUEn;<oh}-^A9N?C%m{gx-wpVm>>$}U@~@WG5q?NBWiCgF7m`*c50Vz>VwojEG038D
znARJBMs3U{NSlDL)c}RFM93qcmVJm}C<#8%2_@`Mt0*|_5M`0r!+><aVuX1~#VFZ6
zMm3Hz%mQZ9vbc@Fo+T6UJr<OJ?Da9oU!MGgaqnX>Tpt)KPy%Es>ykhgA(w9>vH@1`
z$&#{~pGr?s{meuLF`SS$Au(S3RKEVf{HdY|GR<lMbV7n(SU!V)A8mR<rrD-c#tt<R
zH4ugeqw=jkxP+0Q+y-(f<O(5Toy=I7q>SN?@pzqCJ`d3HF>IvWmy6`_$UVT7Or9~|
zkdr*p#Jb%O4+&2NcS%d;v%F8ro?@z|D#0Uj`J7NxB-yPX*&|3ua*C`M0YfaURpQ~`
z7Ybqp-h^kbFfCM3l#Vh`dKInG(MBA%2(JGNIatI&g)g6rfdY(mvw0J8f~dfEDi<sS
zE1@W1b)b$_0V{)?9u5{l4rp-di$3I$Grfz~_`IzAvRkb%bAre+Jg^E9T&+}2PNi6c
zZUUQCMNpF$&}p@5EpUSg%%H{-kT1YbU^K15CVCK~^m;tx08FRCeht7V8XGnM(@}UR
z0hqynS1$lF{uidgb_&eXKE$Od-M=s-GAsv0{CxnVoh^m92LP|CfY(9x4j@x_w*cgU
y<6TWLfh@(5A?if>UyTh#x5d6o@7b3rA4am}O_C5JqOr!(YBl~GMJ1(~iGKjBwM;kw

literal 0
HcmV?d00001

diff --git a/doc/images/uml-fsm.eps b/doc/images/uml-fsm.eps
new file mode 100644
index 00000000..2f37c627
--- /dev/null
+++ b/doc/images/uml-fsm.eps
@@ -0,0 +1,382 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: uml-fsm.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Mon Aug  7 19:25:18 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 500 461
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.555 0.555 0.555 srgb} bind def
+
+end
+save
+newpath 0 461 moveto 0 0 lineto 600 0 lineto 600 461 lineto closepath clip newpath
+-27.6 488.3 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/reencdict 12 dict def /ReEncode { reencdict begin
+/newcodesandnames exch def /newfontname exch def /basefontname exch def
+/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
+basefontdict { exch dup /FID ne { dup /Encoding eq
+{ exch dup length array copy newfont 3 1 roll put }
+{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall
+newfont /FontName newfontname put newcodesandnames aload pop
+128 1 255 { newfont /Encoding get exch /.notdef put } for
+newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat
+newfontname newfont definefont pop end } def
+/isovec [
+8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde
+8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis
+8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron
+8#220 /dotlessi 8#230 /oe 8#231 /OE
+8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling
+8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis
+8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot
+8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus
+8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph
+8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine
+8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf
+8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute
+8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring
+8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute
+8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute
+8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve
+8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply
+8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex
+8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave
+8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring
+8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute
+8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute
+8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve
+8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide
+8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex
+8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def
+/Helvetica /Helvetica-iso isovec ReEncode
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 110
+% Polyline
+7.500 slw
+n 4635 450 m 4635 7740 l 8325 7740 l
+ 8325 450 l gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 450 7695 m 450 450 l 4140 450 l
+ 4140 7740 l gs col7 1.00 shd ef gr gs col0 s gr 
+% here ends figure;
+% 
+% here starts figure with depth 100
+% Polyline
+7.500 slw
+n 450 765 m
+ 4140 765 l gs col0 s gr 
+% Polyline
+n 450 4365 m
+ 4140 4365 l gs col0 s gr 
+/Helvetica-iso ff 180.00 scf sf
+540 675 m
+gs 1 -1 sc (ec_fsm_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 990 m
+gs 1 -1 sc (master: ec_master_t *) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 1170 m
+gs 1 -1 sc (slave: ec_slave_t *) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 1350 m
+gs 1 -1 sc (datagram: ec_datagram_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 1530 m
+gs 1 -1 sc (master_state: void \(*\)\(ec_fsm_t *\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 1710 m
+gs 1 -1 sc (master_slaves_responding: unsigned int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 1890 m
+gs 1 -1 sc (master_slave_states: ec_slave_state_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 2070 m
+gs 1 -1 sc (master_validation: unsigned int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 2250 m
+gs 1 -1 sc (slave_state: void \(*\)\(ec_fsm_t *\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 2430 m
+gs 1 -1 sc (sii_state: void \(*\)\(ec_fsm_t *\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 2610 m
+gs 1 -1 sc (sii_offset: uint16_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 2790 m
+gs 1 -1 sc (sii_mode: unsigned int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 2970 m
+gs 1 -1 sc (sii_value: uint8_t[4]) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 3150 m
+gs 1 -1 sc (sii_start: cycles_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 3330 m
+gs 1 -1 sc (change_state: void \(*\)\(ec_fsm_t *\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 3510 m
+gs 1 -1 sc (change_new: ec_sllave_state_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 3690 m
+gs 1 -1 sc (change_start: cycles_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 3870 m
+gs 1 -1 sc (coe_state: void \(*\)\(ec_fsm_t *\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 4050 m
+gs 1 -1 sc (sdodata: ec_sdo_data_t *) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 4230 m
+gs 1 -1 sc (coe_start: cycles_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 4590 m
+gs 1 -1 sc (+ ec_fsm_init\(\): int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 4770 m
+gs 1 -1 sc (+ ec_fsm_clear\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 4950 m
+gs 1 -1 sc (+ ec_fsm_reset\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 5130 m
+gs 1 -1 sc (+ ec_fsm_execute\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 5310 m
+gs 1 -1 sc (+ ec_fsm_startup\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 5490 m
+gs 1 -1 sc (+ ec_fsm_startup_running\(\): int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 5670 m
+gs 1 -1 sc (+ ec_fsm_startup_success\(\): int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 5850 m
+gs 1 -1 sc (+ ec_fsm_configuration\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 6030 m
+gs 1 -1 sc (+ ec_fsm_configuration_running\(\): int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 6210 m
+gs 1 -1 sc (+ ec_fsm_configuration_success\(\): int) col0 sh gr
+% here ends figure;
+% 
+% here starts figure with depth 50
+/Helvetica-iso ff 180.00 scf sf
+4725 1665 m
+gs 1 -1 sc (- ec_fsm_configuration_conf\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 1845 m
+gs 1 -1 sc (- ec_fsm_slavescan_start\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 2025 m
+gs 1 -1 sc (- ec_fsm_slavescan_address\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 2205 m
+gs 1 -1 sc (- ec_fsm_slavescan_state\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 2385 m
+gs 1 -1 sc (- ec_fsm_slavescan_base\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 2565 m
+gs 1 -1 sc (- ec_fsm_slavescan_datalink\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 2745 m
+gs 1 -1 sc (- ec_fsm_slavescan_eeprom_size\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 2925 m
+gs 1 -1 sc (- ec_fsm_slavescan_eeprom_data\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 3105 m
+gs 1 -1 sc (- ec_fsm_slaveconf_init\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 3285 m
+gs 1 -1 sc (- ec_fsm_slaveconf_sync\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 3465 m
+gs 1 -1 sc (- ec_fsm_slaveconf_preop\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 3645 m
+gs 1 -1 sc (- ec_fsm_slaveconf_fmmu\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 3825 m
+gs 1 -1 sc (- ec_fsm_slaveconf_sdoconf\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 4005 m
+gs 1 -1 sc (- ec_fsm_slaveconf_saveop\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 4185 m
+gs 1 -1 sc (- ec_fsm_slaveconf_op\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 4365 m
+gs 1 -1 sc (- ec_fsm_sii_start_reading\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 4545 m
+gs 1 -1 sc (- ec_fsm_sii_read_check\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 4725 m
+gs 1 -1 sc (- ec_fsm_sii_read_fetch\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 4905 m
+gs 1 -1 sc (- ec_fsm_sii_start_writing\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 5085 m
+gs 1 -1 sc (- ec_fsm_sii_write_check\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 5265 m
+gs 1 -1 sc (- ec_fsm_sii_write_check2\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 5445 m
+gs 1 -1 sc (- ec_fsm_change_start\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 5625 m
+gs 1 -1 sc (- ec_fsm_change_check\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 5805 m
+gs 1 -1 sc (- ec_fsm_change_status\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 5985 m
+gs 1 -1 sc (- ec_fsm_change_code\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 6165 m
+gs 1 -1 sc (- ec_fsm_change_ack\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 6345 m
+gs 1 -1 sc (- ec_fsm_change_check_ack\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 6525 m
+gs 1 -1 sc (- ec_fsm_coe_down_start\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 6705 m
+gs 1 -1 sc (- ec_fsm_coe_down_request\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 6885 m
+gs 1 -1 sc (- ec_fsm_coe_down_check\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 7065 m
+gs 1 -1 sc (- ec_fsm_coe_down_response\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 7245 m
+gs 1 -1 sc (- ec_fsm_end\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 7425 m
+gs 1 -1 sc (- ec_fsm_error\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 765 m
+gs 1 -1 sc (- ec_fsm_master_write_eeprom\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 945 m
+gs 1 -1 sc (- ec_fsm_startup_start\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 1125 m
+gs 1 -1 sc (- ec_fsm_startup_broadcast\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 1305 m
+gs 1 -1 sc (- ec_fsm_startup_scan\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+4725 1485 m
+gs 1 -1 sc (- ec_fsm_configuration_start\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 6390 m
+gs 1 -1 sc (- ec_fsm_master_start\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 6570 m
+gs 1 -1 sc (- ec_fsm_master_broadcast\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 6750 m
+gs 1 -1 sc (- ec_fsm_master_read_states\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 6930 m
+gs 1 -1 sc (- ec_fsm_master_validate_vendor\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 7110 m
+gs 1 -1 sc (- ec_fsm_master_validate_product\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 7290 m
+gs 1 -1 sc (- ec_fsm_master_rewrite_addresses\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+540 7470 m
+gs 1 -1 sc (- ec_fsm_master_configure_slaves\(\)) col0 sh gr
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/uml-fsm.fig b/doc/images/uml-fsm.fig
new file mode 100644
index 00000000..33eda33f
--- /dev/null
+++ b/doc/images/uml-fsm.fig
@@ -0,0 +1,93 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #8e8e8e
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 450 765 4140 765
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 450 4365 4140 4365
+2 1 0 1 0 7 110 -1 20 0.000 0 0 -1 0 0 4
+	 4635 450 4635 7740 8325 7740 8325 450
+2 1 0 1 0 7 110 -1 20 0.000 0 0 -1 0 0 4
+	 450 7695 450 450 4140 450 4140 7740
+4 0 0 100 0 16 12 0.0000 4 150 1275 540 675 ec_fsm_t\001
+4 0 0 100 0 16 12 0.0000 4 150 3045 540 990 master: ec_master_t *\001
+4 0 0 100 -1 16 12 0.0000 4 150 2655 540 1170 slave: ec_slave_t *\001
+4 0 0 100 -1 16 12 0.0000 4 165 3600 540 1350 datagram: ec_datagram_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 4650 540 1530 master_state: void (*)(ec_fsm_t *)\001
+4 0 0 100 -1 16 12 0.0000 4 165 5730 540 1710 master_slaves_responding: unsigned int\001
+4 0 0 100 -1 16 12 0.0000 4 150 5475 540 1890 master_slave_states: ec_slave_state_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 4380 540 2070 master_validation: unsigned int\001
+4 0 0 100 -1 16 12 0.0000 4 165 4455 540 2250 slave_state: void (*)(ec_fsm_t *)\001
+4 0 0 100 -1 16 12 0.0000 4 165 4005 540 2430 sii_state: void (*)(ec_fsm_t *)\001
+4 0 0 100 -1 16 12 0.0000 4 150 2520 540 2610 sii_offset: uint16_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 3165 540 2790 sii_mode: unsigned int\001
+4 0 0 100 -1 16 12 0.0000 4 165 2700 540 2970 sii_value: uint8_t[4]\001
+4 0 0 100 -1 16 12 0.0000 4 165 2415 540 3150 sii_start: cycles_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 4755 540 3330 change_state: void (*)(ec_fsm_t *)\001
+4 0 0 100 -1 16 12 0.0000 4 165 4470 540 3510 change_new: ec_sllave_state_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 3165 540 3690 change_start: cycles_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 4215 540 3870 coe_state: void (*)(ec_fsm_t *)\001
+4 0 0 100 -1 16 12 0.0000 4 150 3585 540 4050 sdodata: ec_sdo_data_t *\001
+4 0 0 100 -1 16 12 0.0000 4 165 2625 540 4230 coe_start: cycles_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 2550 540 4590 + ec_fsm_init(): int\001
+4 0 0 100 -1 16 12 0.0000 4 165 2370 540 4770 + ec_fsm_clear()\001
+4 0 0 100 -1 16 12 0.0000 4 165 2370 540 4950 + ec_fsm_reset()\001
+4 0 0 100 -1 16 12 0.0000 4 165 2790 540 5130 + ec_fsm_execute()\001
+4 0 0 100 -1 16 12 0.0000 4 165 2625 540 5310 + ec_fsm_startup()\001
+4 0 0 100 -1 16 12 0.0000 4 165 4365 540 5490 + ec_fsm_startup_running(): int\001
+4 0 0 100 -1 16 12 0.0000 4 165 4470 540 5670 + ec_fsm_startup_success(): int\001
+4 0 0 100 -1 16 12 0.0000 4 165 3495 540 5850 + ec_fsm_configuration()\001
+4 0 0 100 -1 16 12 0.0000 4 165 5235 540 6030 + ec_fsm_configuration_running(): int\001
+4 0 0 50 -1 16 12 0.0000 4 165 4200 4725 1665 - ec_fsm_configuration_conf()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3825 4725 1845 - ec_fsm_slavescan_start()\001
+4 0 0 50 -1 16 12 0.0000 4 165 4380 4725 2025 - ec_fsm_slavescan_address()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3900 4725 2205 - ec_fsm_slavescan_state()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3930 4725 2385 - ec_fsm_slavescan_base()\001
+4 0 0 50 -1 16 12 0.0000 4 165 4335 4725 2565 - ec_fsm_slavescan_datalink()\001
+4 0 0 50 -1 16 12 0.0000 4 165 5070 4725 2745 - ec_fsm_slavescan_eeprom_size()\001
+4 0 0 50 -1 16 12 0.0000 4 165 5100 4725 2925 - ec_fsm_slavescan_eeprom_data()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3540 4725 3105 - ec_fsm_slaveconf_init()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3810 4725 3285 - ec_fsm_slaveconf_sync()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3960 4725 3465 - ec_fsm_slaveconf_preop()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3900 4725 3645 - ec_fsm_slaveconf_fmmu()\001
+4 0 0 50 -1 16 12 0.0000 4 165 4260 4725 3825 - ec_fsm_slaveconf_sdoconf()\001
+4 0 0 50 -1 16 12 0.0000 4 165 4185 4725 4005 - ec_fsm_slaveconf_saveop()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3495 4725 4185 - ec_fsm_slaveconf_op()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3945 4725 4365 - ec_fsm_sii_start_reading()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3765 4725 4545 - ec_fsm_sii_read_check()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3585 4725 4725 - ec_fsm_sii_read_fetch()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3795 4725 4905 - ec_fsm_sii_start_writing()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3795 4725 5085 - ec_fsm_sii_write_check()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3975 4725 5265 - ec_fsm_sii_write_check2()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3435 4725 5445 - ec_fsm_change_start()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3690 4725 5625 - ec_fsm_change_check()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3675 4725 5805 - ec_fsm_change_status()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3540 4725 5985 - ec_fsm_change_code()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3345 4725 6165 - ec_fsm_change_ack()\001
+4 0 0 50 -1 16 12 0.0000 4 165 4380 4725 6345 - ec_fsm_change_check_ack()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3855 4725 6525 - ec_fsm_coe_down_start()\001
+4 0 0 50 -1 16 12 0.0000 4 165 4320 4725 6705 - ec_fsm_coe_down_request()\001
+4 0 0 50 -1 16 12 0.0000 4 165 4110 4725 6885 - ec_fsm_coe_down_check()\001
+4 0 0 50 -1 16 12 0.0000 4 165 4590 4725 7065 - ec_fsm_coe_down_response()\001
+4 0 0 50 -1 16 12 0.0000 4 165 2130 4725 7245 - ec_fsm_end()\001
+4 0 0 50 -1 16 12 0.0000 4 165 2265 4725 7425 - ec_fsm_error()\001
+4 0 0 50 -1 16 12 0.0000 4 165 4665 4725 765 - ec_fsm_master_write_eeprom()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3330 4725 945 - ec_fsm_startup_start()\001
+4 0 0 50 -1 16 12 0.0000 4 165 4140 4725 1125 - ec_fsm_startup_broadcast()\001
+4 0 0 50 -1 16 12 0.0000 4 165 3420 4725 1305 - ec_fsm_startup_scan()\001
+4 0 0 50 -1 16 12 0.0000 4 165 4200 4725 1485 - ec_fsm_configuration_start()\001
+4 0 0 100 -1 16 12 0.0000 4 165 5340 540 6210 + ec_fsm_configuration_success(): int\001
+4 0 0 50 -1 16 12 0.0000 4 165 3330 540 6390 - ec_fsm_master_start()\001
+4 0 0 50 -1 16 12 0.0000 4 165 4140 540 6570 - ec_fsm_master_broadcast()\001
+4 0 0 50 -1 16 12 0.0000 4 165 4395 540 6750 - ec_fsm_master_read_states()\001
+4 0 0 50 -1 16 12 0.0000 4 165 5010 540 6930 - ec_fsm_master_validate_vendor()\001
+4 0 0 50 -1 16 12 0.0000 4 165 5085 540 7110 - ec_fsm_master_validate_product()\001
+4 0 0 50 -1 16 12 0.0000 4 165 5370 540 7290 - ec_fsm_master_rewrite_addresses()\001
+4 0 0 50 -1 16 12 0.0000 4 165 5160 540 7470 - ec_fsm_master_configure_slaves()\001
diff --git a/doc/images/uml-fsm.pdf b/doc/images/uml-fsm.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..845e962f415a6560c505336bf9677cc8e13137df
GIT binary patch
literal 1991
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

literal 0
HcmV?d00001

diff --git a/doc/images/uml-master.eps b/doc/images/uml-master.eps
new file mode 100644
index 00000000..5d9a02a7
--- /dev/null
+++ b/doc/images/uml-master.eps
@@ -0,0 +1,303 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: uml-master.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Mon Aug  7 13:47:53 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 478 365
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.555 0.555 0.555 srgb} bind def
+
+end
+save
+newpath 0 365 moveto 0 0 lineto 594 0 lineto 594 365 lineto closepath clip newpath
+-55.9 411.8 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/reencdict 12 dict def /ReEncode { reencdict begin
+/newcodesandnames exch def /newfontname exch def /basefontname exch def
+/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
+basefontdict { exch dup /FID ne { dup /Encoding eq
+{ exch dup length array copy newfont 3 1 roll put }
+{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall
+newfont /FontName newfontname put newcodesandnames aload pop
+128 1 255 { newfont /Encoding get exch /.notdef put } for
+newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat
+newfontname newfont definefont pop end } def
+/isovec [
+8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde
+8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis
+8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron
+8#220 /dotlessi 8#230 /oe 8#231 /OE
+8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling
+8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis
+8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot
+8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus
+8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph
+8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine
+8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf
+8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute
+8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring
+8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute
+8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute
+8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve
+8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply
+8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex
+8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave
+8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring
+8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute
+8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute
+8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve
+8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide
+8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex
+8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def
+/Helvetica /Helvetica-iso isovec ReEncode
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 101
+% Polyline
+7.500 slw
+n 900 6525 m 900 765 l 4140 765 l
+ 4140 6525 l gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 5220 975 m 5220 6315 l 8460 6315 l
+ 8460 975 l gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 900 1077 m
+ 4140 1080 l gs col0 s gr 
+% Polyline
+n 900 6210 m
+ 4140 6210 l gs col0 s gr 
+/Helvetica-iso ff 180.00 scf sf
+1005 972 m
+gs 1 -1 sc (ec_master_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 1258 m
+gs 1 -1 sc (list: struct list_head) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 1468 m
+gs 1 -1 sc (reserved: unsigned int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 1678 m
+gs 1 -1 sc (index: unsigned int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 1888 m
+gs 1 -1 sc (kobj: struct kobj) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 2098 m
+gs 1 -1 sc (slaves: struct list_head) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 2308 m
+gs 1 -1 sc (slave_count: unsigned int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 2518 m
+gs 1 -1 sc (device: ec_device_t *) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 2728 m
+gs 1 -1 sc (datagram_queue: struct list_head) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 2938 m
+gs 1 -1 sc (datagram_index: uint8_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 3148 m
+gs 1 -1 sc (domains: struct list_head) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 3360 m
+gs 1 -1 sc (debug_level: unsigned int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 3570 m
+gs 1 -1 sc (stats: ec_stats_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 3780 m
+gs 1 -1 sc (workqueue: struct workqueue_struct *) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 3990 m
+gs 1 -1 sc (idle_work: struct work_struct) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 4200 m
+gs 1 -1 sc (fsm: ec_fsm_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 4408 m
+gs 1 -1 sc (mode: ec_master_mode_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 4618 m
+gs 1 -1 sc (eoe_timer: struct timer_list) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 4828 m
+gs 1 -1 sc (eoe_running: unsigned int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 5038 m
+gs 1 -1 sc (eoe_handlers: struct list_head) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 5248 m
+gs 1 -1 sc (internal_lock: spinlock_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 5458 m
+gs 1 -1 sc (request_cb: int \(*\)\(void *\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 5668 m
+gs 1 -1 sc (release_cb: void \(*\)\(void *\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 5878 m
+gs 1 -1 sc (cb_data: void *) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 6088 m
+gs 1 -1 sc (eeprom_write_enable: uint8_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 6435 m
+gs 1 -1 sc (+ ec_master_init\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5325 2628 m
+gs 1 -1 sc (+ ec_master_queue_datagram\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5325 1788 m
+gs 1 -1 sc (+ ec_master_idle_stop\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5325 2208 m
+gs 1 -1 sc (+ ec_master_eoe_stop\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5325 2418 m
+gs 1 -1 sc (+ ec_master_receive_datagrams\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5325 1368 m
+gs 1 -1 sc (+ ec_master_reset\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5325 1998 m
+gs 1 -1 sc (+ ec_master_eoe_start\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5325 1578 m
+gs 1 -1 sc (+ ec_master_idle_start\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5325 2835 m
+gs 1 -1 sc (+ ec_master_output_stats\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5325 3045 m
+gs 1 -1 sc (+ ec_master_clear_slaves\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5325 3255 m
+gs 1 -1 sc (- ec_master_send_datagrams\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5325 3468 m
+gs 1 -1 sc (- ec_master_idle\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5325 3678 m
+gs 1 -1 sc (- ec_master_eoe_run\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5321 3888 m
+gs 1 -1 sc (+ ecrt_master_callbacks\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5321 4098 m
+gs 1 -1 sc (+ ecrt_master_create_domain\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5321 4308 m
+gs 1 -1 sc (+ ecrt_master_activate\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5321 4518 m
+gs 1 -1 sc (+ ecrt_master_deactivate\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5325 1155 m
+gs 1 -1 sc (+ ec_master_clear\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5321 4725 m
+gs 1 -1 sc (+ ecrt_master_send\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5321 4935 m
+gs 1 -1 sc (+ ecrt_master_receive\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5321 5148 m
+gs 1 -1 sc (+ ecrt_master_prepare\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5321 5358 m
+gs 1 -1 sc (+ ecrt_master_run\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5321 5568 m
+gs 1 -1 sc (+ ecrt_master_start_eoe\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5321 5778 m
+gs 1 -1 sc (+ ecrt_master_debug\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5321 5988 m
+gs 1 -1 sc (+ ecrt_master_print\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5321 6198 m
+gs 1 -1 sc (+ ecrt_master_get_slave\(\)) col0 sh gr
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/uml-master.fig b/doc/images/uml-master.fig
new file mode 100644
index 00000000..c3e7d874
--- /dev/null
+++ b/doc/images/uml-master.fig
@@ -0,0 +1,69 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #8e8e8e
+2 1 0 1 0 7 101 -1 20 0.000 0 0 -1 0 0 4
+	 900 6525 900 765 4140 765 4140 6525
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 900 1077 4140 1080
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 900 6210 4140 6210
+2 1 0 1 0 7 101 -1 20 0.000 0 0 -1 0 0 4
+	 5220 975 5220 6315 8460 6315 8460 975
+4 0 0 100 0 16 12 0.0000 4 150 1740 1005 972 ec_master_t\001
+4 0 0 100 0 16 12 0.0000 4 150 2670 1005 1258 list: struct list_head\001
+4 0 0 100 -1 16 12 0.0000 4 165 3135 1005 1468 reserved: unsigned int\001
+4 0 0 100 -1 16 12 0.0000 4 165 2655 1005 1678 index: unsigned int\001
+4 0 0 100 -1 16 12 0.0000 4 165 2190 1005 1888 kobj: struct kobj\001
+4 0 0 100 -1 16 12 0.0000 4 150 3210 1005 2098 slaves: struct list_head\001
+4 0 0 100 -1 16 12 0.0000 4 165 3600 1005 2308 slave_count: unsigned int\001
+4 0 0 100 -1 16 12 0.0000 4 150 3015 1005 2518 device: ec_device_t *\001
+4 0 0 100 -1 16 12 0.0000 4 165 4695 1005 2728 datagram_queue: struct list_head\001
+4 0 0 100 -1 16 12 0.0000 4 165 3390 1005 2938 datagram_index: uint8_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 3495 1005 3148 domains: struct list_head\001
+4 0 0 100 -1 16 12 0.0000 4 165 3630 1005 3360 debug_level: unsigned int\001
+4 0 0 100 -1 16 12 0.0000 4 150 2250 1005 3570 stats: ec_stats_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 5310 1005 3780 workqueue: struct workqueue_struct *\001
+4 0 0 100 -1 16 12 0.0000 4 150 4005 1005 3990 idle_work: struct work_struct\001
+4 0 0 100 -1 16 12 0.0000 4 150 1920 1005 4200 fsm: ec_fsm_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 3660 1005 4408 mode: ec_master_mode_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 3660 1005 4618 eoe_timer: struct timer_list\001
+4 0 0 100 -1 16 12 0.0000 4 165 3675 1005 4828 eoe_running: unsigned int\001
+4 0 0 100 -1 16 12 0.0000 4 150 4245 1005 5038 eoe_handlers: struct list_head\001
+4 0 0 100 -1 16 12 0.0000 4 150 3405 1005 5248 internal_lock: spinlock_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 3480 1005 5458 request_cb: int (*)(void *)\001
+4 0 0 100 -1 16 12 0.0000 4 165 3750 1005 5668 release_cb: void (*)(void *)\001
+4 0 0 100 -1 16 12 0.0000 4 150 2085 1005 5878 cb_data: void *\001
+4 0 0 100 -1 16 12 0.0000 4 150 4185 1005 6088 eeprom_write_enable: uint8_t\001
+4 0 0 100 0 16 12 0.0000 4 165 2535 1005 6435 + ec_master_init()\001
+4 0 0 100 -1 16 12 0.0000 4 165 4545 5325 2628 + ec_master_queue_datagram()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3420 5325 1788 + ec_master_idle_stop()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3450 5325 2208 + ec_master_eoe_stop()\001
+4 0 0 100 -1 16 12 0.0000 4 165 4860 5325 2418 + ec_master_receive_datagrams()\001
+4 0 0 100 0 16 12 0.0000 4 165 2835 5325 1368 + ec_master_reset()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3450 5325 1998 + ec_master_eoe_start()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3420 5325 1578 + ec_master_idle_start()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3840 5325 2835 + ec_master_output_stats()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3945 5325 3045 + ec_master_clear_slaves()\001
+4 0 0 100 -1 16 12 0.0000 4 165 4440 5325 3255 - ec_master_send_datagrams()\001
+4 0 0 100 -1 16 12 0.0000 4 165 2565 5325 3468 - ec_master_idle()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3240 5325 3678 - ec_master_eoe_run()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3660 5321 3888 + ecrt_master_callbacks()\001
+4 0 0 100 -1 16 12 0.0000 4 165 4425 5321 4098 + ecrt_master_create_domain()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3405 5321 4308 + ecrt_master_activate()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3765 5321 4518 + ecrt_master_deactivate()\001
+4 0 0 100 0 16 12 0.0000 4 165 2835 5325 1155 + ec_master_clear()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3015 5321 4725 + ecrt_master_send()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3360 5321 4935 + ecrt_master_receive()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3420 5321 5148 + ecrt_master_prepare()\001
+4 0 0 100 -1 16 12 0.0000 4 165 2775 5321 5358 + ecrt_master_run()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3630 5321 5568 + ecrt_master_start_eoe()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3210 5321 5778 + ecrt_master_debug()\001
+4 0 0 100 -1 16 12 0.0000 4 165 2925 5321 5988 + ecrt_master_print()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3690 5321 6198 + ecrt_master_get_slave()\001
diff --git a/doc/images/uml-master.pdf b/doc/images/uml-master.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..7495f0e48feacb89e5329319087238163fbd687b
GIT binary patch
literal 1997
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
F<R9?4)h_@5

literal 0
HcmV?d00001

diff --git a/doc/images/uml-slave.eps b/doc/images/uml-slave.eps
new file mode 100644
index 00000000..25db3ab9
--- /dev/null
+++ b/doc/images/uml-slave.eps
@@ -0,0 +1,357 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: uml-slave.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 4
+%%CreationDate: Thu Jul 13 16:33:29 2006
+%%For: fp@jupiter (Florian Pose)
+%%BoundingBox: 0 0 457 478
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+/col32 {0.555 0.555 0.555 srgb} bind def
+
+end
+save
+newpath 0 478 moveto 0 0 lineto 586 0 lineto 586 478 lineto closepath clip newpath
+-55.9 522.3 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/reencdict 12 dict def /ReEncode { reencdict begin
+/newcodesandnames exch def /newfontname exch def /basefontname exch def
+/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
+basefontdict { exch dup /FID ne { dup /Encoding eq
+{ exch dup length array copy newfont 3 1 roll put }
+{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall
+newfont /FontName newfontname put newcodesandnames aload pop
+128 1 255 { newfont /Encoding get exch /.notdef put } for
+newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat
+newfontname newfont definefont pop end } def
+/isovec [
+8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde
+8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis
+8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron
+8#220 /dotlessi 8#230 /oe 8#231 /OE
+8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling
+8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis
+8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot
+8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus
+8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph
+8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine
+8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf
+8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute
+8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring
+8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute
+8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute
+8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve
+8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply
+8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex
+8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave
+8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring
+8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute
+8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute
+8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve
+8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide
+8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex
+8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def
+/Helvetica /Helvetica-iso isovec ReEncode
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 101
+% Polyline
+7.500 slw
+n 900 8265 m 900 720 l 4185 720 l
+ 4185 8250 l gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 4860 855 m 4860 8280 l 8145 8280 l
+ 8145 855 l gs col7 1.00 shd ef gr gs col0 s gr 
+% Polyline
+n 4860 3525 m
+ 8145 3525 l gs col0 s gr 
+/Helvetica-iso ff 180.00 scf sf
+5010 3225 m
+gs 1 -1 sc (online: unsigned int) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5010 3435 m
+gs 1 -1 sc (varsize_fields: struct list_head) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 3735 m
+gs 1 -1 sc (+ ec_slave_init\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 3945 m
+gs 1 -1 sc (+ ec_slave_clear\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 4170 m
+gs 1 -1 sc (+ ec_slave_prepare_fmmu\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 4380 m
+gs 1 -1 sc (+ ec_slave_fetch_strings\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 4590 m
+gs 1 -1 sc (+ ec_slave_fetch_general\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 4800 m
+gs 1 -1 sc (+ ec_slave_fetch_sync\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 5010 m
+gs 1 -1 sc (+ ec_slave_fetch_pdo\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 5220 m
+gs 1 -1 sc (+ ec_slave_locate_string\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 5430 m
+gs 1 -1 sc (+ ec_slave_calc_sync_size\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 5640 m
+gs 1 -1 sc (+ ec_slave_print\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 5850 m
+gs 1 -1 sc (+ ec_slave_mbox_prepare_send\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 6060 m
+gs 1 -1 sc (+ ec_slave_mbox_prepare_check\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 6270 m
+gs 1 -1 sc (+ ec_slave_mbox_check\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 6480 m
+gs 1 -1 sc (+ ec_slave_mbox_prepare_fetch\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 6690 m
+gs 1 -1 sc (+ ec_slave_mbox_fetch\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 6900 m
+gs 1 -1 sc (+ ec_slave_mbox_simple_io\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 7110 m
+gs 1 -1 sc (+ ec_slave_mbox_simple_receive\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5010 7320 m
+gs 1 -1 sc (- ec_slave_write_eeprom\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 7530 m
+gs 1 -1 sc (+ ecrt_slave_conf_sdo8\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 7740 m
+gs 1 -1 sc (+ ecrt_slave_conf_sdo16\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 7950 m
+gs 1 -1 sc (+ ecrt_slave_conf_sdo32\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5006 8160 m
+gs 1 -1 sc (+ ecrt_slave_field_size\(\)) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5010 1125 m
+gs 1 -1 sc (eeprom_group: char *) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5010 1335 m
+gs 1 -1 sc (eeprom_image: char *) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5010 1545 m
+gs 1 -1 sc (eeprom_order: char *) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5010 1755 m
+gs 1 -1 sc (eeprom_name: char *) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5010 1965 m
+gs 1 -1 sc (new_eeprom_data: uint8_t *) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5010 2175 m
+gs 1 -1 sc (new_eeprom_size: uint16_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5010 2385 m
+gs 1 -1 sc (sdo_dictionary: struct list_head) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5010 2595 m
+gs 1 -1 sc (requested_state: ec_slave_state_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5010 2805 m
+gs 1 -1 sc (current_state: ec_slave_state_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+5010 3015 m
+gs 1 -1 sc (error_flag: unsigned int) col0 sh gr
+% Polyline
+n 900 1035 m
+ 4185 1043 l gs col0 s gr 
+/Helvetica-iso ff 180.00 scf sf
+1005 972 m
+gs 1 -1 sc (ec_slave_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 1258 m
+gs 1 -1 sc (list: struct list_head) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 1440 m
+gs 1 -1 sc (kobj: struct kobj) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 1650 m
+gs 1 -1 sc (master: ec_master_t *) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 1860 m
+gs 1 -1 sc (ring_position: uint16_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 2070 m
+gs 1 -1 sc (station_address: uint16_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 2280 m
+gs 1 -1 sc (coupler_index: uint16_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 2490 m
+gs 1 -1 sc (coupler_subindex: uint16_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 2700 m
+gs 1 -1 sc (base_type: uint8_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 2910 m
+gs 1 -1 sc (base_revision: uint8_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 3120 m
+gs 1 -1 sc (base_build: uint16_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 3330 m
+gs 1 -1 sc (base_fmmu_count: uint16_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 3540 m
+gs 1 -1 sc (base_sync_count: uint16_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 3750 m
+gs 1 -1 sc (dl_link: uint8_t[4]) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 3960 m
+gs 1 -1 sc (dl_loop: uint8_t[4]) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 4170 m
+gs 1 -1 sc (dl_signal: uint8_t[4]) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 4380 m
+gs 1 -1 sc (sii_alias: uint16_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 4590 m
+gs 1 -1 sc (sii_vendor_id: uint32_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 4800 m
+gs 1 -1 sc (sii_product_code: uint32_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 5010 m
+gs 1 -1 sc (sii_revision_number: uint32_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 5220 m
+gs 1 -1 sc (sii_serial_number: uint32_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 5430 m
+gs 1 -1 sc (sii_rx_mailbox_offset: uint16_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 5850 m
+gs 1 -1 sc (sii_tx_mailbox_offset: uint16_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 6060 m
+gs 1 -1 sc (sii_tx_mailbox_size: uint16_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 6270 m
+gs 1 -1 sc (sii_mailbox_protocols: uint16_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 6480 m
+gs 1 -1 sc (sii_physical_layer: uint8_t[4]) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 6690 m
+gs 1 -1 sc (registered: uint8_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 6900 m
+gs 1 -1 sc (fmmus: ec_fmmu_t[EC_MAX_FMMUS]) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 7110 m
+gs 1 -1 sc (fmmu_count: uint8_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 7320 m
+gs 1 -1 sc (eeprom_data: uint8_t *) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 7530 m
+gs 1 -1 sc (eeprom_size: uint16_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 7740 m
+gs 1 -1 sc (eeprom_strings: struct list_head) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 7950 m
+gs 1 -1 sc (eeprom_syncs: struct list_head) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 5640 m
+gs 1 -1 sc (sii_rx_mailbox_size: uint16_t) col0 sh gr
+/Helvetica-iso ff 180.00 scf sf
+1005 8160 m
+gs 1 -1 sc (eeprom_pdos: struct list_head) col0 sh gr
+% here ends figure;
+$F2psEnd
+rs
+showpage
diff --git a/doc/images/uml-slave.fig b/doc/images/uml-slave.fig
new file mode 100644
index 00000000..3fc20a9a
--- /dev/null
+++ b/doc/images/uml-slave.fig
@@ -0,0 +1,89 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+0 32 #8e8e8e
+6 4860 1005 10061 8205
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 4860 3525 8145 3525
+4 0 0 100 -1 16 12 0.0000 4 165 2745 5010 3225 online: unsigned int\001
+4 0 0 100 -1 16 12 0.0000 4 150 4245 5010 3435 varsize_fields: struct list_head\001
+4 0 0 100 -1 16 12 0.0000 4 165 2340 5006 3735 + ec_slave_init()\001
+4 0 0 100 -1 16 12 0.0000 4 165 2640 5006 3945 + ec_slave_clear()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3990 5006 4170 + ec_slave_prepare_fmmu()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3735 5006 4380 + ec_slave_fetch_strings()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3870 5006 4590 + ec_slave_fetch_general()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3465 5006 4800 + ec_slave_fetch_sync()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3330 5006 5010 + ec_slave_fetch_pdo()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3750 5006 5220 + ec_slave_locate_string()\001
+4 0 0 100 -1 16 12 0.0000 4 165 4140 5006 5430 + ec_slave_calc_sync_size()\001
+4 0 0 100 -1 16 12 0.0000 4 165 2550 5006 5640 + ec_slave_print()\001
+4 0 0 100 -1 16 12 0.0000 4 165 4890 5006 5850 + ec_slave_mbox_prepare_send()\001
+4 0 0 100 -1 16 12 0.0000 4 165 5040 5006 6060 + ec_slave_mbox_prepare_check()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3750 5006 6270 + ec_slave_mbox_check()\001
+4 0 0 100 -1 16 12 0.0000 4 165 4860 5006 6480 + ec_slave_mbox_prepare_fetch()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3570 5006 6690 + ec_slave_mbox_fetch()\001
+4 0 0 100 -1 16 12 0.0000 4 165 4260 5006 6900 + ec_slave_mbox_simple_io()\001
+4 0 0 100 -1 16 12 0.0000 4 165 5055 5006 7110 + ec_slave_mbox_simple_receive()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3795 5010 7320 - ec_slave_write_eeprom()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3600 5006 7530 + ecrt_slave_conf_sdo8()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3780 5006 7740 + ecrt_slave_conf_sdo16()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3780 5006 7950 + ecrt_slave_conf_sdo32()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3465 5006 8160 + ecrt_slave_field_size()\001
+4 0 0 100 -1 16 12 0.0000 4 165 3060 5010 1125 eeprom_group: char *\001
+4 0 0 100 -1 16 12 0.0000 4 165 3105 5010 1335 eeprom_image: char *\001
+4 0 0 100 -1 16 12 0.0000 4 150 2985 5010 1545 eeprom_order: char *\001
+4 0 0 100 -1 16 12 0.0000 4 150 3030 5010 1755 eeprom_name: char *\001
+4 0 0 100 -1 16 12 0.0000 4 150 3945 5010 1965 new_eeprom_data: uint8_t *\001
+4 0 0 100 -1 16 12 0.0000 4 150 3900 5010 2175 new_eeprom_size: uint16_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 4365 5010 2385 sdo_dictionary: struct list_head\001
+4 0 0 100 -1 16 12 0.0000 4 150 4830 5010 2595 requested_state: ec_slave_state_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 4395 5010 2805 current_state: ec_slave_state_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 3240 5010 3015 error_flag: unsigned int\001
+-6
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 900 1035 4185 1043
+2 1 0 1 0 7 101 -1 20 0.000 0 0 -1 0 0 4
+	 900 8265 900 720 4185 720 4185 8250
+2 1 0 1 0 7 101 -1 20 0.000 0 0 -1 0 0 4
+	 4860 855 4860 8280 8145 8280 8145 855
+4 0 0 100 0 16 12 0.0000 4 150 1545 1005 972 ec_slave_t\001
+4 0 0 100 0 16 12 0.0000 4 150 2670 1005 1258 list: struct list_head\001
+4 0 0 100 -1 16 12 0.0000 4 165 2190 1005 1440 kobj: struct kobj\001
+4 0 0 100 -1 16 12 0.0000 4 150 3045 1005 1650 master: ec_master_t *\001
+4 0 0 100 -1 16 12 0.0000 4 165 3105 1005 1860 ring_position: uint16_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 3540 1005 2070 station_address: uint16_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 3300 1005 2280 coupler_index: uint16_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 3825 1005 2490 coupler_subindex: uint16_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 2580 1005 2700 base_type: uint8_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 3105 1005 2910 base_revision: uint8_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 2850 1005 3120 base_build: uint16_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 3885 1005 3330 base_fmmu_count: uint16_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 3795 1005 3540 base_sync_count: uint16_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 2355 1005 3750 dl_link: uint8_t[4]\001
+4 0 0 100 -1 16 12 0.0000 4 165 2475 1005 3960 dl_loop: uint8_t[4]\001
+4 0 0 100 -1 16 12 0.0000 4 165 2715 1005 4170 dl_signal: uint8_t[4]\001
+4 0 0 100 -1 16 12 0.0000 4 150 2445 1005 4380 sii_alias: uint16_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 3195 1005 4590 sii_vendor_id: uint32_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 3720 1005 4800 sii_product_code: uint32_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 4155 1005 5010 sii_revision_number: uint32_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 3810 1005 5220 sii_serial_number: uint32_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 4260 1005 5430 sii_rx_mailbox_offset: uint16_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 4230 1005 5850 sii_tx_mailbox_offset: uint16_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 4065 1005 6060 sii_tx_mailbox_size: uint16_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 4365 1005 6270 sii_mailbox_protocols: uint16_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 3990 1005 6480 sii_physical_layer: uint8_t[4]\001
+4 0 0 100 -1 16 12 0.0000 4 165 2520 1005 6690 registered: uint8_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 5475 1005 6900 fmmus: ec_fmmu_t[EC_MAX_FMMUS]\001
+4 0 0 100 -1 16 12 0.0000 4 150 2820 1005 7110 fmmu_count: uint8_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 3165 1005 7320 eeprom_data: uint8_t *\001
+4 0 0 100 -1 16 12 0.0000 4 150 3120 1005 7530 eeprom_size: uint16_t\001
+4 0 0 100 -1 16 12 0.0000 4 165 4485 1005 7740 eeprom_strings: struct list_head\001
+4 0 0 100 -1 16 12 0.0000 4 165 4380 1005 7950 eeprom_syncs: struct list_head\001
+4 0 0 100 -1 16 12 0.0000 4 150 4095 1005 5640 sii_rx_mailbox_size: uint16_t\001
+4 0 0 100 -1 16 12 0.0000 4 150 4245 1005 8160 eeprom_pdos: struct list_head\001
diff --git a/doc/images/uml-slave.pdf b/doc/images/uml-slave.pdf
new file mode 100644
index 00000000..046e5720
--- /dev/null
+++ b/doc/images/uml-slave.pdf
@@ -0,0 +1,81 @@
+%PDF-1.3
+%Ç쏢
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xœ•VMoã6½ëWðg‹°¢D}8·¶ØöÒv×
+ì.Z¢mn¨´÷×w¨/Û2¢ðAö¼ÇáðÍðÉ/(Ä…î3<‹*øùs†¶& 8‹h” ×€ tôù ÃË0…0Iqž%¨š4K—˜fHQ˜e˜ÄžH”â’Bädu½
¢$ŒpLP†a»,GQ˜f8]"šÂ¢("Ø|˜X4Í)¦1l<_§šd'ÔW¹Çuqύ¤!à8ýq¡¸—€ô߇GQ¡_W QŽÁqœGhµ	z銒%Ns“%&I†VU°hj%kñˆöµ‘ÛZ”HÖö~õ# 1Ž¢8‹×Fþ#ØF
+UšGd¬Þ)i,Û	^Þß!Ž²Lbô@rœ/³­Ê`ñ3Š“µ´ßßî]òóx¡×pŠIõ›žQZ-Z®aÿªÚLW^Næ̍°ÅŽA}²ÞšzoE-4W7qs¬‹›`[6L5·bØÙƒ\]^æ”ôZXh=ñjݼMQ—ÿÅ)v¢x¾Ezœdvç¼Ez4²j´Ú§Ð9A‹BÈÃ(ÃÙèŒ]…Ñy8-}Õ´¢ÕM5ŽÐÃl•Õaà´Eoê
3e“_ÌÝLÒór¯à8òÂÝe8ïæT¥1x	íêé‹f[ÝìÛGTì¸FºJ@V|+&ànŠ7ºÚ¯yuA¯Åë +¹åpaŒrf¯PWh’”YÂÑX)+›šë£÷V/´xÙcÔÂ|?žzÒýî{­Emߣ­Í6ŠogNs|\ŸNíœ.t®=yt’¦Îdéý/¯
içҐÑÙ˜ÝTZoq9$N¢ÎCÜ©½@fšÒÞhž›õ‰ä~ŒF4ødÅA*Ý)ÐûàLµ‘NìY@$2^–Zs	05
+ÒȺo~Èì×tÍ
òØŠi ¦¨i¦2Αõ^ªÒ“ÇÙ.܆}m=`çi°T^,ÏÓ._é÷1Ü4­'솂«9`¤d\I>Æ…`†0Tr(9ŽNL|	=‚ºJqŽ
+°z_­]¿æ#´äê&¬ß ½R9?k6#.O!h’,»plû.û||flύˆÂmS4Ê#L»;	/¦øq¬ÿ¤¨[éfS”àšlºÑíÚm¿~ü=ýò7ûýéé¯/ßGÆy§‡…·Ýç¦óŒ@ÿšö;Ïȁñò3àŽÓ'aïû³¾Ìöt—=Éq'ÐCnx“ûSw–ô)øÌ)9zendstream
+endobj
+6 0 obj
+964
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 457 478]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF /Text]
+/ExtGState 9 0 R
+/Font 10 0 R
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+>>
+endobj
+7 0 obj
+<</Type/ExtGState
+/OPM 1>>endobj
+9 0 obj
+<</R7
+7 0 R>>
+endobj
+10 0 obj
+<</R8
+8 0 R>>
+endobj
+8 0 obj
+<</BaseFont/Helvetica/Type/Font
+/Encoding 11 0 R/Subtype/Type1>>
+endobj
+11 0 obj
+<</Type/Encoding/Differences[
+45/minus]>>
+endobj
+2 0 obj
+<</Producer(ESP Ghostscript 8.15)
+/CreationDate(D:20060807135421)
+/ModDate(D:20060807135421)
+/Title(uml-slave.fig)
+/Creator(fig2dev Version 3.2 Patchlevel 4)
+/Author(fp@jupiter \(Florian Pose\))>>endobj
+xref
+0 12
+0000000000 65535 f 
+0000001286 00000 n 
+0000001572 00000 n 
+0000001227 00000 n 
+0000001068 00000 n 
+0000000015 00000 n 
+0000001049 00000 n 
+0000001334 00000 n 
+0000001434 00000 n 
+0000001375 00000 n 
+0000001404 00000 n 
+0000001514 00000 n 
+trailer
+<< /Size 12 /Root 1 0 R /Info 2 0 R
+/ID [(a+ÿgiºjíE\rd¬D‹a·)(a+ÿgiºjíE\rd¬D‹a·)]
+>>
+startxref
+1783
+%%EOF
diff --git a/doc/svn.sty b/doc/svn.sty
new file mode 100644
index 00000000..b5bea408
--- /dev/null
+++ b/doc/svn.sty
@@ -0,0 +1,79 @@
+%%
+%% This is file `svn.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% svn.dtx  (with options: `package')
+%% 
+%% This is a generated file.
+%% 
+%% Copyright (C) 2003 by Richard Lewis <rpil+svn@rtf.org.uk>
+%% 
+%% This file may be distributed and/or modified under the conditions
+%% of the LaTeX Project Public License, either version 1.2 of this
+%% license or (at your option) any later version.  The latest version
+%% of this license is in:
+%% 
+%%    http://www.latex-project.org/lppl.txt
+%% 
+%% and version 1.2 or later is part of all distributions of LaTeX
+%% version 1999/12/01 or later.
+%% 
+\NeedsTeXFormat{LaTeX2e}
+\def\next $Id: #1 #2 #3-#4-#5 #6${%
+  \def\svn@date{#3/#4/#5}%
+  \def\svn@revision{#2}%
+}
+\next $Id: svn.dtx 32 2003-09-21 19:08:50Z rpil2 $
+\edef\next{%
+  \noexpand\ProvidesPackage{svn}[\svn@date\space r\svn@revision\space
+                                 Typeset Subversion keywords.]%
+}
+\next
+\def\SVN $#1${\svn@$#1: $}
+\let\SVNempty\relax
+\def\svn@$#1: #2${%
+  \def\svn@tmp{#2}%
+  \ifx\svn@tmp\@empty
+    \def\svn@suffix{@unexpanded}%
+  \else
+    \def\svn@suffix{@expanded}%
+  \fi
+  \@ifundefined{SVN@#1\svn@suffix}%
+      {\@nameuse{SVN@generic\svn@suffix}{#1}{#2}}%
+    {\@nameuse{SVN@#1\svn@suffix}{#1}{#2}}%
+}
+\def\SVN@generic@expanded#1#2{%
+  \expandafter\svn@set\csname SVN#1\endcsname$#2$%
+}
+\def\SVN@generic@unexpanded#1#2{%
+  \expandafter\global\expandafter\let\csname SVN#1\endcsname\SVNempty
+}
+\def\svn@set#1$#2 : ${\gdef#1{#2}}
+\def\SVN@Date@unexpanded#1#2{%
+  \gdef\SVNDate{\today}%
+  \global\let\SVNTime\SVNempty
+  \global\let\SVNRawDate\SVNempty
+}
+\let\SVN@LastChangedDate@unexpanded\SVN@Date@unexpanded
+\def\SVN@Date@expanded#1#2{%
+  \svn@set\SVNRawDate$#2$%
+  \svn@parse@date$#2$%
+}
+\let\SVN@LastChangedDate@expanded\SVN@Date@expanded
+\def\svn@parse@date$#1-#2-#3 #4:#5:#6 #7${%
+  \gdef\SVNDate{%
+    \begingroup
+      \def\svn@tmp{\PackageError{svn}{\SVNDate should not
+      be used in an \protect\edef}{See the svn.sty documentation for a
+      work around.}}%
+      \day#3 \month#2 \year#1
+      \today
+    \endgroup}%
+  \gdef\SVNTime{#4:#5:#6}%
+}
+\def\SVNdate $#1${\SVN $#1$\date{\SVNDate}}
+\endinput
+%%
+%% End of file `svn.sty'.
-- 
GitLab