/* -----------------------------------------------------------------------------
|
/* -----------------------------------------------------------------------------
|
*
|
*
|
* SystemC to Verilog Translator v0.2
|
* SystemC to Verilog Translator v0.2
|
* Provided by OpenSoc Design
|
* Provided by OpenSoc Design
|
*
|
*
|
* www.opensocdesign.com
|
* www.opensocdesign.com
|
*
|
*
|
* -----------------------------------------------------------------------------
|
* -----------------------------------------------------------------------------
|
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
* the Free Software Foundation; either version 2 of the License, or
|
* the Free Software Foundation; either version 2 of the License, or
|
* (at your option) any later version.
|
* (at your option) any later version.
|
*
|
*
|
* This program is distributed in the hope that it will be useful,
|
* This program is distributed in the hope that it will be useful,
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* GNU Library General Public License for more details.
|
* GNU Library General Public License for more details.
|
*
|
*
|
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
*/
|
*/
|
|
|
|
|
%{
|
%{
|
#include
|
#include
|
#include
|
#include
|
|
|
#include "list.h"
|
#include "list.h"
|
|
|
/* Global var to store Regs */
|
/* Global var to store Regs */
|
RegsList *regslist;
|
RegsList *regslist;
|
/* Global var to store Defines */
|
/* Global var to store Defines */
|
DefinesList *defineslist;
|
DefinesList *defineslist;
|
|
|
|
|
int processfound = 0;
|
int processfound = 0;
|
int switchfound = 0;
|
int switchfound = 0;
|
int switchparenthesis = 0;
|
int switchparenthesis = 0;
|
char *processname, *processname2;
|
char *processname, *processname2;
|
char *fileregs;
|
char *fileregs;
|
char *filename ;
|
char *filename ;
|
int openedkeys = 0;
|
int openedkeys = 0;
|
int newline = 0;
|
int newline = 0;
|
int reg_found = 0;
|
int reg_found = 0;
|
int regs_end;
|
int regs_end;
|
int i = 0; //for loops counter
|
int i = 0; //for loops counter
|
FILE *file;
|
FILE *file;
|
FILE *regs_file;
|
FILE *regs_file;
|
char *regname, *regname2;
|
char *regname, *regname2;
|
char *lastword; // Stores last WORD for use it in WRITE
|
char *lastword; // Stores last WORD for use it in WRITE
|
char *file_defines;
|
char *file_defines;
|
FILE *FILE_DEFINES;
|
FILE *FILE_DEFINES;
|
char *file_writes;
|
char *file_writes;
|
FILE *FILE_WRITES; //FILE to store .write to know if it is a wire or reg
|
FILE *FILE_WRITES; //FILE to store .write to know if it is a wire or reg
|
int definefound = 0;
|
int definefound = 0;
|
int defineinvocationfound = 0;
|
int defineinvocationfound = 0;
|
int opencorchfound = 0;
|
int opencorchfound = 0;
|
|
|
int openedcase = 0;
|
int openedcase = 0;
|
|
|
int default_break_found = 0;
|
int default_break_found = 0;
|
int default_found;
|
int default_found;
|
|
|
//Directives variables
|
//Directives variables
|
int translate;
|
int translate;
|
int verilog;
|
int verilog;
|
int writemethod;
|
int writemethod;
|
|
|
void yyerror(const char *str)
|
void yyerror(const char *str)
|
{
|
{
|
fprintf(stderr,"error: %s\n",str);
|
fprintf(stderr,"error: %s\n",str);
|
}
|
}
|
|
|
int yywrap()
|
int yywrap()
|
{
|
{
|
return 1;
|
return 1;
|
}
|
}
|
|
|
main()
|
main()
|
{
|
{
|
regslist = (RegsList *)malloc(sizeof(RegsList));
|
regslist = (RegsList *)malloc(sizeof(RegsList));
|
InitializeRegsList(regslist);
|
InitializeRegsList(regslist);
|
defineslist = (DefinesList *)malloc(sizeof(DefinesList));
|
defineslist = (DefinesList *)malloc(sizeof(DefinesList));
|
InitializeDefinesList(defineslist);
|
InitializeDefinesList(defineslist);
|
|
|
processname = (char *)malloc(256*sizeof(int));
|
processname = (char *)malloc(256*sizeof(int));
|
processname2 = (char *)malloc(256*sizeof(int));
|
processname2 = (char *)malloc(256*sizeof(int));
|
fileregs = (char *)malloc(256*sizeof(int));
|
fileregs = (char *)malloc(256*sizeof(int));
|
|
|
file_defines = (char *)malloc(256*sizeof(int));
|
file_defines = (char *)malloc(256*sizeof(int));
|
strcpy(file_defines, (char *)"file_defines.sc2v");
|
strcpy(file_defines, (char *)"file_defines.sc2v");
|
FILE_DEFINES = fopen(file_defines,(char *)"w");
|
FILE_DEFINES = fopen(file_defines,(char *)"w");
|
|
|
file_writes = (char *)malloc(256*sizeof(int));
|
file_writes = (char *)malloc(256*sizeof(int));
|
strcpy(file_writes, (char *)"file_writes.sc2v");
|
strcpy(file_writes, (char *)"file_writes.sc2v");
|
FILE_WRITES = fopen(file_writes,(char *)"w");
|
FILE_WRITES = fopen(file_writes,(char *)"w");
|
if(FILE_WRITES!=NULL)
|
if(FILE_WRITES!=NULL)
|
printf("\nopening file => filename = %s\n",file_writes);
|
printf("\nopening file => filename = %s\n",file_writes);
|
|
|
translate=1;
|
translate=1;
|
verilog=0;
|
verilog=0;
|
writemethod=0;
|
writemethod=0;
|
|
|
yyparse();
|
yyparse();
|
fclose(FILE_WRITES);
|
fclose(FILE_WRITES);
|
fclose(FILE_DEFINES);
|
fclose(FILE_DEFINES);
|
}
|
}
|
|
|
%}
|
%}
|
|
|
%token NUMBER WORD SC_INT SC_UINT BOOL BIGGER LOWER OPENKEY CLOSEKEY WRITE WORD SYMBOL NEWLINE ENUM INCLUDE
|
%token NUMBER WORD SC_INT SC_UINT BOOL BIGGER LOWER OPENKEY CLOSEKEY WRITE WORD SYMBOL NEWLINE ENUM INCLUDE
|
%token COLON SEMICOLON RANGE OPENPAR CLOSEPAR TWODOUBLEPOINTS OPENCORCH CLOSECORCH SWITCH CASE DEFAULT BREAK
|
%token COLON SEMICOLON RANGE OPENPAR CLOSEPAR TWODOUBLEPOINTS OPENCORCH CLOSECORCH SWITCH CASE DEFAULT BREAK
|
%token SC_BIGINT SC_BIGUINT HEXA DEFINE READ TRANSLATEOFF TRANSLATEON VERILOGBEGIN VERILOGEND TAB DOLLAR INTCONV
|
%token SC_BIGINT SC_BIGUINT HEXA DEFINE READ TRANSLATEOFF TRANSLATEON VERILOGBEGIN VERILOGEND TAB DOLLAR INTCONV
|
%token VOID
|
%token VOID TTRUE TFALSE
|
%token PIFDEF PENDDEF PELSE
|
%token PIFDEF PENDDEF PELSE
|
|
|
%%
|
%%
|
|
|
commands: /* empty */
|
commands: /* empty */
|
| commands command
|
| commands command
|
;
|
;
|
|
|
|
|
command:
|
command:
|
voidword
|
voidword
|
|
|
|
|
include
|
include
|
|
|
|
|
dollar
|
dollar
|
|
|
|
|
intconv
|
intconv
|
|
|
|
|
tab
|
tab
|
|
|
|
|
read
|
read
|
|
|
|
|
sc_int
|
sc_int
|
|
|
|
|
sc_uint
|
sc_uint
|
|
|
|
|
sc_bigint
|
sc_bigint
|
|
|
|
|
sc_biguint
|
sc_biguint
|
|
|
|
|
number
|
number
|
|
|
|
|
bool
|
bool
|
|
|
|
|
word
|
word
|
|
|
|
|
symbol
|
symbol
|
|
|
|
|
write
|
write
|
|
|
|
|
newline
|
newline
|
|
|
|
|
openkey
|
openkey
|
|
|
|
|
closekey
|
closekey
|
|
|
|
|
colon
|
colon
|
|
|
|
|
semicolon
|
semicolon
|
|
|
|
|
range
|
range
|
|
|
|
|
openpar
|
openpar
|
|
|
|
|
closepar
|
closepar
|
|
|
|
|
void
|
void
|
|
|
|
|
opencorch
|
opencorch
|
|
|
|
|
closecorch
|
closecorch
|
|
|
|
|
bigger
|
bigger
|
|
|
|
|
lower
|
lower
|
|
|
|
|
switch
|
switch
|
|
|
|
|
case_only
|
case_only
|
|
|
|
|
case_number
|
case_number
|
|
|
|
|
case_word
|
case_word
|
|
|
|
|
case_default
|
case_default
|
|
|
|
|
break
|
break
|
|
|
|
|
hexa
|
hexa
|
|
|
|
|
define
|
define
|
|
|
|
|
translateoff
|
translateoff
|
|
|
|
|
translateon
|
translateon
|
|
|
|
|
verilogbegin
|
verilogbegin
|
|
|
|
|
verilogend
|
verilogend
|
|
|
|
|
ifdef
|
ifdef
|
|
|
|
|
endif
|
endif
|
|
|
|
|
else
|
pelse
|
|
|
|
|
ttrue
|
|
|
|
|
tfalse
|
;
|
;
|
|
|
|
|
|
|
voidword:
|
voidword:
|
VOID
|
VOID
|
{
|
{
|
if(verilog==1)
|
if(verilog==1)
|
fprintf(file," void");
|
fprintf(file," void");
|
};
|
};
|
|
|
|
|
include:
|
include:
|
INCLUDE
|
INCLUDE
|
{
|
{
|
if(verilog==1)
|
if(verilog==1)
|
fprintf(file," #include");
|
fprintf(file," #include");
|
};
|
};
|
|
|
|
|
dollar:
|
dollar:
|
DOLLAR
|
DOLLAR
|
{
|
{
|
if(verilog==1)
|
if(verilog==1)
|
fprintf(file," $");
|
fprintf(file," $");
|
};
|
};
|
|
|
intconv:
|
intconv:
|
INTCONV
|
INTCONV
|
{
|
{
|
if(verilog==1)
|
if(verilog==1)
|
fprintf(file," (int)");
|
fprintf(file," (int)");
|
};
|
};
|
|
|
tab:
|
tab:
|
TAB
|
TAB
|
{
|
{
|
if(verilog==1)
|
if(verilog==1)
|
fprintf(file," \t");
|
fprintf(file," \t");
|
};
|
};
|
|
|
read:
|
read:
|
READ OPENPAR CLOSEPAR
|
READ OPENPAR CLOSEPAR
|
{
|
{
|
if(verilog==1)
|
if(verilog==1)
|
fprintf(file,".read()");
|
fprintf(file,".read()");
|
|
|
}
|
}
|
|
|
define:
|
define:
|
DEFINE WORD OPENPAR CLOSEPAR
|
DEFINE WORD OPENPAR CLOSEPAR
|
{
|
{
|
if(translate==1 && verilog==0){
|
if(translate==1 && verilog==0){
|
InsertDefine(defineslist, (char *)$2);
|
InsertDefine(defineslist, (char *)$2);
|
definefound = 1;
|
definefound = 1;
|
fprintf(FILE_DEFINES,"`define %s ",(char *)$2);
|
fprintf(FILE_DEFINES,"`define %s ",(char *)$2);
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"#define %s ()",(char *)$2);
|
fprintf(file,"#define %s ()",(char *)$2);
|
}
|
}
|
void:
|
void:
|
WORD TWODOUBLEPOINTS WORD OPENPAR CLOSEPAR
|
WORD TWODOUBLEPOINTS WORD OPENPAR CLOSEPAR
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
strcpy(processname ,(char *)$4);
|
strcpy(processname ,(char *)$4);
|
strcpy(processname2 ,(char *)$4);
|
strcpy(processname2 ,(char *)$4);
|
strcat(processname2, (char *)".sc2v");
|
strcat(processname2, (char *)".sc2v");
|
strcpy(fileregs ,(char *)$4);
|
strcpy(fileregs ,(char *)$4);
|
strcat(fileregs, (char *)"_regs.sc2v");
|
strcat(fileregs, (char *)"_regs.sc2v");
|
/*
|
/*
|
strcpy(file_writes, (char *)$4);
|
strcpy(file_writes, (char *)$4);
|
strcat(file_writes, (char *)"_writes.sc2v");
|
strcat(file_writes, (char *)"_writes.sc2v");
|
*/
|
*/
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file," %s::%s()",(char *)$1,(char *)$3);
|
fprintf(file," %s::%s()",(char *)$1,(char *)$3);
|
|
|
}
|
}
|
sc_int:
|
sc_int:
|
SC_INT LOWER NUMBER BIGGER
|
SC_INT LOWER NUMBER BIGGER
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
fprintf(regs_file,"reg[%d:0] ",(-1 + $3));
|
fprintf(regs_file,"reg[%d:0] ",(-1 + $3));
|
reg_found = 1;
|
reg_found = 1;
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"sc_int<%d>",$3);
|
fprintf(file,"sc_int<%d>",$3);
|
|
|
}
|
}
|
;
|
;
|
|
|
sc_uint:
|
sc_uint:
|
SC_UINT LOWER NUMBER BIGGER
|
SC_UINT LOWER NUMBER BIGGER
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
fprintf(regs_file,"reg[%d:0] ",(-1 + $3));
|
fprintf(regs_file,"reg[%d:0] ",(-1 + $3));
|
reg_found = 1;
|
reg_found = 1;
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"sc_uint<%d>",$3);
|
fprintf(file,"sc_uint<%d>",$3);
|
}
|
}
|
;
|
;
|
|
|
sc_bigint:
|
sc_bigint:
|
SC_BIGINT LOWER NUMBER BIGGER
|
SC_BIGINT LOWER NUMBER BIGGER
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
fprintf(regs_file,"reg[%d:0] ",(-1 + $3));
|
fprintf(regs_file,"reg[%d:0] ",(-1 + $3));
|
reg_found = 1;
|
reg_found = 1;
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"sc_bigint<%d> ",$3);
|
fprintf(file,"sc_bigint<%d> ",$3);
|
}
|
}
|
;
|
;
|
|
|
sc_biguint:
|
sc_biguint:
|
SC_BIGUINT LOWER NUMBER BIGGER
|
SC_BIGUINT LOWER NUMBER BIGGER
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
fprintf(regs_file,"reg[%d:0] ",(-1 + $3));
|
fprintf(regs_file,"reg[%d:0] ",(-1 + $3));
|
reg_found = 1;
|
reg_found = 1;
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"sc_biguint<%d> ",$3);
|
fprintf(file,"sc_biguint<%d> ",$3);
|
}
|
}
|
;
|
;
|
|
|
bool:
|
bool:
|
BOOL
|
BOOL
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
fprintf(regs_file,"reg ");
|
fprintf(regs_file,"reg ");
|
reg_found = 1;
|
reg_found = 1;
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"bool");
|
fprintf(file,"bool");
|
}
|
}
|
;
|
;
|
|
|
range:
|
range:
|
RANGE OPENPAR NUMBER COLON NUMBER CLOSEPAR
|
RANGE OPENPAR NUMBER COLON NUMBER CLOSEPAR
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
fprintf(file,"[%d:%d]",$3,$5);
|
fprintf(file,"[%d:%d]",$3,$5);
|
else if(definefound)
|
else if(definefound)
|
fprintf(FILE_DEFINES,"[%d:%d]",$3,$5);
|
fprintf(FILE_DEFINES,"[%d:%d]",$3,$5);
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,".range(%d,%d)",$3,$5);
|
fprintf(file,".range(%d,%d)",$3,$5);
|
}
|
}
|
;
|
;
|
|
|
number:
|
number:
|
NUMBER
|
NUMBER
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
if(reg_found)
|
if(reg_found)
|
{
|
{
|
if(opencorchfound)
|
if(opencorchfound)
|
fprintf(regs_file,"%d:0", -1 + $1);
|
fprintf(regs_file,"%d:0", -1 + $1);
|
else
|
else
|
fprintf(regs_file,"%d",$1);
|
fprintf(regs_file,"%d",$1);
|
}
|
}
|
else
|
else
|
fprintf(file,"%d",$1);
|
fprintf(file,"%d",$1);
|
else if(definefound)
|
else if(definefound)
|
fprintf(FILE_DEFINES,"%d",$1);
|
fprintf(FILE_DEFINES,"%d",$1);
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"%d",$1);
|
fprintf(file,"%d",$1);
|
}
|
}
|
;
|
;
|
word:
|
word:
|
WORD
|
WORD
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
if(openedcase)
|
if(openedcase)
|
{
|
{
|
fprintf(file," :\n");
|
fprintf(file," :\n");
|
|
|
for(i = 0; i < openedkeys; i++)
|
for(i = 0; i < openedkeys; i++)
|
fprintf(file," ");
|
fprintf(file," ");
|
|
|
fprintf(file,"begin\n");
|
fprintf(file,"begin\n");
|
openedcase = 0;
|
openedcase = 0;
|
}
|
}
|
|
|
lastword=malloc(sizeof(char)*strlen((char *)$1));
|
lastword=malloc(sizeof(char)*strlen((char *)$1));
|
strcpy(lastword, (char *)$1);
|
strcpy(lastword, (char *)$1);
|
|
|
if(reg_found)
|
if(reg_found)
|
{
|
{
|
strcpy(regname ,(char *)$1);
|
strcpy(regname ,(char *)$1);
|
strcpy(regname2 ,(char *)$1);
|
strcpy(regname2 ,(char *)$1);
|
strcat(regname2, processname);
|
strcat(regname2, processname);
|
fprintf(regs_file,"%s",regname2);
|
fprintf(regs_file,"%s",regname2);
|
InsertReg(regslist, regname, regname2);
|
InsertReg(regslist, regname, regname2);
|
}
|
}
|
else
|
else
|
{
|
{
|
if(newline)
|
if(newline)
|
{
|
{
|
for(i = 0; i < openedkeys; i++)
|
for(i = 0; i < openedkeys; i++)
|
fprintf(file," ");
|
fprintf(file," ");
|
}
|
}
|
regname2 = IsReg(regslist, (char *)$1);
|
regname2 = IsReg(regslist, (char *)$1);
|
if(regname2 == NULL)
|
if(regname2 == NULL)
|
{
|
{
|
if(IsDefine(defineslist, (char *)$1))
|
if(IsDefine(defineslist, (char *)$1))
|
{
|
{
|
fprintf(file,"`%s", (char *)$1);
|
fprintf(file,"`%s", (char *)$1);
|
defineinvocationfound = 1;
|
defineinvocationfound = 1;
|
}
|
}
|
else
|
else
|
{
|
{
|
fprintf(file,"%s",(char *)$1);
|
fprintf(file,"%s ",(char *)$1);
|
}
|
}
|
}
|
}
|
else
|
else
|
fprintf(file,"%s",regname2);
|
fprintf(file,"%s",regname2);
|
|
|
newline = 0;
|
newline = 0;
|
}
|
}
|
}
|
}
|
else if(definefound)
|
else if(definefound)
|
{
|
{
|
if(IsDefine(defineslist, (char *)$1))
|
if(IsDefine(defineslist, (char *)$1))
|
{
|
{
|
fprintf(FILE_DEFINES,"`%s",(char *)$1);
|
fprintf(FILE_DEFINES,"`%s",(char *)$1);
|
}
|
}
|
else
|
else
|
{
|
{
|
fprintf(FILE_DEFINES,"%s ",(char *)$1);
|
fprintf(FILE_DEFINES,"%s ",(char *)$1);
|
}
|
}
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file," %s",(char *)$1);
|
fprintf(file," %s",(char *)$1);
|
};
|
};
|
|
|
symbol:
|
symbol:
|
SYMBOL
|
SYMBOL
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
if(reg_found)
|
if(reg_found)
|
fprintf(regs_file,"%s",(char *)$1);
|
fprintf(regs_file,"%s",(char *)$1);
|
else
|
else
|
fprintf(file,"%s",(char *)$1);
|
fprintf(file,"%s",(char *)$1);
|
}
|
}
|
else if(definefound)
|
else if(definefound)
|
{
|
{
|
fprintf(FILE_DEFINES,"%s",(char *)$1);
|
fprintf(FILE_DEFINES,"%s",(char *)$1);
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"%s",(char *)$1);
|
fprintf(file,"%s",(char *)$1);
|
};
|
};
|
|
|
|
|
write:
|
write:
|
WRITE
|
WRITE
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
writemethod=1;
|
writemethod=1;
|
if(processfound)
|
if(processfound)
|
{
|
{
|
fprintf(file," = ");
|
fprintf(file," = ");
|
fprintf(FILE_WRITES, "%s\n", lastword);
|
fprintf(FILE_WRITES, "%s\n", lastword);
|
}
|
}
|
else if(definefound)
|
else if(definefound)
|
{
|
{
|
fprintf(FILE_DEFINES," = ");
|
fprintf(FILE_DEFINES," = ");
|
}
|
}
|
free(lastword);
|
free(lastword);
|
|
|
}else if(verilog==1){
|
}else if(verilog==1){
|
fprintf(file,".write");
|
fprintf(file,".write");
|
}
|
}
|
};
|
};
|
|
|
newline:
|
newline:
|
NEWLINE
|
NEWLINE
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound & !reg_found & !openedcase)
|
if(processfound & !reg_found & !openedcase)
|
{
|
{
|
fprintf(file,"\n");
|
fprintf(file,"\n");
|
newline = 1;
|
newline = 1;
|
}
|
}
|
else if(definefound)
|
else if(definefound)
|
{
|
{
|
fprintf(FILE_DEFINES,"\n");
|
fprintf(FILE_DEFINES,"\n");
|
}
|
}
|
|
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"\n");
|
fprintf(file,"\n");
|
};
|
};
|
|
|
colon:
|
colon:
|
COLON
|
COLON
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
if(reg_found)
|
if(reg_found)
|
{
|
{
|
fprintf(regs_file,",");
|
fprintf(regs_file,",");
|
}
|
}
|
else
|
else
|
fprintf(file,",");
|
fprintf(file,",");
|
}
|
}
|
else if(definefound)
|
else if(definefound)
|
{
|
{
|
fprintf(FILE_DEFINES,",");
|
fprintf(FILE_DEFINES,",");
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,",");
|
fprintf(file,",");
|
};
|
};
|
|
|
semicolon:
|
semicolon:
|
SEMICOLON
|
SEMICOLON
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
if(reg_found)
|
if(reg_found)
|
{
|
{
|
fprintf(regs_file,";\n");
|
fprintf(regs_file,";\n");
|
reg_found = 0;
|
reg_found = 0;
|
}
|
}
|
else if(defineinvocationfound)
|
else if(defineinvocationfound)
|
{
|
{
|
defineinvocationfound = 0;
|
defineinvocationfound = 0;
|
}
|
}
|
else
|
else
|
{
|
{
|
fprintf(file,";");
|
fprintf(file,";");
|
}
|
}
|
}
|
}
|
else if(definefound)
|
else if(definefound)
|
{
|
{
|
fprintf(FILE_DEFINES,";");
|
fprintf(FILE_DEFINES,";");
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,";");
|
fprintf(file,";");
|
};
|
};
|
|
|
openpar:
|
openpar:
|
OPENPAR
|
OPENPAR
|
{
|
{
|
if(translate==1 && verilog==0){
|
if(translate==1 && verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
fprintf(file,"(");
|
fprintf(file,"(");
|
}
|
}
|
else if(definefound)
|
else if(definefound)
|
{
|
{
|
fprintf(FILE_DEFINES,"(");
|
fprintf(FILE_DEFINES,"(");
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"(");
|
fprintf(file,"(");
|
};
|
};
|
|
|
closepar:
|
closepar:
|
CLOSEPAR
|
CLOSEPAR
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
fprintf(file,")");
|
fprintf(file,")");
|
}
|
}
|
else if(definefound)
|
else if(definefound)
|
{
|
{
|
fprintf(FILE_DEFINES,")");
|
fprintf(FILE_DEFINES,")");
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,")");
|
fprintf(file,")");
|
};
|
};
|
|
|
opencorch:
|
opencorch:
|
OPENCORCH
|
OPENCORCH
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
if(reg_found)
|
if(reg_found)
|
{
|
{
|
fprintf(regs_file,"[");
|
fprintf(regs_file,"[");
|
opencorchfound = 1;
|
opencorchfound = 1;
|
}
|
}
|
else
|
else
|
fprintf(file,"[");
|
fprintf(file,"[");
|
}
|
}
|
else if(definefound)
|
else if(definefound)
|
{
|
{
|
fprintf(FILE_DEFINES,"[");
|
fprintf(FILE_DEFINES,"[");
|
|
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"[");
|
fprintf(file,"[");
|
};
|
};
|
|
|
closecorch:
|
closecorch:
|
CLOSECORCH
|
CLOSECORCH
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
if(reg_found)
|
if(reg_found)
|
{
|
{
|
fprintf(regs_file,"]");
|
fprintf(regs_file,"]");
|
opencorchfound = 0;
|
opencorchfound = 0;
|
}
|
}
|
else
|
else
|
fprintf(file,"]");
|
fprintf(file,"]");
|
}
|
}
|
else if(definefound)
|
else if(definefound)
|
{
|
{
|
fprintf(FILE_DEFINES,"]");
|
fprintf(FILE_DEFINES,"]");
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"]");
|
fprintf(file,"]");
|
};
|
};
|
|
|
|
|
openkey:
|
openkey:
|
OPENKEY
|
OPENKEY
|
{
|
{
|
if(translate==1 && verilog==0){
|
if(translate==1 && verilog==0){
|
openedkeys++;
|
openedkeys++;
|
if(openedkeys==1 & !definefound)
|
if(openedkeys==1 & !definefound)
|
{
|
{
|
printf("opening file => filename = %s\n",processname2);
|
printf("opening file => filename = %s\n",processname2);
|
file = fopen(processname2,(char *)"w");
|
file = fopen(processname2,(char *)"w");
|
printf("opening file => filename = %s\n",fileregs);
|
printf("opening file => filename = %s\n",fileregs);
|
regs_file = fopen(fileregs,(char *)"w");
|
regs_file = fopen(fileregs,(char *)"w");
|
processfound = 1;
|
processfound = 1;
|
regslist = (RegsList *)malloc(sizeof(RegsList));
|
regslist = (RegsList *)malloc(sizeof(RegsList));
|
InitializeRegsList(regslist);
|
InitializeRegsList(regslist);
|
regname = (char *)malloc(256*sizeof(int));
|
regname = (char *)malloc(256*sizeof(int));
|
regname2 = (char *)malloc(256*sizeof(int));
|
regname2 = (char *)malloc(256*sizeof(int));
|
}
|
}
|
if(processfound)
|
if(processfound)
|
if(openedkeys != switchparenthesis)
|
if(openedkeys != switchparenthesis)
|
{
|
{
|
|
fprintf(file,"\n");
|
for(i = 0; i < openedkeys; i++)
|
for(i = 0; i < openedkeys; i++)
|
fprintf(file," ");
|
fprintf(file," ");
|
fprintf(file,"begin\n");
|
fprintf(file,"begin\n");
|
newline = 1;
|
newline = 1;
|
}
|
}
|
|
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"{");
|
fprintf(file,"{");
|
}
|
}
|
;
|
;
|
|
|
closekey:
|
closekey:
|
CLOSEKEY
|
CLOSEKEY
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
if(openedkeys==switchparenthesis & switchfound == 1)
|
if(openedkeys==switchparenthesis & switchfound == 1)
|
{
|
{
|
fprintf(file,"\n");
|
fprintf(file,"\n");
|
if(default_found & !default_break_found)
|
if(default_found & !default_break_found)
|
{
|
{
|
for(i = 0; i < openedkeys; i++)
|
for(i = 0; i < openedkeys; i++)
|
fprintf(file," ");
|
fprintf(file," ");
|
fprintf(file,"end\n");
|
fprintf(file,"end\n");
|
default_found = 0;
|
default_found = 0;
|
}
|
}
|
for(i = 0; i < openedkeys; i++)
|
for(i = 0; i < openedkeys; i++)
|
fprintf(file," ");
|
fprintf(file," ");
|
fprintf(file,"endcase\n");
|
fprintf(file,"endcase\n");
|
newline = 1;
|
newline = 1;
|
switchfound = 0;
|
switchfound = 0;
|
switchparenthesis = 0;
|
switchparenthesis = 0;
|
}
|
}
|
else
|
else
|
{
|
{
|
fprintf(file,"\n");
|
fprintf(file,"\n");
|
for(i = 0; i < openedkeys; i++)
|
for(i = 0; i < openedkeys; i++)
|
fprintf(file," ");
|
fprintf(file," ");
|
fprintf(file,"end\n");
|
fprintf(file,"end\n");
|
newline = 1;
|
newline = 1;
|
}
|
}
|
}
|
}
|
|
|
openedkeys--;
|
openedkeys--;
|
if(definefound)
|
if(definefound)
|
{
|
{
|
definefound = 0;
|
definefound = 0;
|
fprintf(FILE_DEFINES,"\n//Dummy Comment\n");
|
fprintf(FILE_DEFINES,"\n//Dummy Comment\n");
|
}
|
}
|
else if(openedkeys==0)
|
else if(openedkeys==0)
|
{
|
{
|
fclose(file);
|
fclose(file);
|
fclose(regs_file);
|
fclose(regs_file);
|
free(regslist);
|
free(regslist);
|
free(regname);
|
free(regname);
|
free(regname2);
|
free(regname2);
|
processfound = 0;
|
processfound = 0;
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"}");
|
fprintf(file,"}");
|
};
|
};
|
|
|
|
|
bigger:
|
bigger:
|
BIGGER
|
BIGGER
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
fprintf(file,">");
|
fprintf(file,">");
|
}
|
}
|
else if(definefound)
|
else if(definefound)
|
{
|
{
|
fprintf(FILE_DEFINES,">");
|
fprintf(FILE_DEFINES,">");
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,">");
|
fprintf(file,">");
|
};
|
};
|
|
|
lower:
|
lower:
|
LOWER
|
LOWER
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
fprintf(file,"<");
|
fprintf(file,"<");
|
}
|
}
|
else if(definefound)
|
else if(definefound)
|
{
|
{
|
fprintf(FILE_DEFINES,"<");
|
fprintf(FILE_DEFINES,"<");
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"<");
|
fprintf(file,"<");
|
};
|
};
|
|
|
|
|
switch:
|
switch:
|
SWITCH
|
SWITCH
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
fprintf(file,"\n");
|
fprintf(file,"\n");
|
for(i = 0; i < openedkeys; i++)
|
for(i = 0; i < openedkeys; i++)
|
fprintf(file," ");
|
fprintf(file," ");
|
fprintf(file,"case");
|
fprintf(file,"case");
|
switchfound = 1;
|
switchfound = 1;
|
switchparenthesis = openedkeys + 1;
|
switchparenthesis = openedkeys + 1;
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"switch");
|
fprintf(file,"switch");
|
};
|
};
|
|
|
case_number:
|
case_number:
|
CASE NUMBER SYMBOL
|
CASE NUMBER SYMBOL
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
for(i = 0; i < openedkeys; i++)
|
for(i = 0; i < openedkeys; i++)
|
fprintf(file," ");
|
fprintf(file," ");
|
if(openedcase)
|
if(openedcase)
|
fprintf(file,", %d",$2);
|
fprintf(file,", %d",$2);
|
else
|
else
|
fprintf(file,"%d",$2);
|
fprintf(file,"%d",$2);
|
|
|
newline = 1;
|
newline = 1;
|
openedcase = 1;
|
openedcase = 1;
|
|
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"case %d %s",$2,(char *)$3);
|
fprintf(file,"case %d %s",$2,(char *)$3);
|
};
|
};
|
case_word:
|
case_word:
|
CASE WORD SYMBOL
|
CASE WORD SYMBOL
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
for(i = 0; i < openedkeys; i++)
|
for(i = 0; i < openedkeys; i++)
|
fprintf(file," ");
|
fprintf(file," ");
|
if(openedcase)
|
if(openedcase)
|
fprintf(file,", %s",(char *)$2);
|
fprintf(file,", %s",(char *)$2);
|
else
|
else
|
fprintf(file,"%s",(char *)$2);
|
fprintf(file,"%s",(char *)$2);
|
|
|
newline = 1;
|
newline = 1;
|
openedcase = 1;
|
openedcase = 1;
|
|
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"case %s %s",(char *)$2,(char *)$3);
|
fprintf(file,"case %s %s",(char *)$2,(char *)$3);
|
};
|
};
|
|
|
case_default:
|
case_default:
|
DEFAULT SYMBOL
|
DEFAULT SYMBOL
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
for(i = 0; i < openedkeys; i++)
|
for(i = 0; i < openedkeys; i++)
|
fprintf(file," ");
|
fprintf(file," ");
|
fprintf(file,"default:\n");
|
fprintf(file,"default:\n");
|
for(i = 0; i < openedkeys; i++)
|
for(i = 0; i < openedkeys; i++)
|
fprintf(file," ");
|
fprintf(file," ");
|
fprintf(file,"begin\n");
|
fprintf(file,"begin\n");
|
newline = 1;
|
newline = 1;
|
default_found = 1;
|
default_found = 1;
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"default %s",(char *)$2);
|
fprintf(file,"default %s",(char *)$2);
|
};
|
};
|
|
|
case_only:
|
case_only:
|
CASE OPENPAR
|
CASE OPENPAR
|
{
|
{
|
//This rule occurs when in Verilog mode a case appears
|
//This rule occurs when in Verilog mode a case appears
|
if(verilog==1)
|
if(verilog==1)
|
fprintf(file,"case(");
|
fprintf(file,"case(");
|
};
|
};
|
|
|
break:
|
break:
|
BREAK SEMICOLON
|
BREAK SEMICOLON
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
if(newline == 0)
|
if(newline == 0)
|
fprintf(file,"\n");
|
fprintf(file,"\n");
|
for(i = 0; i < openedkeys; i++)
|
for(i = 0; i < openedkeys; i++)
|
fprintf(file," ");
|
fprintf(file," ");
|
fprintf(file,"end\n");
|
fprintf(file,"end\n");
|
if(default_found)
|
if(default_found)
|
{
|
{
|
default_break_found = 1;
|
default_break_found = 1;
|
}
|
}
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"break;");
|
fprintf(file,"break;");
|
};
|
};
|
|
|
hexa:
|
hexa:
|
HEXA
|
HEXA
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
fprintf(file,"'h");
|
fprintf(file,"'h");
|
}
|
}
|
else if(definefound)
|
else if(definefound)
|
{
|
{
|
fprintf(FILE_DEFINES,"'h");
|
fprintf(FILE_DEFINES,"'h");
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"0x");
|
fprintf(file,"0x");
|
};
|
};
|
|
|
translateoff:
|
translateoff:
|
TRANSLATEOFF
|
TRANSLATEOFF
|
{
|
{
|
translate=0;
|
translate=0;
|
fprintf(stderr,"Found Translate off directive \n");
|
fprintf(stderr,"Found Translate off directive \n");
|
};
|
};
|
|
|
translateon:
|
translateon:
|
TRANSLATEON
|
TRANSLATEON
|
{
|
{
|
translate=1;
|
translate=1;
|
fprintf(stderr,"Found Translate on directive \n");
|
fprintf(stderr,"Found Translate on directive \n");
|
};
|
};
|
|
|
verilogbegin:
|
verilogbegin:
|
VERILOGBEGIN
|
VERILOGBEGIN
|
{
|
{
|
verilog=1;
|
verilog=1;
|
fprintf(stderr,"Found Verilog Begin directive \n");
|
fprintf(stderr,"Found Verilog Begin directive \n");
|
};
|
};
|
|
|
verilogend:
|
verilogend:
|
VERILOGEND
|
VERILOGEND
|
{
|
{
|
verilog=0;
|
verilog=0;
|
fprintf(stderr,"Found Verilog End directive \n");
|
fprintf(stderr,"Found Verilog End directive \n");
|
};
|
};
|
|
|
ifdef:
|
ifdef:
|
PIFDEF
|
PIFDEF
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
fprintf(file,"`ifdef");
|
fprintf(file,"`ifdef");
|
}
|
}
|
else if(definefound)
|
else if(definefound)
|
{
|
{
|
fprintf(FILE_DEFINES,"`ifdef");
|
fprintf(FILE_DEFINES,"`ifdef");
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"#ifdef");
|
fprintf(file,"#ifdef");
|
};
|
};
|
endif:
|
endif:
|
PENDDEF
|
PENDDEF
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
fprintf(file,"`endif");
|
fprintf(file,"`endif");
|
}
|
}
|
else if(definefound)
|
else if(definefound)
|
{
|
{
|
fprintf(FILE_DEFINES,"`endif");
|
fprintf(FILE_DEFINES,"`endif");
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"#endif");
|
fprintf(file,"#endif");
|
};
|
};
|
else:
|
pelse:
|
PELSE
|
PELSE
|
{
|
{
|
if(translate==1&& verilog==0){
|
if(translate==1&& verilog==0){
|
if(processfound)
|
if(processfound)
|
{
|
{
|
fprintf(file,"`else");
|
fprintf(file,"`else");
|
}
|
}
|
else if(definefound)
|
else if(definefound)
|
{
|
{
|
fprintf(FILE_DEFINES,"`else");
|
fprintf(FILE_DEFINES,"`else");
|
}
|
}
|
}else if(verilog==1)
|
}else if(verilog==1)
|
fprintf(file,"#else");
|
fprintf(file,"#else");
|
};
|
};
|
|
ttrue:
|
|
TTRUE
|
|
{
|
|
if(translate==1&& verilog==0){
|
|
if(processfound)
|
|
{
|
|
fprintf(file,"1");
|
|
}
|
|
}else if(verilog==1)
|
|
fprintf(file,"1");
|
|
};
|
|
|
|
|
|
tfalse:
|
|
TFALSE
|
|
{
|
|
if(translate==1&& verilog==0){
|
|
if(processfound)
|
|
{
|
|
fprintf(file,"0");
|
|
}
|
|
}else if(verilog==1)
|
|
fprintf(file,"0");
|
|
};
|
|
|