/* Very similar to TTL 74181 */ module alu10181( input [3:0] a, input [3:0] b, input [3:0] s, input cin, input m, output [3:0] f, output cout, output pout, output gout ); wire [3:0] p; wire [3:0] g; wire [3:0] h; wire [3:0] c; /* propagate */ assign p[0] = (b[0] ? s[2] : s[3]) | a[0]; assign p[1] = (b[1] ? s[2] : s[3]) | a[1]; assign p[2] = (b[2] ? s[2] : s[3]) | a[2]; assign p[3] = (b[3] ? s[2] : s[3]) | a[3]; /* generate */ assign g[0] = (b[0] ? s[1] : s[0]) & a[0]; assign g[1] = (b[1] ? s[1] : s[0]) & a[1]; assign g[2] = (b[2] ? s[1] : s[0]) & a[2]; assign g[3] = (b[3] ? s[1] : s[0]) & a[3]; /* half sum */ assign h[0] = p[0] ^ g[0]; assign h[1] = p[1] ^ g[1]; assign h[2] = p[2] ^ g[2]; assign h[3] = p[3] ^ g[3]; /* carry */ assign c[0] = p[0] & (cin | g[0]); assign c[1] = p[1] & (p[0] | g[1]) & (cin | g[0] | g[1]); assign c[2] = p[2] & (p[1] | g[2]) & (p[0] | g[1] | g[2]) & (cin | g[0] | g[1] | g[2]); assign pout = g[0] | g[1] | g[2] | g[3]; assign gout = p[3] & (p[2] | g[3]) & (p[1] | g[2] | g[3]) & (p[0] | g[1] | g[2] | g[3]); assign c[3] = gout & (cin | g[0] | g[1] | g[2] | g[3]); assign cout = c[3]; /* full sum */ assign f[0] = h[0] ^ (cin | m); assign f[1] = h[1] ^ (c[0] | m); assign f[2] = h[2] ^ (c[1] | m); assign f[3] = h[3] ^ (c[2] | m); endmodule