blob: 74518a7350cbd0007c605222ca49ee74aa38437a [file] [log] [blame]
\documentclass[tikz,border=10pt]{standalone}
\usepackage{tikz}
\usepackage{makecell}
\usetikzlibrary{arrows}
\usetikzlibrary{circuits.logic.US}
\usetikzlibrary{matrix}
\usetikzlibrary{positioning}
\usetikzlibrary{backgrounds}
\usetikzlibrary{decorations.pathreplacing, positioning, shapes.geometric, shapes.misc, shadows, fit}
\usetikzlibrary{shapes.geometric, shapes.symbols, arrows, shadows, fit, backgrounds, 3d, plotmarks, calc, intersections, matrix, patterns}
\tikzstyle{thin_arrow} = [draw,->,>=stealth]
\tikzstyle{arrow} = [thick,thin_arrow]
\tikzstyle{bidir_arrow} = [draw,thick,<->,>=stealth]
\tikzstyle{graph_node} = [draw, circle, inner sep=0.5pt, font=\footnotesize]
\tikzstyle{lb_color} = [top color=cyan!5, bottom color=cyan!15]
\tikzstyle{lb} = [rectangle, anchor=south west, draw, lb_color]
\tikzstyle{large_lb} = [lb, minimum width=1.5cm, minimum height=1.5cm]
\tikzstyle{ram} = [rectangle, anchor=south west, draw, top color=teal!10, bottom color=teal!20]
\tikzstyle{dsp} = [rectangle, anchor=south west, draw, top color=olive!30, bottom color=olive!40]
\tikzstyle{trapezoid} = [trapezium,
trapezium stretches=true,
trapezium left angle=70,
trapezium right angle=110,
]
\tikzstyle{io} = [trapezoid,
minimum width=2.5cm,
minimum height=1cm,
text centered,
align=center,
draw=black,
drop shadow,
top color=blue!10,
bottom color=blue!30]
\tikzstyle{design} = [io]
\tikzstyle{metric} = [io,
minimum width=1cm]
\tikzstyle{device} = [rounded rectangle,
minimum width=3cm,
minimum height=1cm,
text centered,
align=center,
draw=black,
drop shadow,
top color=black!10!green!20,
bottom color=black!10!green!70]
\tikzstyle{process} = [rectangle,
minimum width=3cm,
minimum height=1cm,
text centered,
align=center,
draw=black,
drop shadow,
top color=orange!10,
bottom color=orange!35]
\tikzstyle{process_no_shadow} = [rectangle,
minimum width=3cm,
minimum height=1cm,
text centered,
align=center,
draw=black,
top color=orange!10,
bottom color=orange!35]
\begin{document}
\begin{tikzpicture}[node distance=1.0cm]
\tikzstyle{vtr_callout} = [draw=black!40!green, fill=black!30!green, fill opacity=0.25, very thick, dash pattern={on 8pt off 4pt}, rounded corners=0.3cm]
\tikzstyle{titan_callout} = [draw=black!20!red, fill=red, very thick, fill opacity=0.25, dash pattern={on 6pt off 2pt on 3pt off 2pt}, rounded corners=0.3cm]
\pgfmathsetmacro{\vtroffset}{0.5cm}
\pgfmathsetmacro{\titanoffset}{0.3cm}
\pgfmathsetmacro{\metricoffset}{0.6cm}
\newcommand{\arrowshift}{0.25cm}
\newcommand{\arrowxshift}{0.07cm}
\matrix [row sep=0.6cm, column sep=0.9cm] {
\node (arch) [device] {FPGA \\ Architecture}; & & \node (hdl) [design] {HDL}; & \\
& \node (odin_synth) [process] {Odin II}; & \node (quartus_map) [process] {Quartus \\ Map}; & \node (yosys_frontend) [] {Yosys}; \\
& & \node (vqm2blif) [process] {VQM to BLIF}; & \node (abc_yosys) [process_no_shadow] {ABC}; \\
& \node (abc_synth) [process] {ABC}; & & \\
& & \node (techmapped_netlist) [design] {Tech. Mapped \\ Netlist}; & & \\
& \node (vpr_pack) [process] {VPR \\ Pack}; & \node (packing) [design] {Packing}; & \node (other_pack) [process, dashed] {Other \\ Pack}; & \\
& \node (vpr_place) [process] {VPR \\ Place}; & \node (placement) [design] {Placement}; & \node (other_place) [process, dashed] {Other \\ Place}; & \\
& \node (vpr_route) [process] {VPR \\ Route}; & \node (routing) [design] {Routing}; & \node (other_route) [process, dashed] {Other \\ Route}; & \\
& & & & \\
& \node (vpr_analysis) [process] {VPR \\ Analysis}; & & \node (assembler) [process, dashed] {Bitstream Gen.}; & \\
};
\node(rr_graph) [device,left=0.25cm of arch] {RR-Graph};
\begin{scope}[on background layer]
\node (yosys) [process, fit=(yosys_frontend) (abc_yosys)] {};
\end{scope}
\node (implementation) [draw, densely dotted, inner sep=0.35cm, fit=(techmapped_netlist) (packing) (placement) (routing)] {};
\node (bitstream) [design, below=0.9cm of assembler, dashed] {Bitstream};
\node (timing) [metric, below=0.9cm of vpr_analysis] {Timing \\ Metrics};
\node (area) [metric, left=0.1cm of timing] {Area \\ Metrics};
\node (power) [metric, right=0.1cm of timing] {Power \\ Metrics};
\node (post_impl_netlist) [design, left=0.8cm of area] {Post-Impl. \\ Netlist};
\draw [arrow] (arch) |- (odin_synth);
\draw [arrow] (arch) |- (vpr_pack.west);
\draw [arrow] (arch) |- ([yshift=\arrowshift]vpr_place.west);
\draw [arrow] (arch) |- ([yshift=\arrowshift]vpr_route.west);
\draw [arrow] (arch) |- ([yshift=\arrowshift]vpr_analysis.west);
\draw [arrow] (arch) |- ([yshift=\arrowshift]vpr_analysis.west);
\draw [arrow] (hdl) -- (odin_synth.north);
\draw [arrow] (hdl) -- (quartus_map);
\draw [arrow] (hdl) -- (yosys.north);
\draw[arrow] (odin_synth) -- (abc_synth);
\draw[arrow] (quartus_map) -- (vqm2blif);
\draw[arrow] (yosys) |- ([yshift=\arrowshift,xshift=\arrowxshift]techmapped_netlist.east);
\draw[arrow] (vqm2blif) -- (abc_synth);
\draw[arrow] (vqm2blif) -- (techmapped_netlist);
\draw[arrow] (abc_synth) |- ([yshift=\arrowshift,xshift=\arrowxshift]techmapped_netlist.west);
\draw[arrow] ([yshift=-\arrowshift,xshift=-\arrowxshift]techmapped_netlist.west) -| (vpr_pack);
\draw[arrow, dashed] ([yshift=-\arrowshift,xshift=-\arrowxshift]techmapped_netlist.east) -| (other_pack);
\draw[arrow] (vpr_pack) -- (vpr_place);
\draw[arrow] (vpr_place) -- (vpr_route);
\draw[arrow, dashed] (other_pack) -- (other_place);
\draw[arrow, dashed] (other_place) -- (other_route);
\draw[bidir_arrow] (vpr_pack) -- (packing);
\draw[bidir_arrow] (vpr_place) -- (placement);
\draw[bidir_arrow] (vpr_route) -- (routing);
\draw[bidir_arrow, dashed] (other_pack) -- (packing);
\draw[bidir_arrow, dashed] (other_place) -- (placement);
\draw[bidir_arrow, dashed] (other_route) -- (routing);
\draw[arrow] (vpr_route) -- (vpr_analysis);
\draw[arrow] (implementation.south west) -- (vpr_analysis);
\draw[arrow] (vpr_analysis) -- (area);
\draw[arrow] (vpr_analysis) -- (timing);
\draw[arrow] (vpr_analysis) -- (power);
\draw[arrow] (vpr_analysis) -- (post_impl_netlist);
\draw[arrow, dashed] (implementation.south east) -- (assembler);
\draw[arrow, dashed] (assembler) -- (bitstream);
\draw [arrow, dashed] (rr_graph) |- ([yshift=-\arrowshift]vpr_place.west);
\draw [arrow, dashed] (rr_graph) |- ([yshift=-\arrowshift]vpr_route.west);
\draw [arrow, dashed] (rr_graph) |- ([yshift=-\arrowshift]vpr_analysis.west);
\begin{scope}[on background layer]
%VTR Callout
\draw[vtr_callout]
([xshift=-\vtroffset,yshift=\vtroffset]odin_synth.north west)
-- ([xshift=-\vtroffset,yshift=-\vtroffset]vpr_analysis.south west)
-- ([xshift=\vtroffset,yshift=-\vtroffset]vpr_analysis.south east)
-- ([xshift=\vtroffset,yshift=-\vtroffset]vpr_pack.north east)
-- ([xshift=-\vtroffset,yshift=-\vtroffset]techmapped_netlist.bottom left corner-|techmapped_netlist.bottom left corner)
-- ([xshift=\vtroffset,yshift=-\vtroffset]techmapped_netlist.bottom right corner-|techmapped_netlist.top right corner)
-- ([xshift=\vtroffset,yshift=\vtroffset]techmapped_netlist.top right corner)
-- ([xshift=\vtroffset,yshift=\vtroffset]techmapped_netlist.top left corner-|abc_synth.south east)
-- ([xshift=\vtroffset,yshift=\vtroffset]abc_synth.south east)
-- ([xshift=\vtroffset,yshift=\vtroffset]odin_synth.north east)
-- cycle;
%Titan Callout
\draw[titan_callout]
([xshift=-\titanoffset,yshift=\titanoffset]quartus_map.north west)
-- ([xshift=-\titanoffset,yshift=\titanoffset]quartus_map.north west|-techmapped_netlist.top left corner)
-- ([xshift=-\titanoffset,yshift=\titanoffset]vpr_pack.north west)
-- ([xshift=-\titanoffset,yshift=-\titanoffset]vpr_analysis.south west)
-- ([xshift=\titanoffset,yshift=-\titanoffset]vpr_analysis.south east)
-- ([xshift=\titanoffset,yshift=\titanoffset]vpr_pack.north east)
-- ([xshift=\titanoffset,yshift=-\titanoffset]techmapped_netlist.bottom right corner-|techmapped_netlist.top right corner)
-- ([xshift=\titanoffset,yshift=\titanoffset]quartus_map.north east)
-- cycle;
\end{scope}
%Legend
\matrix (legend) [row sep=0.1cm, column sep=0.0cm, draw, right=0.50cm of yosys, outer sep=0.0cm, inner sep=0.1cm, nodes={anchor=center}] {
\node [device, minimum width=1.5cm, minimum height=0.5cm] {}; & \node[] {\footnotesize \makecell{Device \\ Description}}; \\
\node [design, minimum width=1.5cm, minimum height=0.5cm] {}; & \node[] {\footnotesize \makecell{Design}}; \\
\node [process, minimum width=1.5cm, minimum height=0.5cm] {}; & \node[] {\footnotesize \makecell{CAD Tool \\ Stage}}; \\
\node [vtr_callout, minimum width=1.5cm, minimum height=0.5cm] {}; & \node[] {\footnotesize \makecell{VTR Flow}}; \\
\node [titan_callout, minimum width=1.5cm, minimum height=0.5cm] {}; & \node[] {\footnotesize \makecell{Titan Flow}}; \\
\node (optional) [rectangle, minimum width=1.0cm, minimum height=0.5cm] {}; & \node[] {\footnotesize \makecell{Standard \\Optional}}; \\
};
\draw [arrow] ([yshift=+0.20cm] optional.west) -- ([yshift=+0.20cm] optional.east);
\draw [arrow, dashed] ([yshift=-0.15cm] optional.west) -- ([yshift=-0.15cm] optional.east);
\end{tikzpicture}
\end{document}