📄 gfemultipliertaps.cpp
字号:
// GFEMultiplierTaps.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
int main(int argc, char* argv[])
{
typedef unsigned int UINT;
UINT primepolynom[9]={0,0x3,0x7,0xb,0x13,0x25,0x43,0x89,0x11d};
int m=0;
printf("GF(2^m) 's dimension m is(1~8):");
while (true) {
scanf("%d", &m);
if (m>0 && m<9) break;
else printf("m Must Be An Integer Of Range [1,8]\n");
}
/*
char oprEqual[8], oprMul[8], oprAdd[8];
printf(" * :"); scanf("%s", oprMul);
printf(" + :"); scanf("%s", oprAdd);
printf(" = :"); scanf("%s", oprEqual);
char YesNo; bool WithBracket;
printf("With () [Y/N]?");
while (true) {
scanf("%c", &YesNo);
if (YesNo=='N' || YesNo=='n') {WithBracket=false; break;}
else if (YesNo=='Y' || YesNo=='y') {WithBracket=true; break;}
}
*/
char oprEqual[]="=", oprMul[]="&", oprAdd[]="^";
int LenPerTerm=14+strlen(oprMul)+strlen(oprAdd);
/*
if (WithBracket) LenPerTerm=14+strlen(oprMul)+strlen(oprAdd);
else LenPerTerm=12+strlen(oprMul)+strlen(oprAdd);
*/
char **tapA, **tapB, **tapC, *curterm;
//bool *isZero=(bool*)malloc(sizeof(bool)*m);
tapA=(char**)malloc(sizeof(char*)*m);
tapB=(char**)malloc(sizeof(char*)*m);
tapC=(char**)malloc(sizeof(char*)*m);
curterm=(char*)malloc(sizeof(char)*(LenPerTerm*m+1));
int i, j;
for (i=0; i<m; i++) {
tapA[i]=(char*)malloc(sizeof(char)*5);
tapB[i]=(char*)malloc(sizeof(char)*5);
tapC[i]=(char*)malloc(sizeof(char)*LenPerTerm*m*m);
strcpy(tapA[i],"A[0]"); tapA[i][2]=('0'+i);
strcpy(tapB[i],"B[0]"); tapB[i][2]=('0'+i);
//isZero[i]=true;
tapC[i][0]=0;
}
UINT mask=1;
for (i=0; i<2*m-1; i++) {
curterm[0]=0;
for (j=0; j<m; j++) {
//a[i-j]*b[j]
if (i-j>=0 && i-j<m) {
strcat(curterm, oprAdd);
strcat(curterm, " ");
strcat(curterm, "(");
strcat(curterm, tapA[i-j]);
strcat(curterm, " ");
strcat(curterm, oprMul);
strcat(curterm, " ");
strcat(curterm, tapB[j]);
strcat(curterm, ")");
strcat(curterm, " ");
}
}
for (j=0; j<m; j++) {
if (((mask>>j) & 0x01)!=0) {
if (tapC[j][0]==0) {
strcat(tapC[j], &curterm[strlen(oprAdd)]);
}
else {
strcat(tapC[j], curterm);
}
}
}
mask=(mask<<1);
if ((mask>>m)!=0) mask=mask^primepolynom[m];
}
char fname[]="GF8Mul.v";
fname[2]='0'+m;
FILE *fp=fopen(fname,"w");
fname[6]=0;
fprintf(fp, "module %s(A, B, C);\n", fname);
fprintf(fp, "input [%d : 0] A;\n", m-1);
fprintf(fp, "input [%d : 0] B;\n", m-1);
fprintf(fp, "output [%d : 0] C;\n", m-1);
for (i=0; i<m; i++) {
fprintf(fp, "assign C[%d]%s%s;\n", i, oprEqual, tapC[i]);
printf("C(%d)%s%s;\n", i, oprEqual, tapC[i]);
}
fprintf(fp, "endmodule\n");
fclose(fp);
/*
{
int i,j, k=a.D, r=b.D;
Polynomial<C> *p=new Polynomial<C>(k+r, a);
//C* SR=(C*)malloc(sizeof(C)*r);
C* SR=new C[r];
for (i=0; i<r; i++) SR[i]=0;//注意对于类型C,可能需要适当地重载赋值号(=0)
for (i=0; i<k+r+1; i++) {
(*p)[i]=0;
for (j=r; j>0; j--) (*p)[i]+=b[j]*SR[j-1];
for (j=r-1; j>0; j--) SR[j]=SR[j-1];
if (i<k+1) {
SR[0]=a[i];
(*p)[i]+=b[0]*a[i];
} else if (i==k+1) SR[0]=0;
}
free(SR);
return *p;
}
*/
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -