diff --git a/.gitignore b/.gitignore index ac94c67..cdb10ee 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ __pycache__/ +.vscode test.py Makefile *.c diff --git a/Tests/Flat_c_circuits/Adders/fa.c b/Tests/Flat_c_circuits/Adders/fa.c new file mode 100644 index 0000000..e31b763 --- /dev/null +++ b/Tests/Flat_c_circuits/Adders/fa.c @@ -0,0 +1,39 @@ +#include +#include + +uint8_t full_adder(uint8_t a, uint8_t b, uint8_t cin){ + uint8_t out = 0; + uint8_t full_adder_a = 0; + uint8_t full_adder_b = 0; + uint8_t full_adder_y0 = 0; + uint8_t full_adder_y1 = 0; + uint8_t full_adder_cin = 0; + uint8_t full_adder_y2 = 0; + uint8_t full_adder_y3 = 0; + uint8_t full_adder_y4 = 0; + + full_adder_a = ((a >> 0) & 0x01); + full_adder_b = ((b >> 0) & 0x01); + full_adder_cin = ((cin >> 0) & 0x01); + full_adder_y0 = full_adder_a ^ full_adder_b; + full_adder_y1 = full_adder_a & full_adder_b; + full_adder_y2 = full_adder_y0 ^ full_adder_cin; + full_adder_y3 = full_adder_y0 & full_adder_cin; + full_adder_y4 = full_adder_y1 | full_adder_y3; + + out |= (full_adder_y2 & 0x01) << 0; + out |= (full_adder_y4 & 0x01) << 1; + return out; +} + +#include +int main(){ + for (int i = 0; i < 2; i++){ + for (int j = 0; j < 2; j++){ + for (int k = 0; k < 2; k++){ + assert((i + j + k) == full_adder(i,j,k)); + } + } + } + return 0; +} \ No newline at end of file diff --git a/Tests/Flat_c_circuits/Adders/ha.c b/Tests/Flat_c_circuits/Adders/ha.c new file mode 100644 index 0000000..481875b --- /dev/null +++ b/Tests/Flat_c_circuits/Adders/ha.c @@ -0,0 +1,29 @@ +#include +#include + +uint8_t half_adder(uint8_t a, uint8_t b){ + uint8_t out = 0; + uint8_t half_adder_a = 0; + uint8_t half_adder_b = 0; + uint8_t half_adder_y0 = 0; + uint8_t half_adder_y1 = 0; + + half_adder_a = ((a >> 0) & 0x01); + half_adder_b = ((b >> 0) & 0x01); + half_adder_y0 = half_adder_a ^ half_adder_b; + half_adder_y1 = half_adder_a & half_adder_b; + + out |= (half_adder_y0 & 0x01) << 0; + out |= (half_adder_y1 & 0x01) << 1; + return out; +} + +#include +int main(){ + for (int i = 0; i < 2; i++){ + for (int j = 0; j < 2; j++){ + assert((i + j) == half_adder(i,j)); + } + } + return 0; +} \ No newline at end of file diff --git a/Tests/Flat_c_circuits/Adders/s_rca2.c b/Tests/Flat_c_circuits/Adders/s_rca2.c new file mode 100644 index 0000000..26dbcea --- /dev/null +++ b/Tests/Flat_c_circuits/Adders/s_rca2.c @@ -0,0 +1,66 @@ +#include +#include + +uint64_t s_rca2(int64_t a, int64_t b){ + uint8_t out = 0; + uint8_t s_rca2_ha_a = 0; + uint8_t s_rca2_ha_b = 0; + uint8_t s_rca2_ha_y0 = 0; + uint8_t s_rca2_ha_y1 = 0; + uint8_t s_rca2_fa1_a = 0; + uint8_t s_rca2_fa1_b = 0; + uint8_t s_rca2_fa1_y0 = 0; + uint8_t s_rca2_fa1_y1 = 0; + uint8_t s_rca2_fa1_s_rca2_ha_y1 = 0; + uint8_t s_rca2_fa1_y2 = 0; + uint8_t s_rca2_fa1_y3 = 0; + uint8_t s_rca2_fa1_y4 = 0; + uint8_t s_rca2_xor_1_a = 0; + uint8_t s_rca2_xor_1_b = 0; + uint8_t s_rca2_xor_1_y0 = 0; + uint8_t s_rca2_xor_2_s_rca2_xor_1_y0 = 0; + uint8_t s_rca2_xor_2_s_rca2_fa1_y4 = 0; + uint8_t s_rca2_xor_2_y0 = 0; + + s_rca2_ha_a = ((a >> 0) & 0x01); + s_rca2_ha_b = ((b >> 0) & 0x01); + s_rca2_ha_y0 = s_rca2_ha_a ^ s_rca2_ha_b; + s_rca2_ha_y1 = s_rca2_ha_a & s_rca2_ha_b; + s_rca2_fa1_a = ((a >> 1) & 0x01); + s_rca2_fa1_b = ((b >> 1) & 0x01); + s_rca2_fa1_s_rca2_ha_y1 = ((s_rca2_ha_y1 >> 0) & 0x01); + s_rca2_fa1_y0 = s_rca2_fa1_a ^ s_rca2_fa1_b; + s_rca2_fa1_y1 = s_rca2_fa1_a & s_rca2_fa1_b; + s_rca2_fa1_y2 = s_rca2_fa1_y0 ^ s_rca2_fa1_s_rca2_ha_y1; + s_rca2_fa1_y3 = s_rca2_fa1_y0 & s_rca2_fa1_s_rca2_ha_y1; + s_rca2_fa1_y4 = s_rca2_fa1_y1 | s_rca2_fa1_y3; + s_rca2_xor_1_a = ((a >> 1) & 0x01); + s_rca2_xor_1_b = ((b >> 1) & 0x01); + s_rca2_xor_1_y0 = s_rca2_xor_1_a ^ s_rca2_xor_1_b; + s_rca2_xor_2_s_rca2_xor_1_y0 = ((s_rca2_xor_1_y0 >> 0) & 0x01); + s_rca2_xor_2_s_rca2_fa1_y4 = ((s_rca2_fa1_y4 >> 0) & 0x01); + s_rca2_xor_2_y0 = s_rca2_xor_2_s_rca2_xor_1_y0 ^ s_rca2_xor_2_s_rca2_fa1_y4; + + out |= (s_rca2_ha_y0 & 0x01) << 0; + out |= (s_rca2_fa1_y2 & 0x01) << 1; + out |= (s_rca2_xor_2_y0 & 0x01) << 2; + return out; +} + +#include +int main(){ + int result = 0; + for (int i = -2; i < 2; i++){ + for (int j = -2; j < 2; j++){ + result = i + j; + + // Calculating 2's complement in case of negative sum + if (result < 0) { + result = 8 + result; + } + + assert(result == (int)s_rca2(i,j)); + } + } + return 0; +} \ No newline at end of file diff --git a/Tests/Flat_c_circuits/Adders/s_rca6.c b/Tests/Flat_c_circuits/Adders/s_rca6.c new file mode 100644 index 0000000..cb8c3f8 --- /dev/null +++ b/Tests/Flat_c_circuits/Adders/s_rca6.c @@ -0,0 +1,134 @@ +#include +#include + +uint64_t s_rca6(int64_t a, int64_t b){ + uint8_t out = 0; + uint8_t s_rca6_ha_a = 0; + uint8_t s_rca6_ha_b = 0; + uint8_t s_rca6_ha_y0 = 0; + uint8_t s_rca6_ha_y1 = 0; + uint8_t s_rca6_fa1_a = 0; + uint8_t s_rca6_fa1_b = 0; + uint8_t s_rca6_fa1_y0 = 0; + uint8_t s_rca6_fa1_y1 = 0; + uint8_t s_rca6_fa1_s_rca6_ha_y1 = 0; + uint8_t s_rca6_fa1_y2 = 0; + uint8_t s_rca6_fa1_y3 = 0; + uint8_t s_rca6_fa1_y4 = 0; + uint8_t s_rca6_fa2_a = 0; + uint8_t s_rca6_fa2_b = 0; + uint8_t s_rca6_fa2_y0 = 0; + uint8_t s_rca6_fa2_y1 = 0; + uint8_t s_rca6_fa2_s_rca6_fa1_y4 = 0; + uint8_t s_rca6_fa2_y2 = 0; + uint8_t s_rca6_fa2_y3 = 0; + uint8_t s_rca6_fa2_y4 = 0; + uint8_t s_rca6_fa3_a = 0; + uint8_t s_rca6_fa3_b = 0; + uint8_t s_rca6_fa3_y0 = 0; + uint8_t s_rca6_fa3_y1 = 0; + uint8_t s_rca6_fa3_s_rca6_fa2_y4 = 0; + uint8_t s_rca6_fa3_y2 = 0; + uint8_t s_rca6_fa3_y3 = 0; + uint8_t s_rca6_fa3_y4 = 0; + uint8_t s_rca6_fa4_a = 0; + uint8_t s_rca6_fa4_b = 0; + uint8_t s_rca6_fa4_y0 = 0; + uint8_t s_rca6_fa4_y1 = 0; + uint8_t s_rca6_fa4_s_rca6_fa3_y4 = 0; + uint8_t s_rca6_fa4_y2 = 0; + uint8_t s_rca6_fa4_y3 = 0; + uint8_t s_rca6_fa4_y4 = 0; + uint8_t s_rca6_fa5_a = 0; + uint8_t s_rca6_fa5_b = 0; + uint8_t s_rca6_fa5_y0 = 0; + uint8_t s_rca6_fa5_y1 = 0; + uint8_t s_rca6_fa5_s_rca6_fa4_y4 = 0; + uint8_t s_rca6_fa5_y2 = 0; + uint8_t s_rca6_fa5_y3 = 0; + uint8_t s_rca6_fa5_y4 = 0; + uint8_t s_rca6_xor_1_a = 0; + uint8_t s_rca6_xor_1_b = 0; + uint8_t s_rca6_xor_1_y0 = 0; + uint8_t s_rca6_xor_2_s_rca6_xor_1_y0 = 0; + uint8_t s_rca6_xor_2_s_rca6_fa5_y4 = 0; + uint8_t s_rca6_xor_2_y0 = 0; + + s_rca6_ha_a = ((a >> 0) & 0x01); + s_rca6_ha_b = ((b >> 0) & 0x01); + s_rca6_ha_y0 = s_rca6_ha_a ^ s_rca6_ha_b; + s_rca6_ha_y1 = s_rca6_ha_a & s_rca6_ha_b; + s_rca6_fa1_a = ((a >> 1) & 0x01); + s_rca6_fa1_b = ((b >> 1) & 0x01); + s_rca6_fa1_s_rca6_ha_y1 = ((s_rca6_ha_y1 >> 0) & 0x01); + s_rca6_fa1_y0 = s_rca6_fa1_a ^ s_rca6_fa1_b; + s_rca6_fa1_y1 = s_rca6_fa1_a & s_rca6_fa1_b; + s_rca6_fa1_y2 = s_rca6_fa1_y0 ^ s_rca6_fa1_s_rca6_ha_y1; + s_rca6_fa1_y3 = s_rca6_fa1_y0 & s_rca6_fa1_s_rca6_ha_y1; + s_rca6_fa1_y4 = s_rca6_fa1_y1 | s_rca6_fa1_y3; + s_rca6_fa2_a = ((a >> 2) & 0x01); + s_rca6_fa2_b = ((b >> 2) & 0x01); + s_rca6_fa2_s_rca6_fa1_y4 = ((s_rca6_fa1_y4 >> 0) & 0x01); + s_rca6_fa2_y0 = s_rca6_fa2_a ^ s_rca6_fa2_b; + s_rca6_fa2_y1 = s_rca6_fa2_a & s_rca6_fa2_b; + s_rca6_fa2_y2 = s_rca6_fa2_y0 ^ s_rca6_fa2_s_rca6_fa1_y4; + s_rca6_fa2_y3 = s_rca6_fa2_y0 & s_rca6_fa2_s_rca6_fa1_y4; + s_rca6_fa2_y4 = s_rca6_fa2_y1 | s_rca6_fa2_y3; + s_rca6_fa3_a = ((a >> 3) & 0x01); + s_rca6_fa3_b = ((b >> 3) & 0x01); + s_rca6_fa3_s_rca6_fa2_y4 = ((s_rca6_fa2_y4 >> 0) & 0x01); + s_rca6_fa3_y0 = s_rca6_fa3_a ^ s_rca6_fa3_b; + s_rca6_fa3_y1 = s_rca6_fa3_a & s_rca6_fa3_b; + s_rca6_fa3_y2 = s_rca6_fa3_y0 ^ s_rca6_fa3_s_rca6_fa2_y4; + s_rca6_fa3_y3 = s_rca6_fa3_y0 & s_rca6_fa3_s_rca6_fa2_y4; + s_rca6_fa3_y4 = s_rca6_fa3_y1 | s_rca6_fa3_y3; + s_rca6_fa4_a = ((a >> 4) & 0x01); + s_rca6_fa4_b = ((b >> 4) & 0x01); + s_rca6_fa4_s_rca6_fa3_y4 = ((s_rca6_fa3_y4 >> 0) & 0x01); + s_rca6_fa4_y0 = s_rca6_fa4_a ^ s_rca6_fa4_b; + s_rca6_fa4_y1 = s_rca6_fa4_a & s_rca6_fa4_b; + s_rca6_fa4_y2 = s_rca6_fa4_y0 ^ s_rca6_fa4_s_rca6_fa3_y4; + s_rca6_fa4_y3 = s_rca6_fa4_y0 & s_rca6_fa4_s_rca6_fa3_y4; + s_rca6_fa4_y4 = s_rca6_fa4_y1 | s_rca6_fa4_y3; + s_rca6_fa5_a = ((a >> 5) & 0x01); + s_rca6_fa5_b = ((b >> 5) & 0x01); + s_rca6_fa5_s_rca6_fa4_y4 = ((s_rca6_fa4_y4 >> 0) & 0x01); + s_rca6_fa5_y0 = s_rca6_fa5_a ^ s_rca6_fa5_b; + s_rca6_fa5_y1 = s_rca6_fa5_a & s_rca6_fa5_b; + s_rca6_fa5_y2 = s_rca6_fa5_y0 ^ s_rca6_fa5_s_rca6_fa4_y4; + s_rca6_fa5_y3 = s_rca6_fa5_y0 & s_rca6_fa5_s_rca6_fa4_y4; + s_rca6_fa5_y4 = s_rca6_fa5_y1 | s_rca6_fa5_y3; + s_rca6_xor_1_a = ((a >> 5) & 0x01); + s_rca6_xor_1_b = ((b >> 5) & 0x01); + s_rca6_xor_1_y0 = s_rca6_xor_1_a ^ s_rca6_xor_1_b; + s_rca6_xor_2_s_rca6_xor_1_y0 = ((s_rca6_xor_1_y0 >> 0) & 0x01); + s_rca6_xor_2_s_rca6_fa5_y4 = ((s_rca6_fa5_y4 >> 0) & 0x01); + s_rca6_xor_2_y0 = s_rca6_xor_2_s_rca6_xor_1_y0 ^ s_rca6_xor_2_s_rca6_fa5_y4; + + out |= (s_rca6_ha_y0 & 0x01) << 0; + out |= (s_rca6_fa1_y2 & 0x01) << 1; + out |= (s_rca6_fa2_y2 & 0x01) << 2; + out |= (s_rca6_fa3_y2 & 0x01) << 3; + out |= (s_rca6_fa4_y2 & 0x01) << 4; + out |= (s_rca6_fa5_y2 & 0x01) << 5; + out |= (s_rca6_xor_2_y0 & 0x01) << 6; + return out; +} + +#include +int main(){ + int result = 0; + for (int i = -32; i < 32; i++){ + for (int j = -32; j < 32; j++){ + result = i + j; + + // Calculating 2's complement in case of negative sum + if (result < 0) { + result = 128 + result; + } + + assert(result == (int)s_rca6(i,j)); + } + } + return 0; +} \ No newline at end of file diff --git a/Tests/Flat_c_circuits/Adders/s_rca8.c b/Tests/Flat_c_circuits/Adders/s_rca8.c new file mode 100644 index 0000000..66bbd0d --- /dev/null +++ b/Tests/Flat_c_circuits/Adders/s_rca8.c @@ -0,0 +1,168 @@ +#include +#include + +uint64_t s_rca8(int64_t a, int64_t b){ + uint64_t out = 0; + uint8_t s_rca8_ha_a = 0; + uint8_t s_rca8_ha_b = 0; + uint8_t s_rca8_ha_y0 = 0; + uint8_t s_rca8_ha_y1 = 0; + uint8_t s_rca8_fa1_a = 0; + uint8_t s_rca8_fa1_b = 0; + uint8_t s_rca8_fa1_y0 = 0; + uint8_t s_rca8_fa1_y1 = 0; + uint8_t s_rca8_fa1_s_rca8_ha_y1 = 0; + uint8_t s_rca8_fa1_y2 = 0; + uint8_t s_rca8_fa1_y3 = 0; + uint8_t s_rca8_fa1_y4 = 0; + uint8_t s_rca8_fa2_a = 0; + uint8_t s_rca8_fa2_b = 0; + uint8_t s_rca8_fa2_y0 = 0; + uint8_t s_rca8_fa2_y1 = 0; + uint8_t s_rca8_fa2_s_rca8_fa1_y4 = 0; + uint8_t s_rca8_fa2_y2 = 0; + uint8_t s_rca8_fa2_y3 = 0; + uint8_t s_rca8_fa2_y4 = 0; + uint8_t s_rca8_fa3_a = 0; + uint8_t s_rca8_fa3_b = 0; + uint8_t s_rca8_fa3_y0 = 0; + uint8_t s_rca8_fa3_y1 = 0; + uint8_t s_rca8_fa3_s_rca8_fa2_y4 = 0; + uint8_t s_rca8_fa3_y2 = 0; + uint8_t s_rca8_fa3_y3 = 0; + uint8_t s_rca8_fa3_y4 = 0; + uint8_t s_rca8_fa4_a = 0; + uint8_t s_rca8_fa4_b = 0; + uint8_t s_rca8_fa4_y0 = 0; + uint8_t s_rca8_fa4_y1 = 0; + uint8_t s_rca8_fa4_s_rca8_fa3_y4 = 0; + uint8_t s_rca8_fa4_y2 = 0; + uint8_t s_rca8_fa4_y3 = 0; + uint8_t s_rca8_fa4_y4 = 0; + uint8_t s_rca8_fa5_a = 0; + uint8_t s_rca8_fa5_b = 0; + uint8_t s_rca8_fa5_y0 = 0; + uint8_t s_rca8_fa5_y1 = 0; + uint8_t s_rca8_fa5_s_rca8_fa4_y4 = 0; + uint8_t s_rca8_fa5_y2 = 0; + uint8_t s_rca8_fa5_y3 = 0; + uint8_t s_rca8_fa5_y4 = 0; + uint8_t s_rca8_fa6_a = 0; + uint8_t s_rca8_fa6_b = 0; + uint8_t s_rca8_fa6_y0 = 0; + uint8_t s_rca8_fa6_y1 = 0; + uint8_t s_rca8_fa6_s_rca8_fa5_y4 = 0; + uint8_t s_rca8_fa6_y2 = 0; + uint8_t s_rca8_fa6_y3 = 0; + uint8_t s_rca8_fa6_y4 = 0; + uint8_t s_rca8_fa7_a = 0; + uint8_t s_rca8_fa7_b = 0; + uint8_t s_rca8_fa7_y0 = 0; + uint8_t s_rca8_fa7_y1 = 0; + uint8_t s_rca8_fa7_s_rca8_fa6_y4 = 0; + uint8_t s_rca8_fa7_y2 = 0; + uint8_t s_rca8_fa7_y3 = 0; + uint8_t s_rca8_fa7_y4 = 0; + uint8_t s_rca8_xor_1_a = 0; + uint8_t s_rca8_xor_1_b = 0; + uint8_t s_rca8_xor_1_y0 = 0; + uint8_t s_rca8_xor_2_s_rca8_xor_1_y0 = 0; + uint8_t s_rca8_xor_2_s_rca8_fa7_y4 = 0; + uint8_t s_rca8_xor_2_y0 = 0; + + s_rca8_ha_a = ((a >> 0) & 0x01); + s_rca8_ha_b = ((b >> 0) & 0x01); + s_rca8_ha_y0 = s_rca8_ha_a ^ s_rca8_ha_b; + s_rca8_ha_y1 = s_rca8_ha_a & s_rca8_ha_b; + s_rca8_fa1_a = ((a >> 1) & 0x01); + s_rca8_fa1_b = ((b >> 1) & 0x01); + s_rca8_fa1_s_rca8_ha_y1 = ((s_rca8_ha_y1 >> 0) & 0x01); + s_rca8_fa1_y0 = s_rca8_fa1_a ^ s_rca8_fa1_b; + s_rca8_fa1_y1 = s_rca8_fa1_a & s_rca8_fa1_b; + s_rca8_fa1_y2 = s_rca8_fa1_y0 ^ s_rca8_fa1_s_rca8_ha_y1; + s_rca8_fa1_y3 = s_rca8_fa1_y0 & s_rca8_fa1_s_rca8_ha_y1; + s_rca8_fa1_y4 = s_rca8_fa1_y1 | s_rca8_fa1_y3; + s_rca8_fa2_a = ((a >> 2) & 0x01); + s_rca8_fa2_b = ((b >> 2) & 0x01); + s_rca8_fa2_s_rca8_fa1_y4 = ((s_rca8_fa1_y4 >> 0) & 0x01); + s_rca8_fa2_y0 = s_rca8_fa2_a ^ s_rca8_fa2_b; + s_rca8_fa2_y1 = s_rca8_fa2_a & s_rca8_fa2_b; + s_rca8_fa2_y2 = s_rca8_fa2_y0 ^ s_rca8_fa2_s_rca8_fa1_y4; + s_rca8_fa2_y3 = s_rca8_fa2_y0 & s_rca8_fa2_s_rca8_fa1_y4; + s_rca8_fa2_y4 = s_rca8_fa2_y1 | s_rca8_fa2_y3; + s_rca8_fa3_a = ((a >> 3) & 0x01); + s_rca8_fa3_b = ((b >> 3) & 0x01); + s_rca8_fa3_s_rca8_fa2_y4 = ((s_rca8_fa2_y4 >> 0) & 0x01); + s_rca8_fa3_y0 = s_rca8_fa3_a ^ s_rca8_fa3_b; + s_rca8_fa3_y1 = s_rca8_fa3_a & s_rca8_fa3_b; + s_rca8_fa3_y2 = s_rca8_fa3_y0 ^ s_rca8_fa3_s_rca8_fa2_y4; + s_rca8_fa3_y3 = s_rca8_fa3_y0 & s_rca8_fa3_s_rca8_fa2_y4; + s_rca8_fa3_y4 = s_rca8_fa3_y1 | s_rca8_fa3_y3; + s_rca8_fa4_a = ((a >> 4) & 0x01); + s_rca8_fa4_b = ((b >> 4) & 0x01); + s_rca8_fa4_s_rca8_fa3_y4 = ((s_rca8_fa3_y4 >> 0) & 0x01); + s_rca8_fa4_y0 = s_rca8_fa4_a ^ s_rca8_fa4_b; + s_rca8_fa4_y1 = s_rca8_fa4_a & s_rca8_fa4_b; + s_rca8_fa4_y2 = s_rca8_fa4_y0 ^ s_rca8_fa4_s_rca8_fa3_y4; + s_rca8_fa4_y3 = s_rca8_fa4_y0 & s_rca8_fa4_s_rca8_fa3_y4; + s_rca8_fa4_y4 = s_rca8_fa4_y1 | s_rca8_fa4_y3; + s_rca8_fa5_a = ((a >> 5) & 0x01); + s_rca8_fa5_b = ((b >> 5) & 0x01); + s_rca8_fa5_s_rca8_fa4_y4 = ((s_rca8_fa4_y4 >> 0) & 0x01); + s_rca8_fa5_y0 = s_rca8_fa5_a ^ s_rca8_fa5_b; + s_rca8_fa5_y1 = s_rca8_fa5_a & s_rca8_fa5_b; + s_rca8_fa5_y2 = s_rca8_fa5_y0 ^ s_rca8_fa5_s_rca8_fa4_y4; + s_rca8_fa5_y3 = s_rca8_fa5_y0 & s_rca8_fa5_s_rca8_fa4_y4; + s_rca8_fa5_y4 = s_rca8_fa5_y1 | s_rca8_fa5_y3; + s_rca8_fa6_a = ((a >> 6) & 0x01); + s_rca8_fa6_b = ((b >> 6) & 0x01); + s_rca8_fa6_s_rca8_fa5_y4 = ((s_rca8_fa5_y4 >> 0) & 0x01); + s_rca8_fa6_y0 = s_rca8_fa6_a ^ s_rca8_fa6_b; + s_rca8_fa6_y1 = s_rca8_fa6_a & s_rca8_fa6_b; + s_rca8_fa6_y2 = s_rca8_fa6_y0 ^ s_rca8_fa6_s_rca8_fa5_y4; + s_rca8_fa6_y3 = s_rca8_fa6_y0 & s_rca8_fa6_s_rca8_fa5_y4; + s_rca8_fa6_y4 = s_rca8_fa6_y1 | s_rca8_fa6_y3; + s_rca8_fa7_a = ((a >> 7) & 0x01); + s_rca8_fa7_b = ((b >> 7) & 0x01); + s_rca8_fa7_s_rca8_fa6_y4 = ((s_rca8_fa6_y4 >> 0) & 0x01); + s_rca8_fa7_y0 = s_rca8_fa7_a ^ s_rca8_fa7_b; + s_rca8_fa7_y1 = s_rca8_fa7_a & s_rca8_fa7_b; + s_rca8_fa7_y2 = s_rca8_fa7_y0 ^ s_rca8_fa7_s_rca8_fa6_y4; + s_rca8_fa7_y3 = s_rca8_fa7_y0 & s_rca8_fa7_s_rca8_fa6_y4; + s_rca8_fa7_y4 = s_rca8_fa7_y1 | s_rca8_fa7_y3; + s_rca8_xor_1_a = ((a >> 7) & 0x01); + s_rca8_xor_1_b = ((b >> 7) & 0x01); + s_rca8_xor_1_y0 = s_rca8_xor_1_a ^ s_rca8_xor_1_b; + s_rca8_xor_2_s_rca8_xor_1_y0 = ((s_rca8_xor_1_y0 >> 0) & 0x01); + s_rca8_xor_2_s_rca8_fa7_y4 = ((s_rca8_fa7_y4 >> 0) & 0x01); + s_rca8_xor_2_y0 = s_rca8_xor_2_s_rca8_xor_1_y0 ^ s_rca8_xor_2_s_rca8_fa7_y4; + + out |= (s_rca8_ha_y0 & 0x01) << 0; + out |= (s_rca8_fa1_y2 & 0x01) << 1; + out |= (s_rca8_fa2_y2 & 0x01) << 2; + out |= (s_rca8_fa3_y2 & 0x01) << 3; + out |= (s_rca8_fa4_y2 & 0x01) << 4; + out |= (s_rca8_fa5_y2 & 0x01) << 5; + out |= (s_rca8_fa6_y2 & 0x01) << 6; + out |= (s_rca8_fa7_y2 & 0x01) << 7; + out |= (s_rca8_xor_2_y0 & 0x01) << 8; + return out; +} + +#include +int main(){ + int result = 0; + for (int i = -128; i < 128; i++){ + for (int j = -128; j < 128; j++){ + result = i + j; + + // Calculating 2's complement in case of negative sum + if (result < 0) { + result = 512 + result; + } + + assert(result == (int)s_rca8(i,j)); + } + } + return 0; +} \ No newline at end of file diff --git a/Tests/Flat_c_circuits/Adders/u_rca3.c b/Tests/Flat_c_circuits/Adders/u_rca3.c new file mode 100644 index 0000000..1cce518 --- /dev/null +++ b/Tests/Flat_c_circuits/Adders/u_rca3.c @@ -0,0 +1,63 @@ +#include +#include + +uint64_t u_rca3(uint64_t a, uint64_t b){ + uint8_t out = 0; + uint8_t u_rca3_ha_a = 0; + uint8_t u_rca3_ha_b = 0; + uint8_t u_rca3_ha_y0 = 0; + uint8_t u_rca3_ha_y1 = 0; + uint8_t u_rca3_fa1_a = 0; + uint8_t u_rca3_fa1_b = 0; + uint8_t u_rca3_fa1_y0 = 0; + uint8_t u_rca3_fa1_y1 = 0; + uint8_t u_rca3_fa1_u_rca3_ha_y1 = 0; + uint8_t u_rca3_fa1_y2 = 0; + uint8_t u_rca3_fa1_y3 = 0; + uint8_t u_rca3_fa1_y4 = 0; + uint8_t u_rca3_fa2_a = 0; + uint8_t u_rca3_fa2_b = 0; + uint8_t u_rca3_fa2_y0 = 0; + uint8_t u_rca3_fa2_y1 = 0; + uint8_t u_rca3_fa2_u_rca3_fa1_y4 = 0; + uint8_t u_rca3_fa2_y2 = 0; + uint8_t u_rca3_fa2_y3 = 0; + uint8_t u_rca3_fa2_y4 = 0; + + u_rca3_ha_a = ((a >> 0) & 0x01); + u_rca3_ha_b = ((b >> 0) & 0x01); + u_rca3_ha_y0 = u_rca3_ha_a ^ u_rca3_ha_b; + u_rca3_ha_y1 = u_rca3_ha_a & u_rca3_ha_b; + u_rca3_fa1_a = ((a >> 1) & 0x01); + u_rca3_fa1_b = ((b >> 1) & 0x01); + u_rca3_fa1_u_rca3_ha_y1 = ((u_rca3_ha_y1 >> 0) & 0x01); + u_rca3_fa1_y0 = u_rca3_fa1_a ^ u_rca3_fa1_b; + u_rca3_fa1_y1 = u_rca3_fa1_a & u_rca3_fa1_b; + u_rca3_fa1_y2 = u_rca3_fa1_y0 ^ u_rca3_fa1_u_rca3_ha_y1; + u_rca3_fa1_y3 = u_rca3_fa1_y0 & u_rca3_fa1_u_rca3_ha_y1; + u_rca3_fa1_y4 = u_rca3_fa1_y1 | u_rca3_fa1_y3; + u_rca3_fa2_a = ((a >> 2) & 0x01); + u_rca3_fa2_b = ((b >> 2) & 0x01); + u_rca3_fa2_u_rca3_fa1_y4 = ((u_rca3_fa1_y4 >> 0) & 0x01); + u_rca3_fa2_y0 = u_rca3_fa2_a ^ u_rca3_fa2_b; + u_rca3_fa2_y1 = u_rca3_fa2_a & u_rca3_fa2_b; + u_rca3_fa2_y2 = u_rca3_fa2_y0 ^ u_rca3_fa2_u_rca3_fa1_y4; + u_rca3_fa2_y3 = u_rca3_fa2_y0 & u_rca3_fa2_u_rca3_fa1_y4; + u_rca3_fa2_y4 = u_rca3_fa2_y1 | u_rca3_fa2_y3; + + out |= (u_rca3_ha_y0 & 0x01) << 0; + out |= (u_rca3_fa1_y2 & 0x01) << 1; + out |= (u_rca3_fa2_y2 & 0x01) << 2; + out |= (u_rca3_fa2_y4 & 0x01) << 3; + return out; +} + +#include +int main(){ + for (int i = 0; i < 8; i++){ + for (int j = 0; j < 8; j++){ + assert((i + j) == u_rca3(i,j)); + } + } + return 0; +} \ No newline at end of file diff --git a/Tests/Flat_c_circuits/Adders/u_rca5.c b/Tests/Flat_c_circuits/Adders/u_rca5.c new file mode 100644 index 0000000..9804418 --- /dev/null +++ b/Tests/Flat_c_circuits/Adders/u_rca5.c @@ -0,0 +1,97 @@ +#include +#include + +uint64_t u_rca5(uint64_t a, uint64_t b){ + uint8_t out = 0; + uint8_t u_rca5_ha_a = 0; + uint8_t u_rca5_ha_b = 0; + uint8_t u_rca5_ha_y0 = 0; + uint8_t u_rca5_ha_y1 = 0; + uint8_t u_rca5_fa1_a = 0; + uint8_t u_rca5_fa1_b = 0; + uint8_t u_rca5_fa1_y0 = 0; + uint8_t u_rca5_fa1_y1 = 0; + uint8_t u_rca5_fa1_u_rca5_ha_y1 = 0; + uint8_t u_rca5_fa1_y2 = 0; + uint8_t u_rca5_fa1_y3 = 0; + uint8_t u_rca5_fa1_y4 = 0; + uint8_t u_rca5_fa2_a = 0; + uint8_t u_rca5_fa2_b = 0; + uint8_t u_rca5_fa2_y0 = 0; + uint8_t u_rca5_fa2_y1 = 0; + uint8_t u_rca5_fa2_u_rca5_fa1_y4 = 0; + uint8_t u_rca5_fa2_y2 = 0; + uint8_t u_rca5_fa2_y3 = 0; + uint8_t u_rca5_fa2_y4 = 0; + uint8_t u_rca5_fa3_a = 0; + uint8_t u_rca5_fa3_b = 0; + uint8_t u_rca5_fa3_y0 = 0; + uint8_t u_rca5_fa3_y1 = 0; + uint8_t u_rca5_fa3_u_rca5_fa2_y4 = 0; + uint8_t u_rca5_fa3_y2 = 0; + uint8_t u_rca5_fa3_y3 = 0; + uint8_t u_rca5_fa3_y4 = 0; + uint8_t u_rca5_fa4_a = 0; + uint8_t u_rca5_fa4_b = 0; + uint8_t u_rca5_fa4_y0 = 0; + uint8_t u_rca5_fa4_y1 = 0; + uint8_t u_rca5_fa4_u_rca5_fa3_y4 = 0; + uint8_t u_rca5_fa4_y2 = 0; + uint8_t u_rca5_fa4_y3 = 0; + uint8_t u_rca5_fa4_y4 = 0; + + u_rca5_ha_a = ((a >> 0) & 0x01); + u_rca5_ha_b = ((b >> 0) & 0x01); + u_rca5_ha_y0 = u_rca5_ha_a ^ u_rca5_ha_b; + u_rca5_ha_y1 = u_rca5_ha_a & u_rca5_ha_b; + u_rca5_fa1_a = ((a >> 1) & 0x01); + u_rca5_fa1_b = ((b >> 1) & 0x01); + u_rca5_fa1_u_rca5_ha_y1 = ((u_rca5_ha_y1 >> 0) & 0x01); + u_rca5_fa1_y0 = u_rca5_fa1_a ^ u_rca5_fa1_b; + u_rca5_fa1_y1 = u_rca5_fa1_a & u_rca5_fa1_b; + u_rca5_fa1_y2 = u_rca5_fa1_y0 ^ u_rca5_fa1_u_rca5_ha_y1; + u_rca5_fa1_y3 = u_rca5_fa1_y0 & u_rca5_fa1_u_rca5_ha_y1; + u_rca5_fa1_y4 = u_rca5_fa1_y1 | u_rca5_fa1_y3; + u_rca5_fa2_a = ((a >> 2) & 0x01); + u_rca5_fa2_b = ((b >> 2) & 0x01); + u_rca5_fa2_u_rca5_fa1_y4 = ((u_rca5_fa1_y4 >> 0) & 0x01); + u_rca5_fa2_y0 = u_rca5_fa2_a ^ u_rca5_fa2_b; + u_rca5_fa2_y1 = u_rca5_fa2_a & u_rca5_fa2_b; + u_rca5_fa2_y2 = u_rca5_fa2_y0 ^ u_rca5_fa2_u_rca5_fa1_y4; + u_rca5_fa2_y3 = u_rca5_fa2_y0 & u_rca5_fa2_u_rca5_fa1_y4; + u_rca5_fa2_y4 = u_rca5_fa2_y1 | u_rca5_fa2_y3; + u_rca5_fa3_a = ((a >> 3) & 0x01); + u_rca5_fa3_b = ((b >> 3) & 0x01); + u_rca5_fa3_u_rca5_fa2_y4 = ((u_rca5_fa2_y4 >> 0) & 0x01); + u_rca5_fa3_y0 = u_rca5_fa3_a ^ u_rca5_fa3_b; + u_rca5_fa3_y1 = u_rca5_fa3_a & u_rca5_fa3_b; + u_rca5_fa3_y2 = u_rca5_fa3_y0 ^ u_rca5_fa3_u_rca5_fa2_y4; + u_rca5_fa3_y3 = u_rca5_fa3_y0 & u_rca5_fa3_u_rca5_fa2_y4; + u_rca5_fa3_y4 = u_rca5_fa3_y1 | u_rca5_fa3_y3; + u_rca5_fa4_a = ((a >> 4) & 0x01); + u_rca5_fa4_b = ((b >> 4) & 0x01); + u_rca5_fa4_u_rca5_fa3_y4 = ((u_rca5_fa3_y4 >> 0) & 0x01); + u_rca5_fa4_y0 = u_rca5_fa4_a ^ u_rca5_fa4_b; + u_rca5_fa4_y1 = u_rca5_fa4_a & u_rca5_fa4_b; + u_rca5_fa4_y2 = u_rca5_fa4_y0 ^ u_rca5_fa4_u_rca5_fa3_y4; + u_rca5_fa4_y3 = u_rca5_fa4_y0 & u_rca5_fa4_u_rca5_fa3_y4; + u_rca5_fa4_y4 = u_rca5_fa4_y1 | u_rca5_fa4_y3; + + out |= (u_rca5_ha_y0 & 0x01) << 0; + out |= (u_rca5_fa1_y2 & 0x01) << 1; + out |= (u_rca5_fa2_y2 & 0x01) << 2; + out |= (u_rca5_fa3_y2 & 0x01) << 3; + out |= (u_rca5_fa4_y2 & 0x01) << 4; + out |= (u_rca5_fa4_y4 & 0x01) << 5; + return out; +} + +#include +int main(){ + for (int i = 0; i < 32; i++){ + for (int j = 0; j < 32; j++){ + assert((i + j) == u_rca5(i,j)); + } + } + return 0; +} \ No newline at end of file diff --git a/Tests/Flat_c_circuits/Adders/u_rca8.c b/Tests/Flat_c_circuits/Adders/u_rca8.c new file mode 100644 index 0000000..45003af --- /dev/null +++ b/Tests/Flat_c_circuits/Adders/u_rca8.c @@ -0,0 +1,148 @@ +#include +#include + +uint64_t u_rca8(uint64_t a, uint64_t b){ + uint64_t out = 0; + uint8_t u_rca8_ha_a = 0; + uint8_t u_rca8_ha_b = 0; + uint8_t u_rca8_ha_y0 = 0; + uint8_t u_rca8_ha_y1 = 0; + uint8_t u_rca8_fa1_a = 0; + uint8_t u_rca8_fa1_b = 0; + uint8_t u_rca8_fa1_y0 = 0; + uint8_t u_rca8_fa1_y1 = 0; + uint8_t u_rca8_fa1_u_rca8_ha_y1 = 0; + uint8_t u_rca8_fa1_y2 = 0; + uint8_t u_rca8_fa1_y3 = 0; + uint8_t u_rca8_fa1_y4 = 0; + uint8_t u_rca8_fa2_a = 0; + uint8_t u_rca8_fa2_b = 0; + uint8_t u_rca8_fa2_y0 = 0; + uint8_t u_rca8_fa2_y1 = 0; + uint8_t u_rca8_fa2_u_rca8_fa1_y4 = 0; + uint8_t u_rca8_fa2_y2 = 0; + uint8_t u_rca8_fa2_y3 = 0; + uint8_t u_rca8_fa2_y4 = 0; + uint8_t u_rca8_fa3_a = 0; + uint8_t u_rca8_fa3_b = 0; + uint8_t u_rca8_fa3_y0 = 0; + uint8_t u_rca8_fa3_y1 = 0; + uint8_t u_rca8_fa3_u_rca8_fa2_y4 = 0; + uint8_t u_rca8_fa3_y2 = 0; + uint8_t u_rca8_fa3_y3 = 0; + uint8_t u_rca8_fa3_y4 = 0; + uint8_t u_rca8_fa4_a = 0; + uint8_t u_rca8_fa4_b = 0; + uint8_t u_rca8_fa4_y0 = 0; + uint8_t u_rca8_fa4_y1 = 0; + uint8_t u_rca8_fa4_u_rca8_fa3_y4 = 0; + uint8_t u_rca8_fa4_y2 = 0; + uint8_t u_rca8_fa4_y3 = 0; + uint8_t u_rca8_fa4_y4 = 0; + uint8_t u_rca8_fa5_a = 0; + uint8_t u_rca8_fa5_b = 0; + uint8_t u_rca8_fa5_y0 = 0; + uint8_t u_rca8_fa5_y1 = 0; + uint8_t u_rca8_fa5_u_rca8_fa4_y4 = 0; + uint8_t u_rca8_fa5_y2 = 0; + uint8_t u_rca8_fa5_y3 = 0; + uint8_t u_rca8_fa5_y4 = 0; + uint8_t u_rca8_fa6_a = 0; + uint8_t u_rca8_fa6_b = 0; + uint8_t u_rca8_fa6_y0 = 0; + uint8_t u_rca8_fa6_y1 = 0; + uint8_t u_rca8_fa6_u_rca8_fa5_y4 = 0; + uint8_t u_rca8_fa6_y2 = 0; + uint8_t u_rca8_fa6_y3 = 0; + uint8_t u_rca8_fa6_y4 = 0; + uint8_t u_rca8_fa7_a = 0; + uint8_t u_rca8_fa7_b = 0; + uint8_t u_rca8_fa7_y0 = 0; + uint8_t u_rca8_fa7_y1 = 0; + uint8_t u_rca8_fa7_u_rca8_fa6_y4 = 0; + uint8_t u_rca8_fa7_y2 = 0; + uint8_t u_rca8_fa7_y3 = 0; + uint8_t u_rca8_fa7_y4 = 0; + + u_rca8_ha_a = ((a >> 0) & 0x01); + u_rca8_ha_b = ((b >> 0) & 0x01); + u_rca8_ha_y0 = u_rca8_ha_a ^ u_rca8_ha_b; + u_rca8_ha_y1 = u_rca8_ha_a & u_rca8_ha_b; + u_rca8_fa1_a = ((a >> 1) & 0x01); + u_rca8_fa1_b = ((b >> 1) & 0x01); + u_rca8_fa1_u_rca8_ha_y1 = ((u_rca8_ha_y1 >> 0) & 0x01); + u_rca8_fa1_y0 = u_rca8_fa1_a ^ u_rca8_fa1_b; + u_rca8_fa1_y1 = u_rca8_fa1_a & u_rca8_fa1_b; + u_rca8_fa1_y2 = u_rca8_fa1_y0 ^ u_rca8_fa1_u_rca8_ha_y1; + u_rca8_fa1_y3 = u_rca8_fa1_y0 & u_rca8_fa1_u_rca8_ha_y1; + u_rca8_fa1_y4 = u_rca8_fa1_y1 | u_rca8_fa1_y3; + u_rca8_fa2_a = ((a >> 2) & 0x01); + u_rca8_fa2_b = ((b >> 2) & 0x01); + u_rca8_fa2_u_rca8_fa1_y4 = ((u_rca8_fa1_y4 >> 0) & 0x01); + u_rca8_fa2_y0 = u_rca8_fa2_a ^ u_rca8_fa2_b; + u_rca8_fa2_y1 = u_rca8_fa2_a & u_rca8_fa2_b; + u_rca8_fa2_y2 = u_rca8_fa2_y0 ^ u_rca8_fa2_u_rca8_fa1_y4; + u_rca8_fa2_y3 = u_rca8_fa2_y0 & u_rca8_fa2_u_rca8_fa1_y4; + u_rca8_fa2_y4 = u_rca8_fa2_y1 | u_rca8_fa2_y3; + u_rca8_fa3_a = ((a >> 3) & 0x01); + u_rca8_fa3_b = ((b >> 3) & 0x01); + u_rca8_fa3_u_rca8_fa2_y4 = ((u_rca8_fa2_y4 >> 0) & 0x01); + u_rca8_fa3_y0 = u_rca8_fa3_a ^ u_rca8_fa3_b; + u_rca8_fa3_y1 = u_rca8_fa3_a & u_rca8_fa3_b; + u_rca8_fa3_y2 = u_rca8_fa3_y0 ^ u_rca8_fa3_u_rca8_fa2_y4; + u_rca8_fa3_y3 = u_rca8_fa3_y0 & u_rca8_fa3_u_rca8_fa2_y4; + u_rca8_fa3_y4 = u_rca8_fa3_y1 | u_rca8_fa3_y3; + u_rca8_fa4_a = ((a >> 4) & 0x01); + u_rca8_fa4_b = ((b >> 4) & 0x01); + u_rca8_fa4_u_rca8_fa3_y4 = ((u_rca8_fa3_y4 >> 0) & 0x01); + u_rca8_fa4_y0 = u_rca8_fa4_a ^ u_rca8_fa4_b; + u_rca8_fa4_y1 = u_rca8_fa4_a & u_rca8_fa4_b; + u_rca8_fa4_y2 = u_rca8_fa4_y0 ^ u_rca8_fa4_u_rca8_fa3_y4; + u_rca8_fa4_y3 = u_rca8_fa4_y0 & u_rca8_fa4_u_rca8_fa3_y4; + u_rca8_fa4_y4 = u_rca8_fa4_y1 | u_rca8_fa4_y3; + u_rca8_fa5_a = ((a >> 5) & 0x01); + u_rca8_fa5_b = ((b >> 5) & 0x01); + u_rca8_fa5_u_rca8_fa4_y4 = ((u_rca8_fa4_y4 >> 0) & 0x01); + u_rca8_fa5_y0 = u_rca8_fa5_a ^ u_rca8_fa5_b; + u_rca8_fa5_y1 = u_rca8_fa5_a & u_rca8_fa5_b; + u_rca8_fa5_y2 = u_rca8_fa5_y0 ^ u_rca8_fa5_u_rca8_fa4_y4; + u_rca8_fa5_y3 = u_rca8_fa5_y0 & u_rca8_fa5_u_rca8_fa4_y4; + u_rca8_fa5_y4 = u_rca8_fa5_y1 | u_rca8_fa5_y3; + u_rca8_fa6_a = ((a >> 6) & 0x01); + u_rca8_fa6_b = ((b >> 6) & 0x01); + u_rca8_fa6_u_rca8_fa5_y4 = ((u_rca8_fa5_y4 >> 0) & 0x01); + u_rca8_fa6_y0 = u_rca8_fa6_a ^ u_rca8_fa6_b; + u_rca8_fa6_y1 = u_rca8_fa6_a & u_rca8_fa6_b; + u_rca8_fa6_y2 = u_rca8_fa6_y0 ^ u_rca8_fa6_u_rca8_fa5_y4; + u_rca8_fa6_y3 = u_rca8_fa6_y0 & u_rca8_fa6_u_rca8_fa5_y4; + u_rca8_fa6_y4 = u_rca8_fa6_y1 | u_rca8_fa6_y3; + u_rca8_fa7_a = ((a >> 7) & 0x01); + u_rca8_fa7_b = ((b >> 7) & 0x01); + u_rca8_fa7_u_rca8_fa6_y4 = ((u_rca8_fa6_y4 >> 0) & 0x01); + u_rca8_fa7_y0 = u_rca8_fa7_a ^ u_rca8_fa7_b; + u_rca8_fa7_y1 = u_rca8_fa7_a & u_rca8_fa7_b; + u_rca8_fa7_y2 = u_rca8_fa7_y0 ^ u_rca8_fa7_u_rca8_fa6_y4; + u_rca8_fa7_y3 = u_rca8_fa7_y0 & u_rca8_fa7_u_rca8_fa6_y4; + u_rca8_fa7_y4 = u_rca8_fa7_y1 | u_rca8_fa7_y3; + + out |= (u_rca8_ha_y0 & 0x01) << 0; + out |= (u_rca8_fa1_y2 & 0x01) << 1; + out |= (u_rca8_fa2_y2 & 0x01) << 2; + out |= (u_rca8_fa3_y2 & 0x01) << 3; + out |= (u_rca8_fa4_y2 & 0x01) << 4; + out |= (u_rca8_fa5_y2 & 0x01) << 5; + out |= (u_rca8_fa6_y2 & 0x01) << 6; + out |= (u_rca8_fa7_y2 & 0x01) << 7; + out |= (u_rca8_fa7_y4 & 0x01) << 8; + return out; +} + +#include +int main(){ + for (int i = 0; i < 256; i++){ + for (int j = 0; j < 256; j++){ + assert((i + j) == u_rca8(i,j)); + } + } + return 0; +} \ No newline at end of file diff --git a/Tests/Flat_c_circuits/Logic_gates/and_gate.c b/Tests/Flat_c_circuits/Logic_gates/and_gate.c new file mode 100644 index 0000000..7a5d28f --- /dev/null +++ b/Tests/Flat_c_circuits/Logic_gates/and_gate.c @@ -0,0 +1,16 @@ +#include +#include + +uint8_t and_gate(uint8_t a, uint8_t b){ + return ((a >> 0) & 0x01) & ((b >> 0) & 0x01); +} + +#include +int main(){ + for (int i = 0; i < 2; i++){ + for (int j = 0; j < 2; j++){ + assert((i & j) == and_gate(i,j)); + } + } + return 0; +} \ No newline at end of file diff --git a/Tests/Flat_c_circuits/Logic_gates/nand_gate.c b/Tests/Flat_c_circuits/Logic_gates/nand_gate.c new file mode 100644 index 0000000..0df54dc --- /dev/null +++ b/Tests/Flat_c_circuits/Logic_gates/nand_gate.c @@ -0,0 +1,16 @@ +#include +#include + +uint8_t nand_gate(uint8_t a, uint8_t b){ + return ~(((a >> 0) & 0x01) & ((b >> 0) & 0x01)) & 0x01 << 0; +} + +#include +int main(){ + for (int i = 0; i < 2; i++){ + for (int j = 0; j < 2; j++){ + assert(!(i & j) == nand_gate(i,j)); + } + } + return 0; +} \ No newline at end of file diff --git a/Tests/Flat_c_circuits/Logic_gates/nor_gate.c b/Tests/Flat_c_circuits/Logic_gates/nor_gate.c new file mode 100644 index 0000000..ffd7d57 --- /dev/null +++ b/Tests/Flat_c_circuits/Logic_gates/nor_gate.c @@ -0,0 +1,16 @@ +#include +#include + +uint8_t nor_gate(uint8_t a, uint8_t b){ + return ~(((a >> 0) & 0x01) | ((b >> 0) & 0x01)) & 0x01 << 0; +} + +#include +int main(){ + for (int i = 0; i < 2; i++){ + for (int j = 0; j < 2; j++){ + assert(!(i | j) == nor_gate(i,j)); + } + } + return 0; +} \ No newline at end of file diff --git a/Tests/Flat_c_circuits/Logic_gates/not_gate.c b/Tests/Flat_c_circuits/Logic_gates/not_gate.c new file mode 100644 index 0000000..a1fbbd9 --- /dev/null +++ b/Tests/Flat_c_circuits/Logic_gates/not_gate.c @@ -0,0 +1,14 @@ +#include +#include + +uint8_t not_gate(uint8_t a){ + return ~((a >> 0) & 0x01) & 0x01 << 0; +} + +#include +int main(){ + for (int i = 0; i < 2; i++){ + assert(!(i) == not_gate(i)); + } + return 0; +} \ No newline at end of file diff --git a/Tests/Flat_c_circuits/Logic_gates/or_gate.c b/Tests/Flat_c_circuits/Logic_gates/or_gate.c new file mode 100644 index 0000000..4c4e3d0 --- /dev/null +++ b/Tests/Flat_c_circuits/Logic_gates/or_gate.c @@ -0,0 +1,16 @@ +#include +#include + +uint8_t or_gate(uint8_t a, uint8_t b){ + return ((a >> 0) & 0x01) | ((b >> 0) & 0x01); +} + +#include +int main(){ + for (int i = 0; i < 2; i++){ + for (int j = 0; j < 2; j++){ + assert((i | j) == or_gate(i,j)); + } + } + return 0; +} \ No newline at end of file diff --git a/Tests/Flat_c_circuits/Logic_gates/xnor_gate.c b/Tests/Flat_c_circuits/Logic_gates/xnor_gate.c new file mode 100644 index 0000000..5237323 --- /dev/null +++ b/Tests/Flat_c_circuits/Logic_gates/xnor_gate.c @@ -0,0 +1,16 @@ +#include +#include + +uint8_t xnor_gate(uint8_t a, uint8_t b){ + return ~(((a >> 0) & 0x01) ^ ((b >> 0) & 0x01)) & 0x01 << 0; +} + +#include +int main(){ + for (int i = 0; i < 2; i++){ + for (int j = 0; j < 2; j++){ + assert(!(i ^ j) == xnor_gate(i,j)); + } + } + return 0; +} \ No newline at end of file diff --git a/Tests/Flat_c_circuits/Logic_gates/xor_gate.c b/Tests/Flat_c_circuits/Logic_gates/xor_gate.c new file mode 100644 index 0000000..4d22615 --- /dev/null +++ b/Tests/Flat_c_circuits/Logic_gates/xor_gate.c @@ -0,0 +1,16 @@ +#include +#include + +uint8_t xor_gate(uint8_t a, uint8_t b){ + return ((a >> 0) & 0x01) ^ ((b >> 0) & 0x01); +} + +#include +int main(){ + for (int i = 0; i < 2; i++){ + for (int j = 0; j < 2; j++){ + assert((i ^ j) == xor_gate(i,j)); + } + } + return 0; +} \ No newline at end of file diff --git a/Tests/flat_c_tests.sh b/Tests/flat_c_tests.sh new file mode 100644 index 0000000..fc3ec85 --- /dev/null +++ b/Tests/flat_c_tests.sh @@ -0,0 +1,225 @@ +#!/bin/sh +POSIXLY_CORRECT=yes + +# Colors +# set thanks to: https://linux.101hacks.com/ps1-examples/prompt-color-using-tput/ +REDCOLOR="$(tput setaf 1)" +GREENCOLOR="$(tput setaf 2)" +BLUECOLOR="$(tput setaf 4)" +NOCOLOR="$(tput sgr0)" + +# Compiler options +C=g++ +CFLAGS=-std=c++11 -Wextra -pedantic -g +LG_PATH="Flat_c_circuits/Logic_gates/" +ADD_PATH="Flat_c_circuits/Adders/" + +# FLATTENED C CODE CIRCUITS # +# Logic gates +AND_G="./and_gate 2>/dev/null" +NAND_G="./nand_gate 2>/dev/null" +OR_G="./or_gate 2>/dev/null" +NOR_G="./nor_gate 2>/dev/null" +XOR_G="./xor_gate 2>/dev/null" +XNOR_G="./xnor_gate 2>/dev/null" +NOT_G="./not_gate 2>/dev/null" + +# Adders +HA="./ha 2>/dev/null" +FA="./fa 2>/dev/null" + +# Unsigned +U_RCA3="./u_rca3 2>/dev/null" +U_RCA5="./u_rca5 2>/dev/null" +U_RCA8="./u_rca8 2>/dev/null" + +# Signed +S_RCA2="./s_rca2 2>/dev/null" +S_RCA6="./s_rca6 2>/dev/null" +S_RCA8="./s_rca8 2>/dev/null" + +# TESTING # +echo "${BLUECOLOR}TESTING OF FLATTENED CIRCUITS GENERATED USING arithmetic_circuits_generator.py" +echo "––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––" +echo "" +echo "LOGIC GATES TESTS${NOCOLOR}" + + +## LOGIC GATES ## +################# + +# AND +${C} ${CFLAGS} ${LG_PATH}and_gate.c -o and_gate +echo "TEST_1: and_gate.c" +eval "$AND_G" +if [ "$?" -eq 0 ] ; then + echo "${GREENCOLOR}PASSED${NOCOLOR}" +else + echo "${REDCOLOR}FAILED${NOCOLOR}" +fi +rm and_gate + +# NAND +${C} ${CFLAGS} ${LG_PATH}nand_gate.c -o nand_gate +echo "TEST_2: nand_gate.c" +eval "$NAND_G" +if [ "$?" -eq 0 ] ; then + echo "${GREENCOLOR}PASSED${NOCOLOR}" +else + echo "${REDCOLOR}FAILED${NOCOLOR}" +fi +rm nand_gate + +# OR +${C} ${CFLAGS} ${LG_PATH}or_gate.c -o or_gate +echo "TEST_3: or_gate.c" +eval "$OR_G" +if [ "$?" -eq 0 ] ; then + echo "${GREENCOLOR}PASSED${NOCOLOR}" +else + echo "${REDCOLOR}FAILED${NOCOLOR}" +fi +rm or_gate + +# NOR +${C} ${CFLAGS} ${LG_PATH}nor_gate.c -o nor_gate +echo "TEST_4: nor_gate.c" +eval "$NOR_G" +if [ "$?" -eq 0 ] ; then + echo "${GREENCOLOR}PASSED${NOCOLOR}" +else + echo "${REDCOLOR}FAILED${NOCOLOR}" +fi +rm nor_gate + +# XOR +${C} ${CFLAGS} ${LG_PATH}xor_gate.c -o xor_gate +echo "TEST_5: xor_gate.c" +eval "$XOR_G" +if [ "$?" -eq 0 ] ; then + echo "${GREENCOLOR}PASSED${NOCOLOR}" +else + echo "${REDCOLOR}FAILED${NOCOLOR}" +fi +rm xor_gate + +# XNOR +${C} ${CFLAGS} ${LG_PATH}xnor_gate.c -o xnor_gate +echo "TEST_6: xnor_gate.c" +eval "$XNOR_G" +if [ "$?" -eq 0 ] ; then + echo "${GREENCOLOR}PASSED${NOCOLOR}" +else + echo "${REDCOLOR}FAILED${NOCOLOR}" +fi +rm xnor_gate + +# NOT +${C} ${CFLAGS} ${LG_PATH}not_gate.c -o not_gate +echo "TEST_7: not_gate.c" +eval "$NOT_G" +if [ "$?" -eq 0 ] ; then + echo "${GREENCOLOR}PASSED${NOCOLOR}" +else + echo "${REDCOLOR}FAILED${NOCOLOR}" +fi +rm not_gate + +echo "" +echo "${BLUECOLOR}ADDERS TESTS${NOCOLOR}" + + +## ADDERS ## +############ + +# HALF ADDER +${C} ${CFLAGS} ${ADD_PATH}ha.c -o ha +echo "TEST_8: ha.c" +eval "$HA" +if [ "$?" -eq 0 ] ; then + echo "${GREENCOLOR}PASSED${NOCOLOR}" +else + echo "${REDCOLOR}FAILED${NOCOLOR}" +fi +rm ha + +# FULL ADDER +${C} ${CFLAGS} ${ADD_PATH}fa.c -o fa +echo "TEST_9: fa.c" +eval "$FA" +if [ "$?" -eq 0 ] ; then + echo "${GREENCOLOR}PASSED${NOCOLOR}" +else + echo "${REDCOLOR}FAILED${NOCOLOR}" +fi +rm fa + +## UNSIGNED ADDERS ## + +# 3-BIT RIPPLE CARRY ADDER +${C} ${CFLAGS} ${ADD_PATH}u_rca3.c -o u_rca3 +echo "TEST_10: u_rca3.c" +eval "$U_RCA3" +if [ "$?" -eq 0 ] ; then + echo "${GREENCOLOR}PASSED${NOCOLOR}" +else + echo "${REDCOLOR}FAILED${NOCOLOR}" +fi +rm u_rca3 + +# 5-BIT RIPPLE CARRY ADDER +${C} ${CFLAGS} ${ADD_PATH}u_rca5.c -o u_rca5 +echo "TEST_11: u_rca5.c" +eval "$U_RCA5" +if [ "$?" -eq 0 ] ; then + echo "${GREENCOLOR}PASSED${NOCOLOR}" +else + echo "${REDCOLOR}FAILED${NOCOLOR}" +fi +rm u_rca5 + +# 8-BIT RIPPLE CARRY ADDER +${C} ${CFLAGS} ${ADD_PATH}u_rca8.c -o u_rca8 +echo "TEST_12: u_rca8.c" +eval "$U_RCA8" +if [ "$?" -eq 0 ] ; then + echo "${GREENCOLOR}PASSED${NOCOLOR}" +else + echo "${REDCOLOR}FAILED${NOCOLOR}" +fi +rm u_rca8 + +## SIGNED ADDERS ## + +# 2-BIT RIPPLE CARRY ADDER +${C} ${CFLAGS} ${ADD_PATH}s_rca2.c -o s_rca2 +echo "TEST_13: s_rca2.c" +eval "$S_RCA2" +if [ "$?" -eq 0 ] ; then + echo "${GREENCOLOR}PASSED${NOCOLOR}" +else + echo "${REDCOLOR}FAILED${NOCOLOR}" +fi +rm s_rca2 + +# 2-BIT RIPPLE CARRY ADDER +${C} ${CFLAGS} ${ADD_PATH}s_rca6.c -o s_rca6 +echo "TEST_14: s_rca6.c" +eval "$S_RCA6" +if [ "$?" -eq 0 ] ; then + echo "${GREENCOLOR}PASSED${NOCOLOR}" +else + echo "${REDCOLOR}FAILED${NOCOLOR}" +fi +rm s_rca6 + +# 8-BIT RIPPLE CARRY ADDER +${C} ${CFLAGS} ${ADD_PATH}s_rca8.c -o s_rca8 +echo "TEST_15: s_rca8.c" +eval "$S_RCA8" +if [ "$?" -eq 0 ] ; then + echo "${GREENCOLOR}PASSED${NOCOLOR}" +else + echo "${REDCOLOR}FAILED${NOCOLOR}" +fi +rm s_rca8 \ No newline at end of file