Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- # 4/20/2011
- # Logic Gate Driver
- # Malcolm Crum
- # Tests each logic gate
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include "gates.h"
- #include "registers.h"
- int main(void) {
- printf("---\n");
- printf("Gates, Mux, Register, Adder Driver\n");
- printf("---\n");
- if (testGates() == 1)
- printf("Gates checked out OK.\n");
- else
- printf("Gates failed!\n");
- if (testMuxes() == 1)
- printf("Muxes checked out OK.\n");
- else
- printf("Muxes failed!\n");
- if (testRegisters() == 1)
- printf("Registers checked out OK.\n");
- else
- printf("Registers failed!\n");
- if (testAdders() == 1)
- printf("Adders checked out OK.\n");
- else
- printf("Adders failed!\n");
- }
- int testGates() {
- int success = 1;
- char A[32] = "10101010101010101010101010101010";
- char B[32] = "11001100110011001100110011001100";
- char C[32] = "00000000000000000000000000000000";
- char D[32] = "10101010101010101010101010101010";
- char E[32] = "11001100110011001100110011001100";
- char F[32] = "00000000000000000000000000000000";
- C[0] = NOT1_1(A[0]);
- C[1] = NOT1_1(A[1]);
- C[2] = NOT1_1(A[2]);
- C[3] = NOT1_1(A[3]);
- C[4] = NOT1_1(A[4]);
- C[5] = NOT1_1(A[5]);
- C[6] = NOT1_1(A[6]);
- C[7] = NOT1_1(A[7]);
- C[8] = NOT1_1(A[8]);
- C[9] = NOT1_1(A[9]);
- C[10] = NOT1_1(A[10]);
- C[11] = NOT1_1(A[11]);
- C[12] = NOT1_1(A[12]);
- C[13] = NOT1_1(A[13]);
- C[14] = NOT1_1(A[14]);
- C[15] = NOT1_1(A[15]);
- C[16] = NOT1_1(A[16]);
- C[17] = NOT1_1(A[17]);
- C[18] = NOT1_1(A[18]);
- C[19] = NOT1_1(A[19]);
- C[20] = NOT1_1(A[20]);
- C[21] = NOT1_1(A[21]);
- C[22] = NOT1_1(A[22]);
- C[23] = NOT1_1(A[23]);
- C[24] = NOT1_1(A[24]);
- C[25] = NOT1_1(A[25]);
- C[26] = NOT1_1(A[26]);
- C[27] = NOT1_1(A[27]);
- C[28] = NOT1_1(A[28]);
- C[29] = NOT1_1(A[29]);
- C[30] = NOT1_1(A[30]);
- C[31] = NOT1_1(A[31]);
- NOT1_32(F, D);
- /*printf("\nC[0-31] = AND2_1(A[0-31], B[0-31])");
- printf("\nA(%.32s) AND B(%.32s) = C(%.32s)", A, B, C);
- printf("\nAND2_32(F,D,E) This result should match the one above.");
- printf("\nD(%.32s) AND E(%.32s) = F(%.32s) \n", D, E, F);*/
- if (memcmp(C,F,32) != 0) {
- printf("%.32s != %.32s (NOT)\n", C, F);
- success = 0;
- }
- C[0] = AND2_1(A[0], B[0]);
- C[1] = AND2_1(A[1], B[1]);
- C[2] = AND2_1(A[2], B[2]);
- C[3] = AND2_1(A[3], B[3]);
- C[4] = AND2_1(A[4], B[4]);
- C[5] = AND2_1(A[5], B[5]);
- C[6] = AND2_1(A[6], B[6]);
- C[7] = AND2_1(A[7], B[7]);
- C[8] = AND2_1(A[8], B[8]);
- C[9] = AND2_1(A[9], B[9]);
- C[10] = AND2_1(A[10], B[10]);
- C[11] = AND2_1(A[11], B[11]);
- C[12] = AND2_1(A[12], B[12]);
- C[13] = AND2_1(A[13], B[13]);
- C[14] = AND2_1(A[14], B[14]);
- C[15] = AND2_1(A[15], B[15]);
- C[16] = AND2_1(A[16], B[16]);
- C[17] = AND2_1(A[17], B[17]);
- C[18] = AND2_1(A[18], B[18]);
- C[19] = AND2_1(A[19], B[19]);
- C[20] = AND2_1(A[20], B[20]);
- C[21] = AND2_1(A[21], B[21]);
- C[22] = AND2_1(A[22], B[22]);
- C[23] = AND2_1(A[23], B[23]);
- C[24] = AND2_1(A[24], B[24]);
- C[25] = AND2_1(A[25], B[25]);
- C[26] = AND2_1(A[26], B[26]);
- C[27] = AND2_1(A[27], B[27]);
- C[28] = AND2_1(A[28], B[28]);
- C[29] = AND2_1(A[29], B[29]);
- C[30] = AND2_1(A[30], B[30]);
- C[31] = AND2_1(A[31], B[31]);
- AND2_32(F, D, E);
- /*printf("\nC[0-31] = AND2_1(A[0-31], B[0-31])");
- printf("\nA(%.32s) AND B(%.32s) = C(%.32s)", A, B, C);
- printf("\nAND2_32(F,D,E) This result should match the one above.");
- printf("\nD(%.32s) AND E(%.32s) = F(%.32s) \n", D, E, F);*/
- if (memcmp(C,F,32) != 0) {
- printf("%.32s != %.32s (AND)\n", C, F);
- success = 0;
- }
- C[0] = OR2_1(A[0], B[0]);
- C[1] = OR2_1(A[1], B[1]);
- C[2] = OR2_1(A[2], B[2]);
- C[3] = OR2_1(A[3], B[3]);
- C[4] = OR2_1(A[4], B[4]);
- C[5] = OR2_1(A[5], B[5]);
- C[6] = OR2_1(A[6], B[6]);
- C[7] = OR2_1(A[7], B[7]);
- C[8] = OR2_1(A[8], B[8]);
- C[9] = OR2_1(A[9], B[9]);
- C[10] = OR2_1(A[10], B[10]);
- C[11] = OR2_1(A[11], B[11]);
- C[12] = OR2_1(A[12], B[12]);
- C[13] = OR2_1(A[13], B[13]);
- C[14] = OR2_1(A[14], B[14]);
- C[15] = OR2_1(A[15], B[15]);
- C[16] = OR2_1(A[16], B[16]);
- C[17] = OR2_1(A[17], B[17]);
- C[18] = OR2_1(A[18], B[18]);
- C[19] = OR2_1(A[19], B[19]);
- C[20] = OR2_1(A[20], B[20]);
- C[21] = OR2_1(A[21], B[21]);
- C[22] = OR2_1(A[22], B[22]);
- C[23] = OR2_1(A[23], B[23]);
- C[24] = OR2_1(A[24], B[24]);
- C[25] = OR2_1(A[25], B[25]);
- C[26] = OR2_1(A[26], B[26]);
- C[27] = OR2_1(A[27], B[27]);
- C[28] = OR2_1(A[28], B[28]);
- C[29] = OR2_1(A[29], B[29]);
- C[30] = OR2_1(A[30], B[30]);
- C[31] = OR2_1(A[31], B[31]);
- OR2_32(F, D, E);
- /*printf("\nC[0-31] = OR2_1(A[0-31], B[0-31])");
- printf("\nA(%.32s) OR B(%.32s) = C(%.32s)", A, B, C);
- printf("\nOR2_32(F,D,E) This result should match the one above.");
- printf("\nD(%.32s) OR E(%.32s) = F(%.32s) \n", D, E, F);*/
- if (memcmp(C,F,32) != 0) {
- printf("%.32s != %.32s (OR)\n", C, F);
- success = 0;
- }
- C[0] = NAND2_1(A[0], B[0]);
- C[1] = NAND2_1(A[1], B[1]);
- C[2] = NAND2_1(A[2], B[2]);
- C[3] = NAND2_1(A[3], B[3]);
- C[4] = NAND2_1(A[4], B[4]);
- C[5] = NAND2_1(A[5], B[5]);
- C[6] = NAND2_1(A[6], B[6]);
- C[7] = NAND2_1(A[7], B[7]);
- C[8] = NAND2_1(A[8], B[8]);
- C[9] = NAND2_1(A[9], B[9]);
- C[10] = NAND2_1(A[10], B[10]);
- C[11] = NAND2_1(A[11], B[11]);
- C[12] = NAND2_1(A[12], B[12]);
- C[13] = NAND2_1(A[13], B[13]);
- C[14] = NAND2_1(A[14], B[14]);
- C[15] = NAND2_1(A[15], B[15]);
- C[16] = NAND2_1(A[16], B[16]);
- C[17] = NAND2_1(A[17], B[17]);
- C[18] = NAND2_1(A[18], B[18]);
- C[19] = NAND2_1(A[19], B[19]);
- C[20] = NAND2_1(A[20], B[20]);
- C[21] = NAND2_1(A[21], B[21]);
- C[22] = NAND2_1(A[22], B[22]);
- C[23] = NAND2_1(A[23], B[23]);
- C[24] = NAND2_1(A[24], B[24]);
- C[25] = NAND2_1(A[25], B[25]);
- C[26] = NAND2_1(A[26], B[26]);
- C[27] = NAND2_1(A[27], B[27]);
- C[28] = NAND2_1(A[28], B[28]);
- C[29] = NAND2_1(A[29], B[29]);
- C[30] = NAND2_1(A[30], B[30]);
- C[31] = NAND2_1(A[31], B[31]);
- NAND2_32(F, D, E);
- /*printf("\nC[0-31] = NAND2_1(A[0-31], B[0-31])");
- printf("\nA(%.32s) NAND B(%.32s) = C(%.32s)", A, B, C);
- printf("\nNAND2_32(F,D,E) This result should match the one above.");
- printf("\nD(%.32s) NAND E(%.32s) = F(%.32s) \n", D, E, F);*/
- if (memcmp(C,F,32) != 0) {
- printf("%.32s != %.32s (NAND)\n", C, F);
- success = 0;
- }
- C[0] = XNOR2_1(A[0], B[0]);
- C[1] = XNOR2_1(A[1], B[1]);
- C[2] = XNOR2_1(A[2], B[2]);
- C[3] = XNOR2_1(A[3], B[3]);
- C[4] = XNOR2_1(A[4], B[4]);
- C[5] = XNOR2_1(A[5], B[5]);
- C[6] = XNOR2_1(A[6], B[6]);
- C[7] = XNOR2_1(A[7], B[7]);
- C[8] = XNOR2_1(A[8], B[8]);
- C[9] = XNOR2_1(A[9], B[9]);
- C[10] = XNOR2_1(A[10], B[10]);
- C[11] = XNOR2_1(A[11], B[11]);
- C[12] = XNOR2_1(A[12], B[12]);
- C[13] = XNOR2_1(A[13], B[13]);
- C[14] = XNOR2_1(A[14], B[14]);
- C[15] = XNOR2_1(A[15], B[15]);
- C[16] = XNOR2_1(A[16], B[16]);
- C[17] = XNOR2_1(A[17], B[17]);
- C[18] = XNOR2_1(A[18], B[18]);
- C[19] = XNOR2_1(A[19], B[19]);
- C[20] = XNOR2_1(A[20], B[20]);
- C[21] = XNOR2_1(A[21], B[21]);
- C[22] = XNOR2_1(A[22], B[22]);
- C[23] = XNOR2_1(A[23], B[23]);
- C[24] = XNOR2_1(A[24], B[24]);
- C[25] = XNOR2_1(A[25], B[25]);
- C[26] = XNOR2_1(A[26], B[26]);
- C[27] = XNOR2_1(A[27], B[27]);
- C[28] = XNOR2_1(A[28], B[28]);
- C[29] = XNOR2_1(A[29], B[29]);
- C[30] = XNOR2_1(A[30], B[30]);
- C[31] = XNOR2_1(A[31], B[31]);
- XNOR2_32(F, D, E);
- /*printf("\nC[0-31] = XNOR2_1(A[0-31], B[0-31])");
- printf("\nA(%.32s) XNOR B(%.32s) = C(%.32s)", A, B, C);
- printf("\nXNOR2_32(F,D,E) This result should match the one above.");
- printf("\nD(%.32s) XNOR E(%.32s) = F(%.32s) \n", D, E, F);*/
- if (memcmp(C,F,32) != 0) {
- printf("%.32s != %.32s (XNOR)\n", C, F);
- success = 0;
- }
- C[0] = XOR2_1(A[0], B[0]);
- C[1] = XOR2_1(A[1], B[1]);
- C[2] = XOR2_1(A[2], B[2]);
- C[3] = XOR2_1(A[3], B[3]);
- C[4] = XOR2_1(A[4], B[4]);
- C[5] = XOR2_1(A[5], B[5]);
- C[6] = XOR2_1(A[6], B[6]);
- C[7] = XOR2_1(A[7], B[7]);
- C[8] = XOR2_1(A[8], B[8]);
- C[9] = XOR2_1(A[9], B[9]);
- C[10] = XOR2_1(A[10], B[10]);
- C[11] = XOR2_1(A[11], B[11]);
- C[12] = XOR2_1(A[12], B[12]);
- C[13] = XOR2_1(A[13], B[13]);
- C[14] = XOR2_1(A[14], B[14]);
- C[15] = XOR2_1(A[15], B[15]);
- C[16] = XOR2_1(A[16], B[16]);
- C[17] = XOR2_1(A[17], B[17]);
- C[18] = XOR2_1(A[18], B[18]);
- C[19] = XOR2_1(A[19], B[19]);
- C[20] = XOR2_1(A[20], B[20]);
- C[21] = XOR2_1(A[21], B[21]);
- C[22] = XOR2_1(A[22], B[22]);
- C[23] = XOR2_1(A[23], B[23]);
- C[24] = XOR2_1(A[24], B[24]);
- C[25] = XOR2_1(A[25], B[25]);
- C[26] = XOR2_1(A[26], B[26]);
- C[27] = XOR2_1(A[27], B[27]);
- C[28] = XOR2_1(A[28], B[28]);
- C[29] = XOR2_1(A[29], B[29]);
- C[30] = XOR2_1(A[30], B[30]);
- C[31] = XOR2_1(A[31], B[31]);
- XOR2_32(F, D, E);
- /*printf("\nC[0-31] = XOR2_1(A[0-31], B[0-31])");
- printf("\nA(%.32s) XOR B(%.32s) = C(%.32s)", A, B, C);
- printf("\nXOR2_32(F,D,E) This result should match the one above.");
- printf("\nD(%.32s) XOR E(%.32s) = F(%.32s) \n", D, E, F); */
- if (memcmp(C,F,32) != 0) {
- printf("%.32s != %.32s (XOR)\n", C, F);
- success = 0;
- }
- C[0] = NOR2_1(A[0], B[0]);
- C[1] = NOR2_1(A[1], B[1]);
- C[2] = NOR2_1(A[2], B[2]);
- C[3] = NOR2_1(A[3], B[3]);
- C[4] = NOR2_1(A[4], B[4]);
- C[5] = NOR2_1(A[5], B[5]);
- C[6] = NOR2_1(A[6], B[6]);
- C[7] = NOR2_1(A[7], B[7]);
- C[8] = NOR2_1(A[8], B[8]);
- C[9] = NOR2_1(A[9], B[9]);
- C[10] = NOR2_1(A[10], B[10]);
- C[11] = NOR2_1(A[11], B[11]);
- C[12] = NOR2_1(A[12], B[12]);
- C[13] = NOR2_1(A[13], B[13]);
- C[14] = NOR2_1(A[14], B[14]);
- C[15] = NOR2_1(A[15], B[15]);
- C[16] = NOR2_1(A[16], B[16]);
- C[17] = NOR2_1(A[17], B[17]);
- C[18] = NOR2_1(A[18], B[18]);
- C[19] = NOR2_1(A[19], B[19]);
- C[20] = NOR2_1(A[20], B[20]);
- C[21] = NOR2_1(A[21], B[21]);
- C[22] = NOR2_1(A[22], B[22]);
- C[23] = NOR2_1(A[23], B[23]);
- C[24] = NOR2_1(A[24], B[24]);
- C[25] = NOR2_1(A[25], B[25]);
- C[26] = NOR2_1(A[26], B[26]);
- C[27] = NOR2_1(A[27], B[27]);
- C[28] = NOR2_1(A[28], B[28]);
- C[29] = NOR2_1(A[29], B[29]);
- C[30] = NOR2_1(A[30], B[30]);
- C[31] = NOR2_1(A[31], B[31]);
- NOR2_32(F, D, E);
- /*printf("\nC[0-31] = NOR2_1(A[0-31], B[0-31])");
- printf("\nA(%.32s) NOR B(%.32s) = C(%.32s)", A, B, C);
- printf("\nNOR2_32(F,D,E) This result should match the one above.");
- printf("\nD(%.32s) NOR E(%.32s) = F(%.32s) \n", D, E, F);*/
- if (memcmp(C,F,32) != 0) {
- printf("%.32s != %.32s (NOR)\n", C, F);
- success = 0;
- }
- return success;
- }
- int testMuxes() {
- int success = 1;
- int i;
- char A[32] = "10101010101010101010101010101010";
- char B[32] = "11001100110011001100110011001100";
- char C[32] = "11111111111111111111111111111111";
- char D[32] = "10001000100010001000100010001000";
- char E[32] = "10000000100000001000000010000000";
- char F[32] = "10000000000000001000000000000000";
- char G[32] = "11011011011011011011011011011011";
- char H[32] = "10110101101011010110101101011010";
- char Z[32] = "00000000000000000000000000000000"; // output
- char out[32];
- Mux_2_32(out, A, B, '1');
- for (i = 0; i < 32; i++)
- Z[i] = Mux_2_1(A[i], B[i], '1');
- if (memcmp(out, Z, 32) != 0) {
- success = 0;
- printf("%.32s != %.32s\n", out, Z);
- }
- Mux_4_32(out, A, B, C, D, "10");
- for (i = 0; i < 32; i++)
- Z[i] = Mux_4_1(A[i], B[i], C[i], D[i], "10");
- if (memcmp(out, Z, 32) != 0) {
- success = 0;
- printf("%.32s != %.32s\n", out, Z);
- }
- Mux_8_32(out, A, B, C, D, E, F, G, H, "100");
- for (i = 0; i < 32; i++)
- Z[i] = Mux_8_1(A[i], B[i], C[i], D[i], E[i], F[i], G[i], H[i], "100");
- if (memcmp(out, Z, 32) != 0) {
- success = 0;
- printf("%.32s != %.32s\n", out, Z);
- }
- return success;
- }
- int testRegisters() {
- int success = 1;
- char A[32] = "10101010101010101010101010101010";
- char F[32] = "00000000000000000000000000000000";
- char out1[32];
- char out2[32];
- char read1[5];
- char read2[5];
- char write[5];
- // write A to 00010
- // also, read $0
- RegisterFileAccess(&out1[0], &out2[0], "00000", "00000", "00010", A, '1');
- if (memcmp(out1, F, 32) != 0) {
- success = 0;
- printf("%.32s != %.32s\n", out1, F);
- }
- // read from 00010
- RegisterFileAccess(&out1[0], &out2[0], "00000", "00010", "00010", A, '0');
- if (memcmp(out2, A, 32) != 0) {
- success = 0;
- printf("%.32s != %.32s\n", out2, A);
- }
- return success;
- }
- int testAdders() {
- int success = 1;
- int i;
- char cin = '0';
- char A[32] = "00101010101010101010101010101010";
- char B[32] = "01010101010101010101010101010101";
- char Z[32] = "00000000000000000000000000000000";
- char out[32];
- AddRCA_32(out, A, B, '0');
- for (i = 0; i < 32; i++)
- cin = AddRCA_1(&Z[i], A[i], B[i], cin);
- if (memcmp(out, Z, 32) != 0) {
- success = 0;
- printf("%.32s != %.32s\n", out, Z);
- }
- return success;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement