⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gfemultipliertaps.cpp

📁 用于生成GF(2^m)有限域中乘法器的Verilog HDL源文件的C程序
💻 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 + -