// parallel square root 32 bit input, 16 bit output // sm basic building block is a subtractor multiplexer // if u=0 then return x otherwise return x-y taking into account borrow define sm(y, u, x, b, bout, dout) circuits bout<=(~x&y&b) |(x&y&b)|(~x&y&~b)|(~x&~y&b) after 1ns; dout<=(((~x&y&~b)|(x&y&b)|(~x&~y&b)|(x&~y&~b))&u)|(x&~u) after 1ns; end circuits; end sm; // special last layer, does not need u input or dout define sml(y, x, b, bout) circuits bout<=(~x&y&b) |(x&y&b)|(~x&y&~b)|(~x&~y&b) after 1ns; end circuits; end sml; // special high order bit, produces u = ~bout define smu(y, x, b, u) circuits u<=~((~x&y&b) |(x&y&b)|(~x&y&~b)|(~x&~y&b)) after 1ns; end circuits; end smu; // 32 bit input sqrt gives 16 bits out define sqrt32(p[32], u[16]) signal b0[1]; signal b1[3]; signal b2[4]; signal b3[5]; signal b4[6]; signal b5[7]; signal b6[8]; signal b7[9]; signal b8[10]; signal b9[11]; signal b10[12]; signal b11[13]; signal b12[14]; signal b13[15]; signal b14[16]; signal b15[17]; signal x0[2]; signal x1[3]; signal x2[4]; signal x3[5]; signal x4[6]; signal x5[7]; signal x6[8]; signal x7[9]; signal x8[10]; signal x9[11]; signal x10[12]; signal x11[13]; signal x12[14]; signal x13[15]; signal x14[16]; signal ubar; circuits b00 use sm(#b1, u[15], p[30], #b0, b0[0], x0[0]); b01 use sm(#b0, u[15], p[31], b0[0], ubar, x0[1]); u[15]<=~ubar after 1ns; b10 use sm(#b1, u[14], p[28], #b0, b1[0], x1[0]); b11 use sm(#b0, u[14], p[29], b1[0], b1[1], x1[1]); b12 use sm(u[15], u[14], x0[0], b1[1], b1[2], x1[2]); b13 use smu(#b0, x0[1], b1[2], u[14]); b20 use sm(#b1, u[13], p[26], #b0, b2[0], x2[0]); b21 use sm(#b0, u[13], p[27], b2[0], b2[1], x2[1]); b22 use sm(u[14], u[13], x1[0], b2[1], b2[2], x2[2]); b23 use sm(u[15], u[13], x1[1], b2[2], b2[3], x2[3]); b24 use smu(#b0, x1[2], b2[3], u[13]); b30 use sm(#b1, u[12], p[24], #b0, b3[0], x3[0]); b31 use sm(#b0, u[12], p[25], b3[0], b3[1], x3[1]); b32 use sm(u[13], u[12], x2[0], b3[1], b3[2], x3[2]); b33 use sm(u[14], u[12], x2[1], b3[2], b3[3], x3[3]); b34 use sm(u[15], u[12], x2[2], b3[3], b3[4], x3[4]); b35 use smu(#b0, x2[3], b3[4], u[12]); b40 use sm(#b1, u[11], p[22], #b0, b4[0], x4[0]); b41 use sm(#b0, u[11], p[23], b4[0], b4[1], x4[1]); b42 use sm(u[12], u[11], x3[0], b4[1], b4[2], x4[2]); b43 use sm(u[13], u[11], x3[1], b4[2], b4[3], x4[3]); b44 use sm(u[14], u[11], x3[2], b4[3], b4[4], x4[4]); b45 use sm(u[15], u[11], x3[3], b4[4], b4[5], x4[5]); b46 use smu(#b0, x3[4], b4[5], u[11]); b50 use sm(#b1, u[10], p[20], #b0, b5[0], x5[0]); b51 use sm(#b0, u[10], p[21], b5[0], b5[1], x5[1]); b52 use sm(u[11], u[10], x4[0], b5[1], b5[2], x5[2]); b53 use sm(u[12], u[10], x4[1], b5[2], b5[3], x5[3]); b54 use sm(u[13], u[10], x4[2], b5[3], b5[4], x5[4]); b55 use sm(u[14], u[10], x4[3], b5[4], b5[5], x5[5]); b56 use sm(u[15], u[10], x4[4], b5[5], b5[6], x5[6]); b57 use smu(#b0, x4[5], b5[6], u[10]); b60 use sm(#b1, u[9], p[18], #b0, b6[0], x6[0]); b61 use sm(#b0, u[9], p[19], b6[0], b6[1], x6[1]); b62 use sm(u[10], u[9], x5[0], b6[1], b6[2], x6[2]); b63 use sm(u[11], u[9], x5[1], b6[2], b6[3], x6[3]); b64 use sm(u[12], u[9], x5[2], b6[3], b6[4], x6[4]); b65 use sm(u[13], u[9], x5[3], b6[4], b6[5], x6[5]); b66 use sm(u[14], u[9], x5[4], b6[5], b6[6], x6[6]); b67 use sm(u[15], u[9], x5[5], b6[6], b6[7], x6[7]); b68 use smu(#b0, x5[6], b6[7], u[9]); b70 use sm(#b1, u[8], p[16], #b0, b7[0], x7[0]); b71 use sm(#b0, u[8], p[17], b7[0], b7[1], x7[1]); b72 use sm(u[9], u[8], x6[0], b7[1], b7[2], x7[2]); b73 use sm(u[10], u[8], x6[1], b7[2], b7[3], x7[3]); b74 use sm(u[11], u[8], x6[2], b7[3], b7[4], x7[4]); b75 use sm(u[12], u[8], x6[3], b7[4], b7[5], x7[5]); b76 use sm(u[13], u[8], x6[4], b7[5], b7[6], x7[6]); b77 use sm(u[14], u[8], x6[5], b7[6], b7[7], x7[7]); b78 use sm(u[15], u[8], x6[6], b7[7], b7[8], x7[8]); b79 use smu(#b0, x6[7], b7[8], u[8]); b80 use sm(#b1, u[7], p[14], #b0, b8[0], x8[0]); b81 use sm(#b0, u[7], p[15], b8[0], b8[1], x8[1]); b82 use sm(u[8], u[7], x7[0], b8[1], b8[2], x8[2]); b83 use sm(u[9], u[7], x7[1], b8[2], b8[3], x8[3]); b84 use sm(u[10], u[7], x7[2], b8[3], b8[4], x8[4]); b85 use sm(u[11], u[7], x7[3], b8[4], b8[5], x8[5]); b86 use sm(u[12], u[7], x7[4], b8[5], b8[6], x8[6]); b87 use sm(u[13], u[7], x7[5], b8[6], b8[7], x8[7]); b88 use sm(u[14], u[7], x7[6], b8[7], b8[8], x8[8]); b89 use sm(u[15], u[7], x7[7], b8[8], b8[9], x8[9]); b810 use smu(#b0, x7[8], b8[9], u[7]); b90 use sm(#b1, u[6], p[12], #b0, b9[0], x9[0]); b91 use sm(#b0, u[6], p[13], b9[0], b9[1], x9[1]); b92 use sm(u[7], u[6], x8[0], b9[1], b9[2], x9[2]); b93 use sm(u[8], u[6], x8[1], b9[2], b9[3], x9[3]); b94 use sm(u[9], u[6], x8[2], b9[3], b9[4], x9[4]); b95 use sm(u[10], u[6], x8[3], b9[4], b9[5], x9[5]); b96 use sm(u[11], u[6], x8[4], b9[5], b9[6], x9[6]); b97 use sm(u[12], u[6], x8[5], b9[6], b9[7], x9[7]); b98 use sm(u[13], u[6], x8[6], b9[7], b9[8], x9[8]); b99 use sm(u[14], u[6], x8[7], b9[8], b9[9], x9[9]); b910 use sm(u[15], u[6], x8[8], b9[9], b9[10], x9[10]); b911 use smu(#b0, x8[9], b9[10], u[6]); b100 use sm(#b1, u[5], p[10], #b0, b10[0], x10[0]); b101 use sm(#b0, u[5], p[11], b10[0], b10[1], x10[1]); b102 use sm(u[6], u[5], x9[0], b10[1], b10[2], x10[2]); b103 use sm(u[7], u[5], x9[1], b10[2], b10[3], x10[3]); b104 use sm(u[8], u[5], x9[2], b10[3], b10[4], x10[4]); b105 use sm(u[9], u[5], x9[3], b10[4], b10[5], x10[5]); b106 use sm(u[10], u[5], x9[4], b10[5], b10[6], x10[6]); b107 use sm(u[11], u[5], x9[5], b10[6], b10[7], x10[7]); b108 use sm(u[12], u[5], x9[6], b10[7], b10[8], x10[8]); b109 use sm(u[13], u[5], x9[7], b10[8], b10[9], x10[9]); b1010 use sm(u[14], u[5], x9[8], b10[9], b10[10], x10[10]); b1011 use sm(u[15], u[5], x9[9], b10[10], b10[11], x10[11]); b1012 use smu(#b0, x9[10], b10[11], u[5]); b110 use sm(#b1, u[4], p[8], #b0, b11[0], x11[0]); b111 use sm(#b0, u[4], p[9], b11[0], b11[1], x11[1]); b112 use sm(u[5], u[4], x10[0], b11[1], b11[2], x11[2]); b113 use sm(u[6], u[4], x10[1], b11[2], b11[3], x11[3]); b114 use sm(u[7], u[4], x10[2], b11[3], b11[4], x11[4]); b115 use sm(u[8], u[4], x10[3], b11[4], b11[5], x11[5]); b116 use sm(u[9], u[4], x10[4], b11[5], b11[6], x11[6]); b117 use sm(u[10], u[4], x10[5], b11[6], b11[7], x11[7]); b118 use sm(u[11], u[4], x10[6], b11[7], b11[8], x11[8]); b119 use sm(u[12], u[4], x10[7], b11[8], b11[9], x11[9]); b1110 use sm(u[13], u[4], x10[8], b11[9], b11[10], x11[10]); b1111 use sm(u[14], u[4], x10[9], b11[10], b11[11], x11[11]); b1112 use sm(u[15], u[4], x10[10], b11[11], b11[12], x11[12]); b1113 use smu(#b0, x10[11], b11[12], u[4]); b120 use sm(#b1, u[3], p[6], #b0, b12[0], x12[0]); b121 use sm(#b0, u[3], p[7], b12[0], b12[1], x12[1]); b122 use sm(u[4], u[3], x11[0], b12[1], b12[2], x12[2]); b123 use sm(u[5], u[3], x11[1], b12[2], b12[3], x12[3]); b124 use sm(u[6], u[3], x11[2], b12[3], b12[4], x12[4]); b125 use sm(u[7], u[3], x11[3], b12[4], b12[5], x12[5]); b126 use sm(u[8], u[3], x11[4], b12[5], b12[6], x12[6]); b127 use sm(u[9], u[3], x11[5], b12[6], b12[7], x12[7]); b128 use sm(u[10], u[3], x11[6], b12[7], b12[8], x12[8]); b129 use sm(u[11], u[3], x11[7], b12[8], b12[9], x12[9]); b1210 use sm(u[12], u[3], x11[8], b12[9], b12[10], x12[10]); b1211 use sm(u[13], u[3], x11[9], b12[10], b12[11], x12[11]); b1212 use sm(u[14], u[3], x11[10], b12[11], b12[12], x12[12]); b1213 use sm(u[15], u[3], x11[11], b12[12], b12[13], x12[13]); b1214 use smu(#b0, x11[12], b12[13], u[3]); b130 use sm(#b1, u[2], p[4], #b0, b13[0], x13[0]); b131 use sm(#b0, u[2], p[5], b13[0], b13[1], x13[1]); b132 use sm(u[3], u[2], x12[0], b13[1], b13[2], x13[2]); b133 use sm(u[4], u[2], x12[1], b13[2], b13[3], x13[3]); b134 use sm(u[5], u[2], x12[2], b13[3], b13[4], x13[4]); b135 use sm(u[6], u[2], x12[3], b13[4], b13[5], x13[5]); b136 use sm(u[7], u[2], x12[4], b13[5], b13[6], x13[6]); b137 use sm(u[8], u[2], x12[5], b13[6], b13[7], x13[7]); b138 use sm(u[9], u[2], x12[6], b13[7], b13[8], x13[8]); b139 use sm(u[10], u[2], x12[7], b13[8], b13[9], x13[9]); b1310 use sm(u[11], u[2], x12[8], b13[9], b13[10], x13[10]); b1311 use sm(u[12], u[2], x12[9], b13[10], b13[11], x13[11]); b1312 use sm(u[13], u[2], x12[10], b13[11], b13[12], x13[12]); b1313 use sm(u[14], u[2], x12[11], b13[12], b13[13], x13[13]); b1314 use sm(u[15], u[2], x12[12], b13[13], b13[14], x13[14]); b1315 use smu(#b0, x12[13], b13[14], u[2]); b140 use sm(#b1, u[1], p[2], #b0, b14[0], x14[0]); b141 use sm(#b0, u[1], p[3], b14[0], b14[1], x14[1]); b142 use sm(u[2], u[1], x13[0], b14[1], b14[2], x14[2]); b143 use sm(u[3], u[1], x13[1], b14[2], b14[3], x14[3]); b144 use sm(u[4], u[1], x13[2], b14[3], b14[4], x14[4]); b145 use sm(u[5], u[1], x13[3], b14[4], b14[5], x14[5]); b146 use sm(u[6], u[1], x13[4], b14[5], b14[6], x14[6]); b147 use sm(u[7], u[1], x13[5], b14[6], b14[7], x14[7]); b148 use sm(u[8], u[1], x13[6], b14[7], b14[8], x14[8]); b149 use sm(u[9], u[1], x13[7], b14[8], b14[9], x14[9]); b1410 use sm(u[10], u[1], x13[8], b14[9], b14[10], x14[10]); b1411 use sm(u[11], u[1], x13[9], b14[10], b14[11], x14[11]); b1412 use sm(u[12], u[1], x13[10], b14[11], b14[12], x14[12]); b1413 use sm(u[13], u[1], x13[11], b14[12], b14[13], x14[13]); b1414 use sm(u[14], u[1], x13[12], b14[13], b14[14], x14[14]); b1415 use sm(u[15], u[1], x13[13], b14[14], b14[15], x14[15]); b1416 use smu(#b0, x13[14], b14[15], u[1]); b150 use sml(#b1, p[0], #b0, b15[0]); b151 use sml(#b0, p[1], b15[0], b15[1]); b152 use sml(u[1], x14[0], b15[1], b15[2]); b153 use sml(u[2], x14[1], b15[2], b15[3]); b154 use sml(u[3], x14[2], b15[3], b15[4]); b155 use sml(u[4], x14[3], b15[4], b15[5]); b156 use sml(u[5], x14[4], b15[5], b15[6]); b157 use sml(u[6], x14[5], b15[6], b15[7]); b158 use sml(u[7], x14[6], b15[7], b15[8]); b159 use sml(u[8], x14[7], b15[8], b15[9]); b1510 use sml(u[9], x14[8], b15[9], b15[10]); b1511 use sml(u[10], x14[9], b15[10], b15[11]); b1512 use sml(u[11], x14[10], b15[11], b15[12]); b1513 use sml(u[12], x14[11], b15[12], b15[13]); b1514 use sml(u[13], x14[12], b15[13], b15[14]); b1515 use sml(u[14], x14[13], b15[14], b15[15]); b1516 use sml(u[15], x14[14], b15[15], b15[16]); b1517 use smu(#b0, x14[15], b15[16], u[0]); end circuits; end sqrt32; signal p[32] <= #h00000001; signal u[16]; circuits s32 use sqrt32(p, u); end circuits;