#include "defs.h"
#include "gates.h"
#include "decods.h"
#include "muxs.h"
#include "alu32.h"
#include "clock.h"
#include <stdio.h>
#ifdef _ADDER_BIT_
void main() {
FILE *data=fopen("data","w");
FILE *data_sdl=fopen("data.sdl","w");
int iter=0;
WIRE a=GND,b=GND,carry_in=GND,sum,carry_out;
ADDER_BIT adder;
fprintf(data,"a b carry_in sum carry_out");
while(iter++ < 200) {
Clock(iter,10,a);
Clock(iter,20,b);
Clock(iter,40,carry_in);
adder.run(a,b,carry_in,sum,carry_out);
fprintf(data_sdl,"%4d%4d%4d%4d%4d\n",
a,b,carry_in,sum,carry_out);
}
}
#endif
#ifdef _ADDER_BIT_CLA_
void main() {
FILE *data=fopen("data","w");
FILE *data_sdl=fopen("data.sdl","w");
int iter=0;
WIRE a=GND,b=GND,carry_in=GND,sum;
ADDER_BIT_CLA adder;
fprintf(data,"a b carry_in sum");
while(iter++ < 200) {
Clock(iter,10,a);
Clock(iter,20,b);
Clock(iter,40,carry_in);
adder.run(a,b,carry_in,sum);
fprintf(data_sdl,"%4d%4d%4d%4d\n",
a,b,carry_in,sum);
}
}
#endif
#ifdef _ALU_BIT_
void main() {
FILE *data=fopen("data","w");
FILE *data_sdl=fopen("data.sdl","w");
int iter=0;
WIRE a=GND,b=GND,b_invert=GND,carry_in=GND,op[2]={GND,GND},
less,res,carry_out;
ALU_BIT alu;
fprintf(data,"less a b carry_in op[0] op[1] b_invert res carry_out");
while(iter++ < 700) {
Clock(iter,5,less);
Clock(iter,10,a);
Clock(iter,20,b);
Clock(iter,40,carry_in);
Clock(iter,80,op[0]);
Clock(iter,160,op[1]);
Clock(iter,320,b_invert);
alu.run(a,b,b_invert,carry_in,op,less,res,carry_out);
fprintf(data_sdl,"%4d%4d%4d%4d%4d%4d%4d%4d%4d\n",
less,a,b,carry_in,op[0],op[1],b_invert,res,carry_out);
}
}
#endif
#ifdef _ALU_BIT_CLA_
void main() {
FILE *data=fopen("data","w");
FILE *data_sdl=fopen("data.sdl","w");
int iter=0;
WIRE a=GND,b=GND,b_invert=GND,carry_in=GND,op[2]={GND,GND},
less,res;
ALU_BIT_CLA alu;
fprintf(data,"less a b carry_in op[0] op[1] b_invert res");
while(iter++ < 700) {
Clock(iter,5,less);
Clock(iter,10,a);
Clock(iter,20,b);
Clock(iter,40,carry_in);
Clock(iter,80,op[0]);
Clock(iter,160,op[1]);
Clock(iter,320,b_invert);
alu.run(a,b,b_invert,carry_in,op,less,res);
fprintf(data_sdl,"%4d%4d%4d%4d%4d%4d%4d%4d\n",
less,a,b,carry_in,op[0],op[1],b_invert,res);
}
}
#endif
#ifdef _ALU_MSBIT_
void main() {
FILE *data=fopen("data","w");
FILE *data_sdl=fopen("data.sdl","w");
int iter=0;
WIRE a,b,b_invert,carry_in,op[2],less,res,carry_out,set,overflow;
ALU_MSBIT alu;
fprintf(data,"less a b carry_in op[0] op[1] b_invert res carry_out set overflow");
while(iter++ < 700) {
Clock(iter,5,less);
Clock(iter,10,a);
Clock(iter,20,b);
Clock(iter,40,carry_in);
Clock(iter,80,op[0]);
Clock(iter,160,op[1]);
Clock(iter,320,b_invert);
alu.run(a,b,b_invert,carry_in,op,less,res,carry_out,set,overflow);
fprintf(data_sdl,"%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d\n",
less,a,b,carry_in,op[0],op[1],b_invert,res,carry_out,set,overflow);
}
}
#endif
#ifdef _ALU_32BIT_RC_
#include "random.h"
#define ITERS 50
int Bin2Dec(WIRE z[32]) {
int i;
int value = 0;
for(i=0;i<32;i++) {
int bit;
if(z[i]) bit = 1; else bit = 0;
value += bit*(1<<i);
}
return value;
}
void main() {
int i,j,k;
WIRE a[32],b[32], // Bus de datos
bnegate,op[2], // Operación aritmética
res[32], // Resultado
overflow, // Overflow en la operación
carry_out, // Acarreo aritmético
zero; // El resultado fue cero
ALU_32BIT_RC alu;
printf("Simulación de una ALU de 32 bits (Ripple-Carry).\n\n");
printf("Se probarán cada una de las operaciones aritméticas útiles.\n");
printf("Se realizarán 10 pruebas para cada operación.\n\n");
/*************** AND *************/
for(k=0;k<10;k++) {
printf("Operación AND: (bnegate=0, op=00).\n");
printf("Contenido del bus a[]:\n");
bnegate = op[1] = op[0] = GND;
for(i=31;i>=0;i--) {
Random(1,1,a[i]);
printf("%4d",a[i]);
}
printf("\n");
printf("Contenido del bus b[]:\n");
for(i=31;i>=0;i--) {
Random(1,1,b[i]);
printf("%4d",b[i]);
}
printf("\n");
printf("Igual a:\n");
for(j=0;j<10;j++) {
alu.run(a,b,bnegate,op,res,overflow,carry_out,zero);
for(i=31;i>=0;i--) {
printf("%4d",res[i]);
}
printf("\n");
}
}
/*********** OR *************/
for(k=0;k<10;k++) {
printf("Operación OR: (bnegate=0, op=01).\n");
printf("Contenido del bus a[]:\n");
bnegate = op[1] = GND; op[0] = VCC;
for(i=31;i>=0;i--) {
Random(1,1,a[i]);
printf("%4d",a[i]);
}
printf("\n");
printf("Contenido del bus b[]:\n");
for(i=31;i>=0;i--) {
Random(1,1,b[i]);
printf("%4d",b[i]);
}
printf("\n");
printf("Igual a:\n");
for(j=0;j<10;j++) {
alu.run(a,b,bnegate,op,res,overflow,carry_out,zero);
for(i=31;i>=0;i--) {
printf("%4d",(int)res[i]);
}
printf("\n");
}
}
/*********** ADD *************/
for(k=0;k<10;k++) {
printf("Operación ADD: (bnegate=0, op=10).\n");
printf("Contenido del bus a[]:\n");
bnegate = op[0] = GND; op[1] = VCC;
for(i=31;i>=0;i--) {
Random(1,1,a[i]);
printf("%4d",a[i]);
}
printf(" = %d\n",Bin2Dec(a));
printf("Contenido del bus b[]:\n");
for(i=31;i>=0;i--) {
Random(1,1,b[i]);
printf("%4d",b[i]);
}
printf(" = %d\n",Bin2Dec(b));
printf("Igual a:\n");
for(j=0;j<ITERS;j++) {
alu.run(a,b,bnegate,op,res,overflow,carry_out,zero);
for(i=31;i>=0;i--) {
printf("%4d",res[i]);
}
printf(" = %d\n",Bin2Dec(res));
}
} /* k */
/*********** SUB *************/
for(k=0;k<10;k++) {
printf("Operación SUB: (bnegate=1, op=10).\n");
printf("Contenido del bus a[]:\n");
bnegate = VCC; op[0] = GND; op[1] = VCC;
for(i=31;i>=0;i--) {
Random(1,1,a[i]);
printf("%4d",a[i]);
}
printf(" = %d\n",Bin2Dec(a));
printf("Contenido del bus b[]:\n");
for(i=31;i>=0;i--) {
Random(1,1,b[i]);
printf("%4d",b[i]);
}
printf(" = %d\n",Bin2Dec(b));
printf("Igual a:\n");
for(j=0;j<ITERS;j++) {
alu.run(a,b,bnegate,op,res,overflow,carry_out,zero);
for(i=31;i>=0;i--) {
printf("%4d",res[i]);
}
printf(" = %d\n",Bin2Dec(res));
}
} /* k */
/*********** SLT *************/
for(k=0;k<10;k++) {
printf("Operación SLT: (bnegate=1, op=11).\n");
printf("Contenido del bus a[]:\n");
bnegate = VCC; op[0] = VCC; op[1] = VCC;
for(i=31;i>=0;i--) {
Random(1,1,a[i]);
printf("%4d",a[i]);
}
printf(" = %d\n",Bin2Dec(a));
printf("Contenido del bus b[]:\n");
for(i=31;i>=0;i--) {
Random(1,1,b[i]);
printf("%4d",b[i]);
}
printf(" = %d\n",Bin2Dec(b));
printf("Igual a:\n");
for(j=0;j<ITERS;j++) {
alu.run(a,b,bnegate,op,res,overflow,carry_out,zero);
for(i=31;i>=0;i--) {
printf("%4d",res[i]);
}
printf(" = %d\n",Bin2Dec(res));
}
} /* k */
}
#endif
#ifdef _ALU_32BIT_CLA_
#include "random.h"
#define ITERS 50
int Bin2Dec(WIRE z[32]) {
int i;
int value = 0;
for(i=0;i<32;i++) {
int bit;
if(z[i]) bit = 1; else bit = 0;
value += bit*(1<<i);
}
return value;
}
void main() {
int i,j,k;
WIRE a[32],b[32], // Bus de datos
bnegate,op[2], // Operación aritmética
res[32], // Resultado
overflow, // Overflow en la operación
carry_out, // Acarreo aritmético
zero; // El resultado fue cero
ALU_32BIT_CLA alu;
printf("Simulación de una ALU de 32 bits (Carry-Look Ahead).\n\n");
printf("Se probarán cada una de las operaciones aritméticas útiles.\n");
printf("Se realizarán 10 pruebas para cada operación.\n\n");
/*************** AND *************/
for(k=0;k<10;k++) {
printf("Operación AND: (bnegate=0, op=00).\n");
printf("Contenido del bus a[]:\n");
bnegate = op[1] = op[0] = GND;
for(i=31;i>=0;i--) {
Random(1,1,a[i]);
printf("%4d",a[i]);
}
printf("\n");
printf("Contenido del bus b[]:\n");
for(i=31;i>=0;i--) {
Random(1,1,b[i]);
printf("%4d",b[i]);
}
printf("\n");
printf("Igual a:\n");
for(j=0;j<10;j++) {
alu.run(a,b,bnegate,op,res,overflow,carry_out,zero);
for(i=31;i>=0;i--) {
printf("%4d",res[i]);
}
printf("\n");
}
}
/*********** OR *************/
for(k=0;k<10;k++) {
printf("Operación OR: (bnegate=0, op=01).\n");
printf("Contenido del bus a[]:\n");
bnegate = op[1] = GND; op[0] = VCC;
for(i=31;i>=0;i--) {
Random(1,1,a[i]);
printf("%4d",a[i]);
}
printf("\n");
printf("Contenido del bus b[]:\n");
for(i=31;i>=0;i--) {
Random(1,1,b[i]);
printf("%4d",b[i]);
}
printf("\n");
printf("Igual a:\n");
for(j=0;j<10;j++) {
alu.run(a,b,bnegate,op,res,overflow,carry_out,zero);
for(i=31;i>=0;i--) {
printf("%4d",(int)res[i]);
}
printf("\n");
}
}
/*********** ADD *************/
for(k=0;k<10;k++) {
printf("Operación ADD: (bnegate=0, op=10).\n");
printf("Contenido del bus a[]:\n");
bnegate = op[0] = GND; op[1] = VCC;
for(i=31;i>=0;i--) {
Random(1,1,a[i]);
printf("%4d",a[i]);
}
printf(" = %d\n",Bin2Dec(a));
printf("Contenido del bus b[]:\n");
for(i=31;i>=0;i--) {
Random(1,1,b[i]);
printf("%4d",b[i]);
}
printf(" = %d\n",Bin2Dec(b));
printf("Igual a:\n");
for(j=0;j<ITERS;j++) {
alu.run(a,b,bnegate,op,res,overflow,carry_out,zero);
for(i=31;i>=0;i--) {
printf("%4d",res[i]);
}
printf(" = %d\n",Bin2Dec(res));
}
} /* k */
/*********** SUB *************/
for(k=0;k<10;k++) {
printf("Operación SUB: (bnegate=1, op=10).\n");
printf("Contenido del bus a[]:\n");
bnegate = VCC; op[0] = GND; op[1] = VCC;
for(i=31;i>=0;i--) {
Random(1,1,a[i]);
printf("%4d",a[i]);
}
printf(" = %d\n",Bin2Dec(a));
printf("Contenido del bus b[]:\n");
for(i=31;i>=0;i--) {
Random(1,1,b[i]);
printf("%4d",b[i]);
}
printf(" = %d\n",Bin2Dec(b));
printf("Igual a:\n");
for(j=0;j<ITERS;j++) {
alu.run(a,b,bnegate,op,res,overflow,carry_out,zero);
for(i=31;i>=0;i--) {
printf("%4d",res[i]);
}
printf(" = %d\n",Bin2Dec(res));
}
} /* k */
/*********** SLT *************/
for(k=0;k<10;k++) {
printf("Operación SLT: (bnegate=1, op=11).\n");
printf("Contenido del bus a[]:\n");
bnegate = VCC; op[0] = VCC; op[1] = VCC;
for(i=31;i>=0;i--) {
Random(1,1,a[i]);
printf("%4d",a[i]);
}
printf(" = %d\n",Bin2Dec(a));
printf("Contenido del bus b[]:\n");
for(i=31;i>=0;i--) {
Random(1,1,b[i]);
printf("%4d",b[i]);
}
printf(" = %d\n",Bin2Dec(b));
printf("Igual a:\n");
for(j=0;j<ITERS;j++) {
alu.run(a,b,bnegate,op,res,overflow,carry_out,zero);
for(i=31;i>=0;i--) {
printf("%4d",res[i]);
}
printf(" = %d\n",Bin2Dec(res));
}
} /* k */
}
#endif