\begin{tikzpicture}
[/tikz/use US style logic gates,
/tikz/scale=0.2,
/pgf/logic gate input sep=.10cm,
/pgf/logic gate inverted radius=.05cm,
and/.style={and gate,draw,minimum height=.65cm},
or/.style= {or gate, draw,minimum height=.65cm},
nor/.style={nor gate,draw,minimum height=.65cm},
not/.style={not gate,draw},
jn/.style={circle,fill,inner sep=0,minimum size=2pt},
lbl/.style={text depth=.25ex,text height=1.5ex,inner sep=2pt}]

% Position the first gate, everything else is relative to this one
\path (1.5,0) node [or,logic gate inputs=nnnn] (O1) {};

% Helper points for the x location of the various horiz. lines
% in the first column.

\path[logic gate anchors use bounding box=true]
    (O1.west)
    ++(-2.0,0) coordinate (L8)
    ++(-1.0,0) coordinate (L7)
    ++(-1.0,0) coordinate (L6)
    ++(-1.0,0) coordinate (L5)
    ++(-1.0,0) coordinate (L4)
    ++(-1.0,0) coordinate (L3)
    ++(-1.0,0) coordinate (L2)
    ++(-1.0,0) coordinate (L1)
    ++(-2.0,0) coordinate (L0);

% Rest of the first column of gates, and inverter

\path  (O1.south) +(0,-0.333) node [and,anchor=north,logic gate inputs=nnnn] (A1) {};
\path  (A1.south) +(0,-0.333) node [and,anchor=north,logic gate inputs=nnnn] (A2) {};
\path  (A2.south) +(0,-0.333) node [and,anchor=north,logic gate inputs=nnn]  (A3) {};
\path  (A3.south) +(0,-0.333) node [and,anchor=north,logic gate inputs=nn]   (A4) {};

\path  (A4.south) +(0,-0.333) node [and,anchor=north,logic gate inputs=nnnn] (A5) {};
\path  (A5.south) +(0,-0.333) node [and,anchor=north,logic gate inputs=nnnn] (A6) {};
\path  (A6.south) +(0,-0.333) node [and,anchor=north,logic gate inputs=nnn]  (A7) {};
\path  (A7.south) +(0,-0.333) node [and,anchor=north,logic gate inputs=nn]   (A8) {};

\path  (A8.south) +(0,-0.333) node [and,anchor=north,logic gate inputs=nnn]  (A9) {};
\path  (A9.south) +(0,-0.333) node [and,anchor=north,logic gate inputs=nnn]  (A10) {};
\path (A10.south) +(0,-0.333) node [and,anchor=north,logic gate inputs=nn]   (A11) {};

\path (A11.south) +(0,-0.333) node [and,anchor=north,logic gate inputs=nn]   (A12) {};
\path (A12.south) +(0,-0.333) node [and,anchor=north,logic gate inputs=nn]   (A13) {};

\path[logic gate anchors use bounding box=true]
    (A13.south -| L6) node [not,anchor=north east] (N1) {};

% Horizontal lines left of first column ...
\draw (O1.input 1) -- (L1 |- O1.input 1);
\draw (O1.input 2) -- (L2 |- O1.input 2);
\draw (O1.input 3) -- (L3 |- O1.input 3);
\draw (O1.input 4) -- (L4 |- O1.input 4);

\draw (A1.input 1) -- (L5 |- A1.input 1);
\draw (A1.input 2) -- (L6 |- A1.input 2);
\draw (A1.input 3) -- (L7 |- A1.input 3);
\draw (A1.input 4) -- (L8 |- A1.input 4);

\draw (A2.input 1) -- (L2 |- A2.input 1);
\draw (A2.input 2) -- (L8 |- A2.input 2);
\draw (A2.input 3) -- (L7 |- A2.input 3);
\draw (A2.input 4) -- (L6 |- A2.input 4);

\draw (A3.input 1) -- (L3 |- A3.input 1);
\draw (A3.input 2) -- (L8 |- A3.input 2);
\draw (A3.input 3) -- (L7 |- A3.input 3);

\draw (A4.input 1) -- (L0 |- A4.input 1) +(0,+0.6) node[lbl,left]{$\overline{P_3}$};
\draw (A4.input 2) -- (L0 |- A4.input 2) +(0,-0.6) node[lbl,left]{$\overline{G_3}$};

\draw (A5.input 1) -- (L7 |- A5.input 1);
\draw (A5.input 2) -- (L6 |- A5.input 2);
\draw (A5.input 3) -- (L5 |- A5.input 3);
\draw (A5.input 4) -- (L8 |- A5.input 4);

\draw (A6.input 1) -- (L1 |- A6.input 1);
\draw (A6.input 2) -- (L7 |- A6.input 2);
\draw (A6.input 3) -- (L6 |- A6.input 3);
\draw (A6.input 4) -- (L5 |- A6.input 4);

\draw (A7.input 1) -- (L2 |- A7.input 1);
\draw (A7.input 2) -- (L7 |- A7.input 2);
\draw (A7.input 3) -- (L6 |- A7.input 3);

\draw (A8.input 1) -- (L0 |- A8.input 1) +(0,+0.6) node[lbl,left]{$\overline{P_2}$};
\draw (A8.input 2) -- (L0 |- A8.input 2) +(0,-0.6) node[lbl,left]{$\overline{G_2}$};

\draw (A9.input 1) -- (L6 |- A9.input 1);
\draw (A9.input 2) -- (L5 |- A9.input 2);
\draw (A9.input 3) -- (L8 |- A9.input 3);

\draw (A10.input 1) -- (L1 |- A10.input 1);
\draw (A10.input 2) -- (L6 |- A10.input 2);
\draw (A10.input 3) -- (L5 |- A10.input 3);

\draw (A11.input 1) -- (L0 |- A11.input 1) +(0,+0.6) node[lbl,left]{$\overline{P_1}$};
\draw (A11.input 2) -- (L0 |- A11.input 2) +(0,-0.6) node[lbl,left]{$\overline{G_1}$};

\draw (A12.input 1) -- (L5 |- A12.input 1);
\draw (A12.input 2) -- (L8 |- A12.input 2);

\draw (A13.input 1) -- (L0 |- A13.input 1) +(0,+0.8) node[lbl,left]{$\overline{P_0}$};
\draw (A13.input 2) -- (L0 |- A13.input 2) +(0,-0.4) node[lbl,left]{$\overline{G_0}$};

\draw (N1.input) -- (L0 |- N1.input)       +(0,-0.4) node[lbl,left]{$C_n$};
\draw (N1.output) -- (L8 |- N1.output);

% ... and accompanying vertical lines ...
\draw (L1 |- O1.input 1) -- (L1 |- A13.input 1);
\draw (L2 |- O1.input 2) -- (L2 |- A11.input 1);
\draw (L3 |- O1.input 3) -- (L3 |- A8.input 1);
\draw (L4 |- O1.input 4) -- (L4 |- A4.input 1);

\draw (L5 |- A1.input 1) -- (L5 |- A13.input 2);
\draw (L6 |- A1.input 2) -- (L6 |- A11.input 2);
\draw (L7 |- A1.input 3) -- (L7 |- A8.input 2);
\draw (L8 |- A1.input 4) -- (L8 |- A4.input 2);
\draw (L8 |- A5.input 4) -- (L8 |- N1.output);

% ... and the joins.

\draw (L1 |- A6.input 1) node [jn] {};
\draw (L1 |- A10.input 1) node [jn] {};
\draw (L1 |- A13.input 1) node [jn] {};

\draw (L2 |- A2.input 1) node [jn] {};
\draw (L2 |- A7.input 1) node [jn] {};
\draw (L2 |- A11.input 1) node [jn] {};

\draw (L3 |- A3.input 1) node [jn] {};
\draw (L3 |- A8.input 1) node [jn] {};

\draw (L4 |- A4.input 1) node [jn] {};

\draw (L5 |- A5.input 3) node [jn] {};
\draw (L5 |- A6.input 4) node [jn] {};
\draw (L5 |- A9.input 2) node [jn] {};
\draw (L5 |- A10.input 3) node [jn] {};
\draw (L5 |- A12.input 1) node [jn] {};

\draw (L6 |- A2.input 4) node [jn] {};
\draw (L6 |- A5.input 2) node [jn] {};
\draw (L6 |- A6.input 3) node [jn] {};
\draw (L6 |- A7.input 3) node [jn] {};
\draw (L6 |- A9.input 1) node [jn] {};
\draw (L6 |- A10.input 2) node [jn] {};
\draw (L6 |- A11.input 2) node [jn] {};

\draw (L7 |- A2.input 3) node [jn] {};
\draw (L7 |- A3.input 3) node [jn] {};
\draw (L7 |- A5.input 1) node [jn] {};
\draw (L7 |- A6.input 2) node [jn] {};
\draw (L7 |- A7.input 2) node [jn] {};
\draw (L7 |- A8.input 2) node [jn] {};

\draw (L8 |- A2.input 2) node [jn] {};
\draw (L8 |- A3.input 2) node [jn] {};
\draw (L8 |- A4.input 2) node [jn] {};
\draw (L8 |- A9.input 3) node [jn] {};
\draw (L8 |- A12.input 2) node [jn] {};

% Some more helper points
\path (O1.output) +(1.5,0) coordinate (L9);
\path (L9) +(1,0) coordinate (L10);

% 2nd column of gates
\path[logic gate anchors use bounding box=true]
    (A2.south east)  +(5, -0.167) node [or,logic gate inputs=nnnn,anchor=west] (O2) {};
\path[logic gate anchors use bounding box=true]
    (A6.south east)  +(5, -0.167) node [nor,logic gate inputs=nnnn,anchor=west] (O3) {};
\path[logic gate anchors use bounding box=true]
    (A10.east)       +(5, 0)      node [nor,logic gate inputs=nnn,anchor=west] (O4) {};
\path[logic gate anchors use bounding box=true]
    (A12.south east) +(5, -0.167) node [nor,logic gate inputs=nn,anchor=west] (O5) {};

% Lines connecting 1st/2nd column of gates
\draw (A1.output)  -| (L10 |- O2.input 1) -- (O2.input 1);
\draw (A2.output)  -| (L9  |- O2.input 2) -- (O2.input 2);
\draw (A3.output)  -| (L9  |- O2.input 3) -- (O2.input 3);
\draw (A4.output)  -| (L10 |- O2.input 4) -- (O2.input 4);

\draw (A5.output)  -| (L10 |- O3.input 1) -- (O3.input 1);
\draw (A6.output)  -| (L9  |- O3.input 2) -- (O3.input 2);
\draw (A7.output)  -| (L9  |- O3.input 3) -- (O3.input 3);
\draw (A8.output)  -| (L10 |- O3.input 4) -- (O3.input 4);

\draw (A9.output)  -| (L9  |- O4.input 1) -- (O4.input 1);
\draw (A10.output)                        -- (O4.input 2);
\draw (A11.output) -| (L9  |- O4.input 3) -- (O4.input 3);

\draw (A12.output) -| (L9  |- O5.input 1) -- (O5.input 1);
\draw (A13.output) -| (L9  |- O5.input 2) -- (O5.input 2);

% And lastly, the output lines
\path (O3.output) +(2,0) coordinate (L11);

\draw (O1.output) -- (L11 |- O1.output) node[lbl,right]{$\overline{P}$};
\draw (O2.output) -- (L11 |- O2.output) node[lbl,right]{$\overline{G}$};
\draw (O3.output) -- (L11 |- O3.output) node[lbl,right]{$C_{n+z}$};
\draw (O4.output) -- (L11 |- O4.output) node[lbl,right]{$C_{n+y}$};
\draw (O5.output) -- (L11 |- O5.output) node[lbl,right]{$C_{n+x}$};
\end{tikzpicture}
% vim:ft=tex:tw=100
