\documentclass{article}
\usepackage[left=0.5in,right=0.5in,top=0in,bottom=0in]{geometry}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,shadows, positioning, calc}
\tikzstyle{intn}=[draw, fill=blue!20, text width=15em,
text centered, minimum height=2em]
\tikzstyle{d} = [text width=3em, text centered, minimum height=2em,rounded corners,fill=green!20]
\tikzstyle{m} = [text width=3em, align=left, minimum height=2em,rounded corners,fill=blue!20]
\tikzstyle{ca} = [text width=3em, text centered, minimum height=2em,rounded corners, fill=red!20]
\tikzstyle{cpu} = [text width=3em, text centered, minimum height=2em,fill=yellow!20]
\usepackage{subcaption}
\begin{document}
\begin{figure}
\centering
\begin{subfigure}[b]{0.45\textwidth}
\begin{tikzpicture}[node distance=1.75cm and 1cm]
\node (in1) [draw, intn] {Interconnection Network};
\node (d2) [yshift=-0.9cm, draw, d] {};
\node (d1) [left of = d2, draw, d] {};
\node (d3) [right of = d2, draw, d] {};
\node (m2) [yshift=-1.8cm, draw, m] {};
\node (m1) [left of = m2, draw, m] {};
\node (m3) [right of = m2, draw, m] {X};
\node (ca2) [yshift=-2.7cm, draw, ca] {};
\node (ca1) [left of = ca2, draw, ca] {};
\node (ca3) [right of = ca2, draw, ca] {};
\node (cpu2) [yshift=-3.6cm, draw, cpu] {CPU 1};
\node (cpu1) [left of = cpu2,draw, cpu] {CPU 0};
\node (cpu3) [right of = cpu2, draw, cpu] {CPU 2};
\node[draw,fill=white!30] at (d3.center) {U000};
\node[draw,fill=white!30] at (m3.center) {4};
\node (dlabel) [left of = d1] {\small{Directories}};
\node (mlabel) [left of = m1] {\small{Memories}};
\node (calabel) [left of = ca1] {\small{Caches}};
\draw ($(in1.south west) +(0.2,0)$) |- (d1.west);
\draw (m1.west) -| ($(in1.south west) +(0.2,0) $);
\draw (ca1.west) -| ($(in1.south west) +(0.2,0) $);
\draw ($(in1.south west) +(1.95,0)$) |- (d2.west);
\draw (m2.west) -| ($(in1.south west) +(1.95,0) $);
\draw (ca2.west) -| ($(in1.south west) +(1.95,0) $);
\draw ($(in1.south west) +(3.7,0)$) |- (d3.west);
\draw (m3.west) -| ($(in1.south west) +(3.7,0) $);
\draw (ca3.west) -| ($(in1.south west) +(3.7,0) $);
\draw (ca1) -- (cpu1);
\draw (ca2) -- (cpu2);
\draw (ca3) -- (cpu3);
\node (ulabel) [right = 0.5cm of d3, text width=2cm] {\small{Information about cache block \\ containing X}};
\draw [->] (ulabel) -- (d3.east);
\end{tikzpicture}
\caption{}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.45\textwidth}
\begin{tikzpicture}[node distance=1.75cm and 1cm]
\node (in1) [draw, intn] {Interconnection Network};
\node (d2) [yshift=-0.9cm, draw, d] {};
\node (d1) [left of = d2, draw, d] {};
\node (d3) [right of = d2, draw, d] {};
\node (m2) [yshift=-1.8cm, draw, m] {};
\node (m1) [left of = m2, draw, m] {};
\node (m3) [right of = m2, draw, m] {X};
\node (ca2) [yshift=-2.7cm, draw, ca] {};
\node (ca1) [left of = ca2, draw, ca] {};
\node (ca3) [right of = ca2, draw, ca] {};
\node (cpu2) [yshift=-3.6cm, draw, cpu] {CPU 1};
\node (cpu1) [left of = cpu2,draw, cpu] {CPU 0};
\node (cpu3) [right of = cpu2, draw, cpu] {CPU 2};
\node[draw,fill=white!30] at (d3.center) {S001};
\node[draw,fill=white!30] at (m3.center) {4};
\node[xshift=-0.4cm] at (ca3.center) {X};
\node[draw,fill=white!30] at (ca3.center) {4};
\draw ($(in1.south west) +(0.2,0)$) |- (d1.west);
\draw (m1.west) -| ($(in1.south west) +(0.2,0) $);
\draw (ca1.west) -| ($(in1.south west) +(0.2,0) $);
\draw ($(in1.south west) +(1.95,0)$) |- (d2.west);
\draw (m2.west) -| ($(in1.south west) +(1.95,0) $);
\draw (ca2.west) -| ($(in1.south west) +(1.95,0) $);
\draw ($(in1.south west) +(3.7,0)$) |- (d3.west);
\draw (m3.west) -| ($(in1.south west) +(3.7,0) $);
\draw (ca3.west) -| ($(in1.south west) +(3.7,0) $);
\draw (ca1) -- (cpu1);
\draw (ca2) -- (cpu2);
\draw (ca3) -- (cpu3);
\end{tikzpicture}
\caption{}
\end{subfigure}
\begin{subfigure}[b]{0.3\textwidth}
\begin{tikzpicture}[node distance=1.75cm and 1cm]
\node (in1) [draw, intn] {Interconnection Network};
\node (d2) [yshift=-0.9cm, draw, d] {};
\node (d1) [left of = d2, draw, d] {};
\node (d3) [right of = d2, draw, d] {};
\node (m2) [yshift=-1.8cm, draw, m] {};
\node (m1) [left of = m2, draw, m] {};
\node (m3) [right of = m2, draw, m] {X};
\node (ca2) [yshift=-2.7cm, draw, ca] {};
\node (ca1) [left of = ca2, draw, ca] {};
\node (ca3) [right of = ca2, draw, ca] {};
\node (cpu2) [yshift=-3.6cm, draw, cpu] {CPU 1};
\node (cpu1) [left of = cpu2,draw, cpu] {CPU 0};
\node (cpu3) [right of = cpu2, draw, cpu] {CPU 2};
\node[draw,fill=white!30] at (d3.center) {E001};
\node[draw,fill=white!30] at (m3.center) {4};
\node[xshift=-0.4cm] at (ca3.center) {X};
\node[draw,fill=white!30] at (ca3.center) {5};
\draw ($(in1.south west) +(0.2,0)$) |- (d1.west);
\draw (m1.west) -| ($(in1.south west) +(0.2,0) $);
\draw (ca1.west) -| ($(in1.south west) +(0.2,0) $);
\draw ($(in1.south west) +(1.95,0)$) |- (d2.west);
\draw (m2.west) -| ($(in1.south west) +(1.95,0) $);
\draw (ca2.west) -| ($(in1.south west) +(1.95,0) $);
\draw ($(in1.south west) +(3.7,0)$) |- (d3.west);
\draw (m3.west) -| ($(in1.south west) +(3.7,0) $);
\draw (ca3.west) -| ($(in1.south west) +(3.7,0) $);
\draw (ca1) -- (cpu1);
\draw (ca2) -- (cpu2);
\draw (ca3) -- (cpu3);
\end{tikzpicture}
\caption{}
\end{subfigure}
~
\begin{subfigure}[b]{0.3\textwidth}
\begin{tikzpicture}[node distance=1.75cm and 1cm]
\node (in1) [draw, intn] {Interconnection Network};
\node (d2) [yshift=-0.9cm, draw, d] {};
\node (d1) [left of = d2, draw, d] {};
\node (d3) [right of = d2, draw, d] {};
\node (m2) [yshift=-1.8cm, draw, m] {};
\node (m1) [left of = m2, draw, m] {};
\node (m3) [right of = m2, draw, m] {X};
\node (ca2) [yshift=-2.7cm, draw, ca] {};
\node (ca1) [left of = ca2, draw, ca] {};
\node (ca3) [right of = ca2, draw, ca] {};
\node (cpu2) [yshift=-3.6cm, draw, cpu] {CPU 1};
\node (cpu1) [left of = cpu2,draw, cpu] {CPU 0};
\node (cpu3) [right of = cpu2, draw, cpu] {CPU 2};
\node[draw,fill=white!30] at (d3.center) {S011};
\node[draw,fill=white!30] at (m3.center) {5};
\node[xshift=-0.4cm] at (ca2.center) {X};
\node[draw,fill=white!30] at (ca2.center) {5};
\node[xshift=-0.4cm] at (ca3.center) {X};
\node[draw,fill=white!30] at (ca3.center) {5};
\draw ($(in1.south west) +(0.2,0)$) |- (d1.west);
\draw (m1.west) -| ($(in1.south west) +(0.2,0) $);
\draw (ca1.west) -| ($(in1.south west) +(0.2,0) $);
\draw ($(in1.south west) +(1.95,0)$) |- (d2.west);
\draw (m2.west) -| ($(in1.south west) +(1.95,0) $);
\draw (ca2.west) -| ($(in1.south west) +(1.95,0) $);
\draw ($(in1.south west) +(3.7,0)$) |- (d3.west);
\draw (m3.west) -| ($(in1.south west) +(3.7,0) $);
\draw (ca3.west) -| ($(in1.south west) +(3.7,0) $);
\draw (ca1) -- (cpu1);
\draw (ca2) -- (cpu2);
\draw (ca3) -- (cpu3);
\end{tikzpicture}
\caption{}
\end{subfigure}
~
\begin{subfigure}[b]{0.3\textwidth}
\begin{tikzpicture}[node distance=1.75cm and 1cm]
\node (in1) [draw, intn] {Interconnection Network};
\node (d2) [yshift=-0.9cm, draw, d] {};
\node (d1) [left of = d2, draw, d] {};
\node (d3) [right of = d2, draw, d] {};
\node (m2) [yshift=-1.8cm, draw, m] {};
\node (m1) [left of = m2, draw, m] {};
\node (m3) [right of = m2, draw, m] {X};
\node (ca2) [yshift=-2.7cm, draw, ca] {};
\node (ca1) [left of = ca2, draw, ca] {};
\node (ca3) [right of = ca2, draw, ca] {};
\node (cpu2) [yshift=-3.6cm, draw, cpu] {CPU 1};
\node (cpu1) [left of = cpu2,draw, cpu] {CPU 0};
\node (cpu3) [right of = cpu2, draw, cpu] {CPU 2};
\node[draw,fill=white!30] at (d3.center) {S111};
\node[draw,fill=white!30] at (m3.center) {5};
\node[xshift=-0.4cm] at (ca1.center) {X};
\node[draw,fill=white!30] at (ca1.center) {5};
\node[xshift=-0.4cm] at (ca2.center) {X};
\node[draw,fill=white!30] at (ca2.center) {5};
\node[xshift=-0.4cm] at (ca3.center) {X};
\node[draw,fill=white!30] at (ca3.center) {5};
\draw ($(in1.south west) +(0.2,0)$) |- (d1.west);
\draw (m1.west) -| ($(in1.south west) +(0.2,0) $);
\draw (ca1.west) -| ($(in1.south west) +(0.2,0) $);
\draw ($(in1.south west) +(1.95,0)$) |- (d2.west);
\draw (m2.west) -| ($(in1.south west) +(1.95,0) $);
\draw (ca2.west) -| ($(in1.south west) +(1.95,0) $);
\draw ($(in1.south west) +(3.7,0)$) |- (d3.west);
\draw (m3.west) -| ($(in1.south west) +(3.7,0) $);
\draw (ca3.west) -| ($(in1.south west) +(3.7,0) $);
\draw (ca1) -- (cpu1);
\draw (ca2) -- (cpu2);
\draw (ca3) -- (cpu3);
\end{tikzpicture}
\caption{}
\end{subfigure}
\begin{subfigure}[b]{0.3\textwidth}
\begin{tikzpicture}[node distance=1.75cm and 1cm]
\node (in1) [draw, intn] {Interconnection Network};
\node (d2) [yshift=-0.9cm, draw, d] {};
\node (d1) [left of = d2, draw, d] {};
\node (d3) [right of = d2, draw, d] {};
\node (m2) [yshift=-1.8cm, draw, m] {};
\node (m1) [left of = m2, draw, m] {};
\node (m3) [right of = m2, draw, m] {X};
\node (ca2) [yshift=-2.7cm, draw, ca] {};
\node (ca1) [left of = ca2, draw, ca] {};
\node (ca3) [right of = ca2, draw, ca] {};
\node (cpu2) [yshift=-3.6cm, draw, cpu] {CPU 1};
\node (cpu1) [left of = cpu2,draw, cpu] {CPU 0};
\node (cpu3) [right of = cpu2, draw, cpu] {CPU 2};
\node[draw,fill=white!30] at (d3.center) {E010};
\node[draw,fill=white!30] at (m3.center) {5};
\node[xshift=-0.4cm] at (ca2.center) {X};
\node[draw,fill=white!30] at (ca2.center) {9};
\draw ($(in1.south west) +(0.2,0)$) |- (d1.west);
\draw (m1.west) -| ($(in1.south west) +(0.2,0) $);
\draw (ca1.west) -| ($(in1.south west) +(0.2,0) $);
\draw ($(in1.south west) +(1.95,0)$) |- (d2.west);
\draw (m2.west) -| ($(in1.south west) +(1.95,0) $);
\draw (ca2.west) -| ($(in1.south west) +(1.95,0) $);
\draw ($(in1.south west) +(3.7,0)$) |- (d3.west);
\draw (m3.west) -| ($(in1.south west) +(3.7,0) $);
\draw (ca3.west) -| ($(in1.south west) +(3.7,0) $);
\draw (ca1) -- (cpu1);
\draw (ca2) -- (cpu2);
\draw (ca3) -- (cpu3);
\end{tikzpicture}
\caption{}
\end{subfigure}
~
\begin{subfigure}[b]{0.5\textwidth}
\begin{tikzpicture}[node distance=1.5cm and 1cm]
\node[text width=25 em] (u){\textbf{Uncached(U)} --- not currently in any processor's cache.};
\node[text width=25 em, below of = u ] (s) {\textbf{Shared(S)} --- cached by one or more processors and the copy in memory is correct.};
\node[text width=25 em, below of = s ] {\textbf{Cached(C)} --- cached by exactly one processor that has written the block, so that the copy in money is obsolete.};
\end{tikzpicture}
\caption{}
\end{subfigure}
\end{figure}
\end{document}