% vim: set ts=2 sw=2 noet:

\begin{circuitikz}[
	]
	\matrix [
		row sep = 5mm, column sep = 7mm,
		nodes = {
			align = center,
			fill = white,
		},
	] {
		& \coordinate (vmi);
			& \node[twoportshape] (B2Li) {};
			&
			& \coordinate (mi);
			&
			& \node[mixer] (Mi) {};
			& \coordinate (si);
			\\
		\node[] (M) {\(m(n)\)};
			& \node[twoportshape] (BSp) {};
			&
			&
			& \node[twoportshape] (H) {};
			& \node[oscillator] (OSC) {};
			& \coordinate (phii);
			& \node[adder] (SUM) {};
			& \node (S) {\(s(t)\)};
			\\
		&&&& \coordinate (phiq);
			\\[-3mm]
		& \coordinate (vmq);
			& \node[twoportshape] (B2Lq) {};
			& \coordinate (mq);
			& \node[mixer] (Mq) {};
			&
			&
			& \coordinate (sq);
			\\
	};

	% Add missing lables
	\node at (H.center) {\large \(\mathcal{H}\)};
	\node at (B2Li.center) {\textsf{B2L}};
	\node at (B2Lq.center) {\textsf{B2L}};
	\node at (BSp) {\textsf{BSp}};

	% Add connections
	\begin{scope}[thick, -latex]
		\draw (M) -- (BSp.west);

		\draw (BSp.north) |- (B2Li.west);
		\draw (B2Li.east) -- (Mi.west);
		\draw (Mi.east) -| (SUM.north);

		\draw (BSp.south) |- (B2Lq.west);
		\draw (B2Lq.east) -- (Mq.west);
		\draw (Mq.east) -| (SUM.south);

		\draw (SUM.east) -- (S);

		\draw (OSC.east) -| (Mi.south);
		\draw (OSC.west) -- (H.east);
		\draw (H.south) -- (Mq.north);
	\end{scope}

	% Add signal labels
	\node[above right] at (vmi) {\(\vec{m}_i\)};
	\node[below right] at (vmq) {\(\vec{m}_q\)};

	\node[above] at (mi) {\(m_i(t)\)};
	\node[below] at (mq) {\(m_q(t)\)};

	\node[above right] at (phii) {\(\phi_i\)};
	\node[right, yshift = 1mm] at (phiq) {\(\phi_q\)};

	\node[above left] at (si) {\(s_i(t)\)};
	\node[below left] at (sq) {\(s_q(t)\)};

	% Draw digital signals
	\begin{scope}[font = \ttfamily\footnotesize, text = blue!70!white]
		\node[above = 1mm of M, xshift = 2mm] {\(\ldots 1100101\)};
		\node[above = 7mm of vmi, xshift = 3mm]
			{\(\overbracket[.8pt]{\,11\ldots 00\,}^{\sqrt{M} \text{ bits}}\)};
	\end{scope}

	% Draw analog waveform
	\begin{scope}[font = \ttfamily\tiny]
		\coordinate (O) at ($(mi)+(-2mm,10.5mm)$);

		\node[left, red!70!white, anchor = east, text width = 8mm, align = right]
			at ($(O) + (-2mm,0)$) {\(2^{\sqrt{M}}\) levels};

		\foreach \y in {-3mm,0,3mm} {
			\draw[gray, densely dotted] (O) ++(-2mm,\y) -- ++(22mm,0);
		}

		\draw[thick, draw = red!70!white] (O)
			-- ++(3mm,0) -- ++(0,-3mm) -- ++(3mm,0) -- ++(0,6mm)
			-- ++(3mm,0) -- ++(0,-3mm) -- ++(3mm,0) -- ++(0,-3mm)
			-- ++(3mm,0) -- ++(0,3mm)  -- ++(3mm,0);
	\end{scope}

	% Draw constellation diagram
	\begin{scope}
		\coordinate (O) at ($(S)+(-7mm,8mm)$);
		\draw[gray, -latex] (O) ++(-2mm,0) -- ++(12mm,0) node[right] {\tiny \(\phi_i\)};
		\draw[gray, -latex] (O) ++(0,-2mm) -- ++(0,12mm) node[above] {\tiny \(\phi_q\)};

		\node[
			circle, thick,
			minimum size = 3pt,
			inner sep = 0, outer sep = .8pt,
			draw = gray, fill = red!50!white
		] (P) at ($(O)+(5mm, 4mm)$) {};

		\node[gray, above right] at (P) {\tiny \(s\)};

		\draw[gray, densely dotted]
			(P) -- (P |- O)
			(P) -- (P -| O);
	\end{scope}


	% Background elements
	\begin{pgfonlayer}{background}
		\fill[left color = white, right color = blue!20, draw = white]
			($(B2Li.north) + (0,1.1)$) coordinate (D) rectangle ($(B2Lq.south) - (3,1)$);
		\fill[right color = white, left color = red!20, draw = white]
			($(B2Li.north) + (0,1.1)$) coordinate (A) rectangle ($(B2Lq.south) + (9,-1)$);

		\node[blue!50, anchor = south east, font = \ttfamily\bfseries, xshift = -4mm]
			at (D) {\bfseries\ttfamily Digital bits};
		\node[red!50, anchor = south west, font = \bfseries\ttfamily, xshift = 4mm]
			at (A) {Analog waveform};
	\end{pgfonlayer}
\end{circuitikz}
