module L16_stage_1(a, b, g, p, H1, Pr1);
assign g[15:0] = a[15:0] & b[15:0] ;
assign p[15:0] = a[15:0] | b[15:0] ;
assign H1[15:0] = g[15:0] | {g[14:0],g[15]} ;
assign Pr1[15:0] = p[15:0] & {p[14:0],p[15]} ;
module L16_stage_2(H1, Pr1, H2, Pr2);
assign H2[15:0] = H1[15:0] | {Pr1[14:0],Pr1[15]} & {H1[13:0],H1[15:14]} ;
assign Pr2[15:0] = Pr1[15:0] & {Pr1[13:0],Pr1[15:14]};
module L16_stage_3(H2, Pr2, H3, Pr3);
assign H3[15:0] = H2[15:0] | {Pr2[14:0],Pr2[15]} & {H2[11:0],H2[15:12]} ;
assign Pr3[15:0] = Pr2[15:0] & {Pr2[11:0],Pr2[15:12]} ;
module L16_stage_4(H3, Pr3, H4);
assign H4[15:0] = H3[15:0] | {Pr3[14:0],Pr3[15]} & {H3[7:0],H3[15:8]} ;
module L16_adder(a, b, sum);
L16_stage_1 CUT1(a, b, g, p, H1, Pr1);
L16_stage_2 CUT2(H1, Pr1, H2, Pr2);
L16_stage_3 CUT3(H2, Pr2, H3, Pr3);
L16_stage_4 CUT4(H3, Pr3, H4);
assign sum[15:0] = ~{H4[14:0],H4[15]} & (a[15:0]^b[15:0]) | {H4[14:0],H4[15]} & (a[15:0]^b[15:0]^{p[14:0],p[15]});
module L4x4_stage_1(a, b, g, p, x);
assign g[15:0] = a[15:0] & b[15:0] ;
assign p[15:0] = a[15:0] | b[15:0] ;
assign x[15:0] = a[15:0] ^ b[15:0] ;
module L4x4_stage_2(g, p, H1, Pr1);
assign H1[15:0] = g[15:0] |
{p[14:0],p[15]} & {g[13:0],g[15:14]} |
{p[14:0],p[15]} & {p[13:0],p[15:14]} & {g[12:0],g[15:13]};
assign Pr1[15:0] = p[15:0] &
module L4x4_stage_3(H1, Pr1, H2);
assign H2[15:0] = H1[15:0] |
{Pr1[14:0],Pr1[15]} & {H1[11:0],H1[15:12]} |
{Pr1[14:0],Pr1[15]} & {Pr1[10:0],Pr1[15:11]} & {H1[7:0],H1[15:8]} |
{Pr1[14:0],Pr1[15]} & {Pr1[10:0],Pr1[15:11]} & {Pr1[6:0],Pr1[15:7]} & {H1[3:0],H1[15:4]};
module L4x4_adder(a, b, sum);
L4x4_stage_1 CUT1(a, b, g, p, x);
L4x4_stage_2 CUT2(g, p, H1, Pr1);
L4x4_stage_3 CUT3(H1, Pr1, H2);
assign sum[15:0] = ~{H2[14:0],H2[15]} & x[15:0] | {H2[14:0],H2[15]} & (x[15:0]^{p[14:0],p[15]}) ;