%% Generated by Sphinx.
\def\sphinxdocclass{report}
\documentclass[a4paper,10pt,english,11pt,openany,oneside]{sphinxmanual}
\ifdefined\pdfpxdimen
   \let\sphinxpxdimen\pdfpxdimen\else\newdimen\sphinxpxdimen
\fi \sphinxpxdimen=.75bp\relax
\ifdefined\pdfimageresolution
    \pdfimageresolution= \numexpr \dimexpr1in\relax/\sphinxpxdimen\relax
\fi
%% let collapsible pdf bookmarks panel have high depth per default
\PassOptionsToPackage{bookmarksdepth=5}{hyperref}

\PassOptionsToPackage{booktabs}{sphinx}
\PassOptionsToPackage{colorrows}{sphinx}

\PassOptionsToPackage{warn}{textcomp}
\usepackage[utf8]{inputenc}
\ifdefined\DeclareUnicodeCharacter
% support both utf8 and utf8x syntaxes
  \ifdefined\DeclareUnicodeCharacterAsOptional
    \def\sphinxDUC#1{\DeclareUnicodeCharacter{"#1}}
  \else
    \let\sphinxDUC\DeclareUnicodeCharacter
  \fi
  \sphinxDUC{00A0}{\nobreakspace}
  \sphinxDUC{2500}{\sphinxunichar{2500}}
  \sphinxDUC{2502}{\sphinxunichar{2502}}
  \sphinxDUC{2514}{\sphinxunichar{2514}}
  \sphinxDUC{251C}{\sphinxunichar{251C}}
  \sphinxDUC{2572}{\textbackslash}
\fi
\usepackage{cmap}
\usepackage[T1]{fontenc}
\usepackage{amsmath,amssymb,amstext}
\usepackage{babel}



        %\usepackage{helvet}
        \usepackage[default]{sourcesanspro}
        %\renewcommand{\familydefault}{\sfdefault}
        \usepackage{charter}
        %\usepackage[defaultsans]{lato}
        
        % a less weird monospace font:
        \IfFileExists{inconsolata.sty}{
            \usepackage{inconsolata}
            % TODO Urgent: --foo is written WRONGLY in inconsolata, cf
            % https://markov.htwsaar.de/tex-archive/fonts/inconsolata/doc/inconsolata-doc.pdf
            %\setmonofont[HyphenChar=None]{Inconsolatazi4}
        }
        
        % ignore all unicode errors
        \makeatletter
        \def\UTFviii@undefined@err#1{$\bigcirc$} % replacement was ??UPS??, now is $\bigcirc$
        \makeatother

    


\usepackage[Bjarne]{fncychap}
\usepackage[,numfigreset=1,mathnumfig,mathnumsep={.}]{sphinx}

\fvset{fontsize=auto}
\usepackage{geometry}


% Include hyperref last.
\usepackage{hyperref}
% Fix anchor placement for figures with captions.
\usepackage{hypcap}% it must be loaded after hyperref.
% Set up styles of URL: it should be placed after hyperref.
\urlstyle{same}

\addto\captionsenglish{\renewcommand{\contentsname}{Users manual}}

\usepackage{sphinxmessages}
\setcounter{tocdepth}{1}


        \usepackage{pdfpages}
        \usepackage[nolink]{qrcode} % nolink - otherwise the QR code is blue
        
        \definecolor{anabridgreen}{cmyk}{0.2745, 0, 0.3922, 0}
        \definecolor{anabridblue}{HTML}{2B307B}
        \definecolor{anabridviolet}{HTML}{b805c1} % vivid violet
        \definecolor{anabridbush}{HTML}{5b1aae}   % daisy bush
        \definecolor{anabridlemon}{HTML}{fcff5a}  % laser lemon
        \definecolor{grey}{HTML}{AAAAAA}
    

\title{REDAC Manual}
\date{Aug 21, 2025}
\release{v1.2\sphinxhyphen{}NN\sphinxhyphen{}g6c40c3c}
\author{Anabrid GmbH}
\newcommand{\sphinxlogo}{\vbox{}}
\renewcommand{\releasename}{Release}
\makeindex
\begin{document}

\ifdefined\shorthandoff
  \ifnum\catcode`\=\string=\active\shorthandoff{=}\fi
  \ifnum\catcode`\"=\active\shorthandoff{"}\fi
\fi

\pagestyle{empty}

        \includepdf{../../_static/redac-manual-cover.pdf}
    
\pagestyle{plain}
\sphinxtableofcontents
\pagestyle{normal}
\phantomsection\label{\detokenize{index::doc}}


\sphinxAtStartPar
This is the official manual for the \sphinxstyleemphasis{Reconfigurable Discrete Analog Computer},
in short \sphinxhref{https://redac.anabrid.com}{REDAC} (https://redac.anabrid.com), made by
\sphinxhref{https://anabrid.com}{anabrid GmbH} (https://anabrid.com).

\sphinxAtStartPar
You can find a printable PDF version of this manual at \sphinxurl{https://redac.anabrid.com/manual.pdf}
and a browser friendly online version at \sphinxurl{https://anabrid.dev/docs/redac-manual/dirhtml/}
\begin{quote}\begin{description}
\sphinxlineitem{Version of this document}
\sphinxAtStartPar
v1.2\sphinxhyphen{}NN\sphinxhyphen{}g6c40c3c (for details see section \hyperref[\detokenize{developer/appendix:about-versions}]{Section \ref{\detokenize{developer/appendix:about-versions}}})

\sphinxlineitem{Build time}
\sphinxAtStartPar
Aug 21, 2025

\sphinxlineitem{Authors}
\sphinxAtStartPar
anabrid GmbH, Am Stadtpark 3, 12167 Berlin, Germany

\sphinxlineitem{Copyright}
\sphinxAtStartPar
© 2025 anabrid GmbH and DLR e.V., Patents pending

\end{description}\end{quote}

\sphinxAtStartPar
\sphinxstylestrong{How to read the manual}:
As a regular user, you only need the {\hyperref[\detokenize{user/preface:user-preface}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{User manual}}}}}. If you are a
system administrator/operator, you should furthermore read the {\hyperref[\detokenize{operator/intro:op-intro}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Operators manual}}}}}.
For software and hardware developers, the {\hyperref[\detokenize{developer/intro:dev-intro}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Developers manual}}}}} is of
most interest. All manual parts should be read in order, i.e. always consider the user
manual first and the developer manual last.

\vfill
\begin{sphinxadmonition}{tip}{Tip}
   \sphinxAtStartPar
   \begin{center}
   \Large
   You can read the latest version of this document online at \\
   \url{https://redac.anabrid.com/manual.pdf} \\[1cm]

   \qrcode[height=.24\linewidth]{https://redac.anabrid.com/manual.pdf}
   \\[.5cm]
   \phantom{whitespace}
   \end{center}
\end{sphinxadmonition}

\part{Users manual}

\sphinxstepscope


\chapter{Preface}
\label{\detokenize{user/preface:preface}}\label{\detokenize{user/preface:user-preface}}\label{\detokenize{user/preface::doc}}
\sphinxAtStartPar
\sphinxstyleemphasis{Analog computers} differ substantially from current digital computers
in that they do not work by executing an algorithm in a step\sphinxhyphen{}by\sphinxhyphen{}step
fashion. Instead they consist of a number of \sphinxstyleemphasis{computing elements}, each
capable of performing a certain mathematical operation such as
summation, multiplication or time\sphinxhyphen{}integration. A \sphinxstyleemphasis{program} for an analog
computer describes how these computing elements are to be connected in
order to create a \sphinxstyleemphasis{model} (an \sphinxstyleemphasis{analogue}) of the problem to be solved.

\sphinxAtStartPar
A (very) simple problem like computing \(a(b+c)\) could be
implemented on a classic digital computer as shown in this exemplary
assembler listing:

\begin{sphinxVerbatim}[commandchars=\\\{\}]
\PYG{n}{LOAD}  \PYG{n}{A}\PYG{p}{,} \PYG{n}{R0}
\PYG{n}{LOAD}  \PYG{n}{B}\PYG{p}{,} \PYG{n}{R1}
\PYG{n}{LOAD}  \PYG{n}{C}\PYG{p}{,} \PYG{n}{R2}
\PYG{n}{ADD}   \PYG{n}{R1}\PYG{p}{,} \PYG{n}{R2}\PYG{p}{,} \PYG{n}{R1}
\PYG{n}{MULT}  \PYG{n}{R0}\PYG{p}{,} \PYG{n}{R1}\PYG{p}{,} \PYG{n}{R0}
\PYG{n}{STORE} \PYG{n}{R0}\PYG{p}{,} \PYG{o}{.}\PYG{o}{.}\PYG{o}{.}
\end{sphinxVerbatim}

\sphinxAtStartPar
This straightforward algorithm requires six individual steps to compute
the desired result.
Contrast this with the analog computer program shown in
figure \hyperref[\detokenize{user/preface:fig-preface-circuit}]{Fig.\@ \ref{\detokenize{user/preface:fig-preface-circuit}}}. This setup requires just two
computing elements, one summer and one multiplier. The summer is fed
with the values \(b\) and \(c\) while the multiplier is
connected to the output of this summer and to the value \(a\).

\begin{figure}[htbp]
\centering
\capstart

\noindent\sphinxincludegraphics[scale=0.99]{{preface-circuit}.png}
\caption{Analog computer setup for solving \(x = a(b+c)\)}\label{\detokenize{user/preface:id2}}\label{\detokenize{user/preface:fig-preface-circuit}}\end{figure}

\sphinxAtStartPar
Typically, values are represented by voltages or currents in an analog
computer so that only a single connection is necessary between computing
elements.

\sphinxAtStartPar
The advantages of this analog computing approach are manyfold. Most
notable are the extremely high degree of parallelism (there are no
central memory, no data dependencies, no synchronisation points, etc.,
so that the computing elements work in full parallelism), the resulting
high speed of computation and the inherent very high energy efficiency
of analog computing.

\sphinxAtStartPar
While a digital computer can basically solve every problem given enough
time and memory, an analog computer setup needs as many computing
elements as there are operations in the governing equations of the
problem to be solved. A little bit more mathematically, one can say that
the size of a digital computer is constant while its time to solution
typically grow much faster than just linearly with the size of the
problem (making many problems basically intractable on classic digital
computers). The size of the analog computer on the other hand grows
linearly with the problem size but, and this cannot be overestimated,
the time to solution remains constant.

\sphinxAtStartPar
Classic analog computers were impressive systems, typically featuring a
large patchpanel with thousands of jacks, all connected to a vast number
of computing elements, such as integrators, summers, coefficient
potentiometers, multipliers, etc. Programming these machines was as much
of an art as a science and was quite time consuming due to the hundreds
or even thousands of connections that had to be made manually.
(\sphinxcite{user/preface:ulmannap2} describes the history of analog
computing in great detail.)

\sphinxAtStartPar
Nowadays, the patchpanel is a museum piece and the actual connection of
the computing elements is done electronically, under the control of an
attached digital computer; this greatly simplifies the programming.
Using appropriate libraries as shown below, the analog computer can be
used as a mathematical machine without having to understand the
underlying electronic implementation in detail.

\sphinxAtStartPar
Since the basics of analog computer programming are outside the scope of
this user guide, please refer to {[}{\hyperref[\detokenize{user/preface:ulmannap2}]{\sphinxcrossref{ulmannAP2}}}{]} for
detailed information on the subject or consult the section \hyperref[\detokenize{user/further_reading:resources}]{Section \ref{\detokenize{user/further_reading:resources}}}.

\sphinxstepscope


\chapter{Getting started}
\label{\detokenize{user/first_steps:getting-started}}\label{\detokenize{user/first_steps:first-steps}}\label{\detokenize{user/first_steps::doc}}
\sphinxAtStartPar
REDAC is a fully software\sphinxhyphen{}reconfigurable analog\sphinxhyphen{}digital hybrid computer
made by \sphinxhref{https://anabrid.com}{Anabrid} (https://anabrid.com). The computer is intended
to be used for datacenters, research and industry. It is specifically designed
for solving differential equations, simulating complex models, and
forecasting dynamic systems with exceptional speed and throughput—all
while operating with minimal or no cooling requirements.

\sphinxAtStartPar
This system excels in a wide range of demanding applications, including
realistic simulations of turbulent fluid dynamics, structural and flight
dynamics, control systems, route optimization, big data analytics,
real\sphinxhyphen{}time sensor processing, and much more.

\sphinxAtStartPar
REDAC is built on a groundbreaking analog dataflow architecture that
delivers unparalleled performance, achieving at least 1,000 times the
speed of traditional computing systems while consuming 10,000 times
less power. It comes fully integrated with a comprehensive suite of
software tools from Anabrid, including a powerful compiler,
bindings for popular programming languages and libraries, and
robust cloud system administration features.

\sphinxAtStartPar
REDAC is one of the first commercially available modern analog\sphinxhyphen{}digital
hybrid computers and allows to solve up to about one thousand coupled
differential equations (\sphinxstyleemphasis{DEQ}s) of \(1^\text{st}\) order or
five hundred DEQs \(2^\text{nd}\) order, etc. Thanks to analog
multipliers, non\sphinxhyphen{}linear equations can also be easily implemented.

\sphinxAtStartPar
The REDAC system contains a complex hierarchy of analog elements and
digital processors (see {\hyperref[\detokenize{developer/architecture:architecture}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Architecture Reference}}}}}). Despite other modes of
operation exist, this makes it very
convenient to use the system as a remote user via the internet.


\section{Requirements}
\label{\detokenize{user/first_steps:requirements}}
\sphinxAtStartPar
REDAC is a modern analog\sphinxhyphen{}digital hybrid computer primarily meant to be used
in a datacenter or “cloud” context. That means you will access it similar to
cloud computing services from Google or Amazon, straight from your computer over
the internet. This reduces the demand on your local computer to a bare minimum.
In fact, this guide promotes our python reference client implementation which
has little dependencies and will run on virtually any modern operating system.

\sphinxAtStartPar
Therefore, as a regular user of REDAC, this is the requirement list:
\begin{itemize}
\item {} 
\sphinxAtStartPar
A notebook or desktop computer with internet access or at least some sort
of direct/company network access to REDAC. Most likely your operator provides
you access to REDAC over conventional IPv4 TCP/IP networking.

\item {} 
\sphinxAtStartPar
The operating systems Apple Mac OS X (macOS 10.9 Mavericks or later),
Microsoft Windows (Windows 7 or later) or GNU/Linux are supported.
Administrator rights are typically not required.

\item {} 
\sphinxAtStartPar
At least Python 3.10 is required for the reference client software.

\item {} 
\sphinxAtStartPar
As access is limited and precious, you first need to get a user
account. Depending on the structure of your organization, you will be able
to apply/register on a website or you have to manually contact the operators
to have them creating a user account for you.

\end{itemize}

\sphinxAtStartPar
Please note that the REDAC’s software may be operated in different states
(see \DUrole{xref}{\DUrole{std}{\DUrole{std-ref}{reconfigurable}}}) which virtualizes the device such that multiple users
may operate on \_partitions\_ of the device independently and in parallel. The mode
is set by the operator and may be queried using the provided CLI tool (see below).


\section{Installing the Python client}
\label{\detokenize{user/first_steps:installing-the-python-client}}
\sphinxAtStartPar
The REDAC programming interface can be used from a variety of programming languages.
However, we first and foremost support the \sphinxstyleemphasis{python scientific programming ecosystem},
consisting of a standard set of tools such as \sphinxhref{https://scipy.org/}{Scipy} (https://scipy.org/) and its
components such as \sphinxhref{https://numpy.org/}{Numpy} (https://numpy.org/).

\sphinxAtStartPar
In order to proceed with REDAC, you need the python client available at your computer.
If you prefer, you can also choose some hosted Jupyter Notebook environment such as
\sphinxstyleemphasis{Google Colab} or \sphinxstyleemphasis{Binder} (or the hosted one by Anabrid, see
{\hyperref[\detokenize{operator/anabrid:opanabrid-services}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{List of provided services}}}}}). The python client very little dependencies. Virtually any
computer running a modern python version should do it. You can run the client even
on a Raspberry Pi if you prefer.

\sphinxAtStartPar
The software package \sphinxhref{https://pypi.org/project/anabrid-redac-client/}{anabrid\sphinxhyphen{}redac\sphinxhyphen{}client} (https://pypi.org/project/anabrid\sphinxhyphen{}redac\sphinxhyphen{}client/)
is released on public python package index (in short \sphinxstyleemphasis{pip}). In order to install it, you need
the \sphinxcode{\sphinxupquote{python\sphinxhyphen{}pip}} or \sphinxcode{\sphinxupquote{pip}} command available on your computer.
Installation is then as easy as typing

\begin{sphinxVerbatim}[commandchars=\\\{\}]
\PYG{n}{pip} \PYG{n}{install} \PYG{n}{anabrid}\PYG{o}{\PYGZhy{}}\PYG{n}{redac}\PYG{o}{\PYGZhy{}}\PYG{n}{client}
\end{sphinxVerbatim}

\sphinxAtStartPar
from a regular python installation, i.e. a system shell with a working \sphinxcode{\sphinxupquote{python}}
and \sphinxcode{\sphinxupquote{pip}} executable on the \sphinxcode{\sphinxupquote{PATH}}. It is suggested to run this
within a \sphinxhref{https://virtualenv.pypa.io/en/latest/user\_guide.html}{Virtual Environment} (https://virtualenv.pypa.io/en/latest/user\_guide.html).
It is generally not suggested to install this system\sphinxhyphen{}wide with \sphinxcode{\sphinxupquote{sudo}}.

\sphinxAtStartPar
A typical terminal session during installation looks like this:

\begin{sphinxVerbatim}[commandchars=\\\{\}]
you@yournotebook \PYGZdl{} python \PYGZhy{}m venv venv
you@yournotebook \PYGZdl{} source venv/bin/activate
(venv) you@yournotebook \PYGZdl{} pip install anabrid\PYGZhy{}redac\PYGZhy{}client
Collecting anabrid\PYGZhy{}redac\PYGZhy{}client
  Downloading anabrid\PYGZus{}redac\PYGZus{}client\PYGZhy{}0.1.0\PYGZhy{}py3\PYGZhy{}none\PYGZhy{}any.whl.metadata (892 bytes)
[...]
Installing collected packages: urllib3, typing\PYGZhy{}extensions, termcolor, six, shellingham, setuptools, python\PYGZhy{}dotenv, pygments, propcache, multidict, mdurl, lucipy, idna, frozenlist, click, charset\PYGZhy{}normalizer, certifi, attrs, annotated\PYGZhy{}types, aiohappyeyeballs, yaspin, yarl, requests, python\PYGZhy{}dateutil, pydantic\PYGZhy{}core, markdown\PYGZhy{}it\PYGZhy{}py, aiosignal, rich, pydantic, aiohttp, typer, anabrid\PYGZhy{}redac\PYGZhy{}core, anabrid\PYGZhy{}redac\PYGZhy{}client
Successfully installed aiohappyeyeballs\PYGZhy{}2.4.6 aiohttp\PYGZhy{}3.11.12 aiosignal\PYGZhy{}1.3.2 anabrid\PYGZhy{}redac\PYGZhy{}client\PYGZhy{}0.1.0 anabrid\PYGZhy{}redac\PYGZhy{}core\PYGZhy{}0.1.0 annotated\PYGZhy{}types\PYGZhy{}0.7.0 attrs\PYGZhy{}25.1.0 certifi\PYGZhy{}2025.1.31 charset\PYGZhy{}normalizer\PYGZhy{}3.4.1 click\PYGZhy{}8.1.8 frozenlist\PYGZhy{}1.5.0 idna\PYGZhy{}3.10 lucipy\PYGZhy{}1.6.0 markdown\PYGZhy{}it\PYGZhy{}py\PYGZhy{}3.0.0 mdurl\PYGZhy{}0.1.2 multidict\PYGZhy{}6.1.0 propcache\PYGZhy{}0.2.1 pydantic\PYGZhy{}2.10.6 pydantic\PYGZhy{}core\PYGZhy{}2.27.2 pygments\PYGZhy{}2.19.1 python\PYGZhy{}dateutil\PYGZhy{}2.9.0.post0 python\PYGZhy{}dotenv\PYGZhy{}1.0.1 requests\PYGZhy{}2.32.3 rich\PYGZhy{}13.9.4 setuptools\PYGZhy{}75.8.0 shellingham\PYGZhy{}1.5.4 six\PYGZhy{}1.17.0 termcolor\PYGZhy{}2.3.0 typer\PYGZhy{}0.15.1 typing\PYGZhy{}extensions\PYGZhy{}4.12.2 urllib3\PYGZhy{}2.3.0 yarl\PYGZhy{}1.18.3 yaspin\PYGZhy{}3.1.0

[notice] A new release of pip is available: 24.2 \PYGZhy{}\PYGZgt{} 25.0.1
[notice] To update, run: pip install \PYGZhy{}\PYGZhy{}upgrade pip
\end{sphinxVerbatim}

\sphinxAtStartPar
After successful installation, you should have the exectuable \sphinxcode{\sphinxupquote{redacli}} available.
Call \sphinxcode{\sphinxupquote{redacli \sphinxhyphen{}\sphinxhyphen{}help}} to test it:

\begin{sphinxVerbatim}[commandchars=\\\{\}]
(venv) you@yournotebook \PYGZdl{} redacli \PYGZhy{}\PYGZhy{}help

Usage: redacli [OPTIONS] COMMAND [ARGS]...

+\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{} Options \PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}+
| \PYGZhy{}\PYGZhy{}install\PYGZhy{}completion   Install completion for the current shell |
| \PYGZhy{}\PYGZhy{}show\PYGZhy{}completion      Show completion for the current shell,   |
|                        to copy it or customize the installation |
| \PYGZhy{}\PYGZhy{}help                 Show this message and exit               |
+\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}+

+\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{} Commands \PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}+
| run    submit    logs    status   results   partitions   health |
+\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}\PYGZhy{}+
\end{sphinxVerbatim}

\sphinxAtStartPar
If you system cannot find the executable, you most likely did not work within a virtual
environment and do not have the python default binary path as part of your \sphinxcode{\sphinxupquote{PATH}}
variable. On UNIX\sphinxhyphen{}like systems, this goes typially into \sphinxcode{\sphinxupquote{\textasciitilde{}/.local/bin}}, for instance
you can type \sphinxcode{\sphinxupquote{export PATH="\$PATH:\$HOME/.local/bin"}} to enable this location. You
can also check the output of \sphinxcode{\sphinxupquote{python \sphinxhyphen{}m site \sphinxhyphen{}\sphinxhyphen{}user\sphinxhyphen{}site}} to find out where your python
installation currently installs packages to.


\section{Logging in}
\label{\detokenize{user/first_steps:logging-in}}
\sphinxAtStartPar
This first access happens in your webbrowser. Visit the website \sphinxurl{https://redac.anabrid.com}
and hit the \sphinxstyleemphasis{log in} button in the upper right.
You should be then provided a page where you can register a user account or login
with your useraccount. In order to connect to REDAC from the client, you currently have
to store your \sphinxstyleemphasis{username} and \sphinxstyleemphasis{password} as environment variables. You can do this,
for instance, by typing

\begin{sphinxVerbatim}[commandchars=\\\{\}]
you@yournotebook \PYGZdl{} export REDAC\PYGZus{}USERNAME=\PYGZdq{}your\PYGZhy{}name@example.com\PYGZdq{}
you@yournotebook \PYGZdl{} export REDAC\PYGZus{}PASSWORD=\PYGZdq{}yourHopefullyComplicatedPasswordGoesHere\PYGZdq{}
\end{sphinxVerbatim}

\sphinxAtStartPar
When connecting, you also might need a hostname. This is, in the moment,
just \sphinxcode{\sphinxupquote{https://redac.anabrid.com}} and this option is already configured as the default
and can be omitted.

\begin{sphinxadmonition}{note}{Note:}
\sphinxAtStartPar
For further details about the registration procedure for the REDAC computer
operated for DLR by anabrid, contact your local system administrator or
see {\hyperref[\detokenize{operator/anabrid:opanabrid}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Anabrid Operations}}}}}. For technical information about the authentification procedure,
see also {\hyperref[\detokenize{operator/auth:opauth}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Authentification}}}}} in the operators manual.
\end{sphinxadmonition}


\section{Using the CLI}
\label{\detokenize{user/first_steps:using-the-cli}}
\sphinxAtStartPar
The REDAC may be operated in a \sphinxstyleemphasis{partitioned} setup where multiple parts of the
system are isolated against each other through the software stack. For each of these
partitions, there is a seperate \sphinxstyleemphasis{job queue} which contains jobs for this partition.
Jobs in these queues may be submitted by diffeent users and each job is identified
through an unique ID.
Currently, there are two options to access the system:
\begin{enumerate}
\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
\item {} 
\sphinxAtStartPar
Through the Python class \sphinxcode{\sphinxupquote{REDACClient}} as demonstrated in {\hyperref[\detokenize{user/examples:examples}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Example Applications}}}}}.

\item {} 
\sphinxAtStartPar
Through the CLI executable \sphinxcode{\sphinxupquote{redacli}}.

\end{enumerate}

\sphinxAtStartPar
This section covers the latter. Please first login to the system according to the
instructions above.
Given a netlist with filename \sphinxcode{\sphinxupquote{config.json}},
one run of the netlist with default parameters on partition \sphinxcode{\sphinxupquote{PART}} is
submitted by

\begin{sphinxVerbatim}[commandchars=\\\{\}]
you@yournotebook \PYGZdl{}  redacli \PYGZhy{}\PYGZhy{}host https://redac.anabrid.com \PYGZhy{}\PYGZhy{}partition PART config.json
\end{sphinxVerbatim}

\sphinxAtStartPar
Note that \sphinxcode{\sphinxupquote{https://redac.anabrid.com}} is the current default and thus may be
omitted. The client then continues to update the status until the job has been
completed (with either the results or an error):

\begin{sphinxVerbatim}[commandchars=\\\{\}]
\PYG{g+gp}{\PYGZgt{}\PYGZgt{}\PYGZgt{} }\PYG{n}{redacli} \PYG{n}{run} \PYG{n}{test}\PYG{o}{/}\PYG{n}{data}\PYG{o}{/}\PYG{n}{config}\PYG{o}{.}\PYG{n}{json}
\PYG{g+go}{✅ Job submitted with ID: 56bcc72f\PYGZhy{}aaa8\PYGZhy{}4c04\PYGZhy{}96f6\PYGZhy{}4eb6425372f6}
\PYG{g+go}{✅ Job 56bcc72f\PYGZhy{}aaa8\PYGZhy{}4c04\PYGZhy{}96f6\PYGZhy{}4eb6425372f6 completed with status: COMPLETED}
\end{sphinxVerbatim}

\sphinxAtStartPar
In this example, we submitted a job that is saved under its ID
\sphinxcode{\sphinxupquote{56bcc72f\sphinxhyphen{}aaa8\sphinxhyphen{}4c04\sphinxhyphen{}96f6\sphinxhyphen{}4eb6425372f6}}. With this ID, we can subsequently
retrieve the results:

\begin{sphinxVerbatim}[commandchars=\\\{\}]
\PYG{g+gp}{\PYGZgt{}\PYGZgt{}\PYGZgt{} }\PYG{n}{redacli} \PYG{n}{results} \PYG{l+m+mi}{56}\PYG{n}{bcc72f}\PYG{o}{\PYGZhy{}}\PYG{n}{aaa8}\PYG{o}{\PYGZhy{}}\PYG{l+m+mi}{4}\PYG{n}{c04}\PYG{o}{\PYGZhy{}}\PYG{l+m+mi}{96}\PYG{n}{f6}\PYG{o}{\PYGZhy{}}\PYG{l+m+mi}{4}\PYG{n}{eb6425372f6}
\PYG{g+go}{\PYGZob{}}
\PYG{g+go}{  \PYGZdq{}/0/0\PYGZdq{}: [(omitted)],}
\PYG{g+go}{  \PYGZdq{}/1/0\PYGZdq{}: [(omitted)]}
\PYG{g+go}{\PYGZcb{}}
\end{sphinxVerbatim}

\sphinxAtStartPar
Note that each item of the results contains data for one \sphinxcode{\sphinxupquote{adc\_channel}} from
the netlist, by the scheme \sphinxcode{\sphinxupquote{/carrier/adc\_channel}}, where both carrier and
\sphinxcode{\sphinxupquote{adc\_channels}} are indexed starting with \sphinxcode{\sphinxupquote{0}}. Furthermore, we may download
the job’s log using the \sphinxcode{\sphinxupquote{logs}} command:

\begin{sphinxVerbatim}[commandchars=\\\{\}]
\PYG{g+gp}{\PYGZgt{}\PYGZgt{}\PYGZgt{} }\PYG{n}{redacli} \PYG{n}{logs} \PYG{l+m+mi}{56}\PYG{n}{bcc72f}\PYG{o}{\PYGZhy{}}\PYG{n}{aaa8}\PYG{o}{\PYGZhy{}}\PYG{l+m+mi}{4}\PYG{n}{c04}\PYG{o}{\PYGZhy{}}\PYG{l+m+mi}{96}\PYG{n}{f6}\PYG{o}{\PYGZhy{}}\PYG{l+m+mi}{4}\PYG{n}{eb6425372f6}
\PYG{g+go}{[/forwarder/0/56bcc72f\PYGZhy{}aaa8\PYGZhy{}4c04\PYGZhy{}96f6\PYGZhy{}4eb6425372f6] 2025\PYGZhy{}02\PYGZhy{}16 20:51:39: Starting task processing...}
\PYG{g+go}{[/forwarder/0/56bcc72f\PYGZhy{}aaa8\PYGZhy{}4c04\PYGZhy{}96f6\PYGZhy{}4eb6425372f6] 2025\PYGZhy{}02\PYGZhy{}16 20:51:40: New run state: JobSequenceEnum.RECEIVED\PYGZus{}SET\PYGZus{}CIRCUIT}
\PYG{g+go}{[/forwarder/0/56bcc72f\PYGZhy{}aaa8\PYGZhy{}4c04\PYGZhy{}96f6\PYGZhy{}4eb6425372f6] 2025\PYGZhy{}02\PYGZhy{}16 20:51:40: New run state: JobSequenceEnum.RECEIVED\PYGZus{}STATUS\PYGZus{}TAKE\PYGZus{}OFF}
\PYG{g+go}{[/forwarder/0/56bcc72f\PYGZhy{}aaa8\PYGZhy{}4c04\PYGZhy{}96f6\PYGZhy{}4eb6425372f6] 2025\PYGZhy{}02\PYGZhy{}16 20:51:40: New run state: JobSequenceEnum.RECEIVED\PYGZus{}STATUS\PYGZus{}DONE}
\PYG{g+go}{[/forwarder/0/56bcc72f\PYGZhy{}aaa8\PYGZhy{}4c04\PYGZhy{}96f6\PYGZhy{}4eb6425372f6] 2025\PYGZhy{}02\PYGZhy{}16 20:51:40: Finished processing (reason: TASK\PYGZus{}FINISH)}
\end{sphinxVerbatim}

\sphinxAtStartPar
These logs are fairly specific to the structure of the software stck, but may serve
as the first indicator when dealing with issues in the software stack.

\sphinxAtStartPar
Last but not least, \sphinxcode{\sphinxupquote{redacli}} enables users to receive information about
the system, namely the \sphinxtitleref{partitioning scheme}:

\begin{sphinxVerbatim}[commandchars=\\\{\}]
\PYG{g+gp}{\PYGZgt{}\PYGZgt{}\PYGZgt{} }\PYG{n}{redacli} \PYG{n}{partitions}
\PYG{g+go}{\PYGZsh{} Partition 0}
\PYG{g+go}{        \PYGZhy{} Job queue length: 1}
\PYG{g+go}{        \PYGZhy{} Carriers:}
\PYG{g+go}{          \PYGZhy{} 00\PYGZhy{}00\PYGZhy{}00\PYGZhy{}00\PYGZhy{}00\PYGZhy{}00}
\PYG{g+go}{\PYGZsh{} Partition 1}
\PYG{g+go}{        \PYGZhy{} Job queue length: 2}
\PYG{g+go}{        \PYGZhy{} Carriers:}
\PYG{g+go}{          \PYGZhy{} 00\PYGZhy{}00\PYGZhy{}00\PYGZhy{}00\PYGZhy{}00\PYGZhy{}01}
\end{sphinxVerbatim}

\sphinxAtStartPar
showing the carriers (mREDACs) per partition and the number of jobs waiting for
processing in each queue as well as the temperatures in the system:

\begin{sphinxVerbatim}[commandchars=\\\{\}]
\PYG{g+gp}{\PYGZgt{}\PYGZgt{}\PYGZgt{} }\PYG{n}{redacli} \PYG{n}{health}
\end{sphinxVerbatim}

\sphinxAtStartPar
which prints a list of individual components in the system as well as their
temperatures.

\sphinxstepscope


\chapter{Architecture Introduction}
\label{\detokenize{user/reconfigurable:architecture-introduction}}\label{\detokenize{user/reconfigurable:arch-intro}}\label{\detokenize{user/reconfigurable::doc}}
\sphinxAtStartPar
Classic analog computers typically featured a large
central patch panel consisting of thousands of sockets by means of which
computing elements were connected with each other using patch cables. This
was very cumbersome, took a long time to manually program, was error prone,
and did not allow for rapid program changes. Fortunately with the REDAC
system these patch panels are finally relegated to museums where they
belong.

\sphinxAtStartPar
This section provides a brief overview about the architecture of the
Reconfigurable Discrete Analog Computer, in short REDAC.
For a more extensive documentation, see {\hyperref[\detokenize{developer/architecture:architecture}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Architecture Reference}}}}} in the
{\hyperref[\detokenize{developer/intro:dev-intro}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{developers manual}}}}}.


\section{REDAC internals}
\label{\detokenize{user/reconfigurable:redac-internals}}
\sphinxAtStartPar
REDAC is a complex system consisting of a plethora of inner, “nested” subsystems.
At the lowest levels, these systems are either digital or analog, rendering the
overall system as a hybrid computer. The vast majority of electronics in REDAC is
analog compute circuitery and analog interconnection networks, the digital parts
are in fact only a tiny fraction of administrative control structures, realized in
heterogenous computer architectures (both embedded, digital switching network
and server grade processors).

\sphinxAtStartPar
REDAC follows the black box approach of operational amplifier based computing. This
means REDAC is a giant replacement for an arithmetic\sphinxhyphen{}logical unit (ALU) of a
traditional digital processor. The analog computing elements of REDAC can carry out
basic mathematical operations such as addition and multiplication, but they can
carry out also advanced operations such as integration in time. They do so at
high accuracy and completely continous in time and with continous values. This
is an important property of the REDAC compute elements but also its interconnection
network, in short \sphinxstyleemphasis{CTCV} (continuous time, continuous variable). For the
analog network, this means that the connections between
the analog computing elements within a REDAC system are not based on switched
capacitors but instead on static (reconfigurable) switching matrices. Although
a switched capacitor network could have simplified the actual hardware
implementation, it would immediately invalidate the low energy footprint of
the analogy compute paradigm.


\section{The system matrix}
\label{\detokenize{user/reconfigurable:the-system-matrix}}
\sphinxAtStartPar
When using an analog computer such as REDAC, one maps a mathematical set of equations
onto an electronical circuit, also refered to as compute graph. When drawing the
adjacency matrix of this graph, one can think of REDAC as a large interconnection
matrix of size \(N^2\) with \(N\) compute elements at the edges,
as illustrated in figure \hyperref[\detokenize{user/reconfigurable:fig-generic-system-matrix}]{Fig.\@ \ref{\detokenize{user/reconfigurable:fig-generic-system-matrix}}}.

\begin{figure}[htbp]
\centering
\capstart

\noindent\sphinxincludegraphics{{system-matrix}.png}
\caption{Interconnection matrix with implicit summing capabilities (Note: in
fact this figure shows a {\hyperref[\detokenize{developer/architecture:arch-cluster}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Single cluster}}}}}).}\label{\detokenize{user/reconfigurable:id1}}\label{\detokenize{user/reconfigurable:fig-generic-system-matrix}}\end{figure}

\sphinxAtStartPar
This illustration should be understood
as following: At the left side, there are computing elements which feed their output
to a column of a matrix (this is called a \sphinxstyleemphasis{fan\sphinxhyphen{}out}). Each matrix element is
real\sphinxhyphen{}valued and constant during analog computation time (this is conceptually called
a \sphinxstyleemphasis{potentiometer}). One can imagine that each cell in the row subsequently holds
the incoming compute result multiplied with the matrix value at that place. The
figure shows a special kind of matrix which has the property of building the column
sum, i.e. there is a \sphinxstyleemphasis{fan\sphinxhyphen{}in} happening which reduces the values by building a sum.
There is then a 1:1 correspondence of columns and rows, i.e. in the simplest case
row \(i\) feeds back to column \(i\) (monadic compute element) whereas the
summing reduction is a bit simplistic for dyadic compute elements such as a multiplier
which has (in theory at least, in REDAC exactly) two inputs which are supposed to
be multiplied together.

\sphinxAtStartPar
This way, arbitrary connections between compute elements are possible
(also refered to as \sphinxstyleemphasis{all\sphinxhyphen{}to\sphinxhyphen{}all} connectivity). In practice, however, REDAC allows
only for \sphinxstyleemphasis{sparse} matrices, i.e. does not allow arbitrary connections between
computing elements but only a tiny subset, with a sparsity beyond 90\%. It is the job
of the software to determine possible connections in order to make your mathematical
problem fit on the computer.


\section{Available compuing elements}
\label{\detokenize{user/reconfigurable:available-compuing-elements}}
\sphinxAtStartPar
In its final expansion stage, REDAC will have at the ballpark order of \(10^4\)
computing elements of each kind, i.e. time integrators or multipliers. As already
indicated above, addition is done “for free” by the interconnection scheme and thus
available in much wider terms. In the same spirit, REDAC has at the order of at least
\(10^5\) digital potentiometers (“weighted edges” in the interconnection graph)
and many more non\sphinxhyphen{}weighted connections.

\sphinxAtStartPar
The computer will have about \(10^{3-4}\) analog\sphinxhyphen{}to\sphinxhyphen{}digital converters that can
be routed to different computing elements, making flexible read\sphinxhyphen{}outs and debuggings
of complex calculations possible.

\sphinxAtStartPar
The computer can be partitioned (time\sphinxhyphen{}sharing) by means which follow its hierarchical
structure. Explaining this structure is beyond the scope of this short introduction.
Instead, see section \hyperref[\detokenize{developer/architecture:architecture}]{Section \ref{\detokenize{developer/architecture:architecture}}} to read more about the computer architecture.

\sphinxstepscope


\chapter{Example Applications}
\label{\detokenize{user/examples:example-applications}}\label{\detokenize{user/examples:examples}}\label{\detokenize{user/examples::doc}}
\sphinxAtStartPar
In the current software revision of REDAC, users are supposed to be given
circuit configuration files (a concept also known as
\sphinxhref{https://en.wikipedia.org/wiki/Netlist}{netlist} (https://en.wikipedia.org/wiki/Netlist)) which are refered to as
\sphinxcode{\sphinxupquote{config.json}} in the following. These circuit configuration
files encode the actual mathematical problems. Their generation is done by
software by tooling which will provided at a later stage.

\sphinxAtStartPar
The usage of REDAC is currently therefore basically the submission of a
\sphinxcode{\sphinxupquote{config.json}} file, next to some basic information about the simulation
parameters (such as simulation runtimes or for data querying of measurement
variables).

\sphinxAtStartPar
Given the Python client (section {\hyperref[\detokenize{user/first_steps:first-steps}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Getting started}}}}}), you can invoke
examples either from your operating system command line or from python code,
using the given client as a library.

\sphinxAtStartPar
For the following example, please download the \sphinxcode{\sphinxupquote{exemplaric config.json file}}
first.

\sphinxAtStartPar
In the print version of this document, a compact version of the config
file is printed for illustrative purpose. Please do not try to type in
this file at your computer but instead head to the online version of
this document and download the ASCII file for straight usage.

\begin{sphinxVerbatim}[commandchars=\\\{\},numbers=left,firstnumber=1,stepnumber=1]
\PYG{p}{\PYGZob{}}\PYG{n+nt}{\PYGZdq{}00\PYGZhy{}00\PYGZhy{}00\PYGZhy{}00\PYGZhy{}00\PYGZhy{}00\PYGZdq{}}\PYG{p}{:\PYGZob{}}\PYG{n+nt}{\PYGZdq{}/0\PYGZdq{}}\PYG{p}{:\PYGZob{}}\PYG{n+nt}{\PYGZdq{}/C\PYGZdq{}}\PYG{p}{:\PYGZob{}}\PYG{n+nt}{\PYGZdq{}elements\PYGZdq{}}\PYG{p}{:[}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{\PYGZhy{}1.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{]\PYGZcb{},}\PYG{n+nt}{\PYGZdq{}/I\PYGZdq{}}\PYG{p}{:\PYGZob{}}\PYG{n+nt}{\PYGZdq{}outputs\PYGZdq{}}\PYG{p}{:[[}\PYG{l+m+mi}{15}\PYG{p}{],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]],}\PYG{n+nt}{\PYGZdq{}upscaling\PYGZdq{}}\PYG{p}{:[}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{]\PYGZcb{},}\PYG{n+nt}{\PYGZdq{}/M0\PYGZdq{}}\PYG{p}{:\PYGZob{}}\PYG{n+nt}{\PYGZdq{}elements\PYGZdq{}}\PYG{p}{:[\PYGZob{}}\PYG{n+nt}{\PYGZdq{}ic\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mf}{\PYGZhy{}0.82}\PYG{p}{,}\PYG{n+nt}{\PYGZdq{}k\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mi}{10000}\PYG{p}{\PYGZcb{},\PYGZob{}}\PYG{n+nt}{\PYGZdq{}ic\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{n+nt}{\PYGZdq{}k\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mi}{10000}\PYG{p}{\PYGZcb{},\PYGZob{}}\PYG{n+nt}{\PYGZdq{}ic\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{n+nt}{\PYGZdq{}k\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mi}{10000}\PYG{p}{\PYGZcb{},\PYGZob{}}\PYG{n+nt}{\PYGZdq{}ic\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{n+nt}{\PYGZdq{}k\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mi}{10000}\PYG{p}{\PYGZcb{},\PYGZob{}}\PYG{n+nt}{\PYGZdq{}ic\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{n+nt}{\PYGZdq{}k\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mi}{10000}\PYG{p}{\PYGZcb{},\PYGZob{}}\PYG{n+nt}{\PYGZdq{}ic\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{n+nt}{\PYGZdq{}k\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mi}{10000}\PYG{p}{\PYGZcb{},\PYGZob{}}\PYG{n+nt}{\PYGZdq{}ic\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{n+nt}{\PYGZdq{}k\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mi}{10000}\PYG{p}{\PYGZcb{},\PYGZob{}}\PYG{n+nt}{\PYGZdq{}ic\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{n+nt}{\PYGZdq{}k\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mi}{10000}\PYG{p}{\PYGZcb{}]\PYGZcb{},}\PYG{n+nt}{\PYGZdq{}/M1\PYGZdq{}}\PYG{p}{:\PYGZob{}\PYGZcb{},}\PYG{n+nt}{\PYGZdq{}/U\PYGZdq{}}\PYG{p}{:\PYGZob{}}\PYG{n+nt}{\PYGZdq{}outputs\PYGZdq{}}\PYG{p}{:[}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{l+m+mi}{0}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{]\PYGZcb{}\PYGZcb{},}\PYG{n+nt}{\PYGZdq{}/T\PYGZdq{}}\PYG{p}{:\PYGZob{}}\PYG{n+nt}{\PYGZdq{}muxes\PYGZdq{}}\PYG{p}{:[}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{l+m+mi}{1}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{l+m+mi}{0}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{]\PYGZcb{},}\PYG{n+nt}{\PYGZdq{}adc\PYGZus{}channels\PYGZdq{}}\PYG{p}{:[}\PYG{l+m+mi}{0}\PYG{p}{]\PYGZcb{},}\PYG{n+nt}{\PYGZdq{}00\PYGZhy{}00\PYGZhy{}00\PYGZhy{}00\PYGZhy{}00\PYGZhy{}02\PYGZdq{}}\PYG{p}{:\PYGZob{}}\PYG{n+nt}{\PYGZdq{}/0\PYGZdq{}}\PYG{p}{:\PYGZob{}}\PYG{n+nt}{\PYGZdq{}/C\PYGZdq{}}\PYG{p}{:\PYGZob{}}\PYG{n+nt}{\PYGZdq{}elements\PYGZdq{}}\PYG{p}{:[}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{1.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{l+m+mf}{0.0}\PYG{p}{]\PYGZcb{},}\PYG{n+nt}{\PYGZdq{}/I\PYGZdq{}}\PYG{p}{:\PYGZob{}}\PYG{n+nt}{\PYGZdq{}outputs\PYGZdq{}}\PYG{p}{:[[}\PYG{l+m+mi}{10}\PYG{p}{],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]],}\PYG{n+nt}{\PYGZdq{}upscaling\PYGZdq{}}\PYG{p}{:[}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{,}\PYG{k+kc}{false}\PYG{p}{]\PYGZcb{},}\PYG{n+nt}{\PYGZdq{}/M0\PYGZdq{}}\PYG{p}{:\PYGZob{}}\PYG{n+nt}{\PYGZdq{}elements\PYGZdq{}}\PYG{p}{:[\PYGZob{}}\PYG{n+nt}{\PYGZdq{}ic\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{n+nt}{\PYGZdq{}k\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mi}{10000}\PYG{p}{\PYGZcb{},\PYGZob{}}\PYG{n+nt}{\PYGZdq{}ic\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{n+nt}{\PYGZdq{}k\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mi}{10000}\PYG{p}{\PYGZcb{},\PYGZob{}}\PYG{n+nt}{\PYGZdq{}ic\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{n+nt}{\PYGZdq{}k\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mi}{10000}\PYG{p}{\PYGZcb{},\PYGZob{}}\PYG{n+nt}{\PYGZdq{}ic\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{n+nt}{\PYGZdq{}k\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mi}{10000}\PYG{p}{\PYGZcb{},\PYGZob{}}\PYG{n+nt}{\PYGZdq{}ic\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{n+nt}{\PYGZdq{}k\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mi}{10000}\PYG{p}{\PYGZcb{},\PYGZob{}}\PYG{n+nt}{\PYGZdq{}ic\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{n+nt}{\PYGZdq{}k\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mi}{10000}\PYG{p}{\PYGZcb{},\PYGZob{}}\PYG{n+nt}{\PYGZdq{}ic\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{n+nt}{\PYGZdq{}k\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mi}{10000}\PYG{p}{\PYGZcb{},\PYGZob{}}\PYG{n+nt}{\PYGZdq{}ic\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mf}{0.0}\PYG{p}{,}\PYG{n+nt}{\PYGZdq{}k\PYGZdq{}}\PYG{p}{:}\PYG{l+m+mi}{10000}\PYG{p}{\PYGZcb{}]\PYGZcb{},}\PYG{n+nt}{\PYGZdq{}/M1\PYGZdq{}}\PYG{p}{:\PYGZob{}\PYGZcb{},}\PYG{n+nt}{\PYGZdq{}/U\PYGZdq{}}\PYG{p}{:\PYGZob{}}\PYG{n+nt}{\PYGZdq{}outputs\PYGZdq{}}\PYG{p}{:[}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{l+m+mi}{0}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{]\PYGZcb{}\PYGZcb{},}\PYG{n+nt}{\PYGZdq{}/T\PYGZdq{}}\PYG{p}{:\PYGZob{}}\PYG{n+nt}{\PYGZdq{}muxes\PYGZdq{}}\PYG{p}{:[}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{l+m+mi}{0}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{l+m+mi}{1}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{,}\PYG{k+kc}{null}\PYG{p}{]\PYGZcb{},}\PYG{n+nt}{\PYGZdq{}adc\PYGZus{}channels\PYGZdq{}}\PYG{p}{:[}\PYG{l+m+mi}{0}\PYG{p}{]\PYGZcb{}\PYGZcb{}}
\end{sphinxVerbatim}

\sphinxAtStartPar
We primarily support the Python programming language as the reference
implementation. The way how to upload a configuration file is like

\begin{sphinxVerbatim}[commandchars=\\\{\}]
\PYG{n}{you}\PYG{n+nd}{@localhost}\PYG{o}{\PYGZgt{}} \PYG{n}{redacli} \PYG{n}{run} \PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{n}{host} \PYG{n}{https}\PYG{p}{:}\PYG{o}{/}\PYG{o}{/}\PYG{n}{redac}\PYG{o}{.}\PYG{n}{anabrid}\PYG{o}{.}\PYG{n}{com} \PYG{p}{[}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{n}{partition} \PYG{n}{partition\PYGZus{}id}\PYG{p}{]} \PYG{n}{config}\PYG{o}{.}\PYG{n}{json}
\PYG{p}{[}\PYG{n}{CSV} \PYG{n}{output} \PYG{n}{of} \PYG{n}{measurement} \PYG{n}{variables}\PYG{p}{]}
\end{sphinxVerbatim}

\sphinxAtStartPar
or, straight from the python programming language (REPL):

\begin{sphinxVerbatim}[commandchars=\\\{\}]
\PYG{n}{you}\PYG{n+nd}{@localhost}\PYG{o}{\PYGZgt{}} \PYG{n}{python}
\PYG{o}{\PYGZgt{}\PYGZgt{}}\PYG{o}{\PYGZgt{}} \PYG{k+kn}{import}\PYG{+w}{ }\PYG{n+nn}{json}
\PYG{o}{\PYGZgt{}\PYGZgt{}}\PYG{o}{\PYGZgt{}} \PYG{k+kn}{from}\PYG{+w}{ }\PYG{n+nn}{anabrid}\PYG{n+nn}{.}\PYG{n+nn}{redaccess}\PYG{n+nn}{.}\PYG{n+nn}{api}\PYG{n+nn}{.}\PYG{n+nn}{client}\PYG{n+nn}{.}\PYG{n+nn}{redac\PYGZus{}client}\PYG{+w}{ }\PYG{k+kn}{import} \PYG{n}{REDACClient}
\PYG{o}{\PYGZgt{}\PYGZgt{}}\PYG{o}{\PYGZgt{}} \PYG{n}{redac} \PYG{o}{=} \PYG{n}{REDACClient}\PYG{p}{(}\PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+s2}{https://redac.anabrid.com}\PYG{l+s+s2}{\PYGZdq{}}\PYG{p}{)}
\PYG{o}{\PYGZgt{}\PYGZgt{}}\PYG{o}{\PYGZgt{}} \PYG{n}{redac}\PYG{o}{.}\PYG{n}{login}\PYG{p}{(}\PYG{n}{username}\PYG{p}{,} \PYG{n}{password}\PYG{p}{)} \PYG{c+c1}{\PYGZsh{} to be set by the user}
\PYG{o}{\PYGZgt{}\PYGZgt{}}\PYG{o}{\PYGZgt{}} \PYG{k}{with} \PYG{n+nb}{open}\PYG{p}{(}\PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+s2}{config.json}\PYG{l+s+s2}{\PYGZdq{}}\PYG{p}{,} \PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+s2}{r}\PYG{l+s+s2}{\PYGZdq{}}\PYG{p}{)} \PYG{k}{as} \PYG{n}{f}\PYG{p}{:}
\PYG{o}{\PYGZgt{}\PYGZgt{}}\PYG{o}{\PYGZgt{}}     \PYG{n}{config} \PYG{o}{=} \PYG{n}{json}\PYG{o}{.}\PYG{n}{load}\PYG{p}{(}\PYG{n}{f}\PYG{p}{)}
\PYG{o}{\PYGZgt{}\PYGZgt{}}\PYG{o}{\PYGZgt{}} \PYG{n}{job\PYGZus{}id}\PYG{p}{,} \PYG{n}{results} \PYG{o}{=} \PYG{n}{redac}\PYG{o}{.}\PYG{n}{solve}\PYG{p}{(}\PYG{n}{config}\PYG{p}{,} \PYG{l+m+mi}{0}\PYG{p}{)}
\PYG{o}{\PYGZgt{}\PYGZgt{}}\PYG{o}{\PYGZgt{}} \PYG{n}{logs} \PYG{o}{=} \PYG{n}{redac}\PYG{o}{.}\PYG{n}{log}\PYG{p}{(}\PYG{n}{job\PYGZus{}id}\PYG{p}{)}
\end{sphinxVerbatim}

\sphinxAtStartPar
Afterwards, the variables \sphinxtitleref{results} resp. \sphinxtitleref{logs} will hold the job results
in a JSON format and the job’s log as a string array.

\sphinxAtStartPar
Note that other than these high\sphinxhyphen{}level functions, \sphinxtitleref{REDACClient} contains several
functions that allow to submit one or multiple job asynchronously, to multiple
partitions, then wait for them to finish and collect their results all at once:

\begin{sphinxVerbatim}[commandchars=\\\{\}]
\PYG{k+kn}{import}\PYG{+w}{ }\PYG{n+nn}{asyncio}
\PYG{k+kn}{import}\PYG{+w}{ }\PYG{n+nn}{json}
\PYG{k+kn}{from}\PYG{+w}{ }\PYG{n+nn}{anabrid}\PYG{n+nn}{.}\PYG{n+nn}{redaccess}\PYG{n+nn}{.}\PYG{n+nn}{api}\PYG{n+nn}{.}\PYG{n+nn}{client}\PYG{n+nn}{.}\PYG{n+nn}{redac\PYGZus{}client}\PYG{+w}{ }\PYG{k+kn}{import} \PYG{n}{REDACClient}

\PYG{k}{async} \PYG{k}{def}\PYG{+w}{ }\PYG{n+nf}{submit\PYGZus{}batch}\PYG{p}{(}\PYG{p}{)}\PYG{p}{:}
  \PYG{n}{redac} \PYG{o}{=} \PYG{n}{REDACClient}\PYG{p}{(}\PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+s2}{https://redac.anabrid.com}\PYG{l+s+s2}{\PYGZdq{}}\PYG{p}{)}
  \PYG{n}{redac}\PYG{o}{.}\PYG{n}{login}\PYG{p}{(}\PYG{n}{username}\PYG{p}{,} \PYG{n}{password}\PYG{p}{)}
  \PYG{k}{with} \PYG{n+nb}{open}\PYG{p}{(}\PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+s2}{config.json}\PYG{l+s+s2}{\PYGZdq{}}\PYG{p}{,} \PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+s2}{r}\PYG{l+s+s2}{\PYGZdq{}}\PYG{p}{)} \PYG{k}{as} \PYG{n}{f}\PYG{p}{:}
    \PYG{n}{config} \PYG{o}{=} \PYG{n}{json}\PYG{o}{.}\PYG{n}{load}\PYG{p}{(}\PYG{n}{f}\PYG{p}{)}

  \PYG{c+c1}{\PYGZsh{} asynchronously submit three jobs}
  \PYG{n}{jobs} \PYG{o}{=} \PYG{p}{[}\PYG{k+kc}{None}\PYG{p}{,} \PYG{k+kc}{None}\PYG{p}{,} \PYG{k+kc}{None}\PYG{p}{]}
  \PYG{k}{for} \PYG{n}{part\PYGZus{}id} \PYG{o+ow}{in} \PYG{n+nb}{range}\PYG{p}{(}\PYG{l+m+mi}{3}\PYG{p}{)}\PYG{p}{:}
    \PYG{n}{job} \PYG{o}{=} \PYG{p}{\PYGZob{}}
      \PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+s2}{config}\PYG{l+s+s2}{\PYGZdq{}}\PYG{p}{:} \PYG{n}{config}\PYG{p}{,}
      \PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+s2}{partition\PYGZus{}id}\PYG{l+s+s2}{\PYGZdq{}}\PYG{p}{:} \PYG{n}{part\PYGZus{}id}\PYG{p}{,}
      \PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+s2}{label}\PYG{l+s+s2}{\PYGZdq{}}\PYG{p}{:} \PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+s2}{Job}\PYG{l+s+s2}{\PYGZdq{}}
    \PYG{p}{\PYGZcb{}}
    \PYG{n}{jobs}\PYG{p}{[}\PYG{n}{part\PYGZus{}id}\PYG{p}{]} \PYG{o}{=} \PYG{n}{asyncio}\PYG{o}{.}\PYG{n}{create\PYGZus{}task}\PYG{p}{(}\PYG{n}{redac}\PYG{o}{.}\PYG{n}{submit\PYGZus{}job}\PYG{p}{(}\PYG{n}{job}\PYG{p}{)}\PYG{p}{)}

  \PYG{c+c1}{\PYGZsh{} wait until the three jobs were successfully submitted (and returned their ID)}
  \PYG{k}{for} \PYG{n}{part\PYGZus{}id} \PYG{o+ow}{in} \PYG{n+nb}{range}\PYG{p}{(}\PYG{l+m+mi}{3}\PYG{p}{)}\PYG{p}{:}
    \PYG{k}{while} \PYG{o+ow}{not} \PYG{n}{jobs}\PYG{p}{[}\PYG{n}{part\PYGZus{}id}\PYG{p}{]}\PYG{o}{.}\PYG{n}{done}\PYG{p}{(}\PYG{p}{)}\PYG{p}{:}
      \PYG{n}{asyncio}\PYG{o}{.}\PYG{n}{sleep}\PYG{p}{(}\PYG{l+m+mf}{0.5}\PYG{p}{)}

  \PYG{c+c1}{\PYGZsh{} not wait until the jobs are done (in the meantime, you can do some other work)}
  \PYG{k}{for} \PYG{n}{part\PYGZus{}id} \PYG{o+ow}{in} \PYG{n+nb}{range}\PYG{p}{(}\PYG{l+m+mi}{3}\PYG{p}{)}\PYG{p}{:}
    \PYG{n}{job\PYGZus{}id} \PYG{o}{=} \PYG{n}{jobs}\PYG{p}{[}\PYG{n}{part\PYGZus{}id}\PYG{p}{]}\PYG{o}{.}\PYG{n}{result}\PYG{p}{(}\PYG{p}{)}
    \PYG{n}{is\PYGZus{}done} \PYG{o}{=} \PYG{k+kc}{False}

    \PYG{k}{while} \PYG{o+ow}{not} \PYG{n}{is\PYGZus{}done}\PYG{p}{:}
      \PYG{n}{is\PYGZus{}done} \PYG{o}{=} \PYG{p}{(}\PYG{k}{await} \PYG{n}{redac}\PYG{o}{.}\PYG{n}{get\PYGZus{}job\PYGZus{}status}\PYG{p}{(}\PYG{n}{job\PYGZus{}id}\PYG{p}{)}\PYG{o}{.}\PYG{n}{status} \PYG{o}{==} \PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+s2}{COMPLETED}\PYG{l+s+s2}{\PYGZdq{}}\PYG{p}{)}
      \PYG{n}{asyncio}\PYG{o}{.}\PYG{n}{sleep}\PYG{p}{(}\PYG{l+m+mf}{0.5}\PYG{p}{)}

  \PYG{c+c1}{\PYGZsh{} finally, download and print results}
  \PYG{k}{for} \PYG{n}{part\PYGZus{}id} \PYG{o+ow}{in} \PYG{n+nb}{range}\PYG{p}{(}\PYG{l+m+mi}{3}\PYG{p}{)}\PYG{p}{:}
    \PYG{n}{job\PYGZus{}id} \PYG{o}{=} \PYG{n}{jobs}\PYG{p}{[}\PYG{n}{part\PYGZus{}id}\PYG{p}{]}\PYG{o}{.}\PYG{n}{result}\PYG{p}{(}\PYG{p}{)}
    \PYG{n}{results} \PYG{o}{=} \PYG{k}{await} \PYG{n}{redac}\PYG{o}{.}\PYG{n}{get\PYGZus{}job\PYGZus{}results}\PYG{p}{(}\PYG{n}{job\PYGZus{}id}\PYG{p}{)}
    \PYG{n+nb}{print}\PYG{p}{(}\PYG{n}{json}\PYG{o}{.}\PYG{n}{dumps}\PYG{p}{(}\PYG{n}{results}\PYG{p}{)}\PYG{p}{)}

\PYG{k}{if} \PYG{n+nv+vm}{\PYGZus{}\PYGZus{}name\PYGZus{}\PYGZus{}} \PYG{o}{==} \PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+s2}{\PYGZus{}\PYGZus{}main\PYGZus{}\PYGZus{}}\PYG{l+s+s2}{\PYGZdq{}}\PYG{p}{:}
  \PYG{n}{asyncio}\PYG{o}{.}\PYG{n}{run}\PYG{p}{(}\PYG{n}{submit\PYGZus{}batch}\PYG{p}{(}\PYG{p}{)}\PYG{p}{)}
\end{sphinxVerbatim}

\sphinxAtStartPar
Save this script as \sphinxcode{\sphinxupquote{batch.py}}, the execute it with \sphinxcode{\sphinxupquote{python batch.py}}. If you
are not familiar with the \sphinxcode{\sphinxupquote{async}} syntax used here, please refer to the official
Python developer’s documentation.

\sphinxstepscope


\chapter{Further reading}
\label{\detokenize{user/further_reading:further-reading}}\label{\detokenize{user/further_reading:resources}}\label{\detokenize{user/further_reading::doc}}
\sphinxAtStartPar
You reached the end of the user\sphinxhyphen{}relevant manual. There is more to
read, thought: If you are interested to take a deep dive into REDAC
programming, you can read the {\hyperref[\detokenize{developer/intro:dev-intro}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Developer manual}}}}}.
If you want to become an administrator of the system, consider
reading the {\hyperref[\detokenize{operator/intro:op-intro}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Operators manual}}}}} next.

\sphinxAtStartPar
In order to learn more about analog computing, we recommend the
books and publications authored by anabrid and the scientific
community. In particular, you may be interested to follow these
weblinks for further recommendations:
\begin{itemize}
\item {} 
\sphinxAtStartPar
\sphinxhref{https://anabrid.com/videos-podcasts/}{Videos and podcasts on analog computing} (https://anabrid.com/videos\sphinxhyphen{}podcasts/)

\item {} 
\sphinxAtStartPar
\sphinxhref{https://anabrid.com/articles-books/}{Research articles and primers on analog computing} (https://anabrid.com/articles\sphinxhyphen{}books/)

\end{itemize}

\sphinxstepscope


\chapter{About the first REDAC}
\label{\detokenize{user/redac1:about-the-first-redac}}\label{\detokenize{user/redac1:redac1}}\label{\detokenize{user/redac1::doc}}
\sphinxAtStartPar
The term \sphinxstyleemphasis{REDAC1} refers to the REDAC system with
serial number 1, which is build for the customer \sphinxhref{https://qci.dlr.de/}{DLR\sphinxhyphen{}QCI} (https://qci.dlr.de/).
During 2025, the {\hyperref[\detokenize{operator/anabrid:opanabrid}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Anabrid Operations}}}}} team
will operate the system on a transitional basis for
and in the interests of the customer.


\section{Access}
\label{\detokenize{user/redac1:access}}
\sphinxAtStartPar
Within this transitional time, the system operated by anabrid is globally
reachable via the internet at \sphinxurl{https://redac.anabrid.com}

\sphinxAtStartPar
Self\sphinxhyphen{}Registration is enabled for all user accounts ending on \sphinxcode{\sphinxupquote{@dlr.de}}.
Otherwise, user accounts have to be manually activated by the operations staff.
Primary contact happens via the \sphinxhref{https://helpdesk.anabrid.com}{anabrid helpdesk} (https://helpdesk.anabrid.com).


\section{Profile user data policy}
\label{\detokenize{user/redac1:profile-user-data-policy}}
\sphinxAtStartPar
Users who want to use the system up have to agree to the european General Data
Protection Regulation (GDPR). The following minimum amount of data is collected:
\begin{description}
\sphinxlineitem{Technical Data}\begin{itemize}
\item {} 
\sphinxAtStartPar
User IP address

\item {} 
\sphinxAtStartPar
technical browser/client identification information (for instance software versions)

\item {} 
\sphinxAtStartPar
Queries sent to the system and replies got

\end{itemize}

\sphinxAtStartPar
Retention period: Logging and Performance evaluation, data is intentionally
preserved only for a fixed period of time and never leaves the system (i.e. the
{\hyperref[\detokenize{operator/network:opsetup-server}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Super Controller}}}}}).

\sphinxlineitem{Organizational Data}\begin{itemize}
\item {} 
\sphinxAtStartPar
Personal identification features (real name, business address, institutional
affiliation, telephone number, e\sphinxhyphen{}mail address)

\item {} 
\sphinxAtStartPar
System Username

\item {} 
\sphinxAtStartPar
System Password (only stored in encrypted form according to common
cryptographic industry standards)

\item {} 
\sphinxAtStartPar
A list of authorised security tokens such as a SSH public key or a JWT access token.

\item {} 
\sphinxAtStartPar
Given consent obtained for personal data processing in accordance with the GDPR
(General Data Protection Regulation, legislation in Germany)

\end{itemize}

\sphinxAtStartPar
Retention period: Data are preserved for the full period of operations, even after
the user intentionally deleted his account. This is neccessary for project
reporting and evaluation.

\end{description}

\begin{sphinxadmonition}{note}{Note:}
\sphinxAtStartPar
When using any services provided by anabrid, the general privacy policy by anabrid
applies. It can be found at \sphinxurl{https://anabrid.com/privacy-policy}. Furthermore, the
general terms and conditions by anabrid apply. They can be found at
\sphinxurl{https://anabrid.com/agb}
\end{sphinxadmonition}

\part{Operators manual}

\sphinxstepscope


\chapter{Introduction}
\label{\detokenize{operator/intro:introduction}}\label{\detokenize{operator/intro:op-intro}}\label{\detokenize{operator/intro::doc}}
\sphinxAtStartPar
Welcome to the Administrators and Operators handbook of REDAC, the Reconfigurable
Discrete Analog Computer. Please ensure you have read the {\hyperref[\detokenize{user/preface:user-preface}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{User manual}}}}}
before approaching this part of the system documentation.

\sphinxAtStartPar
Generally, REDAC is a professional high precision computer system intended for industrial
settings. The system is of low environmental demand but requires nevertheless some
considerations for the {\hyperref[\detokenize{operator/setup:opsetup}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Physical Setup}}}}}.
Furthermore, the system generally requires \sphinxstyleemphasis{low to no regular maintenance}.
Depending on your overall computer network, a substantial initial setup phase might
be neccessary. The relevant steps are described, amongst others,
in the section {\hyperref[\detokenize{operator/network:opnetwork}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Internal network}}}}}.


\section{Intended Audience}
\label{\detokenize{operator/intro:intended-audience}}
\sphinxAtStartPar
As a systems administrator or operator, you have a decent understanding in common
IT networking and Linux server administration. Before reading this, you should know
at least how to configure at small and home office (SOHO) level networking equipment.

\begin{sphinxadmonition}{warning}{Warning:}
\sphinxAtStartPar
You are supposed to read this manual before doing any kind of physical work close
to or with REDAC. It contains essential guides how to deal with this kind of novel
computing equipment.
\end{sphinxadmonition}


\section{Confidential Credentials given at system handover}
\label{\detokenize{operator/intro:confidential-credentials-given-at-system-handover}}\label{\detokenize{operator/intro:op-credentials}}
\sphinxAtStartPar
At system purchase, you are prodived an access credential card.
This card contains sensitive information which you must not share with regular users
nor system developers.
It contains strong passwords individually assigned to your system. As the system administrator,
you are supposed to take over these access credentials and manage them. Consider
using a password manager to track them. Furthermore, you are strongly encouraged
to change the default passwords. This card should look roughly like the following table.


\begin{savenotes}\sphinxattablestart
\sphinxthistablewithglobalstyle
\centering
\sphinxcapstartof{table}
\sphinxthecaptionisattop
\sphinxcaption{REDAC Credentials Overview}\label{\detokenize{operator/intro:id1}}
\sphinxaftertopcaption
\begin{tabulary}{\linewidth}[t]{TTTT}
\sphinxtoprule
\sphinxstyletheadfamily 
\sphinxAtStartPar
Subsystem
&\sphinxstyletheadfamily 
\sphinxAtStartPar
Scope
&\sphinxstyletheadfamily 
\sphinxAtStartPar
User
&\sphinxstyletheadfamily 
\sphinxAtStartPar
Password
\\
\sphinxmidrule
\sphinxtableatstartofbodyhook
\sphinxAtStartPar
{\hyperref[\detokenize{operator/network:opsetup-mikrotik}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Mikrotik}}}}}
&
\sphinxAtStartPar
Web GUI
&
\sphinxAtStartPar
\sphinxtitleref{admin}
&
\sphinxAtStartPar
\sphinxstyleemphasis{provided}
\\
\sphinxhline
\sphinxAtStartPar
{\hyperref[\detokenize{operator/network:opsetup-server}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Super Controller}}}}}
&
\sphinxAtStartPar
SSH/X11 login
&
\sphinxAtStartPar
\sphinxstyleemphasis{provided}
&
\sphinxAtStartPar
\sphinxstyleemphasis{provided}
\\
\sphinxhline
\sphinxAtStartPar
{\hyperref[\detokenize{operator/network:opsetup-server}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Super Controller}}}}}
&
\sphinxAtStartPar
IPMI
&
\sphinxAtStartPar
\sphinxstyleemphasis{povided}
&
\sphinxAtStartPar
\sphinxstyleemphasis{provided}
\\
\sphinxhline
\sphinxAtStartPar
{\hyperref[\detokenize{operator/auth:opauth}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Keycloak}}}}}
&
\sphinxAtStartPar
OpenID managament
&
\sphinxAtStartPar
\sphinxstyleemphasis{provided}
&
\sphinxAtStartPar
\sphinxstyleemphasis{provided}
\\
\sphinxbottomrule
\end{tabulary}
\sphinxtableafterendhook\par
\sphinxattableend\end{savenotes}


\section{Public Information on your REDAC installation}
\label{\detokenize{operator/intro:public-information-on-your-redac-installation}}\label{\detokenize{operator/intro:op-identifiers}}
\sphinxAtStartPar
Next to the confidential system access information, you will get a card that
contains the following information which help to identify the device(s) you have
at hand. They are not secret and can be shared with users and developers, if
neccessary:
\begin{itemize}
\item {} 
\sphinxAtStartPar
\sphinxstyleemphasis{MAC addresses} of the {\hyperref[\detokenize{operator/network:opsetup-mikrotik}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Mikrotik}}}}} uplink ethernet port

\item {} 
\sphinxAtStartPar
\sphinxstyleemphasis{Serial number(s)} of the overall redac device and/or its individual parts

\end{itemize}

\sphinxAtStartPar
These public data should also be attached on a label on the device itself.

\sphinxstepscope


\chapter{Physical Setup}
\label{\detokenize{operator/setup:physical-setup}}\label{\detokenize{operator/setup:opsetup}}\label{\detokenize{operator/setup::doc}}
\sphinxAtStartPar
This section provides an overview about physical handling of the system.
These information are relevant for on\sphinxhyphen{}site operators in particular at
preparing the installation site, mounting, dismounting and moving the computer.
For an overview, consider the following short specs:
\begin{description}
\sphinxlineitem{Dimensions and Weight (Upper limits for one rack)}
\sphinxAtStartPar
2 x 3 x 2 m, weight: 800 kg

\sphinxlineitem{Typical Dimension of one Rack}
\sphinxAtStartPar
HBT 1800 x 800 x 800 mm (37 HE)

\sphinxlineitem{Form factors for outer structures}
\sphinxAtStartPar
\sphinxhref{https://www.netzwerkschrank24.de/37-he-19-zoll-netzwerkschrank-mit-glastur-800-x-800-x-1800-mm-bxtxh.html}{DS8837} (https://www.netzwerkschrank24.de/37\sphinxhyphen{}he\sphinxhyphen{}19\sphinxhyphen{}zoll\sphinxhyphen{}netzwerkschrank\sphinxhyphen{}mit\sphinxhyphen{}glastur\sphinxhyphen{}800\sphinxhyphen{}x\sphinxhyphen{}800\sphinxhyphen{}x\sphinxhyphen{}1800\sphinxhyphen{}mm\sphinxhyphen{}bxtxh.html)
server rack (metal and glass) and \sphinxhref{https://may-static.de/44966.pdf?1583829815925}{EuropacPRO Schroff} (https://may\sphinxhyphen{}static.de/44966.pdf?1583829815925)
chassis (aluminium)

\sphinxlineitem{Max Operating Pressure}
\sphinxAtStartPar
1030 hPa

\sphinxlineitem{Max Environmental Operating Temperature}
\sphinxAtStartPar
60° Celsius

\end{description}


\section{Spatial requirements}
\label{\detokenize{operator/setup:spatial-requirements}}
\sphinxAtStartPar
When setting up REDAC for the first time or evaluating potential locations
for its installation, it is essential to carefully consider the following
aspects to ensure optimal functionality and ease of use.
\begin{description}
\sphinxlineitem{Suitable Rooms}
\sphinxAtStartPar
REDAC is highly versatile in terms of placement and does not impose
strict requirements on the type of room. It can be installed in a
standard office space with a carpeted floor, or even in a small, poorly
ventilated storage room. The system’s design ensures reliable operation
in such varied environments. However, for long\sphinxhyphen{}term usability and
maintenance comfort, a clean and relatively dust\sphinxhyphen{}free area is
recommended to minimize cleaning needs and protect components from
excessive wear due to environmental factors.

\sphinxlineitem{Temperature and Ventilation Requirements}
\sphinxAtStartPar
REDAC does not depend on specialized temperature control or ventilation
systems. All analog components within REDAC are passively cooled,
ensuring silent and reliable operation without the need for fans or
external cooling mechanisms. The active cooling requirements are
limited to the digital components, such as the routing switch and
server, which use standard built\sphinxhyphen{}in cooling systems. These components
are designed to operate effectively in typical office or lab
conditions, with ambient temperatures ranging from 10°C to 60°C.

\sphinxlineitem{Physical Accessibility}
\sphinxAtStartPar
To facilitate setup and maintenance, it is recommended to leave
approximately 50 cm of clearance in each direction around the REDAC
rack. This space allows technicians to access all necessary components
without difficulty during servicing. While this is not strictly
required for daily operations, it can significantly simplify routine
maintenance and troubleshooting procedures.

\sphinxlineitem{Power}
\sphinxAtStartPar
REDAC requires a single\sphinxhyphen{}phase 120V/240V AC mains connection secured
with an ordinary 16A fuse. These conditions are available in virtually
any data center, working office or laboratory. For details, see
{\hyperref[\detokenize{operator/powering:setup-power}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Powering the system}}}}}.

\sphinxlineitem{Network}
\sphinxAtStartPar
REDAC requires a standard Ethernet connection with 10/100/1000 BASE\sphinxhyphen{}T
and an RJ45 interface. This type of network connectivity is widely
available and cost\sphinxhyphen{}effective. A single network cable is sufficient for
typical operations, and a redundant uplink is not necessary unless
advanced failover or high\sphinxhyphen{}availability configurations are desired. For
most scenarios, basic network access is adequate to meet operational
requirements.

\end{description}


\section{Safety Instructions for Physical Handling of the Device}
\label{\detokenize{operator/setup:safety-instructions-for-physical-handling-of-the-device}}
\sphinxAtStartPar
When physically handling the REDAC system, it is crucial to follow these
safety instructions to ensure both personal safety and the integrity of
the equipment:
\begin{description}
\sphinxlineitem{Always Wear an ESD Wrist Strap When Opening the Rack from Behind}
\sphinxAtStartPar
The REDAC rack frame is fully grounded and equipped with several
pre\sphinxhyphen{}installed ESD wrist straps connected directly to the frame. Always
ensure you are wearing one of these straps before coming into contact
with any electrical components, especially when accessing the device
from the rear side. This precaution is essential for protecting the
sensitive electronics within REDAC from electrostatic discharge, which
can cause irreversible damage to critical components. Make sure the
wrist strap is properly secured and functioning before beginning any
work.

\sphinxlineitem{Do Not Modify the Hardware Setup}
\sphinxAtStartPar
Under no circumstances should the hardware configuration of REDAC be
altered without proper authorization. Opening or unmounting the iREDAC
chassis, or making unauthorized modifications, will void the warranty
and liability coverage of the entire system. Hardware changes are
strictly reserved for trained and certified personnel with specific
expertise in handling the system. It is important to note that most
system operators are not certified for such tasks. Unauthorized
alterations can compromise the functionality and safety of the device.

\end{description}


\section{On\sphinxhyphen{}Device Indentifier Tags}
\label{\detokenize{operator/setup:on-device-indentifier-tags}}
\sphinxAtStartPar
The REDAC rack has the following on\sphinxhyphen{}device type plates for device identification:
\begin{itemize}
\item {} 
\sphinxAtStartPar
Each iREDAC has a unique serial number (a short integer as well as
a UUID which is displayed as QR code). The iREDAC labels are attached
on the backplane.

\item {} 
\sphinxAtStartPar
The REDAC rack has a bigger type plate at the back side. There is also
a label which shows the EAN number of the device as a 1D barcode, suitable
for scanning while inventarization.

\end{itemize}

\sphinxAtStartPar
REDAC has a EAN\sphinxhyphen{}13 (European Article Number) which is a GTIN (Global Trade
Item Number) which is a UPC (Universal Product Code). This number is
\sphinxcode{\sphinxupquote{1\sphinxhyphen{}700001\sphinxhyphen{}948842}}. This number refers to a iREDAC, which is at a rack
level scale the building block of REDAC.
The iREDACs also have a CE certification which is indicated by the
appropriate CE symbol.

\sphinxAtStartPar
For legal reasons, the type plates must not be removed or artificially
covered.


\section{Moving}
\label{\detokenize{operator/setup:moving}}
\sphinxAtStartPar
When relocating or moving the REDAC rack, it is important to carefully
consider the following points to ensure both the safety of the equipment
and the personnel involved.
\begin{description}
\sphinxlineitem{Move Avoiding Vibrations}
\sphinxAtStartPar
Although the REDAC rack is equipped with wheels, their use is not
recommended for covering longer distances. Wheels are suitable for
minor adjustments in position but may expose the rack to excessive
vibrations during extended movement. Instead, it is advisable to use
equipment specifically designed for smooth and vibration\sphinxhyphen{}reduced
transport, such as a pallet truck or a similar lifting device. This
approach minimizes the risk of damage to the internal components,
ensuring the longevity and reliability of the system.

\sphinxlineitem{At Least Two People}
\sphinxAtStartPar
A minimum of two people is required at all times when moving the REDAC
rack. This precaution helps to maintain control and balance of the
large and heavy structure, significantly reducing the risk of the rack
tipping over. Coordination between the individuals involved is
essential to ensure safe handling, particularly when navigating tight
spaces or uneven surfaces.

\sphinxlineitem{Make Use of the Installation Supports}
\sphinxAtStartPar
Before moving the rack, ensure that the installation supports are
securely unmounted to allow free movement. Once the relocation is
complete, re\sphinxhyphen{}mount the installation supports to stabilize the rack and
relieve stress on the wheels. These supports are critical for fixing
the rack’s position and maintaining its stability during operation.
Always keep the appropriate wrench readily available to lock or unlock
the installation supports as needed.

\sphinxlineitem{Lock the Door Before Moving}
\sphinxAtStartPar
To prevent the rack door from opening unintentionally during movement,
ensure that the door is securely locked before starting the relocation
process. This simple step protects the contents of the rack and avoids
potential damage or injury caused by the door swinging open while in
transit.

\end{description}


\section{Device Disposal}
\label{\detokenize{operator/setup:device-disposal}}\label{\detokenize{operator/setup:disposal}}
\sphinxAtStartPar
Proper disposal and recycling of the REDAC system are essential to ensure
compliance with environmental regulations and to minimize the impact of
electronic waste. For this purpose, please contact the manufacturers for
guidance on the appropriate steps to take when disposing of the system.

\sphinxAtStartPar
Electronic waste disposal is a free service offered by Anabrid GmbH, the
manufacturer of REDAC. They provide expert assistance to ensure that all
components of the system are handled responsibly, including recycling of
electronic parts and disposal of hazardous materials in accordance with
applicable laws and environmental standards.

\sphinxAtStartPar
When preparing the system for disposal, take the following steps:
\begin{enumerate}
\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
\item {} 
\sphinxAtStartPar
\sphinxstyleemphasis{Contact Anabrid GmbH}: Reach out to our customer service or
designated support channels to inform them about the disposal and to
arrange for the necessary logistics. They may provide you with shipping
instructions or coordinate a collection service.

\item {} 
\sphinxAtStartPar
\sphinxstyleemphasis{Decommission the System Safely}: Disconnect the system from power
and network connections. Anabrid GmbH will take care of packing and
relocating for transporation. Be sure to include all components, such as
power supplies and networking hardware, if requested.

\end{enumerate}
\begin{enumerate}
\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
\setcounter{enumi}{3}
\item {} 
\sphinxAtStartPar
\sphinxstyleemphasis{Follow Local Regulations}: If you are unable to use Anabrid GmbH’s
disposal service, ensure that the device is recycled through a
certified electronic waste handler in compliance with local laws and
regulations.

\end{enumerate}

\sphinxAtStartPar
By utilizing Anabrid GmbH’s free disposal service, you contribute to a
sustainable lifecycle for electronic devices, ensuring that valuable
materials are recovered and hazardous waste is properly managed. For
further details, consult the documentation provided by Anabrid GmbH or
visit their our website.

\sphinxstepscope


\chapter{Powering the system}
\label{\detokenize{operator/powering:powering-the-system}}\label{\detokenize{operator/powering:setup-power}}\label{\detokenize{operator/powering::doc}}
\sphinxAtStartPar
As noted earlier, the REDAC system imposes minimal requirements on its power
supply. Any single\sphinxhyphen{}phase safety plug operating on 120V/240V AC mains with a
maximum current of 16A is sufficient for proper operation.

\sphinxAtStartPar
The REDAC\sphinxhyphen{}specific (mostly analog) components are powered with high quality
24V DC power supplies with a maximum rating of 300W each. Typical power neeeds
of a single iREDAC are 100W when computing (operating mode) and
10W when idling (power svaing mode).

\begin{sphinxadmonition}{important}{Important:}
\sphinxAtStartPar
A correctly grounded mains connection is crucial for safe and reliable
operation. Most data centers, working offices, or professional
laboratories already provide suitable power infrastructure. Ensure
that the grounding is verified to avoid potential safety risks and to
guarantee system stability.
\end{sphinxadmonition}

\sphinxAtStartPar
While the use of a data center power delivery unit (PDU) or an
uninterruptible power supply (UPS) is not mandatory, these devices can
offer significant benefits. A UPS, particularly one with a battery\sphinxhyphen{}backed
design, provides additional protection against power surges, outages, and
voltage fluctuations. Moreover, a UPS can stabilize the input voltage,
which may enhance the performance of the internal power supply. This
stability can, in turn, improve the accuracy and reliability of REDAC’s
computing operations, making it a worthwhile consideration for critical
applications.

\begin{figure}[htbp]
\centering
\capstart

\sphinxincludegraphics[]{graphviz-59f88a5a26572a53c6cea446d8b56ae2fd022cd6.pdf}
\caption{240V power distribution in REDAC}\label{\detokenize{operator/powering:id1}}\label{\detokenize{operator/powering:fig-240v-network}}\end{figure}


\section{System Startup}
\label{\detokenize{operator/powering:system-startup}}
\sphinxAtStartPar
REDAC features a 19\sphinxhyphen{}inch switchable power socket located at the rear of the
rack (see \hyperref[\detokenize{operator/powering:fig-240v-network}]{Fig.\@ \ref{\detokenize{operator/powering:fig-240v-network}}}). This design allows the entire system to be powered on with a single
flip of the master switch, provided the mains connection has been properly
plugged in and secured.

\sphinxAtStartPar
Once power is supplied to the system, the following sequence typically
occurs automatically (ordered by their time to readiness):
\begin{enumerate}
\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
\item {} 
\sphinxAtStartPar
The Ethernet networking equipment (router or switch) powers on
immediately, establishing the network connections required for system
communication.

\end{enumerate}
\begin{enumerate}
\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
\setcounter{enumi}{2}
\item {} 
\sphinxAtStartPar
The analog power supply activates, which subsequently powers all
connected analog modules and prepares them for operation. This also
means that all Microcontrollers power up and wait for an IP address
with DHCP calls until the routing switch assigns them an IP address.

\end{enumerate}
\begin{enumerate}
\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
\setcounter{enumi}{1}
\item {} 
\sphinxAtStartPar
The server, also known as the supercontroller, powers on, waits for
an IP address and starts up all relevant services in correct order.
They then begin to initialize their control and managament processes.

\end{enumerate}

\sphinxAtStartPar
Although each of these components can be powered on or off individually if
necessary, this is rarely required under normal operating conditions. The
automated startup process ensures that the system reaches an operational
state efficiently and with minimal user intervention. However, users
should verify that the system initializes correctly and observe for any
unexpected behavior during startup, especially after relocation or
maintenance.

\begin{sphinxadmonition}{note}{Note:}
\sphinxAtStartPar
The REDAC system operated by anabrid (see {\hyperref[\detokenize{operator/anabrid:opanabrid}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Anabrid Operations}}}}}) can be
monitored at \sphinxurl{https://status.anabrid.net/status/redac1} in order to see
when all systems are up and running after powerup.
\end{sphinxadmonition}


\section{System Shutdown}
\label{\detokenize{operator/powering:system-shutdown}}\label{\detokenize{operator/powering:shutdown}}
\sphinxAtStartPar
When shutting down the REDAC system, follow these guidelines to ensure a
safe and proper shutdown process:
\begin{enumerate}
\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
\item {} 
\sphinxAtStartPar
The Ethernet networking equipment (router or switch) can be powered
off without any adverse effects on the system. Since the networking
components do not store critical data, there is no risk of data loss
when they are turned off.

\item {} 
\sphinxAtStartPar
The server (supercontroller) requires a manual shutdown sequence to
prevent data loss. This is typically done by executing the command
\sphinxcode{\sphinxupquote{sudo shutdown \sphinxhyphen{}h now}} at the Linux command line. This ensures that
all running processes are terminated gracefully, and any data in
memory is safely written to storage before the system powers down.

\item {} 
\sphinxAtStartPar
The analog components of the system can be powered off without any
significant effects. These parts do not rely on active processes or
stored data and can be safely disconnected from power as needed.

\end{enumerate}

\begin{sphinxadmonition}{note}{Note:}
\sphinxAtStartPar
While a sudden power loss is generally not critical for the REDAC system,
it is worth noting that the server is equipped with a journaling file
system. This feature ensures data integrity and facilitates recovery
mechanisms even in the event of an abrupt shutdown. In such cases, the
only potential loss would involve volatile database entries, which are
typically of minor importance in practical applications. Despite this
resilience, a controlled shutdown process is always recommended to avoid
unnecessary recovery procedures and ensure smooth system operation.
\end{sphinxadmonition}

\sphinxstepscope


\chapter{Internal network}
\label{\detokenize{operator/network:internal-network}}\label{\detokenize{operator/network:opnetwork}}\label{\detokenize{operator/network::doc}}
\begin{figure}[htbp]
\centering
\capstart

\sphinxincludegraphics[]{graphviz-17c76ff4ae63f1a71de69f9160b79cb5d39d7f1d.pdf}
\caption{Graph of the logical (internal) Ethernet of REDAC. See main text for explanation.}\label{\detokenize{operator/network:id1}}\label{\detokenize{operator/network:fig-internal-ethernet}}\end{figure}

\sphinxAtStartPar
REDAC features an internal IPv4 network somewhat similar to a typical home subscriber
network (\hyperref[\detokenize{operator/network:fig-internal-ethernet}]{Fig.\@ \ref{\detokenize{operator/network:fig-internal-ethernet}}}). This network has the following physical components:
\begin{description}
\sphinxlineitem{Mikrotik Switching Router}
\sphinxAtStartPar
Off\sphinxhyphen{}the\sphinxhyphen{}shelf rack mount router including a 24port front facing ethernet switch.
The first port of the switch is dedicated to the external uplink while all other
ports are bridged to an internal network. The device is introduced in
section {\hyperref[\detokenize{operator/network:opsetup-mikrotik}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{The Mikrotik Router}}}}}.

\sphinxlineitem{Super Controller (x86 Server)}
\sphinxAtStartPar
An off\sphinxhyphen{}the\sphinxhyphen{}shelf low power low noise low depth server with IPMI out of band
remote managament facilities. The device can also be used as a terminal
server interactively. For further details see section {\hyperref[\detokenize{operator/network:opsetup-server}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{The Super Controller Server}}}}}.

\sphinxlineitem{Hybrid Controllers (Teensy Microcontrollers)}
\sphinxAtStartPar
The network contains dozens of microcontroller units (MCU), each of them
connected with 100Base\sphinxhyphen{}TX to the switch and centrally managed by the super
controller. These devices provide/require no direct network access by system
operators.

\end{description}

\sphinxAtStartPar
This section will present the particular components in detail and explain relevant
configuration steps.

\begin{sphinxadmonition}{note}{Note:}
\sphinxAtStartPar
At the time of reading this, you should have the {\hyperref[\detokenize{operator/intro:op-credentials}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Confidential Credentials given at system handover}}}}} next to
the {\hyperref[\detokenize{operator/intro:op-identifiers}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Public Information on your REDAC installation}}}}} ready at your hand. Note that the authentification
systems of REDAC internal network structure are scoped and not unified/synchronized.
That means that each device has a local user and password configuration and no single login exists.
Do not confuse the scope of the credentials. credentials listed  with the
REDAC \sphinxstyleemphasis{public} application level authentification, which are managed by OpenID
and discussed in the section {\hyperref[\detokenize{operator/auth:opauth}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Authentification}}}}}.
\end{sphinxadmonition}


\section{Initial network setup/access}
\label{\detokenize{operator/network:initial-network-setup-access}}\label{\detokenize{operator/network:opinitialaccess}}
\sphinxAtStartPar
By default, the router behaves as a IPv4 DHCP client at the external interface. If you
have a DHCP server running in the outer network at your control, this default
configuration might be suitable for you. In this case, you can access the super
controller server by means of the TCP ports exposed (by NAT in the router). You can
also take the server as an intermediate to configure the router. Note that the
router configuration interface (web, ssh) is only accessible from the internal
network.

\begin{sphinxadmonition}{tip}{Tip:}
\sphinxAtStartPar
By default, the REDAC Router behaves similiar to a IPv4 home subscriber setup
(think of a Fritzbox in Germany): There is a restrictive firewall allowing no
ingoing traffic, doing masquerading and exposing thus only a single IP address
at the outer network. System operators are encouraged to enter the internal
network with their equipment, in particular for setup and maintenance.
\end{sphinxadmonition}

\sphinxAtStartPar
If you cannot make use of REDAC acting as a DHCP client but need to have it a given
and fixed address, you need to \sphinxstyleemphasis{get access to the internal network}, which requires
physical access. There are two principal ways how to do that:
\begin{itemize}
\item {} 
\sphinxAtStartPar
Connect \sphinxstyleemphasis{your} notebook/computer to the internal network or

\item {} 
\sphinxAtStartPar
Connect a monitor and keyboard/mouse to the super controller and make use of it
as a standalone computer.

\end{itemize}

\begin{sphinxadmonition}{note}{Note:}
\sphinxAtStartPar
The neccessary ports (USB and VGA) for connecting a terminal to the server
are located at the front of the rack. If there are no free USB slots, you can
plug out some USB devices while not using the Analog part of REDAC. Make sure
to connect all USB devices back after having finished the administrative work,
or use a USB hub if neccessary.
\end{sphinxadmonition}

\sphinxAtStartPar
For connecting your own computer to the internal REDAC network, connect it
physically with a network cable to one of the free ports on the switch. Note that
the Mikrotik router in this setup has no Wifi/wireless capabilities.

\sphinxAtStartPar
In both ways, your computer should be assigned an address by the REDAC internal
DHCP server. If you cannot run a DHCP client on your computer, you may choose
a fixed address freely in the range \sphinxcode{\sphinxupquote{192.168.104.5 \sphinxhyphen{} 192.168.104.9}} with
subnet mask \sphinxcode{\sphinxupquote{255.255.255.0}} and gateway \sphinxcode{\sphinxupquote{192.168.104.1}}. The gateway acts
also as DNS server.

\sphinxAtStartPar
If you, instead, choose to make use of the super controller as an interactive
computer, you must have the username and password credentials at hand to login
at the desktop greeter. After successful login, the linux computer will launch
a desktop environment which allows you to start the usual applications such as
a web browser or a terminal. If you do not have a mouse available, hit
\sphinxcode{\sphinxupquote{CTRL + ALT + F2}} or \sphinxcode{\sphinxupquote{F3}} in order to switch the virtual desktop to a TTY
instance which allows you to use the linux shell without a graphical user
interface.

\begin{sphinxadmonition}{warning}{Warning:}
\sphinxAtStartPar
Keep in mind that the direct access to the internal REDAC network is \sphinxstylestrong{only}
intended for system administrators and not regular users. The reason is that
ordinary users should not communicate directly with the microcontrollers.
Otherwise, the Super Controller is bypassed and is prevented from doing his
work correctly, messing up proper system managament.

\sphinxAtStartPar
The same is true for the Super Controller graphical interface! If you want to
provide your users a console like desktop access in the same room, for instance,
please setup your own computers which are put \sphinxstyleemphasis{outside} of REDAC.
\end{sphinxadmonition}


\section{The Mikrotik Router}
\label{\detokenize{operator/network:the-mikrotik-router}}\label{\detokenize{operator/network:opsetup-mikrotik}}
\sphinxAtStartPar
The Mikrotik router runs the proprietary operating system \sphinxstyleemphasis{RouterOS} by Mikrotik.
It is rich in features and the supplier provides a detailed documentation
available at \sphinxurl{https://help.mikrotik.com/docs/}. If you are not familiar with this
technology, please read the section \sphinxstyleemphasis{Getting started} in the linked Mikrotik
documentation.

\sphinxAtStartPar
The REDAC ships with the mikrotik model type \sphinxcode{\sphinxupquote{CRS326\sphinxhyphen{}24G\sphinxhyphen{}2S+RM}}. It features
a managed 24 port gigabit switch next to the routing capabilities.


\subsection{Relevant settings}
\label{\detokenize{operator/network:relevant-settings}}
\sphinxAtStartPar
The router comes with REDAC\sphinxhyphen{}specific default settings (given below)
which only use a tiny fraction of all functions. Virtually any professional
grade router available on the market, such as Cisco, Linksys, Juniper and other
can do the same. Note that the MCUs only have a fast ethernet uplink (100mbit)
and thus modern multi\sphinxhyphen{}gigabit powerhorses are not neccessary. The Mikrotik is
therefore a sufficient and energy saving choice.

\sphinxAtStartPar
The following router configuration options must not be changed by the
systems operator:
\begin{description}
\sphinxlineitem{Internal ethernet configuration}
\sphinxAtStartPar
All ports are bridged except port 1, which belongs to the external port.

\sphinxlineitem{Internal network DHCP server and IP configuration}
\sphinxAtStartPar
There is a single subnet \sphinxcode{\sphinxupquote{192.168.104.0/24}}
with DHCP enabled. The router has the internal IP \sphinxcode{\sphinxupquote{192.168.104.1/32}}. There
is no IPv6 active in the REDAC internal network.

\sphinxlineitem{TCP port forwarding (NAT) for the super controller}
\sphinxAtStartPar
The super controller has a fixed IP address by the mikrotik DHCP server.
TCP ports \sphinxcode{\sphinxupquote{22, 80, 443}} are \sphinxcode{\sphinxupquote{dst\sphinxhyphen{}nat}} to the super controller.

\end{description}

\sphinxAtStartPar
In contrast, the system operator is invited to change not only, but in particular
the following default options:
\begin{itemize}
\item {} 
\sphinxAtStartPar
Changing the behaviour at the external interface, called \sphinxcode{\sphinxupquote{ether1}},
in particular changing the IPv4
configuration or enabling IPv6.

\item {} 
\sphinxAtStartPar
Changing (sharpening or softing) the default firewall

\item {} 
\sphinxAtStartPar
Changing the access credentials

\item {} 
\sphinxAtStartPar
Making use of advanced functions such as VPN services.

\end{itemize}


\subsection{How to access the REDAC Ethernet/IP Routing Switch}
\label{\detokenize{operator/network:how-to-access-the-redac-ethernet-ip-routing-switch}}
\sphinxAtStartPar
When being connected to REDACs internal network, access the mikrotik web browser
based graphical user interface by pointing your browser to \sphinxcode{\sphinxupquote{http://192.168.104.1}}.
Your browser should show you a login mask where you have to fill out the given
credentials.
At \hyperref[\detokenize{operator/network:fig-starting-digital-mikrotik-screenshot}]{Fig.\@ \ref{\detokenize{operator/network:fig-starting-digital-mikrotik-screenshot}}} you can see a typical screenshot
of the web browser based graphical user interface of the router after having logged
in successfully .The page shown
allows to turn of the DHCP client behaviour of the REDAC router.

\begin{figure}[htbp]
\centering
\capstart

\noindent\sphinxincludegraphics[scale=0.5]{{starting_digital_mikrotik_screenshot}.png}
\caption{Mikrotik RouterOS Web Browser GUI screenshot}\label{\detokenize{operator/network:id2}}\label{\detokenize{operator/network:fig-starting-digital-mikrotik-screenshot}}\end{figure}

\sphinxAtStartPar
Alternatively, the router provides an SSH console which allows you to display and
edit the router settings without a graphical user interface. This comes in handy
in particular when you access the system with the linux console (VGA/keyboard
directly connected to super controller) without having a USB mouse at hand.

\begin{sphinxVerbatim}[commandchars=\\\{\}]
some@computer \PYGZdl{} ssh admin@192.168.104.1
...
[admin@REDAC1\PYGZhy{}EthRouter1\PYGZhy{}MikroTik] \PYGZgt{} /ip/address/print
Flags: D \PYGZhy{} DYNAMIC
Columns: ADDRESS, NETWORK, INTERFACE
\PYGZsh{}   ADDRESS             NETWORK        INTERFACE
0   192.168.104.1/24    192.168.104.0  bridge
1   10.110.0.26/32      10.110.0.0     wg\PYGZhy{}tinybridge
2 D 192.168.100.168/24  192.168.100.0  ether1
\end{sphinxVerbatim}


\subsection{Mikrotik default configuration}
\label{\detokenize{operator/network:mikrotik-default-configuration}}
\sphinxAtStartPar
The device default configuration is shown in the following listing. It can be
obtained by typing \sphinxcode{\sphinxupquote{/export compact}} into the console. Save this listing to
a text file and you can restore the device configuration at any time:

\begin{sphinxVerbatim}[commandchars=\\\{\}]
\PYG{c+c1}{\PYGZsh{} 2025\PYGZhy{}01\PYGZhy{}08 20:00:42 by RouterOS 7.13.5}
\PYG{c+c1}{\PYGZsh{} software id = 1SRY\PYGZhy{}CS15}
\PYG{c+c1}{\PYGZsh{}}
\PYG{c+c1}{\PYGZsh{} model = CRS326\PYGZhy{}24G\PYGZhy{}2S+}
\PYG{c+c1}{\PYGZsh{} serial number = HGC09YWZXTY}
\PYG{o}{/}\PYG{n}{interface} \PYG{n}{bridge}
\PYG{n}{add} \PYG{n}{admin}\PYG{o}{\PYGZhy{}}\PYG{n}{mac}\PYG{o}{=}\PYG{n}{D4}\PYG{p}{:}\PYG{l+m+mi}{01}\PYG{p}{:}\PYG{n}{C3}\PYG{p}{:}\PYG{l+m+mi}{80}\PYG{p}{:}\PYG{l+m+mi}{2}\PYG{n}{D}\PYG{p}{:}\PYG{n}{EB} \PYG{n}{auto}\PYG{o}{\PYGZhy{}}\PYG{n}{mac}\PYG{o}{=}\PYG{n}{no} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{name}\PYG{o}{=}\PYG{n}{bridge}
\PYG{o}{/}\PYG{n}{interface} \PYG{n+nb}{list}
\PYG{n}{add} \PYG{n}{name}\PYG{o}{=}\PYG{n}{WAN}
\PYG{n}{add} \PYG{n}{name}\PYG{o}{=}\PYG{n}{LAN}
\PYG{o}{/}\PYG{n}{ip} \PYG{n}{hotspot} \PYG{n}{profile}
\PYG{n+nb}{set} \PYG{p}{[} \PYG{n}{find} \PYG{n}{default}\PYG{o}{=}\PYG{n}{yes} \PYG{p}{]} \PYG{n}{html}\PYG{o}{\PYGZhy{}}\PYG{n}{directory}\PYG{o}{=}\PYG{n}{hotspot}
\PYG{o}{/}\PYG{n}{ip} \PYG{n}{pool}
\PYG{n}{add} \PYG{n}{name}\PYG{o}{=}\PYG{n}{dhcp} \PYG{n}{ranges}\PYG{o}{=}\PYG{l+m+mf}{192.168}\PYG{l+m+mf}{.104}\PYG{l+m+mf}{.10}\PYG{o}{\PYGZhy{}}\PYG{l+m+mf}{192.168}\PYG{l+m+mf}{.104}\PYG{l+m+mf}{.250}
\PYG{o}{/}\PYG{n}{ip} \PYG{n}{dhcp}\PYG{o}{\PYGZhy{}}\PYG{n}{server}
\PYG{n}{add} \PYG{n}{address}\PYG{o}{\PYGZhy{}}\PYG{n}{pool}\PYG{o}{=}\PYG{n}{dhcp} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{name}\PYG{o}{=}\PYG{n}{dhcp1}
\PYG{o}{/}\PYG{n}{port}
\PYG{n+nb}{set} \PYG{l+m+mi}{0} \PYG{n}{name}\PYG{o}{=}\PYG{n}{serial0}
\PYG{o}{/}\PYG{n}{interface} \PYG{n}{bridge} \PYG{n}{port}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{disabled}\PYG{o}{=}\PYG{n}{yes} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether1}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether2}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether3}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether4}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether5}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether6}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether7}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether8}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether9}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether10}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether11}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether12}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether13}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether14}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether15}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether16}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether17}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether18}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether19}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether20}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether21}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether22}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether23}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether24}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{sfp}\PYG{o}{\PYGZhy{}}\PYG{n}{sfpplus1}
\PYG{n}{add} \PYG{n}{bridge}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{comment}\PYG{o}{=}\PYG{n}{defconf} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{sfp}\PYG{o}{\PYGZhy{}}\PYG{n}{sfpplus2}
\PYG{o}{/}\PYG{n}{interface} \PYG{n+nb}{list} \PYG{n}{member}
\PYG{n}{add} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether1} \PYG{n+nb}{list}\PYG{o}{=}\PYG{n}{WAN}
\PYG{n}{add} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{bridge} \PYG{n+nb}{list}\PYG{o}{=}\PYG{n}{LAN}
\PYG{o}{/}\PYG{n}{ip} \PYG{n}{address}
\PYG{n}{add} \PYG{n}{address}\PYG{o}{=}\PYG{l+m+mf}{192.168}\PYG{l+m+mf}{.104}\PYG{l+m+mf}{.1}\PYG{o}{/}\PYG{l+m+mi}{24} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{bridge} \PYG{n}{network}\PYG{o}{=}\PYG{l+m+mf}{192.168}\PYG{l+m+mf}{.104}\PYG{l+m+mf}{.0}
\PYG{o}{/}\PYG{n}{ip} \PYG{n}{dhcp}\PYG{o}{\PYGZhy{}}\PYG{n}{client}
\PYG{n}{add} \PYG{n}{interface}\PYG{o}{=}\PYG{n}{ether1}
\PYG{o}{/}\PYG{n}{ip} \PYG{n}{dhcp}\PYG{o}{\PYGZhy{}}\PYG{n}{server} \PYG{n}{network}
\PYG{n}{add} \PYG{n}{address}\PYG{o}{=}\PYG{l+m+mf}{192.168}\PYG{l+m+mf}{.104}\PYG{l+m+mf}{.0}\PYG{o}{/}\PYG{l+m+mi}{24} \PYG{n}{dns}\PYG{o}{\PYGZhy{}}\PYG{n}{server}\PYG{o}{=}\PYG{l+m+mf}{192.168}\PYG{l+m+mf}{.104}\PYG{l+m+mf}{.1}\PYG{p}{,}\PYG{l+m+mf}{8.8}\PYG{l+m+mf}{.8}\PYG{l+m+mf}{.8} \PYG{n}{gateway}\PYG{o}{=}\PYG{l+m+mf}{192.168}\PYG{l+m+mf}{.104}\PYG{l+m+mf}{.1} \PYG{n}{netmask}\PYG{o}{=}\PYG{l+m+mi}{24}
\PYG{o}{/}\PYG{n}{ip} \PYG{n}{firewall} \PYG{n}{nat}
\PYG{n}{add} \PYG{n}{action}\PYG{o}{=}\PYG{n}{masquerade} \PYG{n}{chain}\PYG{o}{=}\PYG{n}{srcnat} \PYG{n}{out}\PYG{o}{\PYGZhy{}}\PYG{n}{interface}\PYG{o}{\PYGZhy{}}\PYG{n+nb}{list}\PYG{o}{=}\PYG{n}{WAN}
\PYG{o}{/}\PYG{n}{system} \PYG{n}{clock}
\PYG{n+nb}{set} \PYG{n}{time}\PYG{o}{\PYGZhy{}}\PYG{n}{zone}\PYG{o}{\PYGZhy{}}\PYG{n}{name}\PYG{o}{=}\PYG{n}{Europe}\PYG{o}{/}\PYG{n}{Berlin}
\PYG{o}{/}\PYG{n}{system} \PYG{n}{identity}
\PYG{n+nb}{set} \PYG{n}{name}\PYG{o}{=}\PYG{n}{REDAC1}\PYG{o}{\PYGZhy{}}\PYG{n}{EthRouter1}\PYG{o}{\PYGZhy{}}\PYG{n}{MikroTik}
\PYG{o}{/}\PYG{n}{system} \PYG{n}{note}
\PYG{n+nb}{set} \PYG{n}{show}\PYG{o}{\PYGZhy{}}\PYG{n}{at}\PYG{o}{\PYGZhy{}}\PYG{n}{login}\PYG{o}{=}\PYG{n}{no}
\PYG{o}{/}\PYG{n}{system} \PYG{n}{routerboard} \PYG{n}{settings}
\PYG{n+nb}{set} \PYG{n}{boot}\PYG{o}{\PYGZhy{}}\PYG{n}{os}\PYG{o}{=}\PYG{n}{router}\PYG{o}{\PYGZhy{}}\PYG{n}{os} \PYG{n}{enter}\PYG{o}{\PYGZhy{}}\PYG{n}{setup}\PYG{o}{\PYGZhy{}}\PYG{n}{on}\PYG{o}{=}\PYG{n}{delete}\PYG{o}{\PYGZhy{}}\PYG{n}{key}
\end{sphinxVerbatim}

\sphinxAtStartPar
Note that this listing does not include any passwords.


\section{The Super Controller Server}
\label{\detokenize{operator/network:the-super-controller-server}}\label{\detokenize{operator/network:opsetup-server}}
\sphinxAtStartPar
The Super Controller is the name both for a certain kind of software service
and the physical server built into REDAC. This section will only cover the
physical server and its operating system. For applications running on this
server, see for instance {\hyperref[\detokenize{operator/services:opservices}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Services}}}}}, {\hyperref[\detokenize{operator/auth:opauth}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Authentification}}}}} and in general the
overview of {\hyperref[\detokenize{developer/software:dev-software}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{REDAC\sphinxhyphen{}specific software}}}}} in the developers
manual.


\subsection{Server Hardware}
\label{\detokenize{operator/network:server-hardware}}
\sphinxAtStartPar
REDAC ships with a 1U low noise Mini\sphinxhyphen{}ITX server based on the SuperMicro
Xeon Broadwell SoC server\sphinxhyphen{}grade mainboard \sphinxcode{\sphinxupquote{X10SDV\sphinxhyphen{}4C}} and equipped with 32GB
RAM and 1 TB SSD. The low depth enclosure has a single power supply and front facing
I/O, making it easy to connect a KVM (monitor/keyboard) or USB stick. Most imporant
is the IPMI feature which ensures out of band / lights of managament of the server.

\sphinxAtStartPar
This server was chosen due to its compact form factor and not for high availability.
In principle virtually any other rack mountable server is suitable to fulfill the
job, in particular any product made by large server companies such as Dell, HP or
Supermicro.


\subsection{Server Operating System}
\label{\detokenize{operator/network:server-operating-system}}
\sphinxAtStartPar
The Super Controller server is shipping with the \sphinxstyleemphasis{Ubuntu Server} GNU/Linux
distribution and is primarily supposed to be managed via SSH. Access is possible
straight from outside the REDAC network as the SSH port is exposed by the router.
It is up to the system administrator to also expose the IPMI or to lock down the
ports if no remote managament is needed or realized in other fashions.

\sphinxAtStartPar
In general, administrators are expected to be able to manage a Linux server and it
is outside the scope of this manual to discuss how to obtain graphical access from
remote or how to upgrade the operating system. The same applies with basic
monitoring and health checks at an operating system level. The system comes in
standard configuration for \sphinxstyleemphasis{Ubuntu Server}, which means for instance that
security updates for system packages are installed automatically if internet
access is available.


\subsection{Login and usage of the server}
\label{\detokenize{operator/network:login-and-usage-of-the-server}}\label{\detokenize{operator/network:oplogin}}
\sphinxAtStartPar
There are a number of differnet ways to access the server: Either you connect
physically (see also {\hyperref[\detokenize{operator/network:opinitialaccess}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Initial network setup/access}}}}}) and use the standard VGA terminal
(\sphinxcode{\sphinxupquote{getty}} login) or graphical login (\sphinxcode{\sphinxupquote{X11}} login greeter). Or you connect
via network, primarily using SSH. We have the lightweight \sphinxhref{https://xfce.org/}{Xfce} (https://xfce.org/)
desktop environment preinstalled which includes common tools to get the everyday
job done in the graphical user interface.

\sphinxAtStartPar
Via SSH, you have a number of options: Either you use plain SSH, which is just fine
for any advanced Linux user and in particular operator. Or you combine SSH with
graphical forwarding (i.e. \sphinxcode{\sphinxupquote{ssh \sphinxhyphen{}x}}). The most advanced way is to use the
free \sphinxstyleemphasis{terminal server/remote desktop software} \sphinxhref{https://wiki.x2go.org/}{X2go} (https://wiki.x2go.org/)
which is preinstalled. Again, Xfce should be chosen as the installed GUI. A typical
configuration screen is shown in figure \hyperref[\detokenize{operator/network:fig-x2go-starting}]{Fig.\@ \ref{\detokenize{operator/network:fig-x2go-starting}}}, whereas figure
\hyperref[\detokenize{operator/network:fig-x2go-running}]{Fig.\@ \ref{\detokenize{operator/network:fig-x2go-running}}} is shown a typical running session.

\begin{figure}[htbp]
\centering
\capstart

\noindent\sphinxincludegraphics{{x2go-client}.png}
\caption{X2Go session initialization screenshot, showing the configuration options.}\label{\detokenize{operator/network:id3}}\label{\detokenize{operator/network:fig-x2go-starting}}\end{figure}

\begin{figure}[htbp]
\centering
\capstart

\noindent\sphinxincludegraphics{{x2go-running}.jpg}
\caption{Graphical XFCE session running on the REDAC login server, showing a web browser
and a terminal.}\label{\detokenize{operator/network:id4}}\label{\detokenize{operator/network:fig-x2go-running}}\end{figure}

\sphinxAtStartPar
In order to have a better experience at the (remote) desktop, we recommend to disable
the \sphinxstyleemphasis{compositor} (3D features such as windows dropping shadows). We recommend to
use \sphinxcode{\sphinxupquote{xfce4\sphinxhyphen{}terminal}} as the terminal application and \sphinxcode{\sphinxupquote{firefox\sphinxhyphen{}esr}} as the web
browser.

\sphinxAtStartPar
A powerful feature of X2Go is that it allows you to interrupt and resume sessions the same
way as terminal multiplexers such as \sphinxhref{https://www.gnu.org/software/screen/}{GNU screen} (https://www.gnu.org/software/screen/) and
\sphinxhref{https://github.com/tmux/tmux/wiki}{tmux} (https://github.com/tmux/tmux/wiki) allow for the terminal. However, the
session is by default \sphinxstyleemphasis{not} shared with the direct terminal access session.


\section{How user access works from outside}
\label{\detokenize{operator/network:how-user-access-works-from-outside}}
\sphinxAtStartPar
This section explains how general network access works, exemplaric for the
{\hyperref[\detokenize{operator/anabrid:opanabrid}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Anabrid Operations}}}}}:

\sphinxAtStartPar
First, the domain \sphinxcode{\sphinxupquote{redac.anabrid.com}} resolves to the fiber internet uplink of
the anabrid Ulm labs. The router has a Destination\sphinxhyphen{}NAT firewall rule which
forwards incoming traffic on TCP ports such as 80 (HTTP) or 443 (HTTPS) to
the REDAC SuperController within the REDAC internal network. This is possible
because on\sphinxhyphen{}site, the REDAC internal network is accessible from outside.
If this was not the case, the REDAC itself (i.e. the {\hyperref[\detokenize{operator/network:opsetup-mikrotik}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{The Mikrotik Router}}}}})
should do a similar DNAT port forarding, given that it has a single external IP
address by default.

\begin{sphinxadmonition}{warning}{Warning:}
\sphinxAtStartPar
DNAT port forwardings and reverse proxying to IP addresses can be fragile if the
IP addresses of the relevant devices or services are not static. These situations
\sphinxstyleemphasis{do} happen in practice and result in errors which can be hard to trace in particular
if administrators are not familiar with the setup. For instance, as a design choice
in this network, the IP addresses are managed by permanent, yet principally dynamic
DHCP service entries. In particular, devices with multiple network interfaces
or changing MAC addresses are subject to different IP addresses if network cables
are plugged into other interfaces or MAC addresses are changed manually. On an
application level, TCP ports can easily become blocked by stalled server processes
where some “clever” server code decides to listen at some other address, rendering
the whole system unreachable. In order to be able to debug such problems quickly
when they arise, administrators are urged to learn the route of user requests from
outside to the inner parts of REDAC and back.
\end{sphinxadmonition}

\sphinxAtStartPar
On the SuperController server, there is the \sphinxhref{https://caddyserver.com/}{caddy webserver} (https://caddyserver.com/)
running. It provides easy access to \sphinxhref{https://letsencrypt.org/}{Let’s Encrypt} (https://letsencrypt.org/)
certificates and reverse proxying to relevant services. The caddy webserver is
steered by the configuration file \sphinxcode{\sphinxupquote{/etc/caddy/Caddyfile}}
(see \sphinxurl{https://caddyserver.com/docs/caddyfile} for syntax explanation)
which has the following exemplaric content:

\begin{sphinxVerbatim}[commandchars=\\\{\}]
\PYG{c+c1}{\PYGZsh{} Caddyfile for the SuperController Webserver}

\PYG{p}{(}\PYG{n}{error\PYGZus{}handler}\PYG{p}{)} \PYG{p}{\PYGZob{}}
        \PYG{n}{handle\PYGZus{}errors} \PYG{p}{\PYGZob{}}
                \PYG{n}{respond} \PYG{l+s+s2}{\PYGZdq{}}\PYG{l+s+si}{\PYGZob{}http.error.status\PYGZus{}code\PYGZcb{}}\PYG{l+s+s2}{ \PYGZhy{} }\PYG{l+s+si}{\PYGZob{}http.error.message\PYGZcb{}}\PYG{l+s+s2}{ \PYGZhy{}\PYGZhy{} hint, check system availability at https://status.anabrid.net/status/redac1}\PYG{l+s+s2}{\PYGZdq{}}
        \PYG{p}{\PYGZcb{}}
\PYG{p}{\PYGZcb{}}

\PYG{n}{redac}\PYG{o}{.}\PYG{n}{anabrid}\PYG{o}{.}\PYG{n}{com} \PYG{p}{\PYGZob{}}
        \PYG{n}{root} \PYG{o}{*} \PYG{o}{/}\PYG{n}{home}\PYG{o}{/}\PYG{n}{caddy}\PYG{o}{\PYGZhy{}}\PYG{n}{redac}\PYG{o}{.}\PYG{n}{anabrid}\PYG{o}{.}\PYG{n}{com}
        \PYG{n}{file\PYGZus{}server}

        \PYG{n}{redir} \PYG{o}{/} \PYG{o}{/}\PYG{n}{ui}

        \PYG{n}{redir} \PYG{o}{/}\PYG{n}{manual}\PYG{o}{.}\PYG{n}{pdf} \PYG{n}{https}\PYG{p}{:}\PYG{o}{/}\PYG{o}{/}\PYG{n}{anabrid}\PYG{o}{.}\PYG{n}{dev}\PYG{o}{/}\PYG{n}{docs}\PYG{o}{/}\PYG{n}{redac}\PYG{o}{\PYGZhy{}}\PYG{n}{manual}\PYG{o}{/}\PYG{n}{redacmanual}\PYG{o}{.}\PYG{n}{pdf}

        \PYG{n}{redir} \PYG{o}{/}\PYG{n}{auth}  \PYG{n}{https}\PYG{p}{:}\PYG{o}{/}\PYG{o}{/}\PYG{n}{auth}\PYG{o}{.}\PYG{n}{redac}\PYG{o}{.}\PYG{n}{anabrid}\PYG{o}{.}\PYG{n}{com}\PYG{o}{/}

        \PYG{n}{redir} \PYG{o}{/}\PYG{n}{api} \PYG{o}{/}\PYG{n}{api}\PYG{o}{/}
        \PYG{n}{reverse\PYGZus{}proxy} \PYG{o}{/}\PYG{n}{api}\PYG{o}{/}\PYG{o}{*} \PYG{l+m+mf}{127.0}\PYG{l+m+mf}{.0}\PYG{l+m+mf}{.1}\PYG{p}{:}\PYG{l+m+mi}{8081}  \PYG{c+c1}{\PYGZsh{}  redaccess code = main REST interface}

        \PYG{k+kn}{import}\PYG{+w}{ }\PYG{n+nn}{error\PYGZus{}handler}
\PYG{p}{\PYGZcb{}}

\PYG{n}{auth}\PYG{o}{.}\PYG{n}{redac}\PYG{o}{.}\PYG{n}{anabrid}\PYG{o}{.}\PYG{n}{com}  \PYG{p}{\PYGZob{}}
        \PYG{n}{reverse\PYGZus{}proxy} \PYG{l+m+mf}{127.0}\PYG{l+m+mf}{.0}\PYG{l+m+mf}{.1}\PYG{p}{:}\PYG{l+m+mi}{8080}  \PYG{c+c1}{\PYGZsh{}  keycloak = main Authentification}
        \PYG{k+kn}{import}\PYG{+w}{ }\PYG{n+nn}{error\PYGZus{}handler}
\PYG{p}{\PYGZcb{}}

\PYG{n}{stats}\PYG{o}{.}\PYG{n}{redac}\PYG{o}{.}\PYG{n}{anabrid}\PYG{o}{.}\PYG{n}{com}  \PYG{p}{\PYGZob{}}
        \PYG{n}{reverse\PYGZus{}proxy} \PYG{l+m+mf}{127.0}\PYG{l+m+mf}{.0}\PYG{l+m+mf}{.1}\PYG{p}{:}\PYG{l+m+mi}{3000}  \PYG{c+c1}{\PYGZsh{}  grafana}
        \PYG{k+kn}{import}\PYG{+w}{ }\PYG{n+nn}{error\PYGZus{}handler}
\PYG{p}{\PYGZcb{}}

\PYG{n}{jupyter}\PYG{o}{.}\PYG{n}{redac}\PYG{o}{.}\PYG{n}{anabrid}\PYG{o}{.}\PYG{n}{com} \PYG{p}{\PYGZob{}}
        \PYG{n}{reverse\PYGZus{}proxy} \PYG{l+m+mf}{192.168}\PYG{l+m+mf}{.102}\PYG{l+m+mf}{.251}\PYG{p}{:}\PYG{l+m+mi}{8080}  \PYG{c+c1}{\PYGZsh{}  *EXTERNAL* jupyter notebook server}
        \PYG{k+kn}{import}\PYG{+w}{ }\PYG{n+nn}{error\PYGZus{}handler}
\PYG{p}{\PYGZcb{}}

\PYG{c+c1}{\PYGZsh{} ...}
\end{sphinxVerbatim}

\sphinxAtStartPar
This example shows how the Caddy server distributes incoming requests based on their
domain name or path. Given the \sphinxstyleemphasis{current} permeability between the Ulm lab network
and the REDAC internal network, it is easy to reverse proxy also network
services which are not physically hosted on the same server.

\sphinxstepscope


\chapter{Services}
\label{\detokenize{operator/services:services}}\label{\detokenize{operator/services:opservices}}\label{\detokenize{operator/services::doc}}
\sphinxAtStartPar
This section lists the names and explains the maintenance
of the REDAC\sphinxhyphen{}specific software on {\hyperref[\detokenize{operator/network:opsetup-server}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{The Super Controller Server}}}}}. This also includes the
supervision of log files and their general availability.

\sphinxAtStartPar
First of all, all REDAC software comes \sphinxhref{https://www.docker.com/}{dockerized} (https://www.docker.com/) and/or
is maintained as \sphinxhref{https://systemd.io/}{systemd services} (https://systemd.io/). One of the most important
properties is that all relevant services come up \sphinxstyleemphasis{automatically} on system boot. This
is ensured by having
\begin{itemize}
\item {} 
\sphinxAtStartPar
Python daemons being directly started by systemd units (within their relevant
\sphinxhref{https://virtualenv.pypa.io/en/latest/user\_guide.html}{virtualenv} (https://virtualenv.pypa.io/en/latest/user\_guide.html)).

\item {} 
\sphinxAtStartPar
Single docker daemons being directly started by systemd units.

\item {} 
\sphinxAtStartPar
\sphinxhref{https://docs.docker.com/compose/}{Docker\sphinxhyphen{}Compose} (https://docs.docker.com/compose/) services being automatically
started by docker.

\end{itemize}

\sphinxAtStartPar
If you don’t know how to maintain a sytemd service, please advise any contemporary
linux administrators manual. The same applies with docker and in particular
\sphinxcode{\sphinxupquote{docker\sphinxhyphen{}compose}}.


\section{Relevant systemd units}
\label{\detokenize{operator/services:relevant-systemd-units}}
\sphinxAtStartPar
The relevant systemd units are named:
\begin{itemize}
\item {} 
\sphinxAtStartPar
\sphinxcode{\sphinxupquote{redaccess\sphinxhyphen{}forward.service}} ({\hyperref[\detokenize{developer/software:redaccess}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Redaccess (Middleware)}}}}})

\item {} 
\sphinxAtStartPar
\sphinxcode{\sphinxupquote{redaccess\sphinxhyphen{}api.service}} ({\hyperref[\detokenize{developer/software:redaccess}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Redaccess (Middleware)}}}}})

\item {} 
\sphinxAtStartPar
\sphinxcode{\sphinxupquote{supercontroller\sphinxhyphen{}proxy.service}} ({\hyperref[\detokenize{developer/software:pybrid}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Pybrid Proxy}}}}})

\item {} 
\sphinxAtStartPar
\sphinxcode{\sphinxupquote{docker\sphinxhyphen{}keycloak.service}} ({\hyperref[\detokenize{operator/auth:opauth}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Authentification}}}}})

\end{itemize}

\sphinxAtStartPar
You can edit the service description files in \sphinxcode{\sphinxupquote{/etc/systemd/system/\textless{}nameOfService\textgreater{}}}.

\sphinxAtStartPar
For each service, you can its status with \sphinxcode{\sphinxupquote{sudo systemctl status \textless{}nameOfService\textgreater{}}}.
You can view the relevant logfiles with \sphinxcode{\sphinxupquote{sudo journalctl \sphinxhyphen{}\sphinxhyphen{}unit=\textless{}nameOfUnit\textgreater{}}}
(with \sphinxcode{\sphinxupquote{\textless{}nameOfService\textgreater{} = \textless{}nameOfUnit\textgreater{}.service}}). Helpful options for \sphinxcode{\sphinxupquote{journalctl}}
are the \sphinxstyleemphasis{follow flag} \sphinxcode{\sphinxupquote{\sphinxhyphen{}f}} to get interactive, continous output as well as the
date filtering such as \sphinxcode{\sphinxupquote{\sphinxhyphen{}\sphinxhyphen{}since today}} to see the relevant logs only.

\sphinxAtStartPar
This is the output of a typical status report:

\begin{sphinxVerbatim}[commandchars=\\\{\}]
you@redac1\PYGZhy{}sc0 \PYGZdl{} sudo systemctl status supercontroller\PYGZhy{}proxy.service
o supercontroller\PYGZhy{}proxy.service \PYGZhy{} REDAC SuperControl Proxy
    Loaded: loaded (/etc/systemd/system/supercontroller\PYGZhy{}proxy.service; static)
    Active: active (running) since Tue 2025\PYGZhy{}02\PYGZhy{}11 07:34:48 UTC; 5min ago
  Main PID: 3718259 (python)
      Tasks: 2 (limit: 38307)
    Memory: 26.5M (peak: 27.0M)
        CPU: 995ms
    CGroup: /system.slice/supercontroller\PYGZhy{}proxy.service
            +\PYGZhy{} 3718259 /home/anabrid\PYGZhy{}admin/.cache/pypoetry/virtualenvs/pybrid\PYGZhy{}computing\PYGZhy{}XZRhPXGJ\PYGZhy{}py3.12/bin/python \PYGZhy{}m pybrid.cli.base \PYGZhy{}\PYGZhy{}log\PYGZhy{}level=DEBUG redac \PYGZhy{}h 192.168.104.0/24 proxy \PYGZhy{}\PYGZhy{}ma\PYGZgt{}
...
Feb 11 07:34:57 redac1\PYGZhy{}sc0 python[3718259]: 57.677 | WARNING | proxy | Target for MAC mapping from 00\PYGZhy{}00\PYGZhy{}00\PYGZhy{}00\PYGZhy{}00\PYGZhy{}00 to 04\PYGZhy{}E9\PYGZhy{}E5\PYGZhy{}17\PYGZhy{}E5\PYGZhy{}4F does not exist.
Feb 11 07:34:57 redac1\PYGZhy{}sc0 python[3718259]: Starting proxy on 0.0.0.0:5732... Press Ctrl+C to exit.
\end{sphinxVerbatim}

\sphinxAtStartPar
Furthermore, the following services are part of ubuntu software packages, they are
not custom REDAC software but relevant for correct operation:
\begin{itemize}
\item {} 
\sphinxAtStartPar
\sphinxcode{\sphinxupquote{caddy}} with its configuration file at \sphinxcode{\sphinxupquote{/etc/caddy/Caddyfile}}. This is the HTTPS webserver,
REST reverse proxy and main entrypoint. After changing the configuration file, a \sphinxcode{\sphinxupquote{service caddy reload}}
is sufficient.

\item {} 
\sphinxAtStartPar
\sphinxcode{\sphinxupquote{ssh}} is the OpenSSH server which is crucial for managing the system from remote.

\item {} 
\sphinxAtStartPar
\sphinxcode{\sphinxupquote{lightdm}} is the graphical display manager (greeter), see also {\hyperref[\detokenize{operator/network:oplogin}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Login and usage of the server}}}}}. When you have
trouble with the graphical terminal, try to restart this service.

\end{itemize}


\section{Docker service overview}
\label{\detokenize{operator/services:docker-service-overview}}
\sphinxAtStartPar
The following docker services are used/installed:
\begin{itemize}
\item {} 
\sphinxAtStartPar
\sphinxcode{\sphinxupquote{redac\sphinxhyphen{}keycloak}} is a single \sphinxhref{https://hub.docker.com/r/keycloak/keycloak}{keycloak} (https://hub.docker.com/r/keycloak/keycloak) image from
\sphinxhref{https://hub.docker.com}{dockerhub} (https://hub.docker.com), managed by a systemd unit (see above) with relevant options in
the service description file.

\item {} 
\sphinxAtStartPar
Grafana as a \sphinxcode{\sphinxupquote{docker\sphinxhyphen{}compose}} setup

\end{itemize}

\sphinxAtStartPar
You can get a quick overview about running services with these commands:

\begin{sphinxVerbatim}[commandchars=\\\{\}]
you@redac1\PYGZhy{}sc0 \PYGZdl{} sudo docker ps
CONTAINER ID   IMAGE                                  COMMAND                  CREATED          STATUS                  PORTS                                                                                  NAMES
bb9982649e60   quay.io/keycloak/keycloak:26.0.7       \PYGZdq{}/opt/keycloak/bin/k…\PYGZdq{}   47 minutes ago   Up 47 minutes           8443/tcp, 0.0.0.0:8080\PYGZhy{}\PYGZgt{}8080/tcp, :::8080\PYGZhy{}\PYGZgt{}8080/tcp, 9000/tcp                          redac\PYGZhy{}keycloak
b9ce90eaa284   redis2influx                           \PYGZdq{}poetry run python \PYGZhy{}…\PYGZdq{}   21 hours ago     Up 14 hours                                                                                                    redis2influx
f0b7f3d79034   grafana/grafana\PYGZhy{}oss                    \PYGZdq{}/run.sh\PYGZdq{}                21 hours ago     Up 14 hours             0.0.0.0:3000\PYGZhy{}\PYGZgt{}3000/tcp, :::3000\PYGZhy{}\PYGZgt{}3000/tcp                                              grafana
515dd4d984cc   influxdb:2                             \PYGZdq{}/entrypoint.sh infl…\PYGZdq{}   21 hours ago     Up 14 hours             0.0.0.0:8086\PYGZhy{}\PYGZgt{}8086/tcp, :::8086\PYGZhy{}\PYGZgt{}8086/tcp                                              influxdb
c1ef8172ab3b   redis/redis\PYGZhy{}stack                      \PYGZdq{}/entrypoint.sh\PYGZdq{}         21 hours ago     Up 14 hours             0.0.0.0:6379\PYGZhy{}\PYGZgt{}6379/tcp, :::6379\PYGZhy{}\PYGZgt{}6379/tcp, 0.0.0.0:8001\PYGZhy{}\PYGZgt{}8001/tcp, :::8001\PYGZhy{}\PYGZgt{}8001/tcp   redis
20dacd1c8e2a   ghcr.io/goauthentik/server:2024.12.2   \PYGZdq{}dumb\PYGZhy{}init \PYGZhy{}\PYGZhy{} ak wor…\PYGZdq{}   4 weeks ago      Up 14 hours (healthy)                                                                                          authentik\PYGZus{}worker\PYGZus{}1
4376dc22d03d   ghcr.io/goauthentik/server:2024.12.2   \PYGZdq{}dumb\PYGZhy{}init \PYGZhy{}\PYGZhy{} ak ser…\PYGZdq{}   4 weeks ago      Up 14 hours (healthy)   0.0.0.0:9000\PYGZhy{}\PYGZgt{}9000/tcp, :::9000\PYGZhy{}\PYGZgt{}9000/tcp, 0.0.0.0:9443\PYGZhy{}\PYGZgt{}9443/tcp, :::9443\PYGZhy{}\PYGZgt{}9443/tcp   authentik\PYGZus{}server\PYGZus{}1
fddcad498baf   postgres:16\PYGZhy{}alpine                     \PYGZdq{}docker\PYGZhy{}entrypoint.s…\PYGZdq{}   4 weeks ago      Up 14 hours (healthy)   5432/tcp                                                                               authentik\PYGZus{}postgresql\PYGZus{}1
716681800dab   redis:alpine                           \PYGZdq{}docker\PYGZhy{}entrypoint.s…\PYGZdq{}   4 weeks ago      Up 14 hours (healthy)   6379/tcp                                                                               authentik\PYGZus{}redis\PYGZus{}1
\end{sphinxVerbatim}

\sphinxAtStartPar
For instance, the Grafana installation is managed with

\begin{sphinxVerbatim}[commandchars=\\\{\}]
\PYG{n}{you}\PYG{n+nd}{@redac1}\PYG{o}{\PYGZhy{}}\PYG{n}{sc0}\PYG{p}{:}\PYG{o}{/}\PYG{n}{path}\PYG{o}{/}\PYG{n}{to}\PYG{o}{/}\PYG{n}{grafana} \PYG{c+c1}{\PYGZsh{} docker\PYGZhy{}compose ps}
    \PYG{n}{Name}               \PYG{n}{Command}            \PYG{n}{State}                                         \PYG{n}{Ports}
\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}
\PYG{n}{grafana}        \PYG{o}{/}\PYG{n}{run}\PYG{o}{.}\PYG{n}{sh}                    \PYG{n}{Up}      \PYG{l+m+mf}{0.0}\PYG{l+m+mf}{.0}\PYG{l+m+mf}{.0}\PYG{p}{:}\PYG{l+m+mi}{3000}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZgt{}}\PYG{l+m+mi}{3000}\PYG{o}{/}\PYG{n}{tcp}\PYG{p}{,}\PYG{p}{:}\PYG{p}{:}\PYG{p}{:}\PYG{l+m+mi}{3000}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZgt{}}\PYG{l+m+mi}{3000}\PYG{o}{/}\PYG{n}{tcp}
\PYG{n}{influxdb}       \PYG{o}{/}\PYG{n}{entrypoint}\PYG{o}{.}\PYG{n}{sh} \PYG{n}{influxd}     \PYG{n}{Up}      \PYG{l+m+mf}{0.0}\PYG{l+m+mf}{.0}\PYG{l+m+mf}{.0}\PYG{p}{:}\PYG{l+m+mi}{8086}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZgt{}}\PYG{l+m+mi}{8086}\PYG{o}{/}\PYG{n}{tcp}\PYG{p}{,}\PYG{p}{:}\PYG{p}{:}\PYG{p}{:}\PYG{l+m+mi}{8086}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZgt{}}\PYG{l+m+mi}{8086}\PYG{o}{/}\PYG{n}{tcp}
\PYG{n}{redis}          \PYG{o}{/}\PYG{n}{entrypoint}\PYG{o}{.}\PYG{n}{sh}             \PYG{n}{Up}      \PYG{l+m+mf}{0.0}\PYG{l+m+mf}{.0}\PYG{l+m+mf}{.0}\PYG{p}{:}\PYG{l+m+mi}{6379}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZgt{}}\PYG{l+m+mi}{6379}\PYG{o}{/}\PYG{n}{tcp}\PYG{p}{,}\PYG{p}{:}\PYG{p}{:}\PYG{p}{:}\PYG{l+m+mi}{6379}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZgt{}}\PYG{l+m+mi}{6379}\PYG{o}{/}\PYG{n}{tcp}\PYG{p}{,} \PYG{l+m+mf}{0.0}\PYG{l+m+mf}{.0}\PYG{l+m+mf}{.0}\PYG{p}{:}\PYG{l+m+mi}{8001}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZgt{}}\PYG{l+m+mi}{8001}\PYG{o}{/}\PYG{n}{tcp}\PYG{p}{,}\PYG{p}{:}\PYG{p}{:}\PYG{p}{:}\PYG{l+m+mi}{8001}\PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZgt{}}\PYG{l+m+mi}{8001}\PYG{o}{/}\PYG{n}{tcp}
\PYG{n}{redis2influx}   \PYG{n}{poetry} \PYG{n}{run} \PYG{n}{python} \PYG{o}{\PYGZhy{}}\PYG{n}{m} \PYG{n}{src}   \PYG{n}{Up}
\end{sphinxVerbatim}

\sphinxAtStartPar
Further details will follow as soon as the software is more mature. There will be a focus on
installation\sphinxhyphen{}specific details.


\section{How to (re\sphinxhyphen{})install the relevant software on the server}
\label{\detokenize{operator/services:how-to-re-install-the-relevant-software-on-the-server}}
\sphinxAtStartPar
In most cases, reinstallation will be as easy as an
\sphinxcode{\sphinxupquote{docker\sphinxhyphen{}compose pull}}. Note that the REDAC software for the super controller
is not open sourced and thus updates will be provided by anabrid if there
is an appropriate contract discussing this in detail.

\sphinxAtStartPar
In the moment, please refer to the
section about {\hyperref[\detokenize{developer/software:dev-software}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Software}}}}} in the developer’s manual for further detail.

\sphinxstepscope


\chapter{Authentification}
\label{\detokenize{operator/auth:authentification}}\label{\detokenize{operator/auth:opauth}}\label{\detokenize{operator/auth::doc}}
\sphinxAtStartPar
For user authentification, the REDAC Frontend Access Code (\sphinxstyleemphasis{redaccess}) uses
the \sphinxhref{https://openid.net/}{OpenID} (https://openid.net/) standard.
For convenience, the identiy and access managament server
\sphinxhref{https://www.keycloak.org/}{Keycloak} (https://www.keycloak.org/) is running on the
{\hyperref[\detokenize{operator/network:opsetup-server}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Super Controller}}}}}.
Keycloak provides user federation, strong authentication, user management,
fine\sphinxhyphen{}grained authorization, and more.
This section describes the capabilities of this software and how to manage
access to REDAC. Administrators are strongly encouraged to read the relevant
\sphinxhref{https://www.keycloak.org/guides}{Keycloak guides} (https://www.keycloak.org/guides) and documentation. This
section will only cover the REDAC\sphinxhyphen{}specific configuration settings and
intentionally does not provide a general introduction into the Keycloak software.

\begin{sphinxadmonition}{note}{Note:}
\sphinxAtStartPar
The Keycloak OpenID service is supposed to secure access to all
\sphinxstylestrong{user facing services}. This intentionally does not cover any services of the
{\hyperref[\detokenize{operator/network:opnetwork}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Internal network}}}}}. All operator and administrator services have their local
on\sphinxhyphen{}device user account managament. This is also a resilience measure in order
to enable maintainability of the overall system even if REDAC\sphinxhyphen{}specific services
are down.
\end{sphinxadmonition}


\section{Scope and capablities of Keycloak on REDAC}
\label{\detokenize{operator/auth:scope-and-capablities-of-keycloak-on-redac}}
\sphinxAtStartPar
By default the Keycloak installation has two realms:
\begin{enumerate}
\sphinxsetlistlabels{\arabic}{enumi}{enumii}{}{.}%
\item {} 
\sphinxAtStartPar
The \sphinxstyleemphasis{master} (or \sphinxstyleemphasis{default}) realm which is only used for managing Keycloak itself.
Login is at \sphinxurl{https://auth.redac.anabrid.com/} which shows a big warning that this is
not the correct login for ordinary users.

\item {} 
\sphinxAtStartPar
The \sphinxstyleemphasis{redac1\sphinxhyphen{}realm} for actual user authentification, currently
managed by {\hyperref[\detokenize{operator/anabrid:opanabrid}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Anabrid for QCI}}}}}. The most important URL for managing
users and their groups in this realm is
\sphinxurl{https://auth.redac.anabrid.com/admin/master/console/\#/redac1-realm/users}.
For programming against this realm, the information at the ressource
\sphinxurl{https://auth.redac.anabrid.com/realms/redac1-realm/.well-known/openid-configuration} may
be interesting to get the URLs of OpenID endpoints.

\end{enumerate}

\sphinxAtStartPar
The Keycloak itself is currently configured to be able to send out E\sphinxhyphen{}Mails via
an anabrid mailserver with the sending address \sphinxcode{\sphinxupquote{redac1\sphinxhyphen{}keycloak@anabrid.dev}}. This
is a \sphinxstyleemphasis{no\sphinxhyphen{}reply} sender only mail account for the keycloak daemon.

\sphinxAtStartPar
Keycloak is versatile in client policies and modifying the user registration.


\section{REDAC Keycloak clients}
\label{\detokenize{operator/auth:redac-keycloak-clients}}
\sphinxAtStartPar
In Keycloak language, \sphinxstyleemphasis{clients} refer to programs which want to authenticate against
REDAC. Currently, the following \sphinxstyleemphasis{OpenID connect} clients with
\sphinxstyleemphasis{authentification and authorization} capabilities are registered:
\begin{itemize}
\item {} 
\sphinxAtStartPar
\sphinxcode{\sphinxupquote{redaccess}}, served at \sphinxurl{https://redac.anabrid.com/api}

\item {} 
\sphinxAtStartPar
\sphinxcode{\sphinxupquote{jupyterhub\sphinxhyphen{}wup}}, served at \sphinxurl{https://jupyter.redac.anabrid.com/}

\item {} 
\sphinxAtStartPar
Keycloak\sphinxhyphen{}internals such as the account console at \sphinxurl{https://auth.redac.anabrid.com/realms/redac1-realm/account/}

\end{itemize}

\sphinxAtStartPar
The following \sphinxstyleemphasis{OpenID connect} clients with \sphinxstyleemphasis{public access only} capabilities are
registered:
\begin{itemize}
\item {} 
\sphinxAtStartPar
\sphinxcode{\sphinxupquote{redac\sphinxhyphen{}gui}}, served at \sphinxurl{https://redac.anabrid.com/ui}

\end{itemize}

\sphinxstepscope


\chapter{Anabrid Operations}
\label{\detokenize{operator/anabrid:anabrid-operations}}\label{\detokenize{operator/anabrid:opanabrid}}\label{\detokenize{operator/anabrid::doc}}
\noindent{\hspace*{\fill}\sphinxincludegraphics[scale=0.8]{{redac-aso-logo}.png}}

\sphinxAtStartPar
This section is dedicated to the \sphinxstyleemphasis{REDAC1 Systems Operations Team}
at \sphinxstyleemphasis{anabrid GmbH}. The term \sphinxstyleemphasis{REDAC1} refers to the REDAC system with
serial number 1, see {\hyperref[\detokenize{user/redac1:redac1}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{About the first REDAC}}}}} for details.
Some software solutions
that are \sphinxstyleemphasis{not} part of REDAC are provided and operated within this transitional
time. These are listed in this section and their use is documented. There is
no documentation regarding administration, as administration is carried out
by the Anabrid Systems Operations Team.
Within this transitional time, the system operated by anabrid is globally
reachable via the internet at \sphinxurl{https://redac.anabrid.com}

\begin{figure}[htbp]
\centering
\capstart

\noindent\sphinxincludegraphics[scale=0.5]{{anabrid-operations-services}.png}
\caption{Overview about the REDAC\sphinxhyphen{}internal services vs. the services operated by anabrid.
Click to enlarge.}\label{\detokenize{operator/anabrid:id1}}\label{\detokenize{operator/anabrid:fig-anabrid-services}}\end{figure}


\section{List of provided services}
\label{\detokenize{operator/anabrid:list-of-provided-services}}\label{\detokenize{operator/anabrid:opanabrid-services}}
\sphinxAtStartPar
The following services are not part of REDAC but part of the operations
teams, next to the actual REDAC hardware and software maintenance. Similar
systems are supposed to be hosted by a REDAC customer. See also
figure {\hyperref[\detokenize{operator/anabrid:fig-anabrid-services}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Overview about the REDAC\sphinxhyphen{}internal services vs. the services operated by anabrid.
Click to enlarge.}}}}} for an overview.
\begin{description}
\sphinxlineitem{Systems Access to \sphinxcode{\sphinxupquote{redac.anabrid.com}}}
\sphinxAtStartPar
General system access is provided over anabrid paid 1gbit/sec symmetric
internet fiber uplink which has a guaranteed uptime of certainly
less then 99\% (i.e. \sphinxhref{https://uptime.is/99}{14min downtime per day} (https://uptime.is/99)).

\sphinxlineitem{Systems website landing page “User Interface” \sphinxurl{https://redac.anabrid.com/ui/}}
\sphinxAtStartPar
This is a little static website (\sphinxhref{https://svelte.dev/docs/kit/introduction}{Sveltekit} (https://svelte.dev/docs/kit/introduction))
which is managed, amongst other static assets, via SFTP. The website itself,
in particular, is a \sphinxstyleemphasis{goodie} and not part of the official
{\hyperref[\detokenize{developer/software:dev-software}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{software infrastructure}}}}}

\sphinxlineitem{Status Page \sphinxurl{https://status.anabrid.net/status/redac1}}
\sphinxAtStartPar
Anabrid operates a number of status services which allows to have a quick
overview about the availability and reliability of the services. The
reachability of the REDAC1 System is monitored on this website.

\sphinxlineitem{Grafana dashboard \sphinxurl{https://stats.redac.anabrid.com/}}
\sphinxAtStartPar
For demonstrating/displaying temperature readout. Runs as a docker container
on the SuperController.

\sphinxlineitem{JupyterHub instance \sphinxurl{https://jupyter.redac.anabrid.com/}}
\sphinxAtStartPar
This is a Kubernetes cluster operated by the OPs team which has direct access
to REDAC internal network. However, it is physically hosted and served not on
SuperController but dedicated bare metal digital hardware.

\sphinxlineitem{Authentification \sphinxurl{https://auth.redac.anabrid.com/}}
\sphinxAtStartPar
Anabrid transitionally operates the user authentification system for REDAC1.
The underlying software system \sphinxstyleemphasis{Keycloak} is an official suggestion to be used
also by the customer within the REDAC software infrastructure, cf. {\hyperref[\detokenize{operator/auth:opauth}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Authentification}}}}}.

\sphinxlineitem{User Helpdesk \sphinxurl{https://helpdesk.anabrid.com/}}
\sphinxAtStartPar
Anabrid runs a ticketing system in order to provide help for REDAC1 users.
This is a company wide ticketing system where anabrid employees help on improving
the customers jorney. Users can open a ticket straight on the helpdesk or write
a mail to \sphinxhref{mailto:helpdesk@anabrid.com}{helpdesk@anabrid.com}.
Please insert the term \sphinxcode{\sphinxupquote{REDAC1}} in the subject message of your tickets.
Clearly, this ticketing system is not part of REDAC infrastructure.

\sphinxlineitem{Anabrid User Hotline \sphinxcode{\sphinxupquote{0049 30 629 3047 20}}}
\sphinxAtStartPar
Anabrid runs a telephone line which allows people to ask for help within
regular office hours. There is no guarantee that support can be provided
via telephone. However, the onsite team in Ulm is always happy to receive
inqueries at a direct visit.

\end{description}

\begin{sphinxadmonition}{note}{Note:}
\sphinxAtStartPar
Note that
REDAC1 has a standalone user account system (see {\hyperref[\detokenize{operator/auth:opauth}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Authentification}}}}}) which is
by no means related to any institutional user managament systems by DLR
or anabrid.
\end{sphinxadmonition}


\section{About bringing REDAC1 to another network}
\label{\detokenize{operator/anabrid:about-bringing-redac1-to-another-network}}\label{\detokenize{operator/anabrid:relocating}}
\sphinxAtStartPar
Currently, REDAC1 is “hard\sphinxhyphen{}wired” to the Anabrid Ulm network by means that the
public domain \sphinxcode{\sphinxupquote{redac.anabrid.com}} resolves to the IP address of the Anabrid
Ulm gateway and thus \sphinxurl{https://redac.anabrid.com} will stop working once you
disconnect REDAC from Anabrid’s network in Ulm and plug it into an Ethernet
socket of some other network, for instance a network owned by DLR.

\sphinxAtStartPar
More to write here.

\part{Developers manual}

\sphinxstepscope


\chapter{Introduction}
\label{\detokenize{developer/intro:introduction}}\label{\detokenize{developer/intro:dev-intro}}\label{\detokenize{developer/intro::doc}}
\sphinxAtStartPar
Welcome to the Software and Hardware Developers handbook of REDAC, the Reconfigurable
Discrete Analog Computer. Please ensure you have read the {\hyperref[\detokenize{user/preface:user-preface}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{User manual}}}}}
before approaching this part of the system documentation.

\sphinxAtStartPar
REDAC is primarily supposed to be used by engineers and scientists. Depending on
your domain of expertise, it may be sufficient for you to adopt your problems to the
programming interfaces provided by REDAC. This \sphinxstyleemphasis{developer manual} is primarily meant
for people who want or need to know more about the internals of REDAC analog and
digital parts.

\sphinxAtStartPar
Please note that the level of access to the inner workings of the system depends on
your particular legal situation: Despite some parts of REDAC are open sourced (or
supposed to be open sourced soon), most of the system is neither open source nor
open hardware. You, your institute or your company may need to purchase a license,
sign a non disclosure agreement (NDA) or take another other legal action in order
to gain access to the information of interest. Please contact your systems operator
or contact person for further information.

\sphinxstepscope


\chapter{Architecture Reference}
\label{\detokenize{developer/architecture:architecture-reference}}\label{\detokenize{developer/architecture:architecture}}\label{\detokenize{developer/architecture::doc}}
\sphinxAtStartPar
This section provides a deep dive into REDAC architecture,
suitable for developers and experienced users who want to dig into the
connectivity provided by the device. You should read the
{\hyperref[\detokenize{user/reconfigurable:arch-intro}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{introductory section on REDAC architecture}}}}} first.


\section{REDAC Hierarchy}
\label{\detokenize{developer/architecture:redac-hierarchy}}
\sphinxAtStartPar
REDAC stands for \sphinxstyleemphasis{Reconfigurable Discrete Analog Computer}. This means it is
constructed using \sphinxstyleemphasis{discrete} components, which are individual integrated
circuits (ICs). These ICs house, for instance, multiple operational amplifiers (Opamps),
serving as the fundamental building blocks for the electronic analog
computing paradigm employed by REDAC.

\sphinxAtStartPar
The system is designed with a highly modular, hierarchical, and repetitive
architecture. At each hierarchical level, components from the lower levels
are arranged in a consistent, repetitive structure while remaining
individually replaceable. This design achieves a balance between high
regularity for efficient organization and substantial flexibility for
customization. This modularity not only simplifies maintenance and
scalability but also enables tailored configurations to suit specific
computational needs. The following figure \hyperref[\detokenize{developer/architecture:fig-hierarchical-redac-schema}]{Fig.\@ \ref{\detokenize{developer/architecture:fig-hierarchical-redac-schema}}}
provides an overview picture emphasizing on the hierarchical and modular nature
of REDAC.

\begin{figure}[htbp]
\centering
\capstart

\noindent\sphinxincludegraphics{{redac-hierarchy-diagram}.png}
\caption{Abstract hierarchy diagram of REDAC.}\label{\detokenize{developer/architecture:id2}}\label{\detokenize{developer/architecture:fig-hierarchical-redac-schema}}\end{figure}

\sphinxAtStartPar
The figure introduces a lot of concepts which are presented in detail in the
following sections. Despite REDAC is an analog\sphinxhyphen{}digital hybrid computer, the
architectural description will primarily explain the \sphinxstyleemphasis{analog} connectivity, apart
from the description of digital circuits.


\subsection{Single cluster}
\label{\detokenize{developer/architecture:single-cluster}}\label{\detokenize{developer/architecture:arch-cluster}}
\sphinxAtStartPar
A \sphinxstyleemphasis{cluster} is the atom of the REDAC computer. The circuits at this level are
alsor refered to as \sphinxstyleemphasis{macro cell} in the literature. A cluster provides all\sphinxhyphen{}to\sphinxhyphen{}all
connectivity between up to 16 computing elements.
Coupling is implemented by switching matrices under control of the attached
digital computer, basically resembling a \sphinxstyleemphasis{crossbar switch}.

\begin{figure}[htbp]
\centering
\capstart

\noindent\sphinxincludegraphics{{system-matrix}.png}
\caption{The single cluster system reduced to its system matrix.
The entries shown are for a Lorenz system.}\label{\detokenize{developer/architecture:id3}}\label{\detokenize{developer/architecture:fig-lucidac-system-matrix}}\end{figure}

\sphinxAtStartPar
Schematically, Figure \hyperref[\detokenize{developer/architecture:fig-lucidac-system-matrix}]{Fig.\@ \ref{\detokenize{developer/architecture:fig-lucidac-system-matrix}}}
provides a way to visualize the interconnection matrix with real numbers
representing coupling strengths. The cluster system matrix is the
adjacency matrix for the interconnection graph between the computing
elements. The entries are referred to as \sphinxstyleemphasis{weights}. As a special
property, the system matrix does \sphinxstyleemphasis{implicit summing} which can be thought
of as matrix multiplication linear algebra operations:
\(C_i^\text{in} = \sum_{j=0}^{16} M_{ij} C_j^\text{out}, \quad i,j \in [0,16]\)
where \(C_i^\text{in}\) is the input to
the \(i\)\sphinxhyphen{}th computing element, \(C_i^\text{out}\) is its
output, and the \(M_{ij}\) are the weights. The previous equation
describes \sphinxstyleemphasis{monadic} computing elements with one input and one output.
The integrator is the only monadic computing element in a cluster
system. It computes the time integral over its time\sphinxhyphen{}varying input
signal. REDAC also provides another kind of computing elements, which
are \sphinxstyleemphasis{dyadic}, i.e. feature two inputs and one output: Multipliers. The
multipliers implemented allow for full four\sphinxhyphen{}quadrant\sphinxhyphen{}multiplication,
i.e. each of the input values can take on values within the whole
machine unit interval \([-1,1]\).

\begin{figure}[htbp]
\centering
\capstart

\noindent\sphinxincludegraphics{{turbine-diagram}.png}
\caption{The single cluster as a closed\sphinxhyphen{}loop feedback circuit (\sphinxstyleemphasis{turbine diagram}).}\label{\detokenize{developer/architecture:id4}}\label{\detokenize{developer/architecture:fig-lucidac-turbine-diagram}}\end{figure}

\sphinxAtStartPar
Figure \hyperref[\detokenize{developer/architecture:fig-lucidac-turbine-diagram}]{Fig.\@ \ref{\detokenize{developer/architecture:fig-lucidac-turbine-diagram}}} shows a more
detailed block diagram of the REDAC. It shows the closed loop \sphinxstyleemphasis{analog
compute path}. The labeled shapes in the diagram each represent a
particular \sphinxstyleemphasis{blocks} (in bold letters, referred to as “entities” in the
REDAC terminology) and auxiliary \sphinxstyleemphasis{elements} (in normal letters). The
figure does not show any digital control/configuration signal paths.
Most notably, the \sphinxstylestrong{U}\sphinxhyphen{}, \sphinxstylestrong{C}\sphinxhyphen{} and \sphinxstylestrong{I}\sphinxhyphen{}blocks together form the
\sphinxstylestrong{UCI} matrix, which corresponds to the simplified \sphinxstyleemphasis{interconnection
matrix} shown before in
Figure \hyperref[\detokenize{developer/architecture:fig-lucidac-system-matrix}]{Fig.\@ \ref{\detokenize{developer/architecture:fig-lucidac-system-matrix}}}.
In contrast, Figure
\hyperref[\detokenize{developer/architecture:fig-lucidac-turbine-diagram}]{Fig.\@ \ref{\detokenize{developer/architecture:fig-lucidac-turbine-diagram}}} emphasizes the internal
\sphinxstyleemphasis{fanout} and \sphinxstyleemphasis{fanin} properties of the U\sphinxhyphen{} and I\sphinxhyphen{}blocks, resulting in a
turbine\sphinxhyphen{}like appearance of this circuit representation.

\sphinxAtStartPar
The UCI matrix has 16 inputs, 16 outputs and 32 internal signal paths,
each of which contains a coefficient element. These 32 paths are also
called \sphinxstyleemphasis{lanes} and correspond to up to 32 nonzero entries in the system
matrix, yielding a maximum matrix density of \(32 / 16^2 = 12.5\).
This corresponds to a minimum sparsity of 87.5\%.


\subsection{mREDAC level}
\label{\detokenize{developer/architecture:mredac-level}}\label{\detokenize{developer/architecture:mredac-architecture}}
\sphinxAtStartPar
mREDAC stands for \sphinxstyleemphasis{minimal} or \sphinxstyleemphasis{motherboard} REDAC and is the smallest
autonomous part of the system. It contains one microcontroller (MCU)
which has an Ethernet uplink and steers all digital signals on the
motherboard. The board hosts three clusters which share a single OP/IC
line. The three clusters are interconnected by means of one \sphinxcode{\sphinxupquote{T}}
block. This minimal self\sphinxhyphen{}standing analog hybrid computer is completed
with analog aquisition circuitery (eight ADC channels) as well as
digital/analog external I/O. This way, an mREDAC is basically the smallest
standalone unit of REDAC.


\subsection{iREDAC level}
\label{\detokenize{developer/architecture:iredac-level}}\label{\detokenize{developer/architecture:iredac-architecture}}
\sphinxAtStartPar
iREDAC stands for \sphinxstyleemphasis{intermediate} or \sphinxstyleemphasis{interconnecting} REDAC. At this level,
seven mREDAC units are connected to a single backpanel. Interconnection
is enabled by means of several \sphinxcode{\sphinxupquote{T}} blocks. Furthermore, several digital
busses on the back panel enable the orchestration and in particular
synchronization of the mREDACs. The iREDAC comes in a modular 19” rack\sphinxhyphen{}mounted
blade\sphinxhyphen{}style appearance where mREDACs can be conveniently accessed from the front
for maintenance purpose.


\subsection{REDAC level}
\label{\detokenize{developer/architecture:redac-level}}
\sphinxAtStartPar
The whole REDAC system is composed by order of magnitude 10 iREDAC units.
The large number of microcontrollers are steered by a single \sphinxstyleemphasis{supercontroller}
(in short \sphinxstyleemphasis{SC}).
This term refers both to the hardware (a single server grade computer) and a
particular networking software which serves as single end point for all analog
parts of REDAC. From the hardware perspective, the REDAC further contains
Ethernet/IP administration (in the simplest case one switch and one router).
From the software perspective, REDAC contains a managament interface ontop of
the SC which does job managament, user authorization, encryption, provides
API endpoints and custom software support such as compute intensive
circuit transpilation. For further information on the software architecture,
please refer to the {\hyperref[\detokenize{developer/intro:dev-intro}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Developer Manual}}}}}.


\section{Block reference}
\label{\detokenize{developer/architecture:block-reference}}
\sphinxAtStartPar
This section provides a reference of all function blocks within REDAC.
Typically, a \sphinxstyleemphasis{block} is realized as a DIMM form factor PCB. Furthermore,
typically every block is also an \sphinxstyleemphasis{entity} in the concept of the
REDAC hybrid controller (see \DUrole{xref}{\DUrole{std}{\DUrole{std-ref}{firmware documentation}}} for details).


\subsection{Cluster blocks}
\label{\detokenize{developer/architecture:cluster-blocks}}
\sphinxAtStartPar
All blocks within a single cluster are part of the compute path and
shown in figure \hyperref[\detokenize{developer/architecture:fig-lucidac-turbine-diagram}]{Fig.\@ \ref{\detokenize{developer/architecture:fig-lucidac-turbine-diagram}}}.
\begin{description}
\sphinxlineitem{\sphinxcode{\sphinxupquote{M0}} and \sphinxcode{\sphinxupquote{M1}} blocks}
\sphinxAtStartPar
M\sphinxhyphen{}blocks are \sphinxstyleemphasis{math blocks}. Each can have up to 8 analog input and 8
analog output signals. Math blocks contain various elements and allow
digital configuration of these elements. In contrast to classic
analog computers, there are no summers available as explicit
computing elements, as summation is done implicitly in the I\sphinxhyphen{}block.
This enhances the overall flexibility considerably. For details see
{\hyperref[\detokenize{developer/architecture:math-blocks}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Math blocks}}}}}.

\sphinxlineitem{\sphinxcode{\sphinxupquote{U}} block}
\sphinxAtStartPar
The output signals of these M\sphinxhyphen{}blocks are connected to the U\sphinxhyphen{}block
which contains a \(16\times32\) crossbar switch. Since the output
signals of the M\sphinxhyphen{}blocks are voltages, this crossbar switch can
distribute one signal to several outputs at once. It therefore serves
as a 16:32 fan\sphinxhyphen{}out, allowing to distribute the input signals
arbitrarily on 32 internal lanes within the UCI interconnection
matrix.

\sphinxlineitem{\sphinxcode{\sphinxupquote{C}} block}
\sphinxAtStartPar
These \(32\) output signals (still represented by voltages) are
then fed into the \sphinxstyleemphasis{coefficient block}. This contains \(32\)
digitally controlled coefficient potentiometers with \(11\) bits
resolution and an additional sign bit. Thus, the C\sphinxhyphen{}Block implements
one coefficient per lane by means of a multiplying DAC (a certain
type of digital analog converter). These coefficients allow scaling
of values with factors in the interval \([-1,1]\). The output of
these coefficients are now currents instead of voltages and feed the
I\sphinxhyphen{}block.

\sphinxlineitem{\sphinxcode{\sphinxupquote{I}} block}
\sphinxAtStartPar
Following the C\sphinxhyphen{}block is the I\sphinxhyphen{}block. It, too, is a crossbar switch,
this time with \(32\) inputs and \(16\) outputs. Working with
currents, it is now possible to implicitly sum several inputs, thus
eliminating the need for explicit summers as computing elements. The
\(16\) output lines of the I\sphinxhyphen{}block are connected to the inputs of
the computing elements contained on the M\sphinxhyphen{}blocks. The I\sphinxhyphen{}block also
features a programmable gain of either factor 1 or 10, allowing for a
broader dynamical range of the machine.

\sphinxlineitem{\sphinxcode{\sphinxupquote{SH}} block}
\sphinxAtStartPar
This block contains 16 \sphinxstyleemphasis{sample and hold} elements to correct offset
errors of the computing elements. It is transparent for the analog
signal path and only serves for signal conditioning. It is part of
the sophisticated error correction techniques of the LUCIDAC.

\end{description}


\subsection{mREDAC and iREDAC level blocks}
\label{\detokenize{developer/architecture:mredac-and-iredac-level-blocks}}\begin{description}
\sphinxlineitem{\sphinxcode{\sphinxupquote{CTRL}} block}
\sphinxAtStartPar
This block contains the \sphinxstyleemphasis{hybrid controller} based on the MCU. It is
responsible for setting up the computing elements, coefficient
potentiometers, crossbar switches. It also takes care of the
communication with the digital upstream computer (the \sphinxstyleemphasis{client} in a
networking setting or \sphinxstyleemphasis{host} in a USB setting). The control block
physically holds the MCU as well as eight analog to digital converters.

\sphinxlineitem{\sphinxcode{\sphinxupquote{T}} block}
\sphinxAtStartPar
This block is used for interconnecting clusters. The \sphinxcode{\sphinxupquote{T}} stands for
\sphinxstyleemphasis{tee piece} but also \sphinxstyleemphasis{topology} or \sphinxstyleemphasis{transparent}. One jokes that it
also stands for \sphinxstyleemphasis{Tricky} or \sphinxstyleemphasis{T\sphinxhyphen{}Rex}, given its highly regular yet
unintiuitive way of interconnecting a large number of analog
signals. The \sphinxcode{\sphinxupquote{T}} block is not part of a single cluster. Each mREDAC
has one \sphinxcode{\sphinxupquote{T}} block and each iREDAC backplane has three \sphinxcode{\sphinxupquote{T}} blocks.

\sphinxAtStartPar
Technically, a T\sphinxhyphen{}block provides 96 voltage coupled analog I/O that
go to 24 analog switches. Each switch is a 1\sphinxhyphen{}to\sphinxhyphen{}3 fanout or
3\sphinxhyphen{}to\sphinxhyphen{}1 fanin, depending on the information flow in the usage mode.

\end{description}


\subsection{Math blocks}
\label{\detokenize{developer/architecture:math-blocks}}\label{\detokenize{developer/architecture:id1}}
\sphinxAtStartPar
Despite the implicit summing in the networking topology, all linear and
nonlinear analog computation is performed on the Math blocks (M\sphinxhyphen{}blocks).
REDAC math blocks are modular and can be exchanged, despite this requires
opening the device.

\sphinxAtStartPar
A single cluster has slots for two math blocks. As of now there are two
types of M\sphinxhyphen{}blocks available:
\begin{description}
\sphinxlineitem{Integrator Math block \sphinxcode{\sphinxupquote{MInt}}}
\sphinxAtStartPar
contains eight integrators (each with one input with implicit
summing, one output). Integrators have an internal analog state (the
current integration value), a digital state (IC / OP / HALT state
machine), and a hybrid state (initial conditions and time scaling
factor \(k_0\)).

\sphinxlineitem{Multiplier Math block \sphinxcode{\sphinxupquote{MMul}}}
\sphinxAtStartPar
contains four multipliers (each with two implicit summing inputs, one
output). The four remaining outputs of this block are used as
identity elements. They can be used for more flexibility in the
connection topology.

\end{description}

\sphinxAtStartPar
In normal conditions, one cluster contains eight integrators and four multipliers.


\section{Digital Network}
\label{\detokenize{developer/architecture:digital-network}}
\sphinxAtStartPar
REDAC is truly a hybrid computer which not only features a sophisticated
configurable network between the analog computing elements but also a digital
network for system steering, operations and application data input/output.
Compared to the analog network, the digital network is much more “off the shelf”
in terms of concepts and ideas. For instance, for big throughput, REDAC
internally just uses ordinary fast ethernet. See also
{\hyperref[\detokenize{operator/network:opnetwork}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Internal network}}}}} in the operators manual for technical details about the Ethernet
realization and administration.

\sphinxAtStartPar
The digital networks in REDAC fall into two conceptual groups:
\begin{itemize}
\item {} 
\sphinxAtStartPar
Ethernet: General\sphinxhyphen{}purpose switching and blocking network, not supposed for low
latency but highly versatile when it comes to unconventional hybrid
algorithms and quick rebuilds.

\item {} 
\sphinxAtStartPar
Digital buses and signal lines: Real embedded and somewhat “custom”
digital signaling, typically only within our own PCBs. Most of the
time, unidirectionally steered by a single bus master and not time\sphinxhyphen{}multiplexed.

\end{itemize}

\begin{figure}[htbp]
\centering
\capstart

\noindent\sphinxincludegraphics{{digital-network}.png}
\caption{Highlevel overview about the REDAC digital network}\label{\detokenize{developer/architecture:id5}}\label{\detokenize{developer/architecture:fig-digital-network}}\end{figure}

\sphinxAtStartPar
Figure \hyperref[\detokenize{developer/architecture:fig-digital-network}]{Fig.\@ \ref{\detokenize{developer/architecture:fig-digital-network}}} provides a schematic overview about the
digital networking on the seperate hierarchy levels of REDAC. The conventional
REDAC\sphinxhyphen{}internal ethernet (colored in pink) spawns between
the Super Controller, Router and all microcontrollers (MCUs). On an application
level, it is never used to communicate directly between the MCUs but a
star toplogy is realized with the Super Controller in the center.

\sphinxAtStartPar
Within a single mREDAC, the multi\sphinxhyphen{}purpose digital bus is of biggest importance.
It has roughly 11 address lines and roughly 5 data lines.
The bidirectional bus always has the MCU as bus master and can
be used in principal for any communication protocol, despite almost all chips
speak (some dialect of) SPI. The bus is also extended to the iREDAC backplanes
so MCUs can locate themselves and do a full “zero\sphinxhyphen{}knowledge” detection of
adressable components at well\sphinxhyphen{}known address positions. Only for the first
mREDAC in an iREDAC blade, the bus also reaches to programmable parts on
the iREDAC level, which are for instance several T\sphinxhyphen{}blocks.

\sphinxAtStartPar
The sytem mode steering (IC/OP/HALT state machine) is realized in two concepts:
\begin{itemize}
\item {} 
\sphinxAtStartPar
Within a single mREDAC, the mode is steered/distributed by the MCU with direct digital
lines (GPIO outputs) at minimal latency

\item {} 
\sphinxAtStartPar
At iREDAC level and beyond, a custom “lowlevel subscriber scheme” is realized
in a high\sphinxhyphen{}speed serial protocol in order to realize dynamic OP\sphinxhyphen{}groups, i.e.
the dynamic partitioning of REDAC. This serial protocol is converted to the
parallel signal distribution at MCU level. This network is sometimes refered
to as \sphinxstyleemphasis{sync lines} since it allows multiple MCUs to synchronize their clocks over the
seperate low\sphinxhyphen{}latency network which is superior to Ethernet.

\end{itemize}

\sphinxAtStartPar
Note that the digital network within REDAC is not supposed to be configured by neither
developers nor operators. The custom digital buses have near to no configuration
options anyway. For instance, typically the SPI communication parameters are dictated
by the adressed chips (and can be looked up in the respective datasheets). Many parts
within digital REDAC are configurable, for instance with the many EEPROMs (Entity
concept) or with jumpers and dials. However, only hardware developers are supposed to
change these “hard wired” settings.


\section{Aquisition capabilities}
\label{\detokenize{developer/architecture:aquisition-capabilities}}
\sphinxAtStartPar
Each iREDAC provides 8 parallel ADC channels for analog to digital signal conversion.
These channels can be “hooked” onto any of the 24 computing element outputs.
Each ADC can theoretically provide 1 MSample/sec, whereas the practical limit is
currently about 0.5 MSample/sec. Therefore, as a rule of thumb, consider at
data requesting,

\begin{sphinxVerbatim}[commandchars=\\\{\}]
\PYG{n}{sampling\PYGZus{}rate} \PYG{o}{*} \PYG{n}{number\PYGZus{}of\PYGZus{}channels} \PYG{o}{\PYGZlt{}} \PYG{l+m+mi}{500\PYGZus{}000}
\end{sphinxVerbatim}

\sphinxAtStartPar
Where the \sphinxcode{\sphinxupquote{number\_of\_channels}} is between \sphinxcode{\sphinxupquote{0}} and \sphinxcode{\sphinxupquote{8}} and the \sphinxcode{\sphinxupquote{sampling\_rate}}
is an integer in units \sphinxcode{\sphinxupquote{samples / second}}. For the software interface, see
for instance the \sphinxhref{https://anabrid.dev/docs/pybrid/html/redac/commandline.html\#cmdoption-pybrid-redac-set-daq-r}{Sample rate option in pybrid} (https://anabrid.dev/docs/pybrid/html/redac/commandline.html\#cmdoption\sphinxhyphen{}pybrid\sphinxhyphen{}redac\sphinxhyphen{}set\sphinxhyphen{}daq\sphinxhyphen{}r).

\sphinxstepscope


\chapter{Software}
\label{\detokenize{developer/software:software}}\label{\detokenize{developer/software:dev-software}}\label{\detokenize{developer/software::doc}}
\sphinxAtStartPar
The REDAC’s software stack drives a distributed and heterogenous system of computers.
Figure \hyperref[\detokenize{developer/software:fig-software-redac-schema}]{Fig.\@ \ref{\detokenize{developer/software:fig-software-redac-schema}}} shows a high level overview of this
system.

\begin{figure}[htbp]
\centering
\capstart

\noindent\sphinxincludegraphics{{redac-software-block-diagram}.png}
\caption{Abstract software diagram of REDAC.}\label{\detokenize{developer/software:id1}}\label{\detokenize{developer/software:fig-software-redac-schema}}\end{figure}

\sphinxAtStartPar
The purpose of this section is to give a quick overview about the particular parts
and to refer to their respective documentation.
The following sections will go top down.


\section{Client Computers}
\label{\detokenize{developer/software:client-computers}}
\sphinxAtStartPar
On the customers or client computer, a small code is running, called the
\sphinxstyleemphasis{REST API client}. REDAC has an \sphinxstyleemphasis{OpenAPI} defined frontend which makes it
easy to explore the interaction methods programmatically and to generate client codes.

\sphinxAtStartPar
A reference implementation of this client is currently available in Python on the
official python package index at \sphinxhref{https://pypi.org/project/anabrid-redac-client/}{anabrid\sphinxhyphen{}redac\sphinxhyphen{}client} (https://pypi.org/project/anabrid\sphinxhyphen{}redac\sphinxhyphen{}client/).
Getting this code started is part of the {\hyperref[\detokenize{user/first_steps:first-steps}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Getting started}}}}} section in the users
guide. This code is supposed to be open sourced at Github. Further clients shall
be generated in more programming languages in order to make it easy to operate with
REDAC from various settings.


\section{Software on the SuperController}
\label{\detokenize{developer/software:software-on-the-supercontroller}}
\sphinxAtStartPar
The \sphinxstyleemphasis{SuperController} is mastering the internal network (see also section {\hyperref[\detokenize{operator/network:opnetwork}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Internal network}}}}}
in the operators guide). The name \sphinxstyleemphasis{SuperController} refers both to the physical server
as well as to a major software component which manages the embedded hybrid controllers.
See also section {\hyperref[\detokenize{operator/services:opservices}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Services}}}}} in the operators manual for a description how to
manage this software from a devops perspective.


\subsection{Redaccess (Middleware)}
\label{\detokenize{developer/software:redaccess-middleware}}\label{\detokenize{developer/software:redaccess}}
\sphinxAtStartPar
At the interface between the SC and the REDAC public access is a lot of middleware
codes which are not meant to be released as open source.  Most notable is the
\sphinxstyleemphasis{Redaccess} code. It orchestrates a dockerized infrastructure containing parts
such as the \sphinxhref{https://redis.io/}{Redis} (https://redis.io/) and \sphinxhref{https://www.postgresql.org/}{PostgreSQL} (https://www.postgresql.org/)
databases or the \sphinxhref{https://www.rabbitmq.com/}{RabbitMQ} (https://www.rabbitmq.com/) broker. Furthermore, part
of the software stack is an OpenID provider (\sphinxhref{https://www.keycloak.org/}{Keycloak} (https://www.keycloak.org/)),
all running on standard server hardware and software, see the operator’s manual
on {\hyperref[\detokenize{operator/network:opnetwork}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Internal network}}}}} for details.

\sphinxAtStartPar
REDAC is equipped with a number of supplementary software for monitoring or enhancing
user experience, such as a little landing website or a \sphinxhref{https://jupyter.org/hub}{JupyterHub} (https://jupyter.org/hub)
instance. However, none of these services are part of the core functionality and
not neccessarily run on hardware directly related to REDAC.


\subsection{Pybrid Proxy}
\label{\detokenize{developer/software:pybrid-proxy}}\label{\detokenize{developer/software:pybrid}}
\sphinxAtStartPar
The REDAC\sphinxhyphen{}internal ethernet/IP network with its hunderds of microcontrollers is
centrally managed by the \sphinxstyleemphasis{Pybrid Proxy} software. The tasks of this software are
the following:
\begin{itemize}
\item {} 
\sphinxAtStartPar
Application level proxy which provides a single entrypoint at TCP port \sphinxcode{\sphinxupquote{5732}}
speaking the firmware JSONL\sphinxhyphen{}protocol, effectively resembling a “big virtual
hybrid controller”. This means it has to distribute incoming queries to the
relevant microcontrollers and collect their replies again.

\item {} 
\sphinxAtStartPar
Doing all the bookkeeping and resolving logical device addresses (encoding their
positiong in the connectivity graph) to physical devices (encoding their actual
addressing in the digital network, i.e. by MAC and IP address).

\item {} 
\sphinxAtStartPar
Zookeping: Monitoring and scanning available mREDACs or their microcontrollers,
respectively. Ensuring the relevant firmware is available and updating it when
needed. Steering the power and turning off parts of the system which are not
needded. Monitoring their health for instance by polling the temperature sensors
available in the system.

\item {} 
\sphinxAtStartPar
Organization of \sphinxstyleemphasis{run groups} by means of steering a system wide digital bus which
is currently USB\sphinxhyphen{}connected to the server.

\end{itemize}

\sphinxAtStartPar
Pybrid is written in asynchronous python and documented at
\sphinxurl{https://anabrid.dev/docs/pybrid/}. The code forms the \sphinxstyleemphasis{digital frontend}
to all analog circuitery. In regular use, this code should be the only software
which communicates with the embedded controllers directly.


\section{Firmware on Microcontrollers}
\label{\detokenize{developer/software:firmware-on-microcontrollers}}\label{\detokenize{developer/software:firmware}}
\sphinxAtStartPar
REDAC has a hierarchical design where on the lowest level ({\hyperref[\detokenize{developer/architecture:mredac-architecture}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{mREDAC level}}}}})
there are microcontrollers (MCU) with similiar firmware images. The following diagram
\hyperref[\detokenize{developer/software:fig-firmware-redac-schema}]{Fig.\@ \ref{\detokenize{developer/software:fig-firmware-redac-schema}}}
provides an overview of the firmware architecture, with a focus on the communication.

\begin{figure}[htbp]
\centering
\capstart

\noindent\sphinxincludegraphics{{modes-of-communication4}.png}
\caption{REDAC embedded hybrid controller firmware architecture}\label{\detokenize{developer/software:id2}}\label{\detokenize{developer/software:fig-firmware-redac-schema}}\end{figure}

\sphinxAtStartPar
It is important to note that end users \sphinxstylestrong{never} directly communicate with the embedded
controllers. Even the direct contact to the SuperController is prohibited by the
intermediate software.

\sphinxAtStartPar
Despite the MCUs are actually interchangable, REDAC is equipped with 600Mhz 32bit ARM
Cortex\sphinxhyphen{}M7 single core
\sphinxhref{https://www.pjrc.com/teensy/}{Teensy 4.1 development boards} (https://www.pjrc.com/teensy/). The firmware is
developed as a \sphinxhref{https://platformio.org/}{PlatformIO} (https://platformio.org/) project and is huge: It contains
more then 20,000 lines of code in dozens of folders. The firmware has been
open sourced in the past at \sphinxurl{https://github.com/anabrid/lucidac-firmware/} and
is intensively documented at \sphinxurl{https://anabrid.dev/docs/lucidac-firmware/sphinx/dirhtml/}.

\sphinxstepscope


\chapter{Usage modes}
\label{\detokenize{developer/modes:usage-modes}}\label{\detokenize{developer/modes::doc}}
\sphinxAtStartPar
The REDAC system is still in development, and thus are the usage modes.
Despite we have a single user mode in mind which solely goes via a single
entrypoint, which does scheduling, load balancing and the like, in special
situations a number of different usage modes are supported in the moment.
A graphical overview in a block schema diagram is provided in
\hyperref[\detokenize{developer/modes:fig-usage-modes}]{Fig.\@ \ref{\detokenize{developer/modes:fig-usage-modes}}} and subsequentialy discussed.

\begin{figure}[htbp]
\centering
\capstart

\noindent\sphinxincludegraphics[width=0.600\linewidth]{{usage-modes}.png}
\caption{The different inofficial user access variants for REDAC}\label{\detokenize{developer/modes:id1}}\label{\detokenize{developer/modes:fig-usage-modes}}\end{figure}


\section{Queue access}
\label{\detokenize{developer/modes:queue-access}}
\sphinxAtStartPar
The primary access is indirected by the {\hyperref[\detokenize{developer/software:redaccess}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Redaccess (Middleware)}}}}} via HTTP and
REST. This way, ordinary encrypted HTTPS can be used and the regular
{\hyperref[\detokenize{operator/auth:opauth}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Authentification}}}}} methods can be employed. Therefore, this access method is the
only one which is advertised in the REDAC user manual.


\section{Immediate SuperController access}
\label{\detokenize{developer/modes:immediate-supercontroller-access}}
\sphinxAtStartPar
The immediate mode access to the {\hyperref[\detokenize{developer/software:pybrid}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Pybrid Proxy}}}}} is technically only possible
when being within the {\hyperref[\detokenize{operator/network:opnetwork}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Internal network}}}}}. This is for instance possible via
a VPN solution or with appropriate firewall rules from outside. It is
important to note that in this mode, no user authentification is applied,
computing time is not accounted and the TCP connection to the SuperController
is not encrypted. Furthermore, the protocol is no more HTTP but the specific
JSONL protocol which is documented in the pybrid and firmware documentations.

\sphinxAtStartPar
This immediate mode can be interesting for debugging, for experienced users,
in particular single system users. Users are suggested to use the \sphinxcode{\sphinxupquote{pybrid}}
python package to connect to the pybrid proxy.


\section{Immediate Microcontroller access}
\label{\detokenize{developer/modes:immediate-microcontroller-access}}
\sphinxAtStartPar
In this variant, even the SuperController is short\sphinxhyphen{}circuited and users
directly access the mREDAC\sphinxhyphen{}embedded microcontrollers. This is possible if
users are part of the {\hyperref[\detokenize{operator/network:opnetwork}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Internal network}}}}} (see previous section). However, as
a drawback to the immediate SuperController access, in this mode users
can not make use of the global synchronization line. That means that
synchronized computations accross more then a single mREDAC are not possible.

\sphinxAtStartPar
This kind of access is strongly discouraged whenever any part of the higher
level software abstraction is active, i.e. even if the pybrid proxy is active.
If users want to make use of this access mode, they should use the \sphinxcode{\sphinxupquote{pybrid}} or
\sphinxcode{\sphinxupquote{lucipy}} sofware packages in order to address the mREDAC boards.


\section{JupyterHub/Browser access}
\label{\detokenize{developer/modes:jupyterhub-browser-access}}
\sphinxAtStartPar
JupyterHub is a hosted computation software provided by {\hyperref[\detokenize{operator/anabrid:opanabrid}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Anabrid Operations}}}}}.
It is basically a hybrid mode which allows all kind of uses. It combines
a number of advantages:
\begin{itemize}
\item {} 
\sphinxAtStartPar
User does not need to install any software/development environment locally.
He finds the open source scientific programming environment \sphinxstyleemphasis{jupyter} readily
available in browser, comparable to Matlab.

\item {} 
\sphinxAtStartPar
Regular queue access is possible

\item {} 
\sphinxAtStartPar
However, also direct access is possible if neccessary since the instance
has access to the REDAC internal network.

\end{itemize}

\sphinxstepscope


\chapter{Hardware}
\label{\detokenize{developer/hardware:hardware}}\label{\detokenize{developer/hardware:dev-hardware}}\label{\detokenize{developer/hardware::doc}}
\sphinxAtStartPar
REDAC consists of a large number of custom printed circuit boards (PCB) designs made
by anabrid. The \sphinxhref{https://www.kicad.org/}{KiCad EDA} (https://www.kicad.org/) software was used to produce
the schematics and layouts. The PCBs host carefully selected third party analog,
digital or mixed signal chips. Next to PCBs, REDAC consists of metal support structures
in standard industry format (DIN subrack kits, IEC 60529) made of aluminium or steel
as well as industry\sphinxhyphen{}standard cable/connectors of various types.

\sphinxAtStartPar
The whole schematics of the REDAC computer require roughly
200 to 300 pages when being printed out. The circuits are versioned, this versioning is
carefully tracked in the firmware development so there are lowlevel “drivers” for
every piece of hardware developed (despite, of course, old hardware revisions are typically
deprecated).

\sphinxAtStartPar
Some REDAC circuits have international patents granted or pending.

\sphinxAtStartPar
Readers interested in the REDAC hardware should read the high\sphinxhyphen{}level description of
{\hyperref[\detokenize{developer/architecture:architecture}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Architecture Reference}}}}} first. It is important to note that, despite being modular, the
whole REDAC system should be seen as a unity. This means that when dealing with a
complex system such as REDAC from a hardware perspective, one must assume \sphinxstyleemphasis{leaky
abstraction} or a \sphinxstyleemphasis{violation of seperation of concerns}. For instance, despite an
{\hyperref[\detokenize{developer/architecture:iredac-architecture}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{iREDAC}}}}} should be an independent unit standing for itself,
in REDAC several iREDACs are steered by a single digital SuperController and thus
there is certain interdependence. The same might be true due to shared power supplies,
for instance.

\sphinxAtStartPar
For schematics access, please contact the person who is/was responsible for purchasing your
REDAC setup, your administrator/operator or the manufacturer,
\sphinxhref{https://anabrid.com/contact}{anabrid} (https://anabrid.com/contact).

\sphinxstepscope


\chapter{Appendix}
\label{\detokenize{developer/appendix:appendix}}\label{\detokenize{developer/appendix::doc}}

\section{On the REDAC handbook}
\label{\detokenize{developer/appendix:on-the-redac-handbook}}
\sphinxAtStartPar
Most of the developers manual is about \sphinxstyleemphasis{external} documentation and material, in
particular in the {\hyperref[\detokenize{developer/software:dev-software}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Software}}}}} section but also the {\hyperref[\detokenize{developer/hardware:dev-hardware}]{\sphinxcrossref{\DUrole{std}{\DUrole{std-ref}{Hardware}}}}}
section. In contrast, this section is all about the REDAC manual itself, i.e.
this documentation.

\sphinxAtStartPar
Technically, this is a documentation made with \sphinxhref{https://www.sphinx-doc.org/}{Sphinx} (https://www.sphinx\sphinxhyphen{}doc.org/).
This allows a single \sphinxhref{https://docutils.sourceforge.io/rst.html}{reStructuredText} (https://docutils.sourceforge.io/rst.html) base
to be generated to interactive HTML websites as well as printable Latex PDFs.


\subsection{About the versions}
\label{\detokenize{developer/appendix:about-the-versions}}\label{\detokenize{developer/appendix:about-versions}}
\sphinxAtStartPar
This documentation is versioned because it is improved over the time. You are currently
viewing the document release v1.2\sphinxhyphen{}NN\sphinxhyphen{}g6c40c3c from Aug 21, 2025.

\sphinxAtStartPar
This version string is compatible to \sphinxhref{https://git-scm.com/docs/git-describe\#\_examples}{git describe} (https://git\sphinxhyphen{}scm.com/docs/git\sphinxhyphen{}describe\#\_examples),
i.e. it reads something like \sphinxcode{\sphinxupquote{v1.2.3\sphinxhyphen{}NN\sphinxhyphen{}g1234567}}. Here, \sphinxcode{\sphinxupquote{v1.2.3}} refers to the
actual version whereas the suffix \sphinxcode{\sphinxupquote{\sphinxhyphen{}NN\sphinxhyphen{}g1234567}} is only there if this version is
actually \sphinxstyleemphasis{unnamed} and follows after \(N\) commits after the versioned commit.
The actual git shorthash is then suffixed after the \sphinxcode{\sphinxupquote{\sphinxhyphen{}g}}.


\section{List of Abbreviations}
\label{\detokenize{developer/appendix:list-of-abbreviations}}\begin{quote}\begin{description}
\sphinxlineitem{REDAC}
\sphinxAtStartPar
REConfigurable Analog Computer

\sphinxlineitem{Model\sphinxhyphen{}1}
\sphinxAtStartPar
Analog Paradigm Model\sphinxhyphen{}1 Computer

\sphinxlineitem{INT}
\sphinxAtStartPar
Integrator

\sphinxlineitem{INV}
\sphinxAtStartPar
Inverter

\sphinxlineitem{MULT}
\sphinxAtStartPar
Multiplier

\sphinxlineitem{DIMM}
\sphinxAtStartPar
Dual Inline Memory Module (Form factor for PCBs)

\sphinxlineitem{DDR}
\sphinxAtStartPar
Double Data Rate

\sphinxlineitem{DDA}
\sphinxAtStartPar
Digital Differential Analyzer

\sphinxlineitem{ACN}
\sphinxAtStartPar
Analog Compute Node

\sphinxlineitem{CN}
\sphinxAtStartPar
Compute Node

\sphinxlineitem{XBAR}
\sphinxAtStartPar
Crosspoint\sphinxhyphen{}switch / Crossbar\sphinxhyphen{}switch

\sphinxlineitem{AD}
\sphinxAtStartPar
Analog Digital

\sphinxlineitem{DA}
\sphinxAtStartPar
Digital Analog

\sphinxlineitem{AC}
\sphinxAtStartPar
Alternating Current

\sphinxlineitem{DC}
\sphinxAtStartPar
Direct Current

\sphinxlineitem{DC/DC}
\sphinxAtStartPar
DC\sphinxhyphen{}to\sphinxhyphen{}DC Converter (Power Supply)

\sphinxlineitem{DAC}
\sphinxAtStartPar
Digital to Analog Converter

\sphinxlineitem{MDAC}
\sphinxAtStartPar
Multiplying Digital to Analog Converter

\sphinxlineitem{ADC}
\sphinxAtStartPar
Analog to Digital Converter

\sphinxlineitem{DPT}
\sphinxAtStartPar
Digital Potentiometer

\sphinxlineitem{LSB}
\sphinxAtStartPar
Least Significant Bit

\sphinxlineitem{INL}
\sphinxAtStartPar
Integral Nonlinearity

\sphinxlineitem{DNL}
\sphinxAtStartPar
Differential Nonlinearity

\sphinxlineitem{VDD}
\sphinxAtStartPar
Drain Power Voltage

\sphinxlineitem{CMOS}
\sphinxAtStartPar
Complementary Metal\sphinxhyphen{}Oxide\sphinxhyphen{}Semiconductor

\sphinxlineitem{NMOS}
\sphinxAtStartPar
N\sphinxhyphen{}type Metal\sphinxhyphen{}Oxide\sphinxhyphen{}Semiconductor

\sphinxlineitem{PMOS}
\sphinxAtStartPar
P\sphinxhyphen{}type Metal\sphinxhyphen{}Oxide\sphinxhyphen{}Semiconductor

\sphinxlineitem{PCB}
\sphinxAtStartPar
Printed Circuit Board (Electronic Circuit Board)

\sphinxlineitem{IC}
\sphinxAtStartPar
Integrated Circuit or Initial Condition (depending on context)

\sphinxlineitem{OP}
\sphinxAtStartPar
Operating Mode

\sphinxlineitem{HALT}
\sphinxAtStartPar
Halting Mode

\sphinxlineitem{AMP}
\sphinxAtStartPar
(Operational) Amplifier

\sphinxlineitem{OPA}
\sphinxAtStartPar
Operational Amplifier

\sphinxlineitem{OPV}
\sphinxAtStartPar
Operational Amplifier

\sphinxlineitem{SMD}
\sphinxAtStartPar
Surface Mount Device

\sphinxlineitem{SOIC}
\sphinxAtStartPar
Small Outline Integrated Circuit

\sphinxlineitem{TSSOP}
\sphinxAtStartPar
Thin Shrink Small Outline Package

\sphinxlineitem{VSSOP}
\sphinxAtStartPar
Very Thin Shrink Small Outline Package

\sphinxlineitem{GBP}
\sphinxAtStartPar
Great Britain Pound

\sphinxlineitem{PT1}
\sphinxAtStartPar
First Order System with One Pole

\sphinxlineitem{GND}
\sphinxAtStartPar
Ground

\sphinxlineitem{RRO}
\sphinxAtStartPar
Rail to Rail Output

\sphinxlineitem{RRI}
\sphinxAtStartPar
Rail to Rail Input

\sphinxlineitem{CM}
\sphinxAtStartPar
Common Mode

\sphinxlineitem{SR}
\sphinxAtStartPar
Slewrate

\sphinxlineitem{GBW}
\sphinxAtStartPar
Gain Bandwidth (Product)

\sphinxlineitem{MUX}
\sphinxAtStartPar
Multiplexer

\sphinxlineitem{SPST}
\sphinxAtStartPar
Single Pole Single Throw

\sphinxlineitem{SPDT}
\sphinxAtStartPar
Single Pole Dual Throw

\sphinxlineitem{SPI}
\sphinxAtStartPar
Serial Peripheral Interface

\sphinxlineitem{M\sphinxhyphen{}Block}
\sphinxAtStartPar
Math Block

\sphinxlineitem{U\sphinxhyphen{}Block}
\sphinxAtStartPar
Voltage Block

\sphinxlineitem{C\sphinxhyphen{}Block}
\sphinxAtStartPar
Coefficient Block

\sphinxlineitem{I\sphinxhyphen{}Block}
\sphinxAtStartPar
Current Block

\sphinxlineitem{T\sphinxhyphen{}Block}
\sphinxAtStartPar
Topology Block

\sphinxlineitem{FDT}
\sphinxAtStartPar
Feedthrough

\sphinxlineitem{XTALK}
\sphinxAtStartPar
Crosstalk

\sphinxlineitem{PPV}
\sphinxAtStartPar
Perturbation Projection Vector

\sphinxlineitem{NP}
\sphinxAtStartPar
Nondeterministic Polynomial (Complexity Context)

\sphinxlineitem{P}
\sphinxAtStartPar
Polynomial (Complexity Context)

\sphinxlineitem{MPDE}
\sphinxAtStartPar
Multi\sphinxhyphen{}Time Partial Differential Equation

\sphinxlineitem{PDE}
\sphinxAtStartPar
Partial Differential Equation

\sphinxlineitem{pDGL}
\sphinxAtStartPar
Partial Differential Equation (German: Partielle Differentialgleichung)

\sphinxlineitem{DMA}
\sphinxAtStartPar
Direct Memory Access

\sphinxlineitem{HC}
\sphinxAtStartPar
Hybrid Controller

\sphinxlineitem{CU}
\sphinxAtStartPar
Control Unit

\sphinxlineitem{FlexIO}
\sphinxAtStartPar
Flexible Input and Output Peripheral (NXP)

\sphinxlineitem{GPIO}
\sphinxAtStartPar
General Purpose Input and Output Pins/Ports

\sphinxlineitem{CLK}
\sphinxAtStartPar
Clock Signal in Serial Interfaces (e.g., SPI)

\sphinxlineitem{MISO}
\sphinxAtStartPar
Master In, Slave Out (SPI Data Line)

\sphinxlineitem{MOSI}
\sphinxAtStartPar
Master Out, Slave In (SPI Data Line)

\sphinxlineitem{CS}
\sphinxAtStartPar
Chip Select (SPI Signal Line)

\sphinxlineitem{CNVST}
\sphinxAtStartPar
Conversion Start Signal of an ADC

\sphinxlineitem{PWM}
\sphinxAtStartPar
Pulse Width Modulation

\sphinxlineitem{CMP}
\sphinxAtStartPar
Comparator

\end{description}\end{quote}


\section{Glossary}
\label{\detokenize{developer/appendix:glossary}}\begin{description}
\sphinxlineitem{Backplane\index{Backplane@\spxentry{Backplane}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Backplane}}}
\sphinxAtStartPar
A circuit board for housing and connecting carrier modules. The circuit board is the defining element of the iREDAC.

\sphinxlineitem{Carrier Module\index{Carrier Module@\spxentry{Carrier Module}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Carrier-Module}}}
\sphinxAtStartPar
A circuit board with DIMM slots and a VG strip: accommodates functional blocks and the CTRL block. This board is the defining element of the mREDAC and LUCIDAC.

\sphinxlineitem{Cluster\index{Cluster@\spxentry{Cluster}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Cluster}}}
\sphinxAtStartPar
2x M\sphinxhyphen{}, 1x U\sphinxhyphen{}, 1x C\sphinxhyphen{}, 1x I\sphinxhyphen{}Block.

\sphinxlineitem{Carrier Module Prototype\index{Carrier Module Prototype@\spxentry{Carrier Module Prototype}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Carrier-Module-Prototype}}}
\sphinxAtStartPar
1x Cluster and 1 CTRL\sphinxhyphen{}Block on a carrier module (=LUCIDAC, but not explicitly mentioned).

\sphinxlineitem{REDAC Carrier Module\index{REDAC Carrier Module@\spxentry{REDAC Carrier Module}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-REDAC-Carrier-Module}}}
\sphinxAtStartPar
3x Clusters and 1 CTRL\sphinxhyphen{}Block on a carrier module.

\sphinxlineitem{Functional Block\index{Functional Block@\spxentry{Functional Block}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Functional-Block}}}
\sphinxAtStartPar
General term for M\sphinxhyphen{}, U\sphinxhyphen{}, C\sphinxhyphen{}, I\sphinxhyphen{}Block.

\sphinxlineitem{CTRL\sphinxhyphen{}Block\index{CTRL\sphinxhyphen{}Block@\spxentry{CTRL\sphinxhyphen{}Block}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-CTRL-Block}}}
\sphinxAtStartPar
Control block: Interface between analog switching technology and digital computer.

\sphinxlineitem{Cluster\index{Cluster@\spxentry{Cluster}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-0}}}
\sphinxAtStartPar
2x M\sphinxhyphen{}, 1x U\sphinxhyphen{}, 1x C\sphinxhyphen{}, 1x I\sphinxhyphen{}Block.

\sphinxlineitem{M\sphinxhyphen{}/U\sphinxhyphen{}/C\sphinxhyphen{}/I\sphinxhyphen{}Block\index{M\sphinxhyphen{}/U\sphinxhyphen{}/C\sphinxhyphen{}/I\sphinxhyphen{}Block@\spxentry{M\sphinxhyphen{}/U\sphinxhyphen{}/C\sphinxhyphen{}/I\sphinxhyphen{}Block}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-M-U-C-I-Block}}}
\sphinxAtStartPar
Mathematical or computing element, voltage coupling, coefficient, current coupling block.

\end{description}
\begin{description}
\sphinxlineitem{Configuration, Circuit, Program\index{Configuration, Circuit, Program@\spxentry{Configuration, Circuit, Program}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Configuration-Circuit-Program}}}
\sphinxAtStartPar
A data record that fully describes the analog interconnection of the REDAC. In the case of mREDAC, this primarily includes the UCI configuration, MIntConfig, and UBlockAltSignals. The UCI configuration can be represented in different matrix\sphinxhyphen{}like conventions or as a list of routes. See also specializations below, such as Irreducible Configuration or Cluster Configuration.

\sphinxlineitem{Interconnection Configuration\index{Interconnection Configuration@\spxentry{Interconnection Configuration}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Interconnection-Configuration}}}
\sphinxAtStartPar
(As an alternative or German equivalent to “Configuration, Circuit, Program,” or at least a preferred term in the report)
A specific interconnection between virtual or real computing elements. In current usage, it is unclear whether the configurations (e.g., initial values) of the elements are included, but they actually should be.

\sphinxlineitem{Cluster Configuration\index{Cluster Configuration@\spxentry{Cluster Configuration}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Cluster-Configuration}}}
\sphinxAtStartPar
A restriction of the configuration, e.g., to a single cluster.

\sphinxlineitem{Setting, Adjustments (but not: Configuration)\index{Setting, Adjustments (but not: Configuration)@\spxentry{Setting, Adjustments}\spxextra{but not: Configuration}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Setting-Adjustments-but-not-Configuration}}}
\sphinxAtStartPar
(Typically user\sphinxhyphen{}configurable runtime) settings in the Teensy that affect only the functionality of the Teensy itself and not the mREDAC configuration, i.e., the analog circuit. An example is the IP address of the Teensy.

\sphinxAtStartPar
Note: A setting is something the administrator sets. A config is something the user sets.

\sphinxlineitem{Lane\index{Lane@\spxentry{Lane}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Lane}}}
\sphinxAtStartPar
One of 32 lines through the UCI block: Leads from a U\sphinxhyphen{}block output through a DPT into an I\sphinxhyphen{}block input.
As a data type, a lane is an integer in the range {[}0,31{]}.
Also called a UCI lane.

\sphinxAtStartPar
The term “Lane Index” should be avoided; a lane always refers to an index.

\sphinxlineitem{Crosslane, short: Clane\index{Crosslane, short: Clane@\spxentry{Crosslane, short: Clane}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Crosslane-short-Clane}}}
\sphinxAtStartPar
One of 16 lines leading from the MBlock into the UBlock or from the IBlock back into the MBlock.

\sphinxAtStartPar
The term “clane index” should be avoided; a clane always refers to an index.

\sphinxlineitem{(Physical) Route\index{(Physical) Route@\spxentry{(Physical) Route}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Physical-Route}}}
\sphinxAtStartPar
4\sphinxhyphen{}tuple: (uin, uout, cval, iout), where uin and iout are crosslanes and uout is a lane. cval is a coefficient value (float in the range {[}\sphinxhyphen{}20,+20{]}). There are a maximum of 32 routes in the mREDAC.

\sphinxAtStartPar
The iout value in a route is optional, as it can also lead to a virtual output (see below).

\sphinxlineitem{Compute Element, Element Description\index{Compute Element, Element Description@\spxentry{Compute Element, Element Description}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Compute-Element-Element-Description}}}
\sphinxAtStartPar
A type description of a computing element, i.e., it describes the name and inputs/outputs but not the internal structure or behavior.

\sphinxlineitem{Element Name\index{Element Name@\spxentry{Element Name}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Element-Name}}}
\sphinxAtStartPar
By convention, the following computing element names are used in mREDAC: Mul, Int, Daq, Extout, Extin, Const, Pot.

\sphinxlineitem{Physical Compute Element\index{Physical Compute Element@\spxentry{Physical Compute Element}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Physical-Compute-Element}}}
\sphinxAtStartPar
A computing element in the M\sphinxhyphen{}Block or C\sphinxhyphen{}Block, currently Int, Mult, and Coeff. The term refers to an abstract element, i.e., its type (structure/behavior) and not where it is located in the computer.

\sphinxlineitem{Virtual Compute Element\index{Virtual Compute Element@\spxentry{Virtual Compute Element}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Virtual-Compute-Element}}}
\sphinxAtStartPar
A computing element that cannot be physically localized cleanly, currently including External Inputs, External Outputs, DAQ Outputs, Constant Generators, and (arguably) Summators.

\sphinxlineitem{Stateful Compute Element\index{Stateful Compute Element@\spxentry{Stateful Compute Element}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Stateful-Compute-Element}}}
\sphinxAtStartPar
In general, compute elements are stateless. In mREDAC, only integrators and potentiometers have an internal state, and their types contain information such as IC, k0, or coeff\sphinxhyphen{}value.

\sphinxlineitem{Source, Output Compute Element\index{Source, Output Compute Element@\spxentry{Source, Output Compute Element}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Source-Output-Compute-Element}}}
\sphinxAtStartPar
A monadic compute element with no output, i.e., a compute element with an empty input\sphinxhyphen{}port list and an output\sphinxhyphen{}port list containing only one element, conventionally called “source.” In mREDAC, these include External Input elements or constants.

\sphinxAtStartPar
All source elements in mREDAC are necessarily virtual computing elements.

\sphinxlineitem{Sink, Input Compute Element\index{Sink, Input Compute Element@\spxentry{Sink, Input Compute Element}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Sink-Input-Compute-Element}}}
\sphinxAtStartPar
The opposite of a source. In mREDAC, these are, for example, DAQ Output elements.

\sphinxAtStartPar
All sink elements in mREDAC are necessarily virtual computing elements.

\sphinxlineitem{Compute Element Port\index{Compute Element Port@\spxentry{Compute Element Port}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Compute-Element-Port}}}
\sphinxAtStartPar
Each computing element has a list of inputs and outputs. Entries in this list are called “ports.” By convention, monadic compute elements have only an “in” and an “out” port. Dyadic compute elements conventionally have “a” and “b” ports as outputs.

\sphinxlineitem{Assigned (Physical/Virtual) Compute Element\index{Assigned (Physical/Virtual) Compute Element@\spxentry{Assigned (Physical/Virtual) Compute Element}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Assigned-Physical-Virtual-Compute-Element}}}
\sphinxAtStartPar
A computing element localized in the system: Typically, computing elements can be described by an index (in mREDAC) or by a hierarchical device\sphinxhyphen{}tree\sphinxhyphen{}like structure (in REDAC).

\sphinxlineitem{Virtual/Physical Assigned Compute Element Port\index{Virtual/Physical Assigned Compute Element Port@\spxentry{Virtual/Physical Assigned Compute Element Port}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Virtual-Physical-Assigned-Compute-Element-Port}}}
\sphinxAtStartPar
A combination of the above concepts, meaning a localized port of a specific computing element in the system. This concept also applies to virtual computing elements, which are simply numbered.

\sphinxlineitem{Virtual Route, also: Logical Connection\index{Virtual Route, also: Logical Connection@\spxentry{Virtual Route, also: Logical Connection}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Virtual-Route-also-Logical-Connection}}}
\sphinxAtStartPar
An unrouted route that connects two virtual (typically assigned) compute element ports.

\sphinxlineitem{Logical Route\index{Logical Route@\spxentry{Logical Route}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Logical-Route}}}
\sphinxAtStartPar
A virtual route after Pick \& Place, meaning it has, in the case of mREDAC, one or more candidate lanes assigned.

\sphinxlineitem{Auxiliary Block Configuration\index{Auxiliary Block Configuration@\spxentry{Auxiliary Block Configuration}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Auxiliary-Block-Configuration}}}
\sphinxAtStartPar
Something like U\sphinxhyphen{}Block\sphinxhyphen{}Alt\sphinxhyphen{}Signals or MInt\sphinxhyphen{}Block configurations.

\sphinxlineitem{Irreducible Configuration\index{Irreducible Configuration@\spxentry{Irreducible Configuration}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Irreducible-Configuration}}}
\sphinxAtStartPar
Description of the UCI matrix with as few degrees of freedom/variants as possible. This is either a description as a route list or as three U/C/I lists, all of which are input\sphinxhyphen{}centric.

\sphinxlineitem{Input\sphinxhyphen{}Centric Configuration, Output\sphinxhyphen{}Centric Configuration\index{Input\sphinxhyphen{}Centric Configuration, Output\sphinxhyphen{}Centric Configuration@\spxentry{Input\sphinxhyphen{}Centric Configuration, Output\sphinxhyphen{}Centric Configuration}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Input-Centric-Configuration-Output-Centric-Configuration}}}
\sphinxAtStartPar
Describes different ways to represent (linearize) UCI matrices. In the U\sphinxhyphen{}Block, the adjacency list of the U\sphinxhyphen{}Matrix is simultaneously an input\sphinxhyphen{}centric configuration and thus irreducible, as it is a simple list. In the I\sphinxhyphen{}Block, it is an output\sphinxhyphen{}centric configuration and thus a list of lists that can be represented as an input\sphinxhyphen{}centric one.

\sphinxlineitem{MBlock Setup\index{MBlock Setup@\spxentry{MBlock Setup}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-MBlock-Setup}}}
\sphinxAtStartPar
Describes which type of MBlocks sit in which MBlock slots. In the simplest case, this is a mapping of slot indices/coordinates to MBlock types.

\sphinxlineitem{Routing Error\index{Routing Error@\spxentry{Routing Error}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Routing-Error}}}
\sphinxAtStartPar
Description of a result of a compilation step.

\sphinxlineitem{Physical Routing\index{Physical Routing@\spxentry{Physical Routing}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Physical-Routing}}}
\sphinxAtStartPar
Result of the P\&R compilation step. The result includes not only physical routes but also a list of potential routing errors and the U\sphinxhyphen{}Alt\sphinxhyphen{}Block allocation.

\sphinxlineitem{SendEnvelope and RecvEnvelope\index{SendEnvelope and RecvEnvelope@\spxentry{SendEnvelope and RecvEnvelope}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-SendEnvelope-and-RecvEnvelope}}}
\sphinxAtStartPar
Generic envelope types for the JSON protocol. They always have an id (string, should be a UUID), a message type (string, from a list of supported messages), and a message type. A JSON schema should exist that covers all possible envelopes. The RecvEnvelope is similar.

\sphinxlineitem{Serialized Program, Exported Configuration\index{Serialized Program, Exported Configuration@\spxentry{Serialized Program, Exported Configuration}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Serialized-Program-Exported-Configuration}}}
\sphinxAtStartPar
Dump of the data structure of a configuration in an appropriate data format such as JSON/YAML/etc. This should also include version information for reloading.

\sphinxlineitem{Structure Description (!= Hardware Description)\index{Structure Description ("!= Hardware Description)@\spxentry{Structure Description}\spxextra{"!= Hardware Description}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Structure-Description-Hardware-Description}}}
\sphinxAtStartPar
The description of the fundamental mathematical structure of an analog computer. In REDAC, for example, this includes the fact that signals pass through a coefficient and are then summed, meaning only fully multiplied terms can be computed, such as \sphinxtitleref{a*x + a*y} but not \sphinxtitleref{a*(x+y)}. The structure description of an analog computer is static and does not change.

\sphinxAtStartPar
Required for the synthesis step of the compiler.

\sphinxlineitem{Behavioral Description (!= Hardware Description)\index{Behavioral Description ("!= Hardware Description)@\spxentry{Behavioral Description}\spxextra{"!= Hardware Description}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Behavioral-Description-Hardware-Description}}}
\sphinxAtStartPar
The description of the behavior of the analog computing elements and thus the analog computer. This corresponds to the mathematical modeling of a computing element. For example, an integrator is described by the temporal integral over its input signal. The behavioral description of a computing element is static and does not change.

\sphinxlineitem{Hardware Description (= Resource Description, = Hardware Configuration)\index{Hardware Description (= Resource Description, = Hardware Configuration)@\spxentry{Hardware Description}\spxextra{= Resource Description, = Hardware Configuration}|spxpagem}\phantomsection\label{\detokenize{developer/appendix:term-Hardware-Description-Resource-Description-Hardware-Configuration}}}
\sphinxAtStartPar
The list of all available computing elements (potentially implicitly defined by MBlock types) and the available interconnections (potentially implicitly defined by types and positions on backplanes, etc.).

\end{description}

\listoffigures
\listoftables

\includepdf[
   pages=-,
   addtotoc={1,section,1,{European Union CE/RoHS Conformity Declaration},rohs}
]{../../appendix/REDAC_CE_Konformitaetserklaerung.pdf}

\begin{sphinxthebibliography}{ulmannAP}
\bibitem[ulmannAP2]{user/preface:ulmannap2}
\sphinxAtStartPar
Bernd Ulmann: Analog and Hybrid Computer Programming,
De Gruyter, ISBN 9783110662207, \sphinxurl{https://doi.org/10.1515/9783110662207}
or \sphinxhref{https://www.amazon.de/dp/B0893VHTHL?ref\_=cm\_sw\_r\_kb\_dp\_zy7uFbNZ5HRN9\&tag=httpwwwvaxmde-21\&linkCode=kpe}{amazong book listing} (https://www.amazon.de/dp/B0893VHTHL?ref\_=cm\_sw\_r\_kb\_dp\_zy7uFbNZ5HRN9\&tag=httpwwwvaxmde\sphinxhyphen{}21\&linkCode=kpe)
\end{sphinxthebibliography}



\renewcommand{\indexname}{Index}
\printindex
\end{document}