Hirdetés

Keresés

Aktív témák

  • t3rm1nat0r

    csendes tag

    válasz t3rm1nat0r #48 üzenetére

    De ha már belekezdtem, akkor legyen itt a teljes szorzo.

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>


    int pipeline[128][32];
    int parameter[256][2][8],szam[256][2];
    int adder_tablazat[4*4*2][4];



    int main()
    {
    int c,i,j,k,l,mask;


    for(c=0;c<2;c++)//carry
    for(i=0;i<4;i++)
    for(j=0;j<4;j++)
    {
    int osszeg=i+j+c;
    int addr=c*16+i*4+j;
    mask=1;

    for(k=0;k<3;k++) {adder_tablazat[addr][k]=((osszeg & mask)>>k);mask<<=1;}
    }

    for(c=0;c<2;c++)//carry
    for(i=0;i<4;i++)
    for(j=0;j<4;j++)
    {
    int osszeg=i+j+c;
    mask=1;

    printf("%d + %d + %d =%d ",i,j,c,osszeg);
    for(k=0;k<3;k++) printf("%d",adder_tablazat[c*16+i*4+j][2-k]);
    printf("\n");
    }



    for(j=128;j<256;j++)//eleje ures
    {
    szam[j][0]=rand()%256;//veletlen ertekeket szoroz ossze
    szam[j][1]=rand()%256;

    mask=1;
    for(k=0;k<8;k++) {parameter[j][0][k]=(szam[j][0] & mask)>>k;mask<<=1;}
    mask=1;
    for(k=0;k<8;k++) {parameter[j][1][k]=(szam[j][1] & mask)>>k;mask<<=1;}
    }




    int pl=8*8+1;
    int plp=128;//elso elem

    for(l=0;l<pl*2;l++)//ciklus
    {
    //if(l==pl-1)//csak a vegen irja ki
    {
    // for(j=0;j<pl;j++)
    j=pl;
    {
    mask=0x8000;
    int bits=0;
    for(k=0;k<16;k++)
    {
    int bit=pipeline[j][15-k];
    printf("%d",bit);
    if(bit) bits|=mask;
    mask>>=1;
    }
    printf("= %d ",bits);
    printf(" cr= %d ",pipeline[j][20]);

    int p=(plp-j);
    printf("%d * %d = %d ",szam[p][0],szam[p][1],szam[p][0]*szam[p][1]);
    }
    printf("\n");
    }


    mask=1;
    for(k=0;k<32;k++) pipeline[0][k]=0;//mindig nullaval kezd
    int plp2=plp-pl;
    plp++;

    for(j=pl;j>=0;j--)//csovezetek
    {
    int j2=j&7;//8 16-bites adder
    int bit_offset=j>>3;

    int p=plp2;
    plp2++;//a kovetkezo fokozatban regebbi van,j visszafele megy


    for(k=0;k<16;k+=2)
    {
    if((k>>1) == j2 )
    {
    int bita0=pipeline[j][k];
    int bita1=pipeline[j][k+1];
    int bitb0=0;
    int bitb1=0;
    int carry=pipeline[j][20];
    if(j2==0) carry=0;//adder start


    int d=k-bit_offset;
    if(d>=0 && d<8) bitb0=parameter[p][1][d];
    d++;
    if(d>=0 && d<8) bitb1=parameter[p][1][d];

    if(parameter[p][0][bit_offset]==0) //0-val szoroz
    {
    bitb0=0;
    bitb1=0;
    }


    int addra=(bita1<<1)+bita0;
    int addrb=(bitb1<<1)+bitb0;
    addra=(carry<<4) + (addra<<2) + addrb;


    pipeline[j+1][k ]=adder_tablazat[addra][0];
    pipeline[j+1][k+1]=adder_tablazat[addra][1];
    pipeline[j+1][20 ]=adder_tablazat[addra][2];//carry
    }
    else
    {
    pipeline[j+1][k] =pipeline[j][k];
    pipeline[j+1][k+1]=pipeline[j][k+1];
    }
    }
    }
    }


    return 0;
    }

Aktív témák