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

📄 list.c

📁 SystemC to Verilog 转换源程序。
💻 C
字号:
/* ----------------------------------------------------------------------------- * *  SystemC to Verilog Translator v0.1 *  Provided by OpenSoc Design *   *  www.opensocdesign.com * * ----------------------------------------------------------------------------- *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU Library General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <stdlib.h>#include <stdio.h>#include "list.h"void InitializeDefinesList(DefinesList *list){	DefineNode *first;	first = (DefineNode *)malloc(sizeof(DefineNode));	list->first = first;	list->last = NULL;}void InsertDefine(DefinesList *list, char *name){	if(list->last == NULL)  //list empty	{		list->first->name = (char *)malloc(256*sizeof(char));		strcpy(list->first->name ,name);		list->first->next = NULL;		list->last = list->first;	}	else	{		DefineNode *nuevo;		nuevo = (DefineNode *)malloc(sizeof(DefineNode));		nuevo->name = (char *)malloc(256*sizeof(char));		strcpy(nuevo->name ,name);		nuevo->next = NULL;		list->last->next = nuevo;		list->last = nuevo;	}}int IsDefine(DefinesList *list, char *name){	DefineNode *auxwrite = list->first;		if(list->last == NULL)	{		return 0;	}	else	{		while(1)		{			if((strcmp(name, auxwrite->name)==0))			{				return 1;			}			else if(auxwrite->next != NULL)			{				auxwrite = auxwrite->next;			}			else			{				break;			}		}	}	return 0;}void ShowDefines(char *filedefines){	int readok;	char *auxchar;	FILE *file;		file = fopen(filedefines,(char *)"r");		while(1)				{				readok = fread((void *)&auxchar, sizeof(char), 1, file);				if(readok)					printf("%c",auxchar);			    	else				   break;		   	}	}void InitializeWritesList(WritesList *list){	WriteNode *first;	first = (WriteNode *)malloc(sizeof(WriteNode));	list->first = first;	list->last = NULL;}void InsertWrite(WritesList *list, char *name){	if(list->last == NULL)  //list empty	{		list->first->name = (char *)malloc(256*sizeof(char));		strcpy(list->first->name ,name);		list->first->next = NULL;		list->last = list->first;	}	else	{		WriteNode *nuevo;		nuevo = (WriteNode *)malloc(sizeof(WriteNode));		nuevo->name = (char *)malloc(256*sizeof(char));		strcpy(nuevo->name ,name);		nuevo->next = NULL;		list->last->next = nuevo;		list->last = nuevo;	}}int IsWrite(WritesList *list, char *name){	WriteNode *auxwrite = list->first;		if(list->last == NULL)	{		return 0;	}	else	{		while(1)		{			if((strcmp(name, auxwrite->name)==0))			{				return 1;			}			else if(auxwrite->next != NULL)			{				auxwrite = auxwrite->next;			}			else			{				break;			}		}	}	return 0;}void ShowWritesList(WritesList *list){	if(list->last != NULL) //list not empty	{		WriteNode *aux = list->first;		while(1)		{			printf("%s\n",aux->name);			if(aux->next==NULL)	 	 	{		 		break;		 	}			aux = aux->next;		}		}}void ReadWritesFile(WritesList *list, char *name){	char *leido;	int ret;	FILE *file_writes;	file_writes = fopen(name, (char *)"r");		leido = (char *)malloc(256*sizeof(char));		while(1)	{		ret = fscanf(file_writes,"%s",leido);		if(ret == EOF)			break;		InsertWrite(list, leido);	}				 }void InitializeRegsList(RegsList *list){	RegNode *first;	first = (RegNode *)malloc(sizeof(RegNode));	list->first = first;	list->last = NULL;}void InsertReg(RegsList *list, char *name, char *name2){	if(list->last == NULL)  	{		list->first->name = (char *)malloc(256*sizeof(char));		list->first->name2 = (char *)malloc(256*sizeof(char));		strcpy(list->first->name ,name);		strcpy(list->first->name2 ,name2);		list->first->next = NULL;		list->last = list->first;	}	else	{		RegNode *nuevo;		nuevo = (RegNode *)malloc(sizeof(RegNode));		nuevo->name = (char *)malloc(256*sizeof(char));		nuevo->name2 = (char *)malloc(256*sizeof(char));		strcpy(nuevo->name ,name);		strcpy(nuevo->name2 ,name2);		nuevo->next = NULL;		list->last->next = nuevo;		list->last = nuevo;	}}/* Looks if a WORD of func.y file is a register of the process*/char  *IsReg(RegsList *list, char *name){	RegNode *auxreg = list->first;		if(list->last == NULL)	{		return NULL;	}	else	{		while(1)		{			if((strcmp(name, auxreg->name)==0))			{				return auxreg->name2;			}			else if(auxreg->next != NULL)			{				auxreg = auxreg->next;			}			else			{				break;			}		}	}	return NULL;}void ShowRegsList(RegsList *list){	if(list->last != NULL) 	{		RegNode *aux = list->first;		while(1)		{			printf("%s\t",aux->name);			printf("%s;\n",aux->name2);			if(aux->next==NULL)	 	 	{		 		break;		 	}			aux = aux->next;		}		}}			void InitializePortList(PortList *list){	PortNode *first;	first = (PortNode *)malloc(sizeof(PortNode));	list->first = first;	list->last = NULL;}void InsertPort(PortList *list, char *name, char *tipo, int size){	if(list->last == NULL)  	{		list->first->name = name;		list->first->tipo = tipo;		list->first->size = size;		list->first->next = NULL;		list->last = list->first;	}	else	{		PortNode *nuevo;		nuevo = (PortNode *)malloc(sizeof(PortNode));		nuevo->name = name;		nuevo->tipo = tipo;		nuevo->size = size;		nuevo->next = NULL;		list->last->next = nuevo;		list->last = nuevo;	}}void ShowPortList(PortList *list){	if(list->last != NULL)	{		PortNode *aux = list->first;		while(1)		{			printf("%s ",aux->tipo);			if(aux->size != 0)			{				printf("[%d:0] ",(-1 + aux->size));			}			printf("%s;\n",aux->name);			if(aux->next==NULL)	 	 	{		 		break;		 	}			aux = aux->next;		}		}}void RegOutputs(PortList *list){	if(list->last != NULL) 	{		PortNode *aux = list->first;		while(1)		{			if(strcmp(aux->tipo, (char *)"output")==0)			{				printf("reg ");				if(aux->size != 0)				{					printf("[%d:0] ",(-1 + aux->size));				}				printf("%s;\n",aux->name);			}			if(aux->next==NULL)	 	 	{		 		break;		 	}			aux = aux->next;		}		}}void EnumeratePorts(PortList *list){	if(list->last != NULL) 	{		PortNode *aux = list->first;		while(1)		{			if(aux->next==NULL)			{				printf("%s",aux->name);				break;			}			else			{				printf("%s,",aux->name);				aux = aux->next;			}		}	}}void InitializeSignalsList(SignalsList *list){	SignalNode *first;	first = (SignalNode *)malloc(sizeof(SignalNode));	list->first = first;	list->last = NULL;}void InsertSignal(SignalsList *list, char *name, int size){	if(list->last == NULL)  	{		list->first->name = name;		list->first->size = size;		list->first->next = NULL;		list->last = list->first;	}	else	{		SignalNode *nuevo;		nuevo = (SignalNode *)malloc(sizeof(SignalNode));		nuevo->name = name;		nuevo->size = size;		nuevo->next = NULL;		list->last->next = nuevo;		list->last = nuevo;	}}void ShowSignalsList(SignalsList *list, WritesList *WritesList){	if(list->last != NULL) 	{		SignalNode *aux = list->first;		while(1)		{			if(IsWrite(WritesList, aux->name))			{				printf("reg ");				if(aux->size != 0)				{					printf("[%d:0] ",(-1 + aux->size));				}			printf("%s;\n",aux->name);			}			else			{				printf("wire ");				if(aux->size != 0)				{					printf("[%d:0] ",(-1 + aux->size));				}			printf("%s;\n",aux->name);			}						if(aux->next==NULL)	 	 	{		 		break;		 	}			aux = aux->next;		}		}}/* Decides if a signal is a wire or a reg*/int IsWire(char *name, InstancesList *list){	InstanceNode *auxinstance = list->first;	BindNode *auxbind;	if(list->last == NULL)	{		return 0;	}    else	{			while(1)		{			auxbind = auxinstance->bindslist->first;			while(1)			{				if((strcmp(name, auxbind->namebind)==0))				{					return 1;				}				else if(auxbind->next != NULL)				{					auxbind = auxbind->next;				}				else				{					break;				}			}			if(auxinstance->next != NULL)			{				auxinstance = auxinstance->next;			}			else			{				break;			}		}	}	return 0;}void InitializeSensibilityList(SensibilityList *list){	SensibilityNode *first;	first = (SensibilityNode *)malloc(sizeof(SensibilityNode));	list->first = first;	list->last = NULL;}void InsertSensibility(SensibilityList *list, char *name, char *tipo){	if(list->last == NULL)  	{		list->first->name = name;		list->first->tipo = tipo;		list->first->next = NULL;		list->last = list->first;	}	else	{		SensibilityNode *nuevo;		nuevo = (SensibilityNode *)malloc(sizeof(SensibilityNode));		nuevo->name = name;		nuevo->tipo = tipo;		nuevo->next = NULL;		list->last->next = nuevo;		list->last = nuevo;	}}void ShowSensibilityList(SensibilityList *list){	if(list->last != NULL) 	{		SensibilityNode *aux = list->first;		while(1)		{			printf("%s ",aux->tipo);			if(aux->next==NULL)	 	 	{	 			printf("%s",aux->name);		 		break;		 	}			else			{				printf("%s or ",aux->name);			}		aux = aux->next;		}	}}void InitializeProcessList(ProcessList *list){	ProcessNode *first;	first = (ProcessNode *)malloc(sizeof(ProcessNode));	list->first = first;	list->last = NULL;}void InsertProcess(ProcessList *list, char *name, SensibilityList *SensibilityList, char *tipo){	if(list->last == NULL)  	{		list->first->name = name;		list->first->tipo = tipo;		list->first->list = SensibilityList;		list->first->next = NULL;		list->last = list->first;	}	else	{		ProcessNode *nuevo;		nuevo = (ProcessNode *)malloc(sizeof(ProcessNode));		nuevo->name = name;		nuevo->tipo = tipo;		nuevo->list = SensibilityList;		nuevo->next = NULL;		list->last->next = nuevo;		list->last = nuevo;	}}void ShowProcessList(ProcessList *list){	if(list->last != NULL) 	{		ProcessNode *aux = list->first;		while(1)		{			printf("%s: always @(", aux->name);			ShowSensibilityList(aux->list);			printf(")\n");			if(aux->next==NULL)			{				break;			}			aux = aux->next;		}	}}void ShowProcessCode(ProcessList *list){	if(list->last != NULL) 	{		ProcessNode *aux = list->first;		FILE *archivo;		int readok;		char *filename;		char auxchar;				while(1)		{			printf("//%s:\n", aux->name);			filename = (char *)malloc(256*sizeof(char));			strcpy(filename,aux->name);			strcat(filename,(char *)"_regs.sc2v");			archivo = fopen(filename,(char *)"r");									while(1)				{				readok = fread((void *)&auxchar, sizeof(char), 1, archivo);				if(readok)					printf("%c",auxchar);			    	else				   break;		   	}		   		   	fclose(archivo);												printf("always @(");			ShowSensibilityList(aux->list);			printf(")\n");			strcpy(filename,aux->name);			strcat(filename,(char *)".sc2v");			archivo = fopen(filename,(char *)"r");									while(1)				{				readok = fread((void *)&auxchar, sizeof(char), 1, archivo);				if(readok)					printf("%c",auxchar);			    	else				   break;		   	}		   		   	fclose(archivo);						if(aux->next==NULL)			{				break;			}			aux = aux->next;		}	}}void InitializeInstancesList(InstancesList *list) {	InstanceNode *first;	first = (InstanceNode *)malloc(sizeof(InstanceNode));	list->first = first;	list->last = NULL;}void InsertInstance(InstancesList *list, char *nameinstance, char *namemodulo){	if(list->last == NULL)  	{		list->first->nameinstance = nameinstance;		list->first->namemodulo = namemodulo;		list->first->next = NULL;		list->last = list->first;		list->last->bindslist = (BindsList *)malloc(sizeof(BindsList));		list->last->bindslist = (BindsList *)malloc(sizeof(BindsList));		InitializeBindsList(list->last->bindslist);	}	else	{		InstanceNode *nuevo;		nuevo = (InstanceNode *)malloc(sizeof(InstanceNode));		nuevo->nameinstance = nameinstance;		nuevo->namemodulo = namemodulo;		nuevo->next = NULL;		list->last->next = nuevo;		list->last = nuevo;		list->last->bindslist = (BindsList *)malloc(sizeof(BindsList));		InitializeBindsList(list->last->bindslist);	}}void InitializeBindsList(BindsList *list){		BindNode *first;	first = (BindNode *)malloc(sizeof(BindNode));	list->first = first;	list->last = NULL;}void InsertBind(BindsList *list, char *nameport, char *namebind){	if(list->last == NULL)  	{		list->first->nameport = nameport;		list->first->namebind = namebind;		list->first->next = NULL;		list->last = list->first;	}	else	{		BindNode *nuevo;		nuevo = (BindNode *)malloc(sizeof(BindNode));		nuevo->nameport = nameport;		nuevo->namebind = namebind;		nuevo->next = NULL;		list->last->next = nuevo;		list->last = nuevo;	}}void ShowInstancedModules(InstancesList *list){	if(list->last != NULL)			{				InstanceNode *auxinstance;				auxinstance = list->first;				BindNode *auxbind;				auxbind = auxinstance->bindslist->first;				while(1)				{					printf("%s %s (",auxinstance->namemodulo, auxinstance->nameinstance);					while(1)					{						printf(".%s(%s)",auxbind->nameport, auxbind->namebind);						if(auxbind->next == NULL)						{							printf(");\n");							break;						}						else						{							printf(", ");							auxbind = auxbind->next;						}					}					if(auxinstance->next == NULL)					{						break;					}					else					{						auxinstance = auxinstance->next;						auxbind = auxinstance->bindslist->first;					}				}			}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -