\definecolor{col_bench_gen}{HTML}{5a7eff}
\definecolor{col_bench_gen_bg}{HTML}{dbeeff}
\definecolor{col_bench_harness}{HTML}{ffa673}
\definecolor{col_results}{HTML}{000000}

\centering
\begin{tikzpicture}[
    hiddennode/.style={rectangle,draw=normal text.bg, very thick, minimum size=5mm, align=center, font=\footnotesize},
    normnode/.style={rectangle,draw=black, very thick, minimum size=5mm, align=center, font=\footnotesize},
    resultnode/.style={rectangle,draw=col_results, fill=black!2, very thick, minimum size=5mm, align=center, font=\footnotesize},
    bluenode/.style={rectangle, draw=col_bench_gen, fill=col_bench_gen_bg, very thick, minimum height=5mm, minimum width=4cm, align=center, font=\footnotesize},
    rednode/.style={rectangle, draw=col_bench_harness, fill=orange!5, very thick, minimum size=5mm, align=center, font=\footnotesize},
    bencher/.style={rednode, minimum width=2.5cm, minimum height=5mm},
    genarrow/.style={draw=col_bench_gen},
    harnarrow/.style={draw=col_bench_harness},
    ]
    \centering
    %Nodes
    \node[bluenode]  (bench)                       {Benchmark suite \figref{ssec:bench_suite}};
    \node[bluenode]  (pocc)     [below=of bench] {Loop nest optimizers \figref{ssec:loop_nest_optimizer}};
    \node[bluenode]  (kernel)   [below=of pocc]    {Constraining utility \figref{ssec:kernelify}};
    \node[bluenode]  (gcc)      [below=of kernel]  {Compilations \figref{ssec:compile}};
    \node[rednode]   (gdb)      [right=0.1\textwidth of gcc] {Basic block \\extraction \figref{ssec:bb_extr}};
    \node[bencher]   (ithemal)  [right=4cm of gdb]   {Ithemal};
    \node[bencher]   (iaca)     [above=0.5em of ithemal]    {IACA};
    \node[bencher]   (uica)     [above=0.5em of iaca]    {uiCA};
    \node[bencher]   (llvm)     [above=0.5em of uica]     {llvm-mca};
    \node[bencher]   (bhive)    [above=0.5em of llvm]     {BHive (measure)};
    \node[rednode]   (ppapi)    [left=1cm of bhive]   {perf (measure)};
    \node[rednode]   (gus)      [below=0.5em of ppapi] {Gus};
    %% \node[rednode]   (uica)     [below=of gdb]     {uiCA};
    \node[rednode]   (lifting)  [below right=1em and 0.2cm of gdb]   {
        Prediction lifting};
    \node[
        draw=black,
        very thick,
        dotted,
        fit=(ppapi) (gus) (bhive) (llvm) (uica) (iaca) (ithemal)
        ] (comps) {};
    \node (throughput_label)  [above=0.2em of comps,align=center] {
            \footnotesize Throughput predictions \\\footnotesize \& measures
        \figref{ssec:throughput_pred_meas}};
    \node[draw=black,
        very thick,
        dotted,
        %% label={below:\footnotesize Variations},
        label={[above,xshift=1cm]\footnotesize Variations},
        fit=(pocc) (kernel) (gcc)
        ] (vars) {};
    \node[resultnode]  (bench2) [right=of lifting] {Evaluation metrics \\ for
        code analyzers};

    % Key
    \node[]  (keyblue1)     [below left=0.7cm and 0cm of vars]   {};
    \node[hiddennode]  (keyblue2)     [right=0.5cm of keyblue1]   {Generating microbenchmarks};
    \node[]  (keyred1)     [below=.5em of keyblue1]   {};
    \node[hiddennode]  (keyred2)     [right=0.5cm of keyred1] {Benchmarking harness};
    \node[]  (keyresult1)     [below=.5em of keyred1]   {};
    \node[hiddennode]  (keyresult2)     [right=0.5cm of keyresult1]
        {Results analysis};

    %Lines
    \draw[-, very thick, harnarrow] (keyred1.east)     -- (keyred2.west);
    \draw[-, very thick, genarrow]  (keyblue1.east)     -- (keyblue2.west);
    \draw[-, very thick]  (keyresult1.east)     -- (keyresult2.west);
    \draw[->, very thick, genarrow]   (bench.south)   -- (pocc.north);
    \draw[->, very thick, genarrow]   (pocc.south)    -- (kernel.north);
    \draw[->, very thick, genarrow]   (kernel.south)  -- (gcc.north);
    \draw[->, very thick, genarrow]   (gcc.east)     -- (gdb.west);
    \draw[->, very thick, genarrow]   (gcc.east)     -- (ppapi.west);
    \draw[->, very thick, genarrow]   (gcc.east)     -- (gus.west);
    \draw[->, very thick, harnarrow]  (gdb.east)     -- (uica.west);
    \draw[->, very thick, harnarrow]  (gdb.east)     -- (iaca.west);
    \draw[->, very thick, harnarrow]  (gdb.east)     -- (ithemal.west);
    \draw[->, very thick, harnarrow]  (gdb.east)     -- (bhive.west);
    \draw[->, very thick, harnarrow]  (gdb.east)     -- (llvm.west);
    \draw[->, very thick, harnarrow]  (comps.south-|lifting)   -- (lifting.north);
    \draw[->, very thick]            (lifting.east)   -- (bench2.west);
\end{tikzpicture}