/*
* multiplicador.c
* Clase que implementa el multiplicador combinacional por sumas y desplazamientos
*
* Autores: JOSE LUIS BERENGUEL GOMEZ
* JORGE BARBERO PEREZ
*
* Compilación:
* c++ -c multiplicador.c
*
* Ultima modificación: 29-1-02
*/
#include "gates.h"
#include "decods.h"
#include "muxs.h"
#include "alu32.h" // para el sumador completo de 1 bit
#include "celda_base.h"
#include "linea_base.h"
#include "multiplicador.h"
void MULTIPLICADOR_4BITS::run(WIRE mult[4],// entrada de los 4 bits del multiplicando
WIRE Pp[4], // entrada de los 4 productos parciales iniciales. Siempre a cero
WIRE q[4], // entrada de los 4 bits del multiplicador
WIRE cin[4], // entrada de los 4 acarreos de cada linea. Siempre a cero
WIRE Prod[8]){ // salida de los 8 bits del producto
/* COMIENZO DEL METODO */
/* SE INICIALIZAN LAS LINEAS QUE DEBEN SER CERO EN LA ENTRADA */
for(int i=0;i<4;i++)
Pp[i]=cin[i]=0;
/* OPERAMOS CON LAS LINEAS */
/* simulacion linea 0 */
linea[0].run(mult,Pp,q[0],cin[0],cout1,aux_lin1);
Prod[0]=aux_lin1[0];
/* DESPLAZAMOS LOS PRODUCTOS PARCIALES DE LA LINEA AUXILIAR PARA INTRODUCIR LA SALIDA DE ACARREO*/
for(int i=0;i<3;i++)
aux_lin1[i]=aux_lin1[i+1];
aux_lin1[3]=cout1;
/* simulacion linea 1 */
linea[1].run(mult,aux_lin1,q[1],cin[1],cout2,aux_lin2);
Prod[1]=aux_lin2[0];
/* DESPLAZAMOS LOS PRODUCTOS PARCIALES DELA LINEA AUXILIAR PARA INTRODUCIR LA SALIDA DE ACARREO*/
for(int i=0;i<3;i++)
aux_lin2[i]=aux_lin2[i+1];
aux_lin2[3]=cout2;
/* simulación linea 2 */
linea[2].run(mult,aux_lin2,q[2],cin[2],cout3,aux_lin3);
Prod[2]=aux_lin3[0];
/* DESPLAZAMOS LOS PRODUCTOS PARCIALES DELA LINEA AUXILIAR PARA INTRODUCIR LA SALIDA DE ACARREO*/
for(int i=0;i<3;i++)
aux_lin3[i]=aux_lin3[i+1];
aux_lin3[3]=cout3;
/* simulacion linea 3 */
linea[3].run(mult,aux_lin3,q[3],cin[3],cout4,aux_lin4);
Prod[3]=aux_lin4[0];
Prod[4]=aux_lin4[1];
Prod[5]=aux_lin4[2];
Prod[6]=aux_lin4[3];
Prod[7]=cout4;
}
void MULTIPLICADOR_32BITS::run(WIRE mult[32], // entrada de los 32 bits del multiplicando
WIRE Pp[32], // entrada de los 32 productos parciales iniciales. Siempre a cero
WIRE q[32], // entrada de los 32 bits del multiplicador
WIRE cin[32], // entrada de los 32 acarreos de cada linea. Siempre a cero
WIRE Prod[64]){// salida de los 64 bits del producto
/* COMIENZO DEL METODO */
// SE INICIALIZAN LAS LINEAS QUE TIENEN QUE SER CERO EN LA ENTRADA
for(int i=0;i<32;i++)
Pp[i]=cin[i]=0;
// OPERAMOS CON LAS LINEAS
/* simulamos la linea 0 */
linea[0].run(mult,Pp,q[0],cin[0],cout[0],auxlin[0]);
Prod[0]=auxlin[0][0]; // la salida del bit cero del primer producto parcial es Prod[0]
/* desplazamos los productos parciales para introducir la salida de acarreo */
for(int i=0;i<31;i++)
auxlin[0][i]=auxlin[0][i+1];
auxlin[0][31]=cout[0];
/* simulamos el resto de las lineas excepto la ultima */
for(int i=1;i<31;i++){
linea[i].run(mult,auxlin[i-1],q[i],cin[i],cout[i],auxlin[i]);
Prod[i]=auxlin[i][0];
/* desplazamos los productos parciales para introducir la salida de acarreo */
for(int j=0;j<31;j++)
auxlin[i][j]=auxlin[i][j+1];
auxlin[i][31]=cout[i];
}
/* simulamos la ultima linea */
linea[31].run(mult,auxlin[30],q[31],cin[31],cout[31],auxlin[31]);
/* asignamos el resto de bits del producto */
for(int i=0;i<32;i++)
Prod[31+i]=auxlin[31][i];
Prod[63]=cout[31];
}