// csa4.e building block 4 bit by 4 bit csa multiplier // built in fad component define fad(a, b, cin, s, cout) circuits s <= a ^ b ^ cin after 1ns; cout <= (a&b)|(a&cin)|(b&cin) after 1ns; end circuits; end fad; define csa4(a[4], b[4], si[4], ci[4], pi[3], so[4], co[4], po[3]) signal ce[4]; // temporary carry signals signal cf[4]; signal cg[4]; signal se[3]; signal sf[3]; // temporary sum signals signal sg[4]; signal ad[4]; signal ae[4]; // output of 'a' mux's signal af[4]; signal ag[4]; signal zero[4] <= #h0; circuits ad <= a when b[0] else zero after 1ns; // four 4 bit mux ae <= a when b[1] else zero after 1ns; af <= a when b[2] else zero after 1ns; ag <= a when b[3] else zero after 1ns; ad0 use fad(ad[0], si[0], ci[0], po[0], ce[0]); // first group 'd' ad1 use fad(ad[1], si[1], ci[1], se[0], ce[1]); ad2 use fad(ad[2], si[2], ci[2], se[1], ce[2]); ad3 use fad(ad[3], si[3], ci[3], se[2], ce[3]); ae0 use fad(ae[0], se[0], ce[0], po[1], cf[0]); // second group 'e' ae1 use fad(ae[1], se[1], ce[1], sf[0], cf[1]); ae2 use fad(ae[2], se[2], ce[2], sf[1], cf[2]); ae3 use fad(ae[3], pi[0], ce[3], sf[2], cf[3]); af0 use fad(af[0], sf[0], cf[0], po[2], cg[0]); // third group 'f' af1 use fad(af[1], sf[1], cf[1], sg[0], cg[1]); af2 use fad(af[2], sf[2], cf[2], sg[1], cg[2]); af3 use fad(af[3], pi[1], cf[3], sg[2], cg[3]); ag0 use fad(ag[0], sg[0], cg[0], so[0], co[0]); // last group 'g' ag1 use fad(ag[1], sg[1], cg[1], so[1], co[1]); ag2 use fad(ag[2], sg[2], cg[2], so[2], co[2]); ag3 use fad(ag[3], pi[2], cg[3], so[3], co[3]); end circuits; end csa4;