code:
\begin{tikzpicture}

	\definecolor{drivercolor}{rgb}{0.9,0.9,0.5}
	\definecolor{appcolor}   {rgb}{0.6,0.9,0.5}
	\definecolor{kernelcolor}{rgb}{0.9,0.5,0.4}

	\tikzstyle{mempage} = [minimum width=4ex, minimum height=0.5ex, inner sep=0]
	\tikzstyle{driverpage} = [mempage, draw=drivercolor!50!black!70, fill=drivercolor]
	\tikzstyle{apppage}    = [mempage, draw=appcolor!50!black!70,    fill=appcolor]
	\tikzstyle{kernelpage} = [mempage, draw=kernelcolor!50!black!70, fill=kernelcolor]

	\node[hardware, minimum height=10ex] (cpu) {CPU};
	\node[hardware, minimum height=10ex, right=0 of cpu] (mmu) {MMU};
	\node[hardware, minimum height=10ex, right=23ex of mmu] (iommu) {IOMMU};

	\node[component, left=4ex  of cpu, bottom color=appcolor, yshift=3ex] (app)    {Application};
	\node[component, above=4ex of app, bottom color=drivercolor]          (driver) {Driver};
	\node[component, below=4ex of app, bottom color=kernelcolor]          (kernel) {Kernel};

	\draw[thick]         (mmu.east)   -- +(12ex,0) coordinate (sysbusram)  {};
	\draw[thick]         (sysbusram) -- (iommu.west) {};
	\draw[thick]         (iommu.east)  -- +(11ex,0) coordinate (sysbusdisk) {};
	\draw[thick, dotted] (sysbusdisk) -- +(5ex,0) node (sysbusend) {};
	\draw[thick]         (sysbusdisk) -- +(0,4ex) node [hardware, above] (diskcontroller) {Disk\\controller};
	\draw[thick]         (sysbusram)  -- +(0,4ex) node [hardware, above] (memcontroller)  {Memory\\controller};

	\path (sysbusram) -- node[below, pos=0.85] {system bus} (sysbusdisk);

	\node[above=1ex of memcontroller, draw, fill, white, dropshadow,
	      minimum width=5ex, minimum height=10ex] (ram) {};

	\path (ram.north)+(0,0.5ex)
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[driverpage] (driverpage) {}
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[kernelpage] {}
	      -- ++(0,-0.5ex) node[kernelpage] {}
	      -- ++(0,-0.5ex) node[kernelpage] {}
	      -- ++(0,-0.5ex) node[kernelpage] {}
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[apppage]    (apppage) {}
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[kernelpage] (kernelpage) {}
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[apppage]    {};

	\path (cpu.west)+(0,4ex)  coordinate (cpuabove) {};
	\path (cpu.west)+(0,3ex)  coordinate (cpumid)   {};
	\path (cpu.west)+(0,2ex)  coordinate (cpubelow) {};

	\path (mmu.east)+(0,4ex)  coordinate (mmuabove) {};
	\path (mmu.east)+(0,3ex)  coordinate (mmumid)   {};
	\path (mmu.east)+(0,2ex)  coordinate (mmubelow) {};

	\tikzstyle{memaccess} = [opacity=0.7,
	                         decoration={markings,
	                         mark=between positions 0.03 and 1 step 1ex with {\arrow{latex}}},
	                         postaction={decorate}]

	\path[memaccess, drivercolor!70!black]
		(driver)   .. controls +(4ex,-2ex) and +(-4ex,0ex) ..
		(cpuabove) .. controls +(1ex,0)    and +(-1ex,0)   ..
		(mmuabove) .. controls +(8ex,0)    and +(-8ex,0)   ..
		(driverpage);

	\path[memaccess, appcolor!60!black]
		(app.east) .. controls +(2ex,0ex) and +(-2ex,0ex) ..
		(cpumid)   .. controls +(1ex,0)   and +(-1ex,0)   ..
		(mmumid)   .. controls +(8ex,0)   and +(-8ex,0)   ..
		(apppage);

	\path[memaccess, kernelcolor!80!black]
		(kernel)   .. controls +(4ex,2ex) and +(-4ex,0ex) ..
		(cpubelow) .. controls +(1ex,0)   and +(-1ex,0)   ..
		(mmubelow) .. controls +(8ex,0)   and +(-8ex,0)   ..
		(kernelpage);

	\path (diskcontroller.south west)+(-13ex,-2ex) coordinate (dmamid) {};

	\path[memaccess, black]
		(diskcontroller.south west) .. controls +(-1ex,-2ex) and +(8ex,0ex) ..
		(dmamid)                    .. controls +(-8ex,0) and +(8ex,0) ..
		node[above, sloped, pos=0.7, text=black] {\emph{DMA}}
		(driverpage);

%	\path (dmamid) node[above, xshift=1ex] {\emph{DMA}};

\end{tikzpicture}


code:
\begin{tikzpicture}

	\node[opacity=0, inner sep=0, minimum size=1ex] (gap) { };

	\draw[opacity=0.4, densely dotted, <-] (gap) -- +(6ex, -6ex) -- ++(8ex, -6ex) node[opacity=1, anchor=west] {gap};

	\path (gap)+(90:-2ex) node[anchor=east, opacity=0.2, draw, fill, single arrow, minimum size=8ex,
	                           rotate=90, single arrow head extend=1ex] (arrow) {};

	\path (arrow.west) node[align=center] {Device-tree\\analysis};

	\path (gap)+(90+120:-2ex) node[anchor=east, opacity=0.2, draw, fill, single arrow, minimum size=8ex,
	                               rotate=90+120, single arrow head extend=1ex] (arrow) {};

	\path (arrow.west) node[align=center] {Rational\\thinking};

	\path (gap)+(90+240:-2ex) node[anchor=east, opacity=0.2, draw, fill, single arrow, minimum size=8ex,
	                               rotate=90+240, single arrow head extend=1ex] (arrow) {};

	\path (arrow.west) node[align=center] {Intuition};

\end{tikzpicture}

repo_name: Fhiss/genode


code:
\begin{tikzpicture}[node distance=12ex]

	\labeledcompoundnode{child}{component}{Child}{

		\node[capability] (childpdcap) {};
	}

	\labeledcompoundnode{init}{component, below of=child, xshift=-7ex}{Init}{

		\node[capability] (initpdcap) {2};
		\downwardthreadnode{initthread}{inner sep=0, node distance=0ex, left=4ex of initpdcap}
		\node[capability, right of=initpdcap] (initchildpdcap) {3};
	}

	\labeledcompoundnode{core}{component, below of=init, xshift=-10ex}{Core}{

		\rpcobjectrnode{pdinit}{}{}{PD session}

		\rpcobjectrnode{pdchild}{node distance=27.5ex, right of=pdinit}{}{PD session}
	}

	% capability associations
	\path [draw, dashed] (pdinitcap) -- (initpdcap);
	\path [draw, dashed] (pdchildcap) -- (initchildpdcap);
	\path [draw, dashed] (initchildpdcap) -- (childpdcap);

	% transfer quota
	\path [arrow, sloped=false] (initthread)
	      .. controls +(-1,0) and +(0,1) ..
	      node[pos=0.8] {$transfer$(amount, 3)} (pdinitobj);

\end{tikzpicture}


code:
\begin{tikzpicture}

	\input{img/base_hw_soc_dirs.inc}

	\node (leftanchor) {};
	\path (leftanchor) coordinate (anchor);
	\path (anchor) node[dirnode] (imxdir) {imx/};
	\dirstructure{imx8q\_evk}

	\path (leftanchor)+(50ex,0) coordinate (anchor);

	\path (anchor) node[dirnode] (allwinner) {allwinner/};
	\dirstructure{pine\_a64lts}

\end{tikzpicture}


code:
\begin{tikzpicture}

	\definecolor{stream1color}    {rgb}{0.4,0.5,0.9}
	\definecolor{stream2color}    {rgb}{0.9,0.5,0.4}
	\definecolor{stream3color}    {rgb}{0.5,0.9,0.4}
	\definecolor{streammixedcolor}{rgb}{0.9,0.5,0.9}

	\tikzstyle{audiosource} = [component, path fading=flow fade,
	                           minimum width=10ex,
	                           rounded corners=1]

	%
	% Stream 1
	%

	\node[dataspace, inner sep=0.5ex] (audioout1) {

		\begin{tikzpicture}
			\node[draw, rectangle, minimum size=1.2ex, fill=white, align=center]
				(currpos1) {};

			\path (currpos1) node[below=2ex, align=center] (wheel1) {

				\begin{wheel}{5ex}
					\slices{30,40,...,120}{inner color=stream1color!50!white,
					                       outer color=stream1color, dropshadow}
					\rememberouter{120}{wheel1source}
					\rememberinner{30}{wheel1curr}
				\end{wheel}
			};
		\end{tikzpicture}
	};

	\node[audiosource, bottom color=stream1color, left=4ex of audioout1]
		(stream1) {Stream};

	\draw[arrow, thick] (stream1.east)
		.. controls +(8ex,0) and +(120:6ex) .. (wheel1source);

	\draw[arrow, opacity=0.4] (currpos1) -- (wheel1curr);

	%
	% Stream 2
	%

	\node[dataspace, inner sep=0.5ex, below=2ex of audioout1] (audioout2) {

		\begin{tikzpicture}
			\node[draw, rectangle, minimum size=1.2ex, fill=white, align=center]
				(currpos2) {};

			\path (currpos2) node[below=2ex, align=center] (wheel2) {

				\begin{wheel}{5ex}
					\slices{30,40,...,280}{inner color=stream2color!50!white,
					                       outer color=stream2color, dropshadow}
					\rememberouter{280}{wheel2source}
					\rememberinner{30}{wheel2curr}
				\end{wheel}
			};
		\end{tikzpicture}
	};

	\node[audiosource, bottom color=stream2color, left=4ex of audioout2]
		(stream2) {Stream};

	\draw[arrow, thick] (stream2.east)
		.. controls +(4ex,0) and +(280:7ex) .. (wheel2source);

	\draw[arrow, opacity=0.4] (currpos2) -- (wheel2curr);

	%
	% Stream 3
	%

	\node[dataspace, inner sep=0.5ex, below=2ex of audioout2] (audioout3) {

		\begin{tikzpicture}
			\node[draw, rectangle, minimum size=1.2ex, fill=white, align=center]
				(currpos3) {};

			\path (currpos3) node[below=2ex, align=center] (wheel3) {

				\begin{wheel}{5ex}
					\slices{40,50,...,70}{inner color=stream3color!50!white,
					                       outer color=stream3color, dropshadow}
					\rememberouter{70}{wheel3source}
					\rememberinner{40}{wheel3curr}
				\end{wheel}
			};
		\end{tikzpicture}
	};

	\node[audiosource, bottom color=stream3color, left=4ex of audioout3]
		(sporadic) {Sporadic};

	\draw[arrow, thick] (sporadic.east)
		.. controls +(4ex,0) and +(70:7ex) .. (wheel3source);

	\draw[arrow, opacity=0.4] (currpos3) -- (wheel3curr);

	%
	% Mixer
	%

	\node[fit=(audioout1) (audioout2) (audioout3)] (audioout1and2and3) {};

	\node[audiosource, right=4ex of audioout1and2and3]
		(mixer) {Mixer};

	\tikzstyle{singlearrow} = [single arrow, minimum height=4ex,
	                           path fading=flow fade,
	                           single arrow head extend=1ex]

	\path[sloped] (audioout1.south east)
		-- node[singlearrow, draw=stream1color, pos=0.2,
		        fill=stream1color!70!black] {} (mixer.north west);
	\path[sloped] (wheel2)
		-- node[singlearrow, draw=stream2color, pos=0.4,
		        fill=stream2color!70!black] {} (mixer.west);
	\path[sloped] (audioout3.north east)
		-- node[singlearrow, draw=stream3color, pos=0.2,
		        fill=stream3color!70!black] {} (mixer.south west);

	%
	% Stream from mixer to driver
	%

	\node[dataspace, inner sep=0.5ex, right=4ex of mixer] (audiooutmixed) {

		\begin{tikzpicture}
			\node[draw, rectangle, minimum size=1.2ex, fill=white, align=center]
				(currposmixed) {};

			\path (currposmixed) node[below=2ex, align=center] (wheelmixed) {

				\begin{wheel}{5ex}
					\slices{30}{inner color=streammixedcolor!50!white,
					                       outer color=streammixedcolor, dropshadow}
					\slices{40,50,...,70}{inner color=white,
					                       outer color=white, dropshadow}
					\slices{80,90,...,120}{inner color=streammixedcolor!50!white,
					                       outer color=streammixedcolor, dropshadow}

					\rememberouter{60}{wheelremixed}
					\rememberinner{40}{wheelmixedcurr}
				\end{wheel}
			};
		\end{tikzpicture}
	};

	\draw[arrow, thick] (mixer.east)
		.. controls +(4ex,0) and +(60:7ex) .. node[pos=0.4] {remix} (wheelremixed);

	%
	% Driver
	%

	\node[audiosource, right=4ex of audiooutmixed]
		(driver) {Driver};

	\path[sloped] (wheelmixed) -- node[singlearrow, draw=streammixedcolor,
	                                   fill=streammixedcolor!70!black,
	                                   pos=0.3] {}
	                                   (driver.west);

	\draw[arrow, opacity=0.4] (currposmixed) -- (wheelmixedcurr);

\end{tikzpicture}


code:
\begin{tikzpicture}

	\definecolor{stream1color}    {rgb}{0.4,0.5,0.9}
	\definecolor{stream2color}    {rgb}{0.9,0.5,0.4}
	\definecolor{streammixedcolor}{rgb}{0.9,0.5,0.9}

	\tikzstyle{audiosource} = [component, path fading=flow fade,
	                           minimum width=10ex,
	                           rounded corners=1]

	%
	% Stream 1
	%

	\node[dataspace, inner sep=0.5ex] (audioout1) {

		\begin{tikzpicture}
			\node[draw, rectangle, minimum size=1.2ex, fill=white, align=center]
				(currpos1) {};

			\path (currpos1) node[below=2ex, align=center] (wheel1) {

				\begin{wheel}{5ex}
					\slices{30,40,...,120}{inner color=stream1color!50!white,
					                       outer color=stream1color, dropshadow}

					\rememberouter{120}{wheel1source}
					\rememberouter{30}{wheel1sink}

					\rememberinner{30}{wheel1curr}
				\end{wheel}
			};
		\end{tikzpicture}
	};

	\node[audiosource, bottom color=stream1color, left=4ex of audioout1]
		(stream1) {Stream};

	\draw[arrow, thick] (stream1.east)
		.. controls +(8ex,0) and +(120:6ex) .. (wheel1source);

	\draw[arrow, opacity=0.4] (currpos1) -- (wheel1curr);

	%
	% Stream 2
	%

	\node[dataspace, inner sep=0.5ex, below=2ex of audioout1] (audioout2) {

		\begin{tikzpicture}
			\node[draw, rectangle, minimum size=1.2ex, fill=white, align=center]
				(currpos2) {};

			\path (currpos2) node[below=2ex, align=center] (wheel2) {

				\begin{wheel}{5ex}
					\slices{30,40,...,280}{inner color=stream2color!50!white,
					                       outer color=stream2color, dropshadow}

					\rememberouter{280}{wheel2source}
					\rememberouter{30}{wheel2sink}

					\rememberinner{30}{wheel2curr}
				\end{wheel}
			};
		\end{tikzpicture}
	};

	\node[audiosource, bottom color=stream2color, left=4ex of audioout2]
		(stream2) {Stream};

	\draw[arrow, thick] (stream2.east)
		.. controls +(4ex,0) and +(280:7ex) .. (wheel2source);

	\draw[arrow, opacity=0.4] (currpos2) -- (wheel2curr);

	%
	% Mixer
	%

	\node[fit=(audioout1) (audioout2)] (audioout1and2) {};

	\node[audiosource, right=4ex of audioout1and2]
		(mixer) {Mixer};

	\tikzstyle{singlearrow} = [single arrow, minimum height=4ex,
	                           path fading=flow fade,
	                           single arrow head extend=1ex]

	\path[sloped] (wheel1) -- node[singlearrow, draw=stream1color, pos=0.4,
	                               fill=stream1color!70!black] {} (mixer.north west);
	\path[sloped] (wheel2) -- node[singlearrow, draw=stream2color, pos=0.4,
	                               fill=stream2color!70!black] {} (mixer.south west);

	%
	% Stream from mixer to driver
	%

	\node[dataspace, inner sep=0.5ex, right=4ex of mixer] (audiooutmixed) {

		\begin{tikzpicture}
			\node[draw, rectangle, minimum size=1.2ex, fill=white, align=center]
				(currposmixed) {};

			\path (currposmixed) node[below=2ex, align=center] (wheelmixed) {

				\begin{wheel}{5ex}
					\slices{30,40,...,120}{inner color=streammixedcolor!50!white,
					                       outer color=streammixedcolor, dropshadow}

					\rememberouter{120}{wheelmixedsource}
					\rememberouter{30}{wheelmixedsink}

					\rememberinner{30}{wheelmixedcurr}
				\end{wheel}
			};
		\end{tikzpicture}
	};

	\draw[arrow, thick] (mixer.east)
		.. controls +(4ex,0) and +(120:7ex) .. (wheelmixedsource);

	\draw[arrow, opacity=0.4] (currposmixed) -- (wheelmixedcurr);

	%
	% Driver
	%

	\node[audiosource, right=4ex of audiooutmixed]
		(driver) {Driver};

	\path[sloped] (wheelmixed) -- node[singlearrow, draw=streammixedcolor,
	                                   fill=streammixedcolor!70!black,
	                                   pos=0.3] {}
	                                   (driver.west);

\end{tikzpicture}


code:
\newcommand{\nestinglevel}[1]{
	\begin{tikzpicture}[inner sep=0, outer sep=0]
		\node[align=left, font=\scriptsize \sffamily] (content) {#1};
		\path (content.north west)+(-2ex,0.5ex) {};
	\end{tikzpicture}
}

\newcommand{\configlevel}[2]{
	\begin{tikzpicture}[inner sep=0, outer sep=0]
		\node[align=left, dropshadow, font=\scriptsize \sffamily, #1] (content) {#2};
	\end{tikzpicture}
}

\configlevel{fill=black!17}{
  $<$config$>$\\
  \nestinglevel{
  $<$parent-provides$>$ ... $<$/parent-provides$>$\\
  $<$default-route$>$ ... $<$/default-route$>$\\
  ...\\
  $<$start name="nitpicker" caps="100"$>$\\
    \nestinglevel{...}\\
  $<$/start$>$\\
  $<$start name="launchpad" caps="2000"$>$\\
    \nestinglevel{
    ...\\
    \configlevel{fill=black!12}{
    $<$config$>$\\
      \nestinglevel{
      $<$launcher name="Virtualbox"$>$\\
        \nestinglevel{
        $<$binary name="init"/$>$\\
        \configlevel{fill=black!7}{
        $<$config$>$\\
          \nestinglevel{
          $<$parent-provides$>$ ... $<$/parent-provides$>$\\
          $<$default-route$>$\\
            \nestinglevel{
            $<$any-service$>$ $<$any-child/$>$ $<$parent/$>$ $<$/any-service$>$
            }\\
          $<$/default-route$>$\\
          $<$start name="virtualbox" caps="1000"$>$\\
            \nestinglevel{
            $<$resource name="RAM" quantum="1G"/$>$\\
            \configlevel{fill=black!2}{
              $<$config vbox\_file="test.vbox" vm\_name="TestVM"$>$\\
              \nestinglevel{
                ...
              }\\
              $<$/config$>$
            }
            }\\
          $<$/start$>$
          }\\
        $<$/config$>$
        }
        }\\
      $<$/launcher$>$
      }\\
    $<$/config$>$
    }
    }\\
  $<$/start$>$
  }\\
$<$/config$>$
}


code:
\begin{tikzpicture}

	\begin{timelinediagram}

		\renewcommand{\timestepvector}{0,-0.8}

		% initial timelines

		\path (0,0) node (timelineanchor) {};
		\newtimeline{client}
		\path (client) node[above=2pt, align=center] (clientlabel) {\normalsize Client\\};

		\path (2.5,0) node (timelineanchor) {};
		\newtimeline{servermain}
		\path (servermain) node[above=2pt, align=center] (serverlabel) {\normalsize Server\\};

		\path (timelineanchor)+(10,0) node (timelineanchor) {};
		\newtimeline{corecap}
		\path (corecap) node[above=2pt, align=center] (corecaplabel) {\normalsize Core\\PD};

		\activate{servermain}
		\activate{client}

		% timelines for entrypoint and object pool

		\path (servermain)+(2.5,0) node (timelineanchor) {};
		\newtimeline{serverep}
		\node[draw, fill=white, align=center, dropshadow] at (serverep) (ep) {Entrypoint};

		\path (serverep)+(2.5,0) node (timelineanchor) {};
		\newtimeline{serverobjpool}
		\node[draw, fill=white, align=center, dropshadow] at (serverobjpool) (objpool) {Object\\pool};
		\timestep

		% create RPC object

		\path (serverobjpool)+(2.5,0) node (timelineanchor) {};
		\newtimeline{serverrpcobj}
		\node[draw, fill=white, align=center, dropshadow] at (serverrpcobj) (rpcobj) {RPC object\\ \textbf{a}};
		\draw[timelinemessage, dashed] (servermain) -- node[above] {$create$} (rpcobj);
		\timestep

		% manage RPC object

		\transition{servermain}{serverep}{manage \textbf{a}}
		\timestep
		\transition{serverep}{corecap}{allocate capability}
		\timestep
		\transition{corecap}{serverep}{return capability \textbf{$cap_a$}}
		\timestep
		\transition{serverep}{serverobjpool}{}
		\node[align=center] at (transitionlabel) {associate \\ {\textbf{a}} with \textbf{$cap_a$}};
		\timestep
		\transition{serverobjpool}{serverep}{}
		\timestep
		\transition{serverep}{servermain}{}
		\node[align=center] at (transitionlabel) {return \\ \textbf{$cap_a$}};
		\timestep

		% delegate capability to client
		\draw[timelinemessage, dashed] (servermain) --
			node[align=center] {$delegate$ \\ \textbf{$cap_a$}}
			(client);
		\timestep

	\end{timelinediagram}

	\begin{scope}[on background layer]
	\node[timelinegroup, fit=(serverlabel)  (serverrpcobj) (rpcobj)] {};
	\node[timelinegroup, fit=(clientlabel)  (client)] {};
	\node[timelinegroup, fit=(corecaplabel) (corecap)] {};
	\end{scope}

\end{tikzpicture}


code:
\begin{tikzpicture}

	\definecolor{appcolor}       {rgb}{1,1,0.7}
	\definecolor{nitpickercolor} {rgb}{0.9,0.5,0.4}

	\tikzstyle{treenode} = [component, path fading=flow fade, align=center,
	                        rounded corners=1]

	\tikzstyle{nitpickernode} = [treenode, minimum width=12ex, minimum height=6ex, bottom color=nitpickercolor]
	\tikzstyle{appnode}       = [treenode, bottom color=appcolor]

	%
	% Components
	%

	% init
	\node[treenode, minimum width=12ex, minimum height=5ex] (init) {Init};

	% nitpicker and window manager
	\node[nitpickernode, above=8ex of init, xshift=-7ex] (nitpicker) {Nitpicker\\GUI};
	\node[nitpickernode, above=8ex of init, xshift=7ex]  (wm)        {Window\\Manager};

	% nitpicker apps
	\path (nitpicker.west)+(-12ex,4ex) node[appnode] (panel)    {Panel};
	\path (panel)+(-5ex,-4ex)          node[appnode] (pointer)  {Pointer};
	\path (pointer)+(-5ex,-4ex)        node[appnode] (backdrop) {Backdrop};

	% window-manager apps
	\path (wm.east)+(12ex,5ex)   node[appnode] (launchpad) {Launchpad};
	\path (launchpad)+(5ex,-4ex) node[appnode] (browser)   {Browser};
	\path (browser)+(4ex,-3ex)   node[appnode, minimum width=5ex]   (app1) {};
	\path (app1)+(3ex,-2.2ex)    node[appnode, minimum width=3.5ex] (app2) {};
	\path (app2)+(2ex,-2.2ex)    node[appnode, minimum width=2ex]   (app3) {};

	%
	% Parent-child relationships
	%

	\tikzstyle{treechildarrow} = [arrow, thick, opacity=0.2]

	\path[treechildarrow] (init) -- (nitpicker.south);
	\path[treechildarrow] (init) -- (wm.south);
	\path[treechildarrow] (init) -- (backdrop);
	\path[treechildarrow] (init) -- (pointer);
	\path[treechildarrow] (init) -- (panel);
	\path[treechildarrow] (init) -- (launchpad);
	\path[treechildarrow] (init) -- (browser);
	\path[treechildarrow] (init) -- (app1);
	\path[treechildarrow] (init) -- (app2);
	\path[treechildarrow] (init) -- (app3);

	%
	% Session relationships
	%

	\tikzstyle{treesessionarrow} = [arrow, thick, densely dashed]

	% window manager -> nitpicker
	\path[treesessionarrow] (wm.220)
		.. controls +(0,-3ex) and +(0,-3ex) .. (nitpicker.320);

	% nitpicker apps -> nitpicker
	\path[treesessionarrow] (panel.320)
		.. controls +(0,-8ex) and +(-3ex,-3ex) .. (nitpicker.220);
	\path[treesessionarrow] (pointer.320)
		.. controls +(0,-7ex) and +(-1ex,-4ex) .. (nitpicker.230);
	\path[treesessionarrow] (backdrop.320)
		.. controls +(0,-6ex) and +(0ex,-5ex) .. (nitpicker.240);

	% window-manager apps -> window manager
	\path[treesessionarrow] (launchpad.230)
		.. controls +(-2ex,-8ex) and +(3ex,-3ex) .. (wm.327);
	\path[treesessionarrow] (browser.230)
		.. controls +(-2ex,-8ex) and +(3ex,-4ex) .. (wm.319);
	\path[treesessionarrow] (app1.230)
		.. controls +(-2ex,-8ex) and +(2ex,-5ex) .. (wm.310);
	\path[treesessionarrow] (app2.230)
		.. controls +(-2ex,-8ex) and +(1ex,-6ex) .. (wm.300);
	\path[treesessionarrow] (app3.230)
		.. controls +(-2ex,-8ex) and +(0ex,-7ex) .. (wm.290);

\end{tikzpicture}


code:
\begin{tikzpicture}

	\definecolor{corecolor} {rgb}{0.7,0.8,0.9}

	\tikzstyle{treenode} = [component, path fading=flow fade, align=center,
	                        rounded corners=1]

	\tikzstyle{subsystem} = [minimum width=6ex, minimum height=3ex, align=center,
	                         draw=black!80, fill=white, fill opacity=0.6]

	%
	% Core
	%

	\node[treenode, bottom color=corecolor, minimum width=30ex, minimum height=6ex] (core) {};
	\path (core.east) node[left=1ex] {Core};

	\path (core.west)    node[right=1ex, subsystem] (corerom) {ROM};
	\path (corerom.east) node[right=1ex, subsystem] (corepd)  {PD};
	\path (corepd.east)  node[right=1ex, subsystem] (corecpu) {CPU};

	%
	% Component
	%
	\node[treenode, minimum width=30ex, minimum height=6ex, above=8ex of core] (target) {};
	\path (target.center) node {Component};

	\coordinate (componentrom) at (corerom |- target.south);
	\coordinate (componentpd)  at (corepd  |- target.south);
	\coordinate (componentcpu) at (corecpu |- target.south);

	\path (corerom) -- coordinate (midrom) (componentrom);
	\path (corepd)  -- coordinate (midpd)  (componentpd);
	\path (corecpu) -- coordinate (midcpu) (componentcpu);

	\draw (componentrom) -- (midrom);
	\draw[arrow, densely dashed] (midrom) -- (corerom);

	\draw (componentpd) -- (midpd);
	\draw[arrow, densely dashed] (midpd) -- (corepd);

	\draw (componentcpu) -- (midcpu);
	\draw[arrow, densely dashed] (midcpu) -- (corecpu);

	%
	% Service
	%
	\path (target.east) node[treenode, right=4ex, minimum width=10ex, minimum height=5ex]
		(service) {Service};

	\path (componentcpu)+(7ex,0) coordinate (componentclient) {};

	\tikzstyle{treesessionarrow} = [arrow, thick, densely dashed]

	% target -> service
	\path[treesessionarrow] (componentclient.290)
		.. controls +(290:7ex) and +(250:7ex) .. (service.250);

\end{tikzpicture}


code:
\begin{tikzpicture}

	\definecolor{drivercolor}{rgb}{0.9,0.9,0.5}
	\definecolor{appcolor}   {rgb}{0.6,0.9,0.5}
	\definecolor{kernelcolor}{rgb}{0.9,0.5,0.4}

	\tikzstyle{mempage} = [minimum width=4ex, minimum height=0.5ex, inner sep=0]
	\tikzstyle{driverpage} = [mempage, draw=drivercolor!50!black!70, fill=drivercolor]
	\tikzstyle{apppage}    = [mempage, draw=appcolor!50!black!70,    fill=appcolor]
	\tikzstyle{kernelpage} = [mempage, draw=kernelcolor!50!black!70, fill=kernelcolor]

	\node[hardware, minimum height=10ex] (cpu) {CPU};
	\node[hardware, minimum height=10ex, right=0 of cpu] (mmu) {MMU};

	\node[component, left=4ex  of cpu, bottom color=appcolor, yshift=3ex] (app)    {Application};
	\node[component, above=4ex of app, bottom color=drivercolor]          (driver) {Driver};
	\node[component, below=4ex of app, bottom color=kernelcolor]          (kernel) {Kernel};

	\draw[thick]         (mmu.east)   -- +(15ex,0) coordinate (sysbusram)  {};
	\draw[thick]         (sysbusram)  -- +(20ex,0) coordinate (sysbusdisk) {};
	\draw[thick, dotted] (sysbusdisk) -- +(5ex,0) node (sysbusend) {};
	\draw[thick]         (sysbusdisk) -- +(0,4ex) node [hardware, above] (diskcontroller) {Disk\\controller};
	\draw[thick]         (sysbusram)  -- +(0,4ex) node [hardware, above] (memcontroller)  {Memory\\controller};

	\path (sysbusram) -- node[below] {system bus} (sysbusdisk);

	\node[above=1ex of memcontroller, draw, fill, white, dropshadow,
	      minimum width=5ex, minimum height=10ex] (ram) {};

	\path (ram.north)+(0,0.5ex)
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[driverpage] (driverpage) {}
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[kernelpage] {}
	      -- ++(0,-0.5ex) node[kernelpage] {}
	      -- ++(0,-0.5ex) node[kernelpage] {}
	      -- ++(0,-0.5ex) node[kernelpage] {}
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[apppage]    (apppage) {}
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[kernelpage] (kernelpage) {}
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[apppage]    {}
	      -- ++(0,-0.5ex) node[apppage]    {};

	\path (cpu.west)+(0,4ex)  coordinate (cpuabove) {};
	\path (cpu.west)+(0,3ex)  coordinate (cpumid)   {};
	\path (cpu.west)+(0,2ex)  coordinate (cpubelow) {};

	\path (mmu.east)+(0,4ex)  coordinate (mmuabove) {};
	\path (mmu.east)+(0,3ex)  coordinate (mmumid)   {};
	\path (mmu.east)+(0,2ex)  coordinate (mmubelow) {};

	\tikzstyle{memaccess} = [opacity=0.7,
	                         decoration={markings,
	                         mark=between positions 0.03 and 1 step 1ex with {\arrow{latex}}},
	                         postaction={decorate}]

	\path[memaccess, drivercolor!70!black]
		(driver)   .. controls +(4ex,-2ex) and +(-4ex,0ex) ..
		(cpuabove) .. controls +(1ex,0)    and +(-1ex,0)   ..
		(mmuabove) .. controls +(8ex,0)    and +(-8ex,0)   ..
		(driverpage);

	\path[memaccess, appcolor!60!black]
		(app.east) .. controls +(2ex,0ex) and +(-2ex,0ex) ..
		(cpumid)   .. controls +(1ex,0)   and +(-1ex,0)   ..
		(mmumid)   .. controls +(8ex,0)   and +(-8ex,0)   ..
		(apppage);

	\path[memaccess, kernelcolor!80!black]
		(kernel)   .. controls +(4ex,2ex) and +(-4ex,0ex) ..
		(cpubelow) .. controls +(1ex,0)   and +(-1ex,0)   ..
		(mmubelow) .. controls +(8ex,0)   and +(-8ex,0)   ..
		(kernelpage);

	\path (diskcontroller.south west)+(-5ex,-2ex) coordinate (dmamid) {};

	\path[memaccess, black]
		(diskcontroller.south west) .. controls +(-1ex,-2ex) and +(4ex,0ex) ..
		(dmamid)                    .. controls +(-4ex,0) and +(8ex,0) ..
		(kernelpage);

	\path[memaccess, black]
		(diskcontroller.south west) .. controls +(-1ex,-2ex) and +(4ex,0ex) ..
		(dmamid)                    .. controls +(-4ex,0) and +(8ex,0) ..
		(apppage);

	\path[memaccess, black]
		(diskcontroller.south west) .. controls +(-1ex,-2ex) and +(4ex,0ex) ..
		(dmamid)                    .. controls +(-4ex,0) and +(8ex,0) ..
		(driverpage);

	\path (dmamid) node[above, xshift=1ex] {\emph{DMA}};

\end{tikzpicture}


code:
\begin{tikzpicture}

	\node at (-20ex,5ex) {};

	\labeledcompoundnode{pdcompound}{component}{Protection domain}{
		\rpcobjectrnode{rpcobja}{}{3}{RPC object A}
	}

	\labeledcompoundnode{capspacecompound}
	            {compound, below of=pdcompound, node distance=17ex}
	            {Cap space}{
		\capspacenode{capspace}{5}{}
	}

	\path [arrow] (rpcobjacap) .. controls +(0,-1) and +(0,1) .. (capspace3);

	\node [kernelobj, below of=capspacecompound, node distance=12ex,
	       xshift=8ex] (objectidentity)
	      {Object\\identity\\A};

	\kernelboundary{fit=(capspacecompound) (objectidentity)}

	\path [arrow, *->] (capspace3.center)
	      .. controls +(0,-1) and +(0,1) ..
	      node {} (objectidentity);

	\path [arrow, dashed] (rpcobjaobj.south west)
	      .. controls +(-2,-3) and +(-4,0) ..
	      node [pos=0.7] {owns} (objectidentity.west);

\end{tikzpicture}


code:
\begin{tikzpicture}

	\node [inner sep=0, outer sep=0] (anchor) {};

	%
	% Client PD
	%

	\labeledcompoundnode{clientpdcompound}
	                    {component,
	                     below=0ex of anchor,
	                     minimum width=15ex}
	                    {Client PD}{
		\node[capability] (delegatedcap) {5};
	}

	%
	% Server PD
	%

	\labeledcompoundnode{serverpdcompound}
	                    {component,
	                     below=0ex of anchor,
	                     xshift=28ex,
	                     node distance=7ex}
	                    {Server PD}{
		\rpcobjectlnode{rpcobja}{}{3}{RPC object A}

		\rpcobjectlnode{rpcobjb}{below of=rpcobja, xshift=10ex}{7}{RPC object B}

		\node[below of=rpcobjb, minimum height=2ex] {};
	}

	\entrypointnode{ep}{}{serverpdcompound}

	\path [draw, dashed] (rpcobjalink)
	      .. controls +(0,-1) and +(-1,1) ..
	      node [pos=0.7] {} (epep);

	\path [draw, dashed] (rpcobjblink)
	      .. controls +(0,-0.5) and +(0,0.5) ..
	      node [pos=0.7] {} (epep);

	% line to delegated cap
	\path [draw, dashed] (rpcobjacap)
	      .. controls +(-1,0) and +(1,0) ..
	      node [pos=0.7] {} (delegatedcap);

\end{tikzpicture}


code:
\begin{tikzpicture}

	\definecolor{corecolor} {rgb}{0.7,0.8,0.9}
	\definecolor{gdbmoncolor} {rgb}{1,0.8,0.7}

	\tikzstyle{treenode} = [component, path fading=flow fade, align=center,
	                        rounded corners=1]

	\tikzstyle{subsystem} = [minimum width=6ex, minimum height=3ex, align=center,
	                         draw=black!80, fill=white, fill opacity=0.6]

	%
	% Core
	%

	\node[treenode, bottom color=corecolor, minimum width=30ex, minimum height=6ex] (core) {};
	\path (core.east) node[left=1ex] {Core};

	\path (core.west)    node[right=1ex, subsystem] (corerom) {ROM};
	\path (corerom.east) node[right=1ex, subsystem] (corepd)  {PD};
	\path (corepd.east)  node[right=1ex, subsystem] (corecpu) {CPU};

	%
	% GDB monitor
	%
	\node[treenode, bottom color=gdbmoncolor, minimum width=30ex,
	      minimum height=6ex, above=6ex of core] (gdbmon) {};
	\path (gdbmon.east) node[left=1ex, align=right] {GDB\\Monitor};

	\path (gdbmon.west)    node[right=1ex, subsystem] (gdbmonrom) {ROM};
	\path (gdbmonrom.east) node[right=1ex, subsystem] (gdbmonpd)  {PD};
	\path (gdbmonpd.east)  node[right=1ex, subsystem] (gdbmoncpu) {CPU};

	%
	% Component
	%
	\node[treenode, minimum width=30ex, minimum height=6ex, above=4ex of gdbmon] (target) {};
	\path (target.center) node[align=center] {Component\\as Debugging Target};

	\coordinate (componentrom) at (corerom |- target.south);
	\coordinate (componentpd)  at (corepd  |- target.south);
	\coordinate (componentcpu) at (corecpu |- target.south);

	\path (corerom) -- coordinate (midrom) (componentrom);
	\path (corepd)  -- coordinate (midpd)  (componentpd);
	\path (corecpu) -- coordinate (midcpu) (componentcpu);

	\draw[arrow] (componentrom) -- (gdbmonrom);
	\draw[arrow, densely dashed] (gdbmonrom) -- (corerom);

	\draw[arrow] (componentpd) -- (gdbmonpd);
	\draw[arrow, densely dashed] (gdbmonpd) -- (corepd);

	\draw[arrow] (componentcpu) -- (gdbmoncpu);
	\draw[arrow, densely dashed] (gdbmoncpu) -- (corecpu);

	%
	% Service
	%
	\path (gdbmon.east) node[treenode, right=4ex, minimum width=10ex, minimum height=5ex]
		(service) {Service};

	\path (componentcpu)+(7ex,0) coordinate (componentclient) {};

	\tikzstyle{treesessionarrow} = [arrow, thick, densely dashed]

	% target -> service
	\path[treesessionarrow] (componentclient.270)
		.. controls +(270:15ex) and +(250:4ex) .. (service.250);

	%
	% Noux
	%
	\path (service.east) node[treenode, right=4ex, minimum width=10ex, minimum height=5ex]
		(noux) {Noux};

	%
	% GDB
	%

	\path (noux.north) node[treenode, above=4ex, minimum width=10ex, minimum height=5ex]
		(gdb) {GDB};

	%
	% Parent-child relationships
	%

	\tikzstyle{treechildarrow} = [arrow, thick, opacity=0.2]

	\path[treechildarrow] (noux)   -- (gdb);
	\path[treechildarrow] (gdbmon) -- (target);

	% GDB monitor -> noux
	\path[treesessionarrow] (gdbmon.342)
		.. controls +(300:10ex) and +(270:17ex) .. (gdb.230);

\end{tikzpicture}


code:
\newenvironment{ringbuffer} {

	%%
	% Draw slices
	%
	% argument 1: range to iterate over the angles, in steps of 15
	% argument 2: style used for drawing the slices
	%
	\newcommand{\slices}[2]{
		\foreach \i in {##1} {
			\path (\i:5ex) node[trapezium, trapezium angle=80,
			                    rotate=\i+90, draw, fill=white,
			                    dropshadow, rounded corners=1,
			                    path fading=flow fade, inner sep=0.74ex,
			                    ##2] {};
		}
	}

	%%
	% Add reference node
	%
	% argument 1: angle
	% argument 2: node name
	%
	\newcommand{\markslice}[2]{
		\path (##1:5ex) node[circle, fill=black, inner sep=0.35ex] (##2) {};
	}

	\begin{tikzpicture}[inner sep=0, outer sep=0, minimum size=0]
		\foreach \i in {0, 20,...,350} {
			\path (\i:5ex) node[trapezium, trapezium angle=80,
			                    rounded corners=1,
			                    rotate=\i+90, draw, fill=white, opacity=0.15,
			                    inner sep=0.74ex] {};
		}
} {

	\end{tikzpicture}
}

\begin{tikzpicture}

	\node[dataspace, minimum width=20ex, minimum height=40ex] (dataspace) {};

	\node[above=0.5ex of dataspace] {\emph{shared between source and sink}};

	%
	% submit queue
	%

	\path (dataspace.south) node[minimum size=0, yshift=6ex, xshift=-0.5ex, inner sep=0, outer sep=0] (submitqueue) {
		\begin{ringbuffer}
			\slices{60,80,...,100}{};
			\markslice{60}{submit1}
			\markslice{80}{submit2}
			\markslice{100}{submit3}
		\end{ringbuffer}
	};

	\path (submitqueue) node[align=center, xshift=0.5ex] {submit\\queue};

	%
	% acknowledgement queue
	%

	\path (dataspace.north) node[minimum size=0, yshift=-6ex, xshift=-0.5ex, inner sep=0, outer sep=0] (ackqueue) {
		\begin{ringbuffer}
			\slices{280,300,...,280}{};
			\markslice{280}{ack1}
			\markslice{300}{ack2}
		\end{ringbuffer}
	};

	\path (ackqueue) node[align=center, xshift=0.5ex] {ack\\queue};

	%
	% bulk buffer
	%

	\path (dataspace.center) node[rectangle, fill=black!5, draw=black!35,
	                              minimum width=18ex, minimum height=14ex]
	                              (bulkbuffer) {bulk buffer};

	\tikzstyle{bulkblock} = [minimum size=3ex, fill=white, draw=black!80,
	                         pattern=north east lines, pattern color=black!30];

	\path (bulkbuffer.center)+(6ex,-4.5ex)  node[bulkblock] (submitblock1) {};
	\path (bulkbuffer.center)+(0ex,-3.2ex)  node[bulkblock] (submitblock2) {};
	\path (bulkbuffer.center)+(-6ex,-3.5ex) node[bulkblock] (submitblock3) {};

	\draw[arrow] (submit1) -- (submitblock1);
	\draw[arrow] (submit2) -- (submitblock2);
	\draw[arrow] (submit3) -- (submitblock3);

	\path (bulkbuffer.center)+(-5.4ex,3.8ex) node[bulkblock, dashed] (ackblockgone) {};
	\path (bulkbuffer.center)+(1ex,4.2ex)    node[bulkblock] (ackblock1) {};
	\path (bulkbuffer.center)+(5.8ex,2.5ex)  node[bulkblock] (ackblock2) {};

	\draw[arrow] (ack1) -- (ackblock1);
	\draw[arrow] (ack2) -- (ackblock2);

	%
	% source and sink
	%

	\tikzstyle{packetstreamcomponent} = [component, minimum size=10ex]

	\node[packetstreamcomponent, left=10ex of dataspace] (source) {Source};

	\node[packetstreamcomponent, right=10ex of dataspace] (sink) {Sink};

	%
	% Steps
	%

	\tikzstyle{packetstreamarrow} = [->, >= stealth, densely dotted, thick, draw=black]
	\tikzstyle{packetstreamindex} = [draw, fill=white, solid, circle, dropshadow, inner sep=0.5ex]

	\path[packetstreamarrow] (source.340) --
		node[above, pos=0.3] {alloc}
		node[packetstreamindex, pos=0.6] {1} (submitblock3);

	\path[packetstreamarrow] (source.320)
		.. controls +(0:4ex) and +(180:6ex) ..
		node[left, pos=0.5] {submit}
		node[packetstreamindex, pos=0.6] {2} (submitqueue.west);

	\path[packetstreamarrow] (submitqueue.east)
		.. controls +(0:6ex) and +(180:4ex) ..
		node[right, pos=0.6] {get}
		node[packetstreamindex, pos=0.45] {3} (sink.210);

	\path[packetstreamarrow] (sink.150)
		.. controls +(180:6ex) and +(0:6ex) ..
		node[right, pos=0.4] {acknowledge}
		node[packetstreamindex, pos=0.5] {4} (ackqueue.east);

	\path[packetstreamarrow] (ackqueue.west)+(1ex,0)
		.. controls +(180:6ex) and +(30:6ex) ..
		node[left, pos=0.55] {get acked}
		node[packetstreamindex, pos=0.45] {5} (source.30);

	\path[packetstreamarrow] (source.10) --
		node[above, pos=0.45] {release} (ackblockgone);

\end{tikzpicture}


code:
\begin{tikzpicture}[node distance=17ex]

	\labeledcompoundnode{child}{component}{Child}{

		\downwardthreadnode{childthread}{}
		\node[capability, right of=childthread, node distance=12ex] (parentcap) {};
	}

	\labeledcompoundnode{parent}{component, below of=child}{Parent}{
		\rpcobjectrnode{parentrpcobj}{node distance=4ex}{}{Parent}
		\upwardthreadnode{parentthread}{above of=parentrpcobj, node distance=4ex}
	}

	% line between rpc object can parent cap in child pd
	\path [draw, dashed] (parentrpcobjcap) -- (parentcap);

	\path [arrow, dashed] (parentthread) -- node[below, rotate=7, yshift=0.5ex] {$create$}  (childthread);
	\path (child.south west)+(1ex,0.7ex) node (childsouthwest) {};
	\path [arrow, dashed] (parentthread) -- (childsouthwest);
	\path [arrow, dashed] (parentthread) -- node[pos=0.45] {$install$} (parentcap);

\end{tikzpicture}


code:
\begin{tikzpicture}[node distance=12ex, inner sep=1ex]

	\node [component] (child) {Child};

	\node [component, below of=child] (parent) {Parent};

	\path[sloped] (parent) -- node [pos=0.4, ownership] {owns}
	              (child);

\end{tikzpicture}


code:
\begin{tikzpicture}

	\definecolor{appcolor}        {rgb}{1,1,0.7}
	\definecolor{defaultcolor}    {rgb}{1,1,1}
	\definecolor{criticalcolor}   {rgb}{0.9,0.5,0.4}
	\definecolor{kernelcolor}     {rgb}{0.6,0.8,0.7}
	\definecolor{drivercolor}     {rgb}{0.6,0.7,0.8}

	\tikzstyle{treenode} = [component, path fading=flow fade, align=center,
	                        rounded corners=1, minimum height=6ex]

	\tikzstyle{service} = [draw=black, draw opacity=0.4, ball color=defaultcolor, fill opacity=0.2,
	                       rounded corners=0, shape=semicircle,
	                       inner sep=1.3ex, outer sep=0, above]

	\tikzstyle{appnode}    = [treenode, bottom color=appcolor]
	\tikzstyle{kernelnode} = [treenode, bottom color=kernelcolor, minimum width=18ex]
	\tikzstyle{drivernode} = [treenode, bottom color=drivercolor]

	\tikzstyle{treesessionarrow} = [arrow, thick]

	\tikzstyle{signal} = [sloped=false, >= stealth]

	\tikzstyle{memrange} = [anchor=north, draw, minimum width=3ex, inner sep=0, outer sep=0]

	%
	% Components
	%

	% core / init
	\node[kernelnode] (core) {Core / Init};

	\path (core.north) node[service, scale=0.4, xshift=8ex]  (mmioservice) {};
	\path (core.north) node[service, scale=0.4, xshift=-8ex] (irqservice)  {};
	\path (mmioservice) node[scale=0.7, yshift=-2ex] {MMIO};
	\path (irqservice)  node[scale=0.7, yshift=-2ex] {IRQ};

	% gpio test
	\node[appnode, minimum width=18ex, minimum height=16ex, above=4ex of core, align=center]
	     (gpiotest) {};
	\path (irqservice.north)+(0,6ex)
		node[scale=0.7, align=center] (irqhandler)  {Interrupt\\handler};

	\path (gpiotest) node[align=center, xshift=-2ex] {GPIO\\Interrupt\\Test\\};

	% sessions
	\path[treesessionarrow] (mmioservice |- gpiotest.south) -- (mmioservice);
	\path[treesessionarrow] (irqservice  |- gpiotest.south) -- (irqservice);

	%
	% Device registers
	%

	\tikzstyle{devreg} = [inner sep=0, outer sep=0, draw, anchor=north, minimum width=17ex, minimum height=3ex]

	\path (core)+(34ex,25ex) coordinate (anchor);

	\path (anchor)             node[devreg] (pbcfg0)  {PB\_CFG0};
	\path (pbcfg0.south)       node[devreg] (anchor)  {...};
	\path (anchor.south)       node[devreg] (pbeintcfg0)  {PB\_EINT\_CFG0};
	\path (pbeintcfg0.south)   node[devreg, minimum height=5ex] (anchor)  {...};
	\path (anchor.south)       node[devreg] (pbeintstatus) {};
	\path (pbeintstatus.south) node[devreg] (anchor)     {...};
	\path (anchor.south)       node[devreg] (pbeintctl)  {};
	\path (pbeintctl.south)    node[devreg, opacity=0.5]  (anchor)  {...};
	\path (anchor.south)       node[devreg, opacity=0.2]  (anchor)  {...};
	\path (anchor.south west)  coordinate (lastreg) {};

	\path (pbcfg0.north) node[anchor=south] (devregs) {Device Registers};

	\tikzstyle{bit} = [draw, draw opacity=0.1, anchor=north east,
	                   minimum width=1ex, minimum height=3ex,
	                   inner sep=0, outer sep=0]

	\newcommand\bitarray[1]{
		\foreach \i in {0, 1,...,#1} {
			\path (anchor)+(\i*-1ex,0)
				node[bit] (bit\i) { }; } }

	% bits of the status register
	\path (pbeintstatus.north east) coordinate (anchor) {};
	\bitarray{9}
	\path (bit2.north) coordinate (statusbit2in)  {};
	\path (bit2.south) coordinate (statusbit2out) {};

	% bits of the control register
	\path (pbeintctl.north east) coordinate (anchor) {};
	\bitarray{9}
	\path (bit2.south) coordinate (ctlbit2out) {};

	\node[at=(pbeintstatus)] {PB\_EINT\_STATUS};
	\node[at=(pbeintctl)]    {PB\_EINT\_CTL};

	%
	% Pin MUX
	%

	\path (pbcfg0)+(30ex,-7ex)
		node [draw, thick, rotate=270, trapezium, trapezium angle=60, minimum width=10ex] (pinmux) {};

	\node[at=(pinmux), scale=0.8] {MUX};

	\path (pinmux.south) coordinate (pbcontact) {};

	\draw[-] (pbcontact)+(0,3ex)    -- ++(-2ex,3ex);
	\draw[-] (pbcontact)+(0,1.5ex)  -- ++(-2ex,1.5ex);
	\draw[-] (pbcontact)+(0,-1.5ex) -- ++(-2ex,-1.5ex);
	\draw[-] (pbcontact)+(0,-3ex)   -- ++(-2ex,-3ex);

	% contact to the board
	\draw[signal, <-] (pinmux.north) -- ++(2ex,0) node[align=left, xshift=1ex] (pb2) {PB2\\};

	% mux selector defined by PB_CFG0
	\path (pinmux |- pbcfg0) coordinate (corner) {};
	\draw[signal, ->] (pbcfg0) -- (corner) -- (pinmux);

	%
	% Trigger logic
	%

	\path (pinmux)+(-12ex,0) node[draw, thick, align=center] (triggerlogic) {Trigger\\Logic};

	% input from pin MUX
	\draw[signal, ->] (pbcontact)  -- node[above, scale=0.5] {PB\_EINT2} (triggerlogic);

	% input from PB_EINT_CFG0
	\draw[signal, ->] (pbeintcfg0) -- node[scale=0.7, align=center] {positive\\edge} (triggerlogic.west |- pbeintcfg0);

	% output to PB_EINT_STATUS bit 2
	\path (triggerlogic.south) -- coordinate (midway) (statusbit2in);
	\draw[signal, ->] (triggerlogic.south) -- (triggerlogic.south |- midway)
	               -- (statusbit2in |- midway) -- node[pos=0.5, left, scale=0.7] {2} (statusbit2in);

	%
	% GIC IRQ gating
	%

	\path (triggerlogic)+(0,-19ex) node[draw, thick, align=center, minimum size=4ex] (irqgate) {};
	\node[at=(irqgate)] {$\&$};

	% input from status bit to gate
	\path (irqgate.north)+(1ex,0) coordinate (connector) {};
	\path (connector) -- coordinate[pos=0.85] (midpoint) (statusbit2out);
	\draw[signal, ->] (statusbit2out) -- (statusbit2out |- midpoint) --
	                  (connector |- midpoint) -- (connector);

	% input from cfg bit to gate
	\path (irqgate.north)+(-1ex,0) coordinate (connector) {};
	\path (connector) -- coordinate[pos=0.5] (midpoint) (ctlbit2out);
	\draw[signal, ->] (ctlbit2out) -- (ctlbit2out |- midpoint) --
	                  (connector |- midpoint) -- (connector);

	%
	% Compound for PIO
	%

	\node[fit=(pinmux) (devregs) (lastreg) (irqgate), draw, opacity=0.5, fill=black, fill opacity=0.03] (pio) {};

	\path (pio.south east) node[anchor=south east, scale=2, opacity=0.6] {PIO};

	%
	% System bus
	%

	\path (devregs)+(-17ex,0) node (sysbus) {System Bus};

	\path (sysbus.south) node[memrange, fill, fill opacity=0.03, draw opacity=0.5, minimum height=12ex] {};
	\path (sysbus.south)+(0,-8ex) node[memrange, fill=black, fill opacity=0.1, minimum height=1ex] (piobusaddr) {};

	% mapping of device registers at the system bus
	\draw[fill=black, draw opacity=0.2, fill opacity=0.05]
		(piobusaddr.north east) -- (pbcfg0.north west) --
		(lastreg.south west) -- (piobusaddr.south east);

	%
	% Interrupt controller
	%

	\path (sysbus)+(0,-18ex) node (gic) {GIC};

	\tikzstyle{irq} = [draw, draw opacity=0.5,
	                   inner sep=0, anchor=north, minimum size=1ex];

	\path (gic)+(0,-2ex) node[irq, draw opacity=0.15] (irq0) {};
	\path (irq0.south) coordinate (anchor) {};
	\path (anchor) node[irq, draw opacity=0.3] (irq1) {};
	\path (irq1.south) coordinate (anchor) {};

	\foreach \i in {40, 41,...,49} {
		\path (anchor) node[irq] (irq\i) { };
		\path (irq\i.south) coordinate (anchor) {};
	}

	\path (anchor) node[irq, draw opacity=0.3] (irq998) {};
	\path (irq998.south) coordinate (anchor) {};
	\path (anchor) node[irq, draw opacity=0.15] (irq999) {};
	\path (irq999.south) coordinate (anchor) {};

	\path (irq999.south)+(4ex,0) coordinate (midpoint) {};
	\draw[signal, ->] (irqgate.south) -- (irqgate.south |- midpoint) --
	                  (midpoint) -- (midpoint |- irq43) -- (irq43);

	\path (irq43.west)+(-1ex,0.7ex) node[scale=0.7] {43};

	\path (irq49.south)+(-4ex,0) coordinate (midpoint) {};

	\draw[signal, densely dotted, rounded corners=10] (irq43) -- (midpoint |- irq43) -- (midpoint) --
	                  (irqservice |- midpoint) -- (irqhandler);

	%
	% Virtual address space
	%

	\path (gpiotest |- sysbus) node (sysbus) {Genode};

	\path (gpiotest)+(6ex,4ex) node (vaddr) {};

	\path (vaddr) node[anchor=south, scale=0.7, align=center] {Virtual\\Memory};

	\path (vaddr.south) node[memrange, fill=white, fill opacity=0.53, draw opacity=0.5, minimum height=10ex] {};
	\path (vaddr.south)+(0,-5ex) node[memrange, fill=black, fill opacity=0.1, minimum height=1ex] (piovirtaddr) {};

	% mapping from system bus to virtual address space
	\draw[fill=black, draw opacity=0.2, fill opacity=0.05]
	     (piovirtaddr.north east) -- (piobusaddr.north west) --
	     (piobusaddr.south west) -- (piovirtaddr.south east);

\end{tikzpicture}


code:
\begin{tikzpicture}

	\definecolor{appcolor}        {rgb}{1,1,0.7}
	\definecolor{defaultcolor}    {rgb}{1,1,1}
	\definecolor{criticalcolor}   {rgb}{0.9,0.5,0.4}
	\definecolor{kernelcolor}     {rgb}{0.6,0.8,0.7}
	\definecolor{drivercolor}     {rgb}{0.6,0.7,0.8}

	\tikzstyle{treenode} = [component, path fading=flow fade, align=center,
	                        rounded corners=1, minimum height=6ex]

	\tikzstyle{service} = [draw=black, draw opacity=0.4, ball color=defaultcolor, fill opacity=0.2,
	                       rounded corners=0, shape=semicircle,
	                       inner sep=1.3ex, outer sep=0, above]

	\tikzstyle{appnode}    = [treenode, bottom color=appcolor]
	\tikzstyle{kernelnode} = [treenode, bottom color=kernelcolor, minimum width=18ex]
	\tikzstyle{drivernode} = [treenode, bottom color=drivercolor]

	%
	% Components
	%

	% core / init
	\node[kernelnode] (core) {Core / Init};

	\path (core.north) node[service, scale=0.4] (mmioservice) {};
	\path (mmioservice) node[scale=0.7, yshift=-2ex] {MMIO};

	% gpio test
	\node[appnode, minimum width=18ex, minimum height=16ex, above=4ex of core, align=center]
	     (gpiotest) {};

	\path (gpiotest) node[align=center, xshift=-2ex] {GPIO\\Input Test};

	%
	% Sessions
	%

	\tikzstyle{treesessionarrow} = [arrow, thick]
	\path[treesessionarrow] (mmioservice |- gpiotest.south) -- (mmioservice);

	\tikzstyle{devreg} = [inner sep=0, outer sep=0, draw, anchor=north, minimum width=10ex, minimum height=3ex]

	\path (core)+(35ex,25ex) coordinate (anchor);

	\path (anchor)        node[devreg] (pbcfg0)  {PB\_CFG0};
	\path (pbcfg0.south)  node[devreg] (anchor)  {...};
	\path (anchor.south)  node[devreg] (pbdata)  {PB\_DATA};
	\path (pbdata.south)  node[devreg] (anchor)  {...};
	\path (anchor.south)  node[devreg] (anchor)  {...};
	\path (anchor.south)  node[devreg] (anchor)  {...};
	\path (anchor.south)  node[devreg] (pbpull0) {PB\_PULL0};
	\path (pbpull0.south) node[devreg] (anchor)  {...};
	\path (anchor.south)  node[devreg, opacity=0.5]  (anchor)  {...};
	\path (anchor.south)  node[devreg, opacity=0.2]  (anchor)  {...};
	\path (anchor.south west)  coordinate (lastreg) {};

	\path (pbcfg0.north) node[anchor=south, xshift=2ex] (devregs) {Device Registers};

	\path (pbcfg0)+(26ex,-7ex)
		node [draw, thick, rotate=270, trapezium, trapezium angle=60, minimum width=10ex] (pinmux) {};

	\node[at=(pinmux), scale=0.8] {MUX};

	\path (pinmux.south |- pbdata) coordinate (pbcontact) {};

	\draw (pbdata) -- (pbcontact);

	\draw[-] (pbcontact)+(0,1.5ex)  -- ++(-2ex,1.5ex)  node[left, scale=0.5] {UART2\_RTS};
	\draw[-] (pbcontact)+(0,-1.5ex) -- ++(-2ex,-1.5ex) node[left, scale=0.5] {JTAG\_DO0};
	\draw[-] (pbcontact)+(0,-3ex) -- ++(-2ex,-3ex) node[left, scale=0.5] {...};

	\draw[-] (pinmux.north) -- ++(2ex,0) node[align=left, xshift=1ex] (pb2) {PB2\\};
	\draw[-o, densely dotted] (pinmux.north)+(2ex,0) -- ++(12ex,0) node[right,align=center, scale=0.7] (pin27) {Pin 27};

	\path (pin27.west)+(0,-13.5ex) coordinate (pin34) {};
	\path(pin34)+(-5ex,0) coordinate (corner) {};
	\draw[-o] (corner) -- (pin34) node[right, align=center, scale=0.7] {Pin 34};
	\draw (corner) -- ++(0,-5ex) node[ground, scale=0.7] {};

	\path (pin34)+(0,4ex) coordinate (pin8) {};
	\path (pin8)+(-5ex,0) coordinate (vcc) {};
	\path (vcc) node[anchor=east, scale=0.7] {$V_{CC}$};
	\draw[-o] (vcc) -- (pin8) node[right, align=center, scale=0.7] {Pin 8};

	\path (pinmux |- pbcfg0) coordinate (corner) {};
	\draw[->, >= stealth] (pbcfg0) -- (corner) -- (pinmux);

	\path (pbpull0)+(14ex,0) node[draw, thick, trapezium, trapezium angle=60, minimum width=8ex] (pullmux) {};
	\node[at=(pullmux), scale=0.8] {MUX};

	\draw[->, >= stealth] (pbpull0) -- (pullmux);

	\path (pullmux.north) -- node[draw, thick, minimum width=1.5ex, minimum height=4ex] (rpull) {}
	      node[right] {$R_{pull}$} (pullmux.north |- pbdata);

	\draw (pullmux.north) -- (rpull);
	\draw[-] (rpull) -- (pullmux.north |- pbdata) node[circle, fill, inner sep=0.2ex, outer sep=0] {};

	\draw (pullmux.south)+(-2ex,0) -- ++(-2ex,-5ex) node[ground, scale=0.7] {} node[left, scale=0.7, xshift=-2ex, yshift=-3ex]{$ground$};
	\draw (pullmux.south)+(0ex,0) -- ++(0ex,-3ex);
	\draw[-o] (pullmux.south)+(2ex,0) -- ++(2ex,-7ex) node[right, scale=0.7]{$V_{CC}$};

	\path (pin27)+(-1ex,-6ex) coordinate (eulerconnector) {};

	\path (eulerconnector) node[draw, opacity=0.5, minimum width=7ex, minimum height=22ex] {};
	\path (eulerconnector) node[scale=0.7, align=center] {Euler\\Connector\\\\};

	\node[fit=(pinmux) (devregs) (lastreg), draw, opacity=0.5, fill=black, fill opacity=0.03] (pio) {};

	\path (pio.south east) node[anchor=south east, scale=2, opacity=0.6] {PIO};

	\path (devregs)+(-18ex,0) node (sysbus) {System Bus};

	\tikzstyle{memrange} = [anchor=north, draw, minimum width=3ex, inner sep=0, outer sep=0]

	\path (sysbus.south) node[memrange, fill, fill opacity=0.03, draw opacity=0.5, minimum height=30ex] {};
	\path (sysbus.south)+(0,-25ex) node[memrange, fill=black, fill opacity=0.1, minimum height=1ex] (piobusaddr) {};

	\path (piobusaddr.south west) node[anchor=north east, scale=0.7, yshift=1ex] {0x1c20800};

	\draw[fill=black, draw opacity=0.2, fill opacity=0.05] (piobusaddr.north east) -- (pbcfg0.north west) -- (lastreg.south west) -- (piobusaddr.south east);

	\path (gpiotest)+(6ex,4ex) node (vaddr) {};

	\path (vaddr) node[anchor=south, scale=0.7, align=center] {Virtual\\Memory};

	\path (vaddr.south) node[memrange, fill=white, fill opacity=0.53, draw opacity=0.5, minimum height=10ex] {};
	\path (vaddr.south)+(0,-5ex) node[memrange, fill=black, fill opacity=0.1, minimum height=1ex] (piovirtaddr) {};

	\draw[fill=black, draw opacity=0.2, fill opacity=0.05]
	     (piovirtaddr.north east) -- (piobusaddr.north west) -- (piobusaddr.south west) -- (piovirtaddr.south east);

	\path (gpiotest |- sysbus) node (sysbus) {Genode};

	\path (eulerconnector |- sysbus) node (board) {Board};

\end{tikzpicture}


code:
\begin{tikzpicture}

	\definecolor{appcolor}        {rgb}{1,1,0.7}
	\definecolor{defaultcolor}    {rgb}{1,1,1}
	\definecolor{criticalcolor}   {rgb}{0.9,0.5,0.4}
	\definecolor{kernelcolor}     {rgb}{0.6,0.8,0.7}
	\definecolor{drivercolor}     {rgb}{0.6,0.7,0.8}

	\tikzstyle{treenode} = [component, path fading=flow fade, align=center,
	                        rounded corners=1, minimum height=6ex]

	\tikzstyle{service} = [draw=black, draw opacity=0.4, ball color=defaultcolor, fill opacity=0.2,
	                       rounded corners=0, shape=semicircle,
	                       inner sep=1.3ex, outer sep=0, above]

	\tikzstyle{appnode}    = [treenode, bottom color=appcolor]
	\tikzstyle{kernelnode} = [treenode, bottom color=kernelcolor, minimum width=80ex]
	\tikzstyle{drivernode} = [treenode, bottom color=drivercolor]
	\tikzstyle{muxnode}    = [treenode, bottom color=criticalcolor]

	%
	% Components
	%

	% drivers

	\node[drivernode, minimum width=24ex] (fbdrv) {Framebuffer Driver};

	\path (fbdrv)+(0ex,-10ex) coordinate (devices) { };

	\tikzstyle{device} = [drivernode, rounded corners=0, minimum height=2ex, rotate=45, scale=0.5]

	\path (devices)+(-3ex*0,0) node[device] (dphy) {DPHY};
	\path (devices)+(-3ex*1,0) node[device] (pio)  {PIO};
	\path (devices)+(-3ex*2,0) node[device] (rpio) {R\_PIO};
	\path (devices)+(-3ex*3,0) node[device] (ccu)  {CCU};
	\path (devices)+(-3ex*4,0) node[device] (dsi)  {DSI};
	\path (devices)+(-3ex*5,0) node[device] (rsb)  {R\_RSB};
	\path (rsb)+(0,-5ex) node[device] (pmic) {PMIC};
	\path (devices)+(-3ex*6,0) node[device] (syscon) {SYSCON};
	\path (devices)+(3ex*1,0)  node[device] (de2bus) {DE2\_BUS};
	\path (devices)+(3ex*2,0)  node[device] (rccu)   {R\_CCU};
	\path (devices)+(3ex*3,0)  node[device] (rintc)  {R\_INTC};
	\path (devices)+(3ex*4,0)  node[device] (rpwm)   {R\_PWM};
	\path (devices)+(3ex*5,0)  node[device] (tcon0)  {TCON0};
	\path (devices)+(3ex*6,0)  node[device] (tcon1)  {TCON1};

	\tikzstyle{accessarrow} = [arrow]
	\path[accessarrow] (fbdrv.270) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (dphy);
	\path[accessarrow] (fbdrv.260) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (pio);
	\path[accessarrow] (fbdrv.250) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (rpio);
	\path[accessarrow] (fbdrv.240) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (ccu);
	\path[accessarrow] (fbdrv.230) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (dsi);
	\path[accessarrow] (fbdrv.220) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (rsb);
	\path[accessarrow] (rsb)       .. controls +(0,-4ex) and +( 0ex,4ex)  .. (pmic);
	\path[accessarrow] (fbdrv.210) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (syscon);

	\path[accessarrow] (fbdrv.280) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (de2bus);
	\path[accessarrow] (fbdrv.290) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (rccu);
	\path[accessarrow] (fbdrv.300) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (rintc);
	\path[accessarrow] (fbdrv.310) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (rpwm);
	\path[accessarrow] (fbdrv.320) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (tcon0);
	\path[accessarrow] (fbdrv.330) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (tcon1);

\end{tikzpicture}


code:
\begin{tikzpicture}

	\definecolor{appcolor}        {rgb}{1,1,0.7}
	\definecolor{defaultcolor}    {rgb}{1,1,1}
	\definecolor{criticalcolor}   {rgb}{0.9,0.5,0.4}
	\definecolor{kernelcolor}     {rgb}{0.6,0.8,0.7}
	\definecolor{drivercolor}     {rgb}{0.6,0.7,0.8}

	\tikzstyle{treenode} = [component, path fading=flow fade, align=center,
	                        rounded corners=1, minimum height=6ex]

	\tikzstyle{service} = [draw=black, draw opacity=0.4, ball color=defaultcolor, fill opacity=0.2,
	                       rounded corners=0, shape=semicircle,
	                       inner sep=1.3ex, outer sep=0, above]

	\tikzstyle{appnode}    = [treenode, bottom color=appcolor]
	\tikzstyle{kernelnode} = [treenode, bottom color=kernelcolor, minimum width=80ex]
	\tikzstyle{drivernode} = [treenode, bottom color=drivercolor]
	\tikzstyle{muxnode}    = [treenode, bottom color=criticalcolor]

	%
	% Components
	%

	% drivers

	\node[drivernode, minimum width=24ex] (fbdrv) {Framebuffer Driver};

	\node[at=(fbdrv.east), anchor=west, xshift=4ex, drivernode, minimum width=24ex] (touchdrv) {Touchscreen Driver};

	\path (fbdrv) -- node (drivers) {} (touchdrv);

%	\node[fit=(fbdrv) (touchdrv)] (drivers) { };

	\path (drivers)+(0ex,-18ex) coordinate (devices) { };

	\tikzstyle{device} = [drivernode, rounded corners=0, minimum height=2ex, rotate=45, scale=0.5]

	\path (devices)+(-3ex*0,0) node[device] (dphy) {DPHY};
	\path (devices)+(-3ex*1,0) node[device] (pio)  {PIO};
	\path (devices)+(-3ex*2,0) node[device] (rpio) {R\_PIO};
	\path (devices)+(-3ex*3,0) node[device] (ccu)  {CCU};
	\path (devices)+(-3ex*4,0) node[device] (dsi)  {DSI};
	\path (devices)+(-3ex*5,0) node[device] (rsb)  {R\_RSB};
	\path (rsb)+(0,-5ex) node[device] (pmic) {PMIC};
	\path (devices)+(-3ex*6,0) node[device] (syscon) {SYSCON};
	\path (devices)+(3ex*1,0)  node[device] (de2bus) {DE2\_BUS};
	\path (devices)+(3ex*2,0)  node[device] (rccu)   {R\_CCU};
	\path (devices)+(3ex*3,0)  node[device] (rintc)  {R\_INTC};
	\path (devices)+(3ex*4,0)  node[device] (rpwm)   {R\_PWM};
	\path (devices)+(3ex*5,0)  node[device] (tcon0)  {TCON0};
	\path (devices)+(3ex*6,0)  node[device] (tcon1)  {TCON1};
	\path (devices)+(3ex*7,0)  node[device] (i2c0)   {I2C0};
	\path (i2c0)+(0,-5ex)  node[device] (goodix)   {Goodix};

	\tikzstyle{accessarrow} = [arrow]

	% framebuffer driver dependencies
	\path[accessarrow] (fbdrv.270) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (dphy);
	\path[accessarrow] (fbdrv.260) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (pio);
	\path[accessarrow] (fbdrv.250) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (rpio);
	\path[accessarrow] (fbdrv.240) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (ccu);
	\path[accessarrow] (fbdrv.230) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (dsi);
	\path[accessarrow] (fbdrv.220) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (rsb);
	\path[accessarrow] (rsb)       .. controls +(0,-4ex) and +( 0ex,4ex)  .. (pmic);
	\path[accessarrow] (fbdrv.210) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (syscon);

	\path[accessarrow] (fbdrv.280) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (de2bus);
	\path[accessarrow] (fbdrv.290) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (rccu);
	\path[accessarrow] (fbdrv.300) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (rintc);
	\path[accessarrow] (fbdrv.310) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (rpwm);
	\path[accessarrow] (fbdrv.320) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (tcon0);
	\path[accessarrow] (fbdrv.330) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (tcon1);

	% touch driver dependencies
	\path[accessarrow] (touchdrv.240) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (rsb);
	\path[accessarrow] (touchdrv.250) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (ccu);
	\path[accessarrow] (touchdrv.260) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (rpio);
	\path[accessarrow] (touchdrv.270) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (pio);
	\path[accessarrow] (touchdrv.280) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (rccu);
	\path[accessarrow] (touchdrv.290) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (rintc);
	\path[accessarrow] (touchdrv.300) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (i2c0);
	\path[accessarrow] (i2c0)      .. controls +(0,-4ex) and +( 0ex,4ex)  .. (goodix);

	\tikzstyle{conflict} = [draw, fill, dropshadow,
	                        top color=white, bottom color=yellow,
	                        path fading=flow fade,
	                        starburst, inner sep=0.5ex,
	                        starburst point height=1ex, minimum width=0.1ex, minimum height=0.1ex]

	\node[at=(ccu.50),conflict,yshift=0.5ex] {};
	\node[at=(rsb.50),conflict,yshift=0.5ex] {};
	\node[at=(rpio.50),conflict,yshift=0.5ex] {};
	\node[at=(pio.50),conflict,yshift=0.5ex] {};
	\node[at=(rccu.50),conflict,yshift=0.5ex] {};
	\node[at=(rintc.50),conflict,yshift=0.5ex] {};
	\node[at=(ccu.50),conflict,yshift=0.5ex] {};

\end{tikzpicture}


code:
\begin{tikzpicture}

	\definecolor{appcolor}        {rgb}{1,1,0.7}
	\definecolor{defaultcolor}    {rgb}{1,1,1}
	\definecolor{criticalcolor}   {rgb}{0.9,0.5,0.4}
	\definecolor{kernelcolor}     {rgb}{0.6,0.8,0.7}
	\definecolor{drivercolor}     {rgb}{0.6,0.7,0.8}

	\tikzstyle{treenode} = [component, path fading=flow fade, align=center,
	                        rounded corners=1, minimum height=6ex]

	\tikzstyle{service} = [draw=black, draw opacity=0.4, ball color=defaultcolor, fill opacity=0.2,
	                       rounded corners=0, shape=semicircle,
	                       inner sep=1.3ex, outer sep=0, above]

	\tikzstyle{appnode}    = [treenode, bottom color=appcolor]
	\tikzstyle{kernelnode} = [treenode, bottom color=kernelcolor, minimum width=80ex]
	\tikzstyle{drivernode} = [treenode, bottom color=drivercolor]
	\tikzstyle{muxnode}    = [treenode, bottom color=criticalcolor]

	%
	% Components
	%

	% drivers

	\node[drivernode, minimum width=24ex] (fbdrv) {Framebuffer Driver};

	\node[at=(fbdrv.east), anchor=west, xshift=4ex, drivernode, minimum width=24ex] (touchdrv) {Touchscreen Driver};

	\path (fbdrv) -- node (drivers) {} (touchdrv);

%	\node[fit=(fbdrv) (touchdrv)] (drivers) { };

	\path (drivers)+(0,-15ex) node[xshift=-1ex, anchor=east, drivernode, minimum width=5ex, minimum height=1ex, align=center] (clkdrv) { Clock\\Power\\Reset };
	\path (drivers)+(0,-15ex) node[xshift=1ex, anchor=west, drivernode, minimum width=5ex, minimum height=1ex, align=center] (piodrv) { PIO };

	\path (drivers)+(0ex,-28ex) coordinate (devices) { };

	\tikzstyle{device} = [drivernode, rounded corners=0, minimum height=2ex, rotate=45, scale=0.5]

	\path (devices)+(-3ex*7,0) node[device] (dphy) {DPHY};
	\path (devices)+(-3ex*6,0) node[device] (syscon) {SYSCON};
	\path (devices)+(-3ex*5,0) node[device] (dsi)  {DSI};
	\path (devices)+(-3ex*4,0) node[device] (de2bus) {DE2\_BUS};
	\path (devices)+(-3ex*3,0) node[device] (rpwm)   {R\_PWM};
	\path (devices)+(-3ex*2,0) node[device] (tcon0)  {TCON0};
	\path (devices)+(-3ex*1,0) node[device] (tcon1)  {TCON1};

	\path (devices)+(3ex*0,0) node[device] (ccu)  {CCU};
	\path (devices)+(3ex*1,0) node[device] (rsb)  {R\_RSB};
	\path (rsb)+(0,-5ex) node[device] (pmic) {PMIC};
	\path (devices)+(3ex*2,0)  node[device] (rccu)   {R\_CCU};
	\path (devices)+(3ex*3,0)  node[device] (rintc)  {R\_INTC};
	\path (devices)+(3ex*4,0) node[device] (pio)  {PIO};
	\path (devices)+(3ex*5,0) node[device] (rpio) {R\_PIO};

	\path (devices)+(3ex*6,0)  node[device] (i2c0)   {I2C0};
	\path (i2c0)+(0,-5ex)  node[device] (goodix)   {Goodix};

	\tikzstyle{accessarrow} = [arrow]

	% framebuffer driver dependencies
	\path[accessarrow] (fbdrv.210) .. controls +(0,-14ex) and +( 0ex,4ex)  .. (dphy);
	\path[accessarrow] (fbdrv.220) .. controls +(0,-14ex) and +( 0ex,4ex)  .. (syscon);
	\path[accessarrow] (fbdrv.230) .. controls +(0,-14ex) and +( 0ex,4ex)  .. (dsi);
	\path[accessarrow] (fbdrv.240) .. controls +(0,-14ex) and +( 0ex,4ex)  .. (de2bus);
	\path[accessarrow] (fbdrv.250) .. controls +(0,-14ex) and +( 0ex,4ex)  .. (rpwm);
	\path[accessarrow] (fbdrv.260) .. controls +(0,-14ex) and +( 0ex,4ex)  .. (tcon0);
	\path[accessarrow] (fbdrv.270) .. controls +(0,-14ex) and +( 0ex,4ex)  .. (tcon1);
	\path[accessarrow] (fbdrv.280) .. controls +(0,-2ex) and +( 0ex,4ex)  .. (clkdrv.100);
	\path[accessarrow] (rsb)       .. controls +(0,-2ex) and +( 0ex,4ex)  .. (pmic);
	\path[accessarrow] (fbdrv.290) .. controls +(0,-2ex) and +( 0ex,4ex)  .. (piodrv.110);

	% touch driver dependencies
	\path[accessarrow] (touchdrv.260) .. controls +(0,-2ex) and +( 0ex,4ex)  .. (clkdrv.80);
	\path[accessarrow] (touchdrv.270) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (piodrv.70);
	\path[accessarrow] (touchdrv.280) .. controls +(0,-14ex) and +( 0ex,4ex)  .. (i2c0);
	\path[accessarrow] (i2c0)         .. controls +(0,-4ex) and +( 0ex,4ex)  .. (goodix);

	% pio driver dependencies
	\path[accessarrow] (piodrv.280) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (rpio);
	\path[accessarrow] (piodrv.260) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (pio);

	% clk driver dependencies
	\path[accessarrow] (clkdrv.240) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (ccu);
	\path[accessarrow] (clkdrv.260) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (rsb);
	\path[accessarrow] (rsb)        .. controls +(0,-4ex) and +( 0ex,4ex)  .. (pmic);
	\path[accessarrow] (clkdrv.280) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (rccu);
	\path[accessarrow] (clkdrv.300) .. controls +(0,-4ex) and +( 0ex,4ex)  .. (rintc);

\end{tikzpicture}


code:
\begin{tikzpicture}

	\definecolor{appcolor}        {rgb}{1,1,0.7}
	\definecolor{guestoscolor}    {rgb}{0.8,0.8,0.7}
	\definecolor{defaultcolor}    {rgb}{1,1,1}
	\definecolor{criticalcolor}   {rgb}{0.9,0.5,0.4}
	\definecolor{kernelcolor}     {rgb}{0.6,0.8,0.7}
	\definecolor{drivercolor}     {rgb}{0.6,0.7,0.8}

	\tikzstyle{treenode} = [component, path fading=flow fade, align=center,
	                        rounded corners=1, minimum height=6ex]

	\tikzstyle{service} = [draw=black, draw opacity=0.4, ball color=defaultcolor, fill opacity=0.2,
	                       rounded corners=0, shape=semicircle,
	                       inner sep=1.3ex, outer sep=0, above]

	\tikzstyle{appnode}     = [treenode, bottom color=appcolor]
	\tikzstyle{kernelnode}  = [treenode, bottom color=kernelcolor, minimum width=65ex]
	\tikzstyle{drivernode}  = [treenode, bottom color=drivercolor]
	\tikzstyle{muxnode}     = [treenode, bottom color=criticalcolor]
	\tikzstyle{guestosnode} = [treenode, bottom color=guestoscolor, top color=appcolor]

	%
	% Components
	%

	% core / init
	\node[kernelnode] (core) {Core / Init};

	\path (core.north) node[service, xshift=-24ex, scale=0.4] (irqservice) {};
	\path (irqservice) node[scale=0.7, yshift=-2ex] {IRQ};

	\path (core.north) node[service, xshift=-12ex, scale=0.4] (mmioservice) {};
	\path (mmioservice) node[scale=0.7, yshift=-2ex] {MMIO};

	% platform driver
	\node[drivernode, minimum width=19ex, above=4ex of core, xshift=-17.5ex] (platformdrv) {Platform Driver};
	\path (platformdrv.north) node[service, scale=0.4] (platformservice) {};
	\path (platformdrv.north) node[scale=0.7, yshift=-1.5ex] {Platform};

	% Terminal crosslink
	\node[muxnode, minimum width=19ex, above=4ex of core, xshift=13.5ex] (crosslink)  {Terminal crosslink};
	\path (crosslink.north) node[service, scale=0.4, xshift=10ex] (terminalservice) {};
	\path (terminalservice) node[scale=0.7, yshift=-2ex] {Terminal};
	\path (crosslink.north) node[service, scale=0.4, xshift=-10ex] (terminalservice2) {};
	\path (terminalservice2) node[scale=0.7, yshift=-2ex] {Terminal};

	% Modem manager
	\node[drivernode, minimum width=15ex, above=10ex of platformdrv] (modemman)  {Modem Manager};

	% UART drivers
	\node[drivernode, minimum width=15ex, above=10ex of crosslink, xshift=-10ex] (hostuartdrv)  {UART Driver};
	\node[drivernode, minimum width=15ex, above=10ex of crosslink, xshift=10ex] (modemuartdrv)  {UART Driver};

	%
	% Sessions
	%
	\tikzstyle{treesessionarrow} = [arrow, thick]
	\path[treesessionarrow] (irqservice  |- platformdrv.south)   -- (irqservice);
	\path[treesessionarrow] (mmioservice |- platformdrv.south)   -- (mmioservice);
	\path[treesessionarrow] (hostuartdrv.320) .. controls +(0,-5ex) and +(0ex,5ex) ..  (terminalservice2);
	\path[treesessionarrow] (modemuartdrv.320) .. controls +(0,-5ex) and +(0ex,5ex) ..  (terminalservice);
	\path[treesessionarrow] (hostuartdrv.220) .. controls +(0,-5ex) and +(5ex,5ex) ..  (platformservice);
	\path[treesessionarrow] (modemuartdrv.220) .. controls +(0,-5ex) and +(5ex,5ex) ..  (platformservice);
	\path[treesessionarrow] (platformservice |- modemman.south) -- (platformservice);

	%
	% UART connections
	%
	\draw[arrow, <->, densely dashed] (hostuartdrv.250) -- +(0,-35ex) node[below=1ex] { Host console };
	\draw[arrow, <->, densely dashed] (modemuartdrv.310) -- +(0,-35ex) node[below=1ex] { Modem control };

\end{tikzpicture}


code:
\begin{tikzpicture}

	\definecolor{appcolor}        {rgb}{1,1,0.7}
	\definecolor{defaultcolor}    {rgb}{1,1,1}
	\definecolor{criticalcolor}   {rgb}{0.9,0.5,0.4}
	\definecolor{kernelcolor}     {rgb}{0.6,0.8,0.7}
	\definecolor{drivercolor}     {rgb}{0.6,0.7,0.8}

	\tikzstyle{treenode} = [component, path fading=flow fade, align=center,
	                        rounded corners=1, minimum height=6ex]

	\tikzstyle{service} = [draw=black, draw opacity=0.4, ball color=defaultcolor, fill opacity=0.2,
	                       rounded corners=0, shape=semicircle,
	                       inner sep=1.3ex, outer sep=0, above]

	\tikzstyle{appnode}    = [treenode, bottom color=appcolor]
	\tikzstyle{kernelnode} = [treenode, bottom color=kernelcolor, minimum width=18ex]

	\tikzstyle{treesessionarrow} = [arrow, thick]

	%
	% Components
	%

	% core / init
	\node[kernelnode] (core) {Core / Init};

	\path (core.north) node[service, scale=0.4, xshift=8ex]  (mmioservice) {};
	\path (core.north) node[service, scale=0.4, xshift=-8ex] (irqservice)  {};
	\path (mmioservice) node[scale=0.7, yshift=-2ex] {MMIO};
	\path (irqservice)  node[scale=0.7, yshift=-2ex] {IRQ};

	% gpio test
	\node[appnode, minimum width=18ex, above=4ex of core, align=center]
	     (gpiotest) {};

	\path (gpiotest) node[align=center] {PIO Test};

	% sessions
	\path[treesessionarrow] (mmioservice |- gpiotest.south) -- (mmioservice);
	\path[treesessionarrow] (irqservice  |- gpiotest.south) -- (irqservice);

	\tikzstyle{risk} = [rectangle callout, fill=red!80!black, rounded corners=3, text=white]
	\tikzstyle{details} = [rectangle callout, draw opacity=0.3, fill=white, fill opacity=0.2,
	                       text opacity=1, rounded corners=3, draw]

	\path (core.east)+(3ex,0ex)
		node [details, anchor=west, callout relative pointer={(-3ex,0ex)}, align=left] {
		ultimate \\
		authority
		};

	\path (gpiotest.east)+(3ex,0ex)
		node [risk, anchor=west, callout relative pointer={(-3ex,0ex)}, align=left] {
		access to \\
		any device
		};

\end{tikzpicture}


code:
\begin{tikzpicture}

	\definecolor{appcolor}        {rgb}{1,1,0.7}
	\definecolor{defaultcolor}    {rgb}{1,1,1}
	\definecolor{criticalcolor}   {rgb}{0.9,0.5,0.4}
	\definecolor{kernelcolor}     {rgb}{0.6,0.8,0.7}
	\definecolor{drivercolor}     {rgb}{0.6,0.7,0.8}

	\tikzstyle{treenode} = [component, path fading=flow fade, align=center,
	                        rounded corners=1, minimum height=6ex]

	\tikzstyle{service} = [draw=black, draw opacity=0.4, ball color=defaultcolor, fill opacity=0.2,
	                       rounded corners=0, shape=semicircle,
	                       inner sep=1.3ex, outer sep=0, above]

	\tikzstyle{appnode}    = [treenode, bottom color=appcolor]
	\tikzstyle{drivernode} = [treenode, bottom color=criticalcolor]
	\tikzstyle{kernelnode} = [treenode, bottom color=kernelcolor, minimum width=18ex]

	\tikzstyle{treesessionarrow} = [arrow, thick]

	%
	% Components
	%

	% core / init
	\node[kernelnode] (core) {Core / Init};

	\path (core.north) node[service, scale=0.4, xshift=8ex]  (mmioservice) {};
	\path (core.north) node[service, scale=0.4, xshift=-8ex] (irqservice)  {};
	\path (mmioservice) node[scale=0.7, yshift=-2ex] {MMIO};
	\path (irqservice)  node[scale=0.7, yshift=-2ex] {IRQ};

	% platform driver
	\node[drivernode, minimum width=18ex, above=4ex of core, align=center]
	     (platformdrv) {};

	\path (platformdrv) node[align=center] {Platform Driver};

	\path (platformdrv.north) node[service, scale=0.4]  (platformservice) {};
	\path (platformservice) node[scale=0.7, yshift=-2ex] {Platform};

	% pio driver
	\node[drivernode, minimum width=18ex, above=4ex of platformdrv, align=center]
	     (piodrv) {};

	\path (piodrv) node[align=center] {PIO Driver};

	\path (piodrv.north) node[service, scale=0.4, xshift=-12ex]  (pincontrolservice) {};
	\path (piodrv.north) node[service, scale=0.4, xshift=8ex] (pinirqservice)  {};
	\path (piodrv.north) node[service, scale=0.4, xshift=16ex] (pinstateservice)  {};
	\path (pincontrolservice) node[align=center, scale=0.5, yshift=-3.2ex] {Pin\\control};
	\path (pinirqservice)     node[scale=0.7, yshift=-2ex] {IRQ};
	\path (pinstateservice)   node[align=center, scale=0.5, yshift=-3.2ex] {Pin\\state};

	\node[appnode, minimum width=8ex, above=4ex of piodrv.north west,
	      align=center, anchor=south west]
	     (ledpulse) {};

	\path (ledpulse) node[align=center] {LED\\Pulse};

	\node[appnode, minimum width=8ex, above=4ex of piodrv.north east,
	      align=center, anchor=south east]
	     (pinbutton) {};

	\path (pinbutton) node[align=center] {Pin\\Button};

	% sessions
	\path[treesessionarrow] (mmioservice  |- platformdrv.south) -- (mmioservice);
	\path[treesessionarrow] (irqservice   |- platformdrv.south) -- (irqservice);
	\path[treesessionarrow] (platformservice |- piodrv.south) -- (platformservice);

	\path[treesessionarrow] (pincontrolservice |- ledpulse.south)  -- (pincontrolservice);
	\path[treesessionarrow] (pinstateservice   |- pinbutton.south) -- (pinstateservice);
	\path[treesessionarrow] (pinirqservice     |- pinbutton.south) -- (pinirqservice);

	\tikzstyle{risk} = [rectangle callout, fill=red!80!black, rounded corners=3, text=white]
	\tikzstyle{details} = [rectangle callout, draw opacity=0.3, fill=white, fill opacity=0.2,
	                       text opacity=1, rounded corners=3, draw]

	\path (core.east)+(3ex,0ex)
		node [details, anchor=west, callout relative pointer={(-3ex,0ex)}, align=left] {
		ultimate \\
		authority
		};

	\path (platformdrv.east)+(3ex,0ex)
		node [details, anchor=west, callout relative pointer={(-3ex,0ex)}, align=left] {
		authority over \\
		all device resources
		};

	\path (piodrv.east)+(3ex,0ex)
		node [details, anchor=west, callout relative pointer={(-3ex,0ex)}, align=left] {
		authority over \\
		all GPIO pins
		};

	\path (pinbutton.east)+(3ex,0ex)
		node [details, anchor=west, callout relative pointer={(-3ex,0ex)}, align=left] {
		authority to observe \\
		GPIO pin 8 at bank H
		};

	\path (ledpulse.north)+(0ex,3ex)
		node [details, anchor=south, callout relative pointer={(0ex,-3ex)}, align=left] {
		authority to control \\
		GPIO pin 2 at bank B
		};

\end{tikzpicture}


code:
\begin{tikzpicture}

	\definecolor{appcolor}        {rgb}{1,1,0.7}
	\definecolor{defaultcolor}    {rgb}{1,1,1}
	\definecolor{criticalcolor}   {rgb}{0.9,0.5,0.4}
	\definecolor{kernelcolor}     {rgb}{0.6,0.8,0.7}
	\definecolor{drivercolor}     {rgb}{0.6,0.7,0.8}

	\tikzstyle{treenode} = [component, path fading=flow fade, align=center,
	                        rounded corners=1, minimum height=6ex]

	\tikzstyle{service} = [draw=black, draw opacity=0.4, ball color=defaultcolor, fill opacity=0.2,
	                       rounded corners=0, shape=semicircle,
	                       inner sep=1.3ex, outer sep=0, above]

	\tikzstyle{appnode}    = [treenode, bottom color=appcolor]
	\tikzstyle{drivernode} = [treenode, bottom color=criticalcolor]
	\tikzstyle{kernelnode} = [treenode, bottom color=kernelcolor, minimum width=18ex]

	\tikzstyle{treesessionarrow} = [arrow, thick]

	%
	% Components
	%

	% core / init
	\node[kernelnode] (core) {Core / Init};

	\path (core.north) node[service, scale=0.4, xshift=8ex]  (mmioservice) {};
	\path (core.north) node[service, scale=0.4, xshift=-8ex] (irqservice)  {};
	\path (mmioservice) node[scale=0.7, yshift=-2ex] {MMIO};
	\path (irqservice)  node[scale=0.7, yshift=-2ex] {IRQ};

	% platform driver
	\node[drivernode, minimum width=18ex, above=4ex of core, align=center]
	     (platformdrv) {};

	\path (platformdrv) node[align=center] {Platform Driver};

	\path (platformdrv.north) node[service, scale=0.4]  (platformservice) {};
	\path (platformservice) node[scale=0.7, yshift=-2ex] {Platform};

	% gpio test
	\node[appnode, minimum width=18ex, above=4ex of platformdrv, align=center]
	     (gpiotest) {};

	\path (gpiotest) node[align=center] {PIO Test};

	% sessions
	\path[treesessionarrow] (mmioservice  |- platformdrv.south) -- (mmioservice);
	\path[treesessionarrow] (irqservice   |- platformdrv.south) -- (irqservice);
	\path[treesessionarrow] (platformservice |- gpiotest.south) -- (platformservice);

	\tikzstyle{risk} = [rectangle callout, fill=red!80!black, rounded corners=3, text=white]
	\tikzstyle{details} = [rectangle callout, draw opacity=0.3, fill=white, fill opacity=0.2,
	                       text opacity=1, rounded corners=3, draw]

	\path (core.east)+(3ex,0ex)
		node [details, anchor=west, callout relative pointer={(-3ex,0ex)}, align=left] {
		ultimate \\
		authority
		};

	\path (platformdrv.east)+(3ex,0ex)
		node [details, anchor=west, callout relative pointer={(-3ex,0ex)}, align=left] {
		authority over \\
		all device resources
		};

	\path (gpiotest.east)+(3ex,0ex)
		node [risk, anchor=west, callout relative pointer={(-3ex,0ex)}, align=left] {
		access to single \\
		PIO device
		};

\end{tikzpicture}


code:
\begin{tikzpicture}[remember picture,overlay]

	\definecolor{titlecolor}   {rgb}{0.75,0.85,0.75}

	\draw [top color=black!70, bottom color=titlecolor]
		(current page.south west) rectangle (current page.north east);

	%%
	% Calculate coordinates for a single logo stripe
	%
	% argument 1: base angle of the stripe
	% argument 2: fan angle
	%
	% In addition to the arguments, the function relies on the prior
	% definition of the coordinates 'leftbase', 'rightbase', and 'righttop'.
	%
	\newcommand\calccoordinates[2]{

		\def\baseangle{#1}
		\def\steepangle{#2}

		\path (rightbase)+(\baseangle+90:10cm) coordinate (rightfarup);

		\path (lefttop)+(\steepangle+\baseangle+270:100cm) coordinate (tmp);
		\coordinate (touchpoint) at (intersection of leftbase--rightbase
		                                         and lefttop--tmp);

		\path (touchpoint)+(\steepangle+\baseangle:100cm) coordinate (tmp);
		\coordinate (righttop) at (intersection of rightbase--rightfarup
		                                         and touchpoint--tmp);
	}

	\tikzstyle{logospike} = [fill, black, opacity=0.9,
	                         path fading=flow fade]

	\path (current page.south west) -- coordinate[pos=0.15] (midleft) (current page.north west);
	\path (current page.south east) -- coordinate[pos=0.15] (midright) (current page.north east);

	\path (midleft)           coordinate (leftbase);
	\path (midright)          coordinate (rightbase);
	\path (leftbase)+(90:7cm) coordinate (lefttop);

	\def\maxiterations{5}
	\foreach \i in {0,...,\maxiterations} {

		\calccoordinates{0 + \i*11}{11}

		% draw polygon
		\ifthenelse{\i = 0} {
			% let lowest spoke go right to the bottom of the page
			\path[logospike]
			                 (current page.south west)
			              -- (current page.south east)
			              -- (righttop) -- (touchpoint)
			              -- (lefttop) --cycle;
		} {
			\path[logospike]
				(leftbase) -- (rightbase) -- (righttop) -- (touchpoint)
				           -- (lefttop) --cycle;
		}

		% init coordinates for next iteration

		\def\nextangle{0 + 11 + \i*11}
		\def\nextspace{2cm - \i*0.3cm}

		\path (touchpoint) -- ++(\nextangle:\nextspace)
		                   -- ++(\nextangle + 90:\nextspace)
		                   coordinate (leftbase);

		\path (righttop) -- ++(\nextangle + 90:\nextspace)
		                 coordinate (rightbase);

		\path (lefttop) -- ++(\nextangle:\nextspace)
		                -- ++(\nextangle + 90:0.6*\nextspace)
		                coordinate (lefttop);
	}

	\definecolor{titlecol} {rgb}{1,1,1}

	\path (current page.north)
		node[below=1cm, font=\normalsize \sffamily, color=titlecol, scale=10,
		     opacity=0.8] (genode) {GENODE};

	\path (genode)
		node[below=2cm, font=\normalsize \sffamily, color=titlecol,
		     opacity=0.8, scale=2.65] (osf) {Operating System Framework 22.05};

	\definecolor{subtitlecol} {rgb}{0.85, 0.90, 0.6}

	\path (current page.south)
		node[above=1.8cm, font=\normalsize \sffamily, color=subtitlecol,
		     scale=5] (subtitle) {Platforms};

	\path (current page.south)+(0cm,0.8cm)
		node[anchor=south, font=\normalsize \sffamily, color=black,
		     opacity=0.7, scale=2] {Norman Feske};

\end{tikzpicture}


code:
\begin{tikzpicture}

	\labeledcompoundnode{pdcompound}{component}{Protection domain}{
		\node[minimum width=15ex] {};
	}

\end{tikzpicture}


code:
\begin{tikzpicture}

	\labeledcompoundnode{guiserver}{component}{GUI server}{

		\rpcobjectrnode{gui}{align=center}{}{GUI \\ session}
	}

	\labeledcompoundnode{terminal}{component, right=5ex of guiserver}{Terminal}{

		\rpcobjectrnode{terminalsession}{align=center}{}{Terminal \\ session}
		\node[capability, xshift=-5ex, yshift=0] (terminalguicap) {};
	}

	\labeledcompoundnode{app}{component, right=5ex of terminal,
	                          minimum width=14ex}{Application}{

		\node[capability] (appterminalsessioncap) {};
	}

	% capability associations
	\path [draw, dashed] (guicap) -- (terminalguicap);
	\path [draw, dashed] (terminalsessioncap)    -- (appterminalsessioncap);

\end{tikzpicture}


code:
\begin{tikzpicture}

	\definecolor{appcolor} {rgb}{1,1,0.7}

	\tikzstyle{treenode} = [component, path fading=flow fade, align=center,
	                        rounded corners=1]

	\tikzstyle{subsystem} = [minimum width=6ex, minimum height=3ex, align=center,
	                         draw=black!80, fill=white, fill opacity=0.6]

	\tikzstyle{codecsubsystem} = [subsystem, minimum width=10ex]

	%
	% GUI
	%

	\node[treenode, minimum width=23ex, minimum height=7ex] (gui) {};
	\path (gui.west) node[right=1ex] {GUI};

	\path (gui.east) node[left=1ex, subsystem, align=center] (vfb)
		{\tiny Virtual\\ \tiny GUI};

	\path (vfb.west) node[left=1ex, subsystem, align=center] (vrom)
		{\tiny Virtual\\ \tiny ROM};

	%
	% Avplay
	%

	\node[treenode, minimum width=23ex, minimum height=10ex, above=16ex of gui] (avplay) {};
	\path (avplay.north) node[below=1ex] {Codec (avplay)};

	\path (avplay.south) node[above=1ex, codecsubsystem, xshift=-5.5ex] (sdlaudio)
		{SDL audio};

	\path (avplay.south) node[above=1ex, codecsubsystem, xshift=5.5ex] (sdlvideo)
		{SDL video};

	%
	% ROM service
	%
	\node[treenode, minimum width=10ex, minimum height=3ex, below=6ex of gui,
	      xshift=-5ex] (rom) {ROM\\service};

	\tikzstyle{treesessionarrow} = [arrow, thick, densely dashed]

	%
	% ROM connection for "media"
	%
	\draw[treesessionarrow] (avplay.180)
		.. controls +(180:8ex) and +(165:12ex) ..
		node[left, align=center, sloped=false] {ROM\\"media"}
		(gui.158)
		.. controls +(165 + 180:4ex) and +(90:8ex) ..
		(rom);

	\coordinate (sdlvideofb) at (vfb |- sdlvideo.south);
	\coordinate (avplayconfig) at (vrom |- avplay.south);

	\draw[treesessionarrow] (sdlvideofb) --
		node[right, align=center, sloped=false] {GUI} (vfb);
	\draw[treesessionarrow] (avplayconfig) --
		node[right, align=center, pos=0.2, sloped=false, xshift=-0.5ex] {ROM\\"config"}
		coordinate[pos=0.55] (configrom) (vrom);

	%
	% Codec configuration
	%
	\path (configrom) node[left=-6ex, fill=white, dropshadow, align=left,
                       chamfered rectangle, draw, draw opacity=0.5,
                       chamfered rectangle corners=north east,
                       inner sep=0]
	{
		\tiny
		\begin{lstlisting}
<config>
   <sdl_audio_volume
         value="85"/>
</config>
		\end{lstlisting}
	};

	%
	% Nitpicker
	%
	\node[treenode, minimum width=24ex, minimum height=22ex, right=8ex of gui,
	      yshift=8ex] (nitpicker) {};
	\path (nitpicker.north) node[below=1ex] {Nitpicker GUI server};

	\graphicspath{ {./img/} }
	\path (nitpicker.south) node[above=1ex] (screenshot) {\includegraphics[width=24ex]{qt_avplay_screen.png}};

	\path (screenshot.south west)+(13ex,3ex) coordinate (nitpickerguisession) {};
	\path (screenshot.south west)+(10ex,5ex) coordinate (nitpickeravplaysession) {};

	\draw[treesessionarrow] (gui.320)
		.. controls +(270:8ex) and +(270:14ex) ..
		node[below, sloped=false] {GUI}
		(nitpickerguisession);

	\draw[treesessionarrow] (vfb.300)
		.. controls +(270:5ex) and +(270:13ex) ..
		node[below, sloped=false] {GUI}
		(nitpickeravplaysession);

\end{tikzpicture}


code:
\begin{tikzpicture}[node distance=10ex]

	\node [component, inner sep=1.5ex] (gui) {GUI};
	\node [component, inner sep=1.5ex, right of=gui, xshift=6ex, align=center] (launcher) {Launcher};
	\node [component, inner sep=1.5ex, above of=launcher, xshift=8ex] (app) {Application};
	\node [fit=(gui) (launcher), inner sep=0, outer sep=0] (children) {};
	\node [component, inner sep=1.5ex, below of=children, node distance=10ex] (init) {Init};

	\path[sloped] (init)     -- node [ownership, rotate=180] {} (gui);
	\path[sloped] (init)     -- node [ownership]             {} (launcher);
	\path[sloped] (launcher) -- node [ownership]             {} (app);

\end{tikzpicture}


code:
\begin{tikzpicture}

	\labeledcompoundnode{fbdrv}{component, minimum width=17ex}{Framebuffer driver}{

		\node[capability] (fbdrvcapturesessioncap) {};
	}

	\labeledcompoundnode{inputdrv}{component, minimum width=17ex, below=5ex of fbdrv}{Input driver}{

		\node[capability] (inputdrveventsessioncap) {};
	}

	\node[fit=(fbdrv) (inputdrv)] (drivers) {};

	\labeledcompoundnode{gui}{component, right=5ex of drivers}{GUI server}{

		\rpcobjectrnode{guisession1}{align=center}{}{GUI session}
		\rpcobjectrnode{guisession2}{align=center, below=1ex of guisession1}{}{GUI session}
		\rpcobjectrnode{guisession3}{align=center, below=1ex of guisession2}{}{GUI session}
		\rpcobjectlnode{capturesession}{align=center, xshift=-25ex, yshift=-2ex}{}{Capture session}
		\rpcobjectlnode{eventsession}{align=center,   xshift=-25ex, yshift=-7ex}{}{Event session}
	}

	\labeledcompoundnode{app1}{component, right=6ex of gui, yshift=10ex,
	                          minimum width=12ex}{Application}{
		\node[capability] (app1guisessioncap) {};
	}

	\labeledcompoundnode{app2}{component, below=3ex of app1,
	                          minimum width=12ex}{Application}{
		\node[capability] (app2guisessioncap) {};
	}

	\labeledcompoundnode{app3}{component, below=3ex of app2,
	                          minimum width=12ex}{Application}{
		\node[capability] (app3guisessioncap) {};
	}

	% capability associations
	\path [draw, dashed] (capturesessioncap) -- (fbdrvcapturesessioncap);
	\path [draw, dashed] (eventsessioncap)   -- (inputdrveventsessioncap);
	\path [draw, dashed] (guisession1cap)    -- (app1guisessioncap);
	\path [draw, dashed] (guisession2cap)    -- (app2guisessioncap);
	\path [draw, dashed] (guisession3cap)    -- (app3guisessioncap);

\end{tikzpicture}


code:
\begin{tikzpicture}[node distance=12ex]

	\labeledcompoundnode{client}{component}{Client}{

		\node[capability] (clientpdcap) {};
	}

	\labeledcompoundnode{child}{component, below of=client, xshift=-10ex}{Child}{

		\node[capability] (childpdcap) {};
		\node[capability, right of=childpdcap] (childclientpdcap) {};
	}

	\labeledcompoundnode{server}{component, left of=child, xshift=-18ex}{Server}{

		\node[capability] (serverpdcap) {};
		\node[capability, right of=serverpdcap] (serverclientpdcap) {};
	}

	\labeledcompoundnode{init}{component, node distance=10ex, below of=child, xshift=-15ex}{Init}{

%		\node[capability] (initpdcap) {2};
%		\downwardthreadnode{initthread}{inner sep=0, node distance=0ex, left=4ex of initpdcap}
%		\node[capability, right of=initpdcap] (initchildpdcap) {3};
	}

	\labeledcompoundnode{core}{component, node distance=10ex, below of=init}{Core}{

		\rpcobjectrnode{pdserver}{}{}{PD session}

		\rpcobjectrnode{pdchild}{node distance=25ex, right of=pdserver}{}{PD session}

		\rpcobjectrnode{pdclient}{node distance=25ex, right of=pdchild}{}{PD session}
	}

	% capability associations
	\path [draw, dashed] (pdservercap) -- (serverpdcap);
	\path [draw, dashed] (pdchildcap) -- (childpdcap);
	\path [draw, dashed] (pdclientcap) -- (childclientpdcap);
	\path [draw, dashed] (childclientpdcap) -- (clientpdcap);
	\path [draw, dashed] (clientpdcap) -- (serverclientpdcap);

	% delegation of the client's PD session to the server
	\delegationpath (clientpdcap)
	      .. controls +(-1,0) and +(0,1) ..
	      node[sloped, above] {delegate} (serverclientpdcap);

	\newcommand\transferpath{
		\path [color=green!50!black!70, text=black,
		       decoration={markings,
		                   mark=between positions 0.03 and 1 step 1ex with {\arrow{latex}}},
		       postaction={decorate}]}

	\transferpath (pdchildobj) .. controls +(0,1) and +(0,1) .. (pdclientobj);
	\transferpath (pdclientobj) .. controls +(0,-1) and +(0,-1) .. (pdserverobj);

\end{tikzpicture}


code:
\begin{tikzpicture}

	% object-pool entry
	\node[umlclass2] (objpoolentry) {
		\textbf{Object-pool entry}
		\nodepart{two}
		capability
	};

	% RPC-object base
	\node[umlclass3, below of=objpoolentry, node distance=15ex] (rpcobjbase) {
		\textbf{RPC-object base}
		\nodepart{two}
		\nodepart{three}
		$dispatch()$
	};

	% RPC object
	\node[umlclass3, below of=rpcobjbase, node distance=18ex] (rpcobj) {
		\textbf{RPC object}
		\nodepart{two}
		\nodepart{three}
		dispatch()
	};
	\path (rpcobj.north east)+(4ex,1ex) node[umlclass, dashed] {RPC interface};

	% object pool
	\node[umlclass, right of=objpoolentry, node distance=35ex, inner sep=2ex] (objpool)
		{\textbf{Object pool}};
	\path (objpool.north east) node[umlclass, dashed] {T};

	% info about object pool
	\node[umlinfo, right of=objpool, node distance=25ex] (objpoolinfo)
		{associates \\capabilities with \\ local objects};
	\path[umlinfoline] (objpool) -- (objpoolinfo);

	% entrpoint
	\node[umlclass3, below of=objpool, node distance=15ex] (rpcentrypoint) {
		\textbf{Entrypoint}
		\nodepart{two}
		\nodepart{three}
		manage(RPC object base \&) : Capability \\
		dissolve(RPC object base \&)
	};

	% info about entrypoint
	\node[umlinfo, below of=rpcentrypoint, node distance=15ex] (rpcentrypointinfo)
		{receives \\ incoming RPC \\ requests};
	\path[umlinfoline] (rpcentrypoint) -- (rpcentrypointinfo);

	% relationships
	\path[umlinherit] (rpcobjbase)    -- (objpoolentry);
	\path[umlinherit] (rpcobj)        -- (rpcobjbase);
	\path[umlinherit] (rpcentrypoint) -- (objpool);

	\path[umlrelated] (objpoolentry) -- node[pos=0.1] {*} node[pos=0.9] {1} (objpool);

	\path[umloperate] (rpcentrypoint) -- node {lookup} (objpoolentry.south east);
	\path[umloperate] (rpcentrypoint) -- node {call}   (rpcobjbase);

\end{tikzpicture}


code:
\begin{tikzpicture}

	\tikzstyle{layerbox} = [minimum width=20ex, minimum height=4ex, dropshadow,
	                        node distance=4ex, draw, draw opacity=0.3,
	                        left color=black!5]

	\node[layerbox, right color=black!10] (connection) {Connection};
	\node[layerbox, right color=black!10!yellow!30, below of=connection]    (client)        {Client object};
	\node[layerbox, right color=black!10!green!30,  below of=client]        (rpcstubclient) {RPC stub code};
	\node[layerbox, right color=black!10!blue!30,   below of=rpcstubclient] (ipcclient)     {IPC library};

	\node[layerbox, right color=black!10, right=10ex of connection]         (session)       {Session};
	\node[layerbox, right color=black!10!yellow!30, below of=session]       (objframework)  {RPC object};
	\node[layerbox, right color=black!10!green!30,  below of=objframework]  (rpcstubserver) {RPC stub code};
	\node[layerbox, right color=black!10!blue!30,   below of=rpcstubserver] (ipcserver)     {IPC library};

	% helper for positioning the kernel node
	\node[fit=(connection) (ipcserver)] (userland) {};

	\node[layerbox, minimum width=50ex, minimum height=6ex,
	      right color=black!10!blue!30, below=0ex of userland] (kernel) {Kernel IPC mechanism};

	% dashed line between typed and untyped capabilities
	\path (rpcstubclient.south west)+(-1,0) node (typeborderleft)  {};
	\path (rpcstubserver.south east)+(3,0)  node (typeborderright) {};
	\draw[dashed, thick] (typeborderleft) --
		node[above, pos=0.9] {$typed$}
		node[below, pos=0.9] {$untyped$} (typeborderright);

	% double-headed arrow across all layers
	\path (connection)+(7ex,0) node (arrowstart) {};
	\path (session)+(-7ex,0)    node (arrowend)   {};
	\draw[ultra thick, <->, >= stealth, draw opacity=0.2, fill opacity=0.2] (arrowstart)
		.. controls +(0,-1)  and +(-1.5,0) .. (kernel.center)
		.. controls +(1.5,0) and +(0,-1)   .. (arrowend);

\end{tikzpicture}


code:
\begin{tikzpicture}

	\labeledcompoundnode{pdcompound}{component}{Protection domain}{
		\rpcobjectrnode{rpcobj}{}{}{RPC object}
	}

\end{tikzpicture}


code:
\begin{tikzpicture}

	\labeledcompoundnode{runtime}{component}{Runtime environment}{

		\rpcobjectrnode{runtimeparent2}{align=center}{}{Parent}
		\rpcobjectrnode{runtimeparent1}{align=center, left=1ex of runtimeparent2}{}{Parent}
		\rpcobjectrnode{runtimeparent3}{align=center, right=1ex of runtimeparent2}{}{Parent}
	}

	\labeledcompoundnode{child2}{component, above=4.5ex of runtime,
	                          minimum width=10ex}{Child}{
		\node[capability] (child2parentcap) {};
	}

	\labeledcompoundnode{child1}{component, left=4ex of child2,
	                          minimum width=10ex}{Child}{
		\node[capability] (child1parentcap) {};
	}

	\labeledcompoundnode{child3}{component, right=3ex of child2,
	                          minimum width=10ex}{Child}{
		\node[capability] (child3parentcap) {};
	}

	% ownership arrows
	\path (child1.south) -- node[ownership, sloped, rotate=180] {} +(0,-5ex);
	\path (child2.south) -- node[ownership, sloped, rotate=180] {} +(0,-5ex);
	\path (child3.south) -- node[ownership, sloped, rotate=180] {} +(0,-5ex);

	% capability associations
	\path [draw, dashed] (runtimeparent1cap) -- (child1parentcap);
	\path [draw, dashed] (runtimeparent2cap) -- (child2parentcap);
	\path [draw, dashed] (runtimeparent3cap) -- (child3parentcap);

\end{tikzpicture}


code:
\begin{tikzpicture}

	\definecolor{arrowcol} {rgb}{1,0.8,0.5}

	\node[draw, dropshadow, path fading=flow fade, shape=double arrow,
	      draw opacity=0.5,
	      top color=arrowcol, bottom color=black!50!arrowcol,
	      double arrow head extend=1.5ex,
	      inner xsep=5ex, inner ysep=1.5ex]
	      (arrow) { };

	\node[left=0ex  of arrow, minimum width=30ex] {};
	\node[right=0ex of arrow, minimum width=30ex] {};

	\node[left=2ex  of arrow] { \Large Security };
	\node[right=2ex of arrow] { \Large Ease of use };

\end{tikzpicture}


code:
\begin{tikzpicture}[node distance=10ex]

	%
	% init
	%
	\labeledcompoundnode{init}
	                    {component}
	                    {Init}{

		\rpcobjectrnode{parentgui}{node distance=3.5ex}{}{Parent}
		\node[capability, right of=parentgui] (rootcap) {};
		\rpcobjectrnode{parentlauncher}{node distance=3.5ex, xshift=7ex,
		                               right of=rootcap, opacity=0.5}{}{Parent}
	}

	%
	% launcher
	%
	\labeledcompoundnode{launcher}
	                    {component, above=5ex of init, xshift=15ex}
	                    {Launcher}{
		\rpcobjectrnode{parentapplication}{node distance=3.5ex}{}{Parent}
		\downwardthreadnode{launcherthread}{below of=parentapplication,
		                                    node distance=4ex}
		\node[capability, below=0ex of launcherthread] (launcherparentcap) {};
	}

	%
	% application
	%
	\labeledcompoundnode{application}
	                    {component, above=5ex of launcher, xshift=8ex,
	                     minimum width=15ex}
	                    {Application}{
		\downwardthreadnode{applicationthread}{}
		\node[capability, below=0ex of applicationthread] (applicationparentcap) {};
	}

	%
	% gui
	%
	\labeledcompoundnode{gui}
	                    {component, above=5ex of init, xshift=-12ex}
	                    {GUI}{
		\rpcobjectrnode{guiroot}{node distance=5ex}{}{GUI root}
		\downwardthreadnode{guithread}{below of=guiroot, text opacity=0, node distance=4ex}
		\node[capability, below=0ex of guithread] (guiparentcap) {};
	}

	% session call from application to launcher
	\path[arrow] (applicationparentcap) .. controls +(0,-4ex) and +(0,4ex)
	                            .. node [sloped=false, pos=0.6]
	                            {$session$("GUI", label:browser)} (parentapplicationobj);

	% session call from launcher to init
	\path[arrow] (launcherparentcap) .. controls +(0,-4ex) and +(0,4ex)
	                            .. node [sloped=false, pos=0.6, xshift=8ex]
	                            {$session$("GUI", label:arora)} (parentlauncherobj);

	% invisible, just for keeping the layout consistent with announce.tikz
	\path (guiparentcap) .. controls +(0,-4ex) and +(0,4ex)
	                            .. node [sloped=false, pos=0.6, xshift=-10ex, text opacity=0]
	                            {$announce$("GUI", 3)} (parentguiobj);

	% capability delegations
	\path [draw, dashed] (guirootcap)           .. controls +(5ex,-5ex) and +(0,5ex) .. (rootcap);
	\path [draw, dashed] (guiparentcap)         .. controls +(5ex,-5ex) and +(0,5ex) .. (parentguicap);
	\path [draw, dashed] (applicationparentcap) .. controls +(0ex,-5ex) and +(0,5ex) .. (parentapplicationcap);
	\path [draw, dashed] (launcherparentcap)    .. controls +(0ex,-5ex) and +(0,5ex) .. (parentlaunchercap);

\end{tikzpicture}