OpenCores
URL https://opencores.org/ocsvn/sc2v/sc2v/trunk

Subversion Repositories sc2v

[/] [sc2v/] [trunk/] [src/] [sc2v_step2.y] - Diff between revs 4 and 11

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 4 Rev 11
/* -----------------------------------------------------------------------------
/* -----------------------------------------------------------------------------
 *
 *
 *  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 
#include 
#include "list.h"
#include "list.h"
/*Global var to read from file_writes.sc2v*/
/*Global var to read from file_writes.sc2v*/
WritesList *writeslist;
WritesList *writeslist;
/*Global var to store ports*/
/*Global var to store ports*/
PortList *portlist;
PortList *portlist;
/* Global var to store signals*/
/* Global var to store signals*/
SignalsList *signalslist;
SignalsList *signalslist;
/* Global var to store sensitivity list*/
/* Global var to store sensitivity list*/
SensibilityList *sensibilitylist;
SensibilityList *sensibilitylist;
/* Global var to store instantiated modules*/
/* Global var to store instantiated modules*/
InstancesList *instanceslist;
InstancesList *instanceslist;
/* Global var to store process list*/
/* Global var to store process list*/
ProcessList *processlist;
ProcessList *processlist;
/*List of enumerates*/
/*List of enumerates*/
EnumeratesList *enumerateslist;
EnumeratesList *enumerateslist;
EnumListList   *enumlistlist;
EnumListList   *enumlistlist;
char           *enumname;
char           *enumname;
int            reading_enumerates=0;
int            reading_enumerates=0;
/*Multiple Declarations*/
/*Multiple Declarations*/
int            multipledec;
int            multipledec;
char           *storedtype;
char           *storedtype;
/* Global var to store process module name*/
/* Global var to store process module name*/
char *module_name;
char *module_name;
int module_name_found = 0;
int module_name_found = 0;
/* Global var to store last port type*/
/* Global var to store last port type*/
char *lastportkind;
char *lastportkind;
int lastportsize;
int lastportsize;
int activeport = 0;     // 1 -> reading port list
int activeport = 0;     // 1 -> reading port list
/* Global var to store last signal type*/
/* Global var to store last signal type*/
int lastsignalsize;
int lastsignalsize;
int signalactive = 0;
int signalactive = 0;
/* Global var to store last SC_METHOD found*/
/* Global var to store last SC_METHOD found*/
char *active_method;
char *active_method;
char *active_method_type;
char *active_method_type;
int method_found;
int method_found;
/* Global var to store last sensitivity found*/
/* Global var to store last sensitivity found*/
char *last_sensibility;
char *last_sensibility;
int sensibility_active = 0;
int sensibility_active = 0;
int translate;
int translate;
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()
{
{
    /*Initialize lists*/
    /*Initialize lists*/
        writeslist = (WritesList *)malloc(sizeof(WritesList));
        writeslist = (WritesList *)malloc(sizeof(WritesList));
        InitializeWritesList(writeslist);
        InitializeWritesList(writeslist);
        portlist = (PortList *)malloc(sizeof(PortList));
        portlist = (PortList *)malloc(sizeof(PortList));
        InitializePortList(portlist);
        InitializePortList(portlist);
        signalslist = (SignalsList *)malloc(sizeof(SignalsList));
        signalslist = (SignalsList *)malloc(sizeof(SignalsList));
        InitializeSignalsList(signalslist);
        InitializeSignalsList(signalslist);
        sensibilitylist = (SensibilityList *)malloc(sizeof(SensibilityList));
        sensibilitylist = (SensibilityList *)malloc(sizeof(SensibilityList));
        InitializeSensibilityList(sensibilitylist);
        InitializeSensibilityList(sensibilitylist);
        instanceslist = (InstancesList *)malloc(sizeof(InstancesList));
        instanceslist = (InstancesList *)malloc(sizeof(InstancesList));
        InitializeInstancesList(instanceslist);
        InitializeInstancesList(instanceslist);
    processlist = (ProcessList *)malloc(sizeof(ProcessList));
    processlist = (ProcessList *)malloc(sizeof(ProcessList));
        InitializeProcessList(processlist);
        InitializeProcessList(processlist);
        enumlistlist = (EnumListList *)malloc(sizeof(EnumListList));
        enumlistlist = (EnumListList *)malloc(sizeof(EnumListList));
        InitializeEnumListList(enumlistlist);
        InitializeEnumListList(enumlistlist);
        translate=1;
        translate=1;
        yyparse();
        yyparse();
        printf("module %s(",module_name);
        printf("module %s(",module_name);
        EnumeratePorts(portlist);
        EnumeratePorts(portlist);
        printf(");\n");
        printf(");\n");
        ShowPortList(portlist);
        ShowPortList(portlist);
        printf("\n");
        printf("\n");
        RegOutputs(portlist);
        RegOutputs(portlist);
        printf("\n");
        printf("\n");
    ShowEnumListList(enumlistlist);
    ShowEnumListList(enumlistlist);
        ReadWritesFile(writeslist, (char *)"file_writes.sc2v");
        ReadWritesFile(writeslist, (char *)"file_writes.sc2v");
        ShowSignalsList(signalslist, writeslist);
        ShowSignalsList(signalslist, writeslist);
        printf("\n");
        printf("\n");
        ShowInstancedModules(instanceslist);
        ShowInstancedModules(instanceslist);
        printf("\n");
        printf("\n");
        ShowDefines((char *)"file_defines.sc2v");
        ShowDefines((char *)"file_defines.sc2v");
        ShowProcessCode(processlist);
        ShowProcessCode(processlist);
        printf("\n");
        printf("\n");
        printf("endmodule\n");
        printf("endmodule\n");
}
}
%}
%}
%token NUMBER SC_MODULE WORD OPENPAR CLOSEPAR SC_IN SC_OUT SEMICOLON BOOL ENUM
%token NUMBER SC_MODULE WORD OPENPAR CLOSEPAR SC_IN SC_OUT SEMICOLON BOOL ENUM
%token MENOR MAYOR SC_INT SC_UINT SC_METHOD SENSITIVE_POS SENSITIVE_NEG SENSITIVE
%token MENOR MAYOR SC_INT SC_UINT SC_METHOD SENSITIVE_POS SENSITIVE_NEG SENSITIVE
%token SENSIBLE CLOSEKEY OPENKEY SEMICOLON COLON SC_SIGNAL ARROW EQUALS NEW QUOTE
%token SENSIBLE CLOSEKEY OPENKEY SEMICOLON COLON SC_SIGNAL ARROW EQUALS NEW QUOTE
%token SC_CTOR VOID ASTERISCO TRANSLATEON TRANSLATEOFF
%token SC_CTOR VOID ASTERISCO TRANSLATEON TRANSLATEOFF
%%
%%
commands: /* empty */
commands: /* empty */
        | commands command
        | commands command
        ;
        ;
command:
command:
        module
        module
        |
        |
        in_bool
        in_bool
        |
        |
        in_sc_int
        in_sc_int
        |
        |
        in_sc_uint
        in_sc_uint
        |
        |
        out_bool
        out_bool
        |
        |
        out_sc_int
        out_sc_int
        |
        |
        out_sc_uint
        out_sc_uint
        |
        |
        sc_method
        sc_method
        |
        |
        sensitive_pos
        sensitive_pos
        |
        |
        sensitive_neg
        sensitive_neg
        |
        |
        sensitive
        sensitive
        |
        |
        sensible_word_colon
        sensible_word_colon
        |
        |
        sensible_word_semicolon
        sensible_word_semicolon
        |
        |
        sensible_par_colon
        sensible_par_colon
        |
        |
        sensible_par_pos
        sensible_par_pos
        |
        |
        sensible_par_neg
        sensible_par_neg
        |
        |
        closekey
        closekey
        |
        |
        word_semicolon
        word_semicolon
        |
        |
        word_colon
        word_colon
        |
        |
        word_closekey
        word_closekey
        |
        |
        word_closekey_word
        word_closekey_word
        |
        |
        signal_bool
        signal_bool
        |
        |
        signal_uint
        signal_uint
        |
        |
        signal_int
        signal_int
        |
        |
        instantation
        instantation
        |
        |
        port_binding
        port_binding
        |
        |
        sc_ctor
        sc_ctor
        |
        |
        void
        void
        |
        |
        inst_decl
        inst_decl
        |
        |
        closekey_semicolon
        closekey_semicolon
        |
        |
        enumerates
        enumerates
        |
        |
        enumerates_type
        enumerates_type
        |
        |
        declaration
        declaration
        |
        |
        declaration_sc_signal
        declaration_sc_signal
        |
        |
        multiple_declaration
        multiple_declaration
        |
        |
        multiple_sc_signal_declaration
        multiple_sc_signal_declaration
        |
        |
        translateoff
        translateoff
        |
        |
        translateon
        translateon
        ;
        ;
module:
module:
        SC_MODULE OPENPAR WORD CLOSEPAR OPENKEY
        SC_MODULE OPENPAR WORD CLOSEPAR OPENKEY
        {
        {
        if(translate==1){
        if(translate==1){
                if(module_name_found)
                if(module_name_found)
                        {
                        {
                        fprintf(stderr,"error: two or more modules found in the file\n");
                        fprintf(stderr,"error: two or more modules found in the file\n");
                        exit(1);
                        exit(1);
                        }
                        }
                else
                else
                        {
                        {
                        module_name = (char *)malloc(256*sizeof(char));
                        module_name = (char *)malloc(256*sizeof(char));
                        strcpy(module_name, (char *)$3);
                        strcpy(module_name, (char *)$3);
                        module_name_found = 1;
                        module_name_found = 1;
                        }
                        }
        }
        }
        }
        }
        ;
        ;
in_sc_uint:
in_sc_uint:
        SC_IN MENOR SC_UINT MENOR NUMBER MAYOR MAYOR
        SC_IN MENOR SC_UINT MENOR NUMBER MAYOR MAYOR
        {
        {
        if(translate==1){
        if(translate==1){
                activeport = 1;
                activeport = 1;
                lastportsize = $5;
                lastportsize = $5;
                lastportkind = (char *)"input";
                lastportkind = (char *)"input";
        }
        }
        };
        };
in_sc_int:
in_sc_int:
        SC_IN MENOR SC_INT MENOR NUMBER MAYOR MAYOR
        SC_IN MENOR SC_INT MENOR NUMBER MAYOR MAYOR
        {
        {
        if(translate==1){
        if(translate==1){
                activeport = 1;
                activeport = 1;
                lastportsize = $5;
                lastportsize = $5;
                lastportkind = (char *)"input";
                lastportkind = (char *)"input";
        }
        }
        };
        };
in_bool:
in_bool:
        SC_IN MENOR BOOL MAYOR
        SC_IN MENOR BOOL MAYOR
        {
        {
        if(translate==1){
        if(translate==1){
                activeport = 1;
                activeport = 1;
                lastportsize = 0;
                lastportsize = 0;
                lastportkind = (char *)"input";
                lastportkind = (char *)"input";
        }
        }
        };
        };
signal_bool:
signal_bool:
                SC_SIGNAL MENOR BOOL MAYOR
                SC_SIGNAL MENOR BOOL MAYOR
                {
                {
                if(translate==1){
                if(translate==1){
                        signalactive = 1;
                        signalactive = 1;
                        lastsignalsize = 0;
                        lastsignalsize = 0;
                }
                }
                };
                };
signal_uint:
signal_uint:
                SC_SIGNAL MENOR SC_UINT MENOR NUMBER MAYOR MAYOR
                SC_SIGNAL MENOR SC_UINT MENOR NUMBER MAYOR MAYOR
                {
                {
                if(translate==1){
                if(translate==1){
                        signalactive = 1;
                        signalactive = 1;
                        lastsignalsize = $5;
                        lastsignalsize = $5;
                }
                }
                };
                };
signal_int:
signal_int:
                SC_SIGNAL MENOR SC_INT MENOR NUMBER MAYOR MAYOR
                SC_SIGNAL MENOR SC_INT MENOR NUMBER MAYOR MAYOR
                {
                {
                if(translate==1){
                if(translate==1){
                        signalactive = 1;
                        signalactive = 1;
                        lastsignalsize = $5;
                        lastsignalsize = $5;
                }
                }
                };
                };
out_bool:
out_bool:
        SC_OUT MENOR BOOL MAYOR
        SC_OUT MENOR BOOL MAYOR
        {
        {
        if(translate==1){
        if(translate==1){
                activeport = 1;
                activeport = 1;
                lastportsize = 0;
                lastportsize = 0;
                lastportkind = (char *)"output";
                lastportkind = (char *)"output";
        }
        }
        };
        };
out_sc_uint:
out_sc_uint:
        SC_OUT MENOR SC_UINT MENOR NUMBER MAYOR MAYOR
        SC_OUT MENOR SC_UINT MENOR NUMBER MAYOR MAYOR
        {
        {
        if(translate==1){
        if(translate==1){
                activeport = 1;
                activeport = 1;
                lastportsize = $5;
                lastportsize = $5;
                lastportkind = (char *)"output";
                lastportkind = (char *)"output";
        }
        }
        };
        };
out_sc_int:
out_sc_int:
        SC_OUT MENOR SC_INT MENOR NUMBER MAYOR MAYOR
        SC_OUT MENOR SC_INT MENOR NUMBER MAYOR MAYOR
        {
        {
        if(translate==1){
        if(translate==1){
                activeport = 1;
                activeport = 1;
                lastportsize = $5;
                lastportsize = $5;
                lastportkind = (char *)"output";
                lastportkind = (char *)"output";
        }
        }
        };
        };
sc_method:
sc_method:
        SC_METHOD OPENPAR WORD CLOSEPAR SEMICOLON
        SC_METHOD OPENPAR WORD CLOSEPAR SEMICOLON
        {
        {
        if(translate==1){
        if(translate==1){
                if(method_found)
                if(method_found)
                        {
                        {
                        InsertProcess(processlist, active_method, sensibilitylist, active_method_type);
                        InsertProcess(processlist, active_method, sensibilitylist, active_method_type);
                        }
                        }
                active_method = (char *)$3;
                active_method = (char *)$3;
                method_found = 1;
                method_found = 1;
                /* New sensitivity list */
                /* New sensitivity list */
                sensibilitylist = (SensibilityList *)malloc(sizeof(SensibilityList));
                sensibilitylist = (SensibilityList *)malloc(sizeof(SensibilityList));
                InitializeSensibilityList(sensibilitylist);
                InitializeSensibilityList(sensibilitylist);
        }
        }
        };
        };
sensible_par_neg:
sensible_par_neg:
        SENSITIVE_NEG OPENPAR WORD CLOSEPAR SEMICOLON
        SENSITIVE_NEG OPENPAR WORD CLOSEPAR SEMICOLON
        {
        {
        if(translate==1){
        if(translate==1){
            active_method_type = (char *)"seq"; //comb
            active_method_type = (char *)"seq"; //comb
                InsertSensibility(sensibilitylist, (char *)$3, "negedge");
                InsertSensibility(sensibilitylist, (char *)$3, "negedge");
        }
        }
        };
        };
sensible_par_pos:
sensible_par_pos:
        SENSITIVE_POS OPENPAR WORD CLOSEPAR SEMICOLON
        SENSITIVE_POS OPENPAR WORD CLOSEPAR SEMICOLON
        {
        {
        if(translate==1){
        if(translate==1){
            active_method_type = (char *)"seq"; //comb
            active_method_type = (char *)"seq"; //comb
                InsertSensibility(sensibilitylist, (char *)$3, "posedge");
                InsertSensibility(sensibilitylist, (char *)$3, "posedge");
        }
        }
        };
        };
sensitive_pos:
sensitive_pos:
        SENSITIVE_POS
        SENSITIVE_POS
        {
        {
        if(translate==1){
        if(translate==1){
                last_sensibility = (char *)"posedge";
                last_sensibility = (char *)"posedge";
                active_method_type = (char *)"seq"; //seq
                active_method_type = (char *)"seq"; //seq
                sensibility_active = 1;
                sensibility_active = 1;
        }
        }
        };
        };
sensitive_neg:
sensitive_neg:
        SENSITIVE_NEG
        SENSITIVE_NEG
        {
        {
        if(translate==1){
        if(translate==1){
                last_sensibility = (char *)"negedge";
                last_sensibility = (char *)"negedge";
                active_method_type = (char *)"seq"; //seq
                active_method_type = (char *)"seq"; //seq
                sensibility_active = 1;
                sensibility_active = 1;
        }
        }
        };
        };
sensitive:
sensitive:
        SENSITIVE
        SENSITIVE
        {
        {
        if(translate==1){
        if(translate==1){
                last_sensibility = (char *)" ";
                last_sensibility = (char *)" ";
                active_method_type = (char *)"comb"; //comb
                active_method_type = (char *)"comb"; //comb
                sensibility_active = 1;
                sensibility_active = 1;
        }
        }
        };
        };
sensible_par_colon:
sensible_par_colon:
        SENSITIVE OPENPAR WORD CLOSEPAR SEMICOLON
        SENSITIVE OPENPAR WORD CLOSEPAR SEMICOLON
        {
        {
        if(translate==1){
        if(translate==1){
            active_method_type = (char *)"comb"; //comb
            active_method_type = (char *)"comb"; //comb
                InsertSensibility(sensibilitylist, (char *)$3, " ");
                InsertSensibility(sensibilitylist, (char *)$3, " ");
        }
        }
        };
        };
sensible_word_colon:
sensible_word_colon:
        SENSIBLE WORD
        SENSIBLE WORD
        {
        {
        if(translate==1){
        if(translate==1){
                InsertSensibility(sensibilitylist, (char *)$2, (char *)last_sensibility);
                InsertSensibility(sensibilitylist, (char *)$2, (char *)last_sensibility);
        }
        }
        };
        };
sensible_word_semicolon:
sensible_word_semicolon:
        SENSIBLE WORD SEMICOLON
        SENSIBLE WORD SEMICOLON
        {
        {
        if(translate==1){
        if(translate==1){
                InsertSensibility(sensibilitylist, (char *)$2, (char *)last_sensibility);
                InsertSensibility(sensibilitylist, (char *)$2, (char *)last_sensibility);
                if(sensibility_active)
                if(sensibility_active)
                        {
                        {
                        sensibility_active = 0;
                        sensibility_active = 0;
                        }
                        }
        }
        }
        };
        };
closekey:
closekey:
        CLOSEKEY
        CLOSEKEY
        {
        {
        if(translate==1){
        if(translate==1){
                if(method_found)
                if(method_found)
                        {
                        {
                        method_found = 0;
                        method_found = 0;
                        InsertProcess(processlist, active_method, sensibilitylist, active_method_type);
                        InsertProcess(processlist, active_method, sensibilitylist, active_method_type);
                        }
                        }
        }
        }
        };
        };
word_semicolon:
word_semicolon:
        WORD SEMICOLON
        WORD SEMICOLON
        {
        {
        if(translate==1){
        if(translate==1){
                        if(activeport)
                        if(activeport)
                        {
                        {
                                InsertPort(portlist, (char *)$1, lastportkind, lastportsize);
                                InsertPort(portlist, (char *)$1, lastportkind, lastportsize);
                                activeport = 0;
                                activeport = 0;
                        }
                        }
                        else if(signalactive)
                        else if(signalactive)
                        {
                        {
                                InsertSignal(signalslist, (char *)$1, lastsignalsize);
                                InsertSignal(signalslist, (char *)$1, lastsignalsize);
                                signalactive = 0;
                                signalactive = 0;
                        }else if(multipledec){
                        }else if(multipledec){
                          int length,list_pos;
                          int length,list_pos;
                      length=0;
                      length=0;
                      list_pos=0;
                      list_pos=0;
                      //Look in the enumerated list if it was declared e.j state_t state;
                      //Look in the enumerated list if it was declared e.j state_t state;
                      list_pos=findEnumList(enumlistlist, storedtype);
                      list_pos=findEnumList(enumlistlist, storedtype);
                      if(list_pos>-1){
                      if(list_pos>-1){
                        //Calculate the number of bits needed to represent the enumerate
                        //Calculate the number of bits needed to represent the enumerate
                length=findEnumerateLength(enumlistlist,list_pos);
                length=findEnumerateLength(enumlistlist,list_pos);
                        InsertSignal(signalslist, (char *)$1,length);
                        InsertSignal(signalslist, (char *)$1,length);
                            InsertWrite(writeslist,(char *)$1);
                            InsertWrite(writeslist,(char *)$1);
                                free(storedtype);
                                free(storedtype);
                            multipledec=0;
                            multipledec=0;
              }else{
              }else{
                fprintf(stderr,"\nType %s unknow\n",(char *)$1);
                fprintf(stderr,"\nType %s unknow\n",(char *)$1);
                return(1);
                return(1);
              }
              }
                   }
                   }
        }
        }
        };
        };
word_colon:
word_colon:
                WORD COLON
                WORD COLON
                {
                {
                if(translate==1){
                if(translate==1){
                        if(activeport)
                        if(activeport)
                        {
                        {
                                InsertPort(portlist, (char *)$1, lastportkind, lastportsize);
                                InsertPort(portlist, (char *)$1, lastportkind, lastportsize);
                        }
                        }
                        else if(signalactive)
                        else if(signalactive)
                        {
                        {
                                InsertSignal(signalslist, (char *)$1, lastsignalsize);
                                InsertSignal(signalslist, (char *)$1, lastsignalsize);
                        }
                        }
                        else if(reading_enumerates)
                        else if(reading_enumerates)
                        {
                        {
                            InsertEnumerates(enumerateslist, (char *)$1);
                            InsertEnumerates(enumerateslist, (char *)$1);
                        }else if(multipledec){
                        }else if(multipledec){
                          int length,list_pos;
                          int length,list_pos;
                      length=0;
                      length=0;
                      list_pos=0;
                      list_pos=0;
                      //Look in the enumerated list if it was declared e.j state_t state;
                      //Look in the enumerated list if it was declared e.j state_t state;
                      list_pos=findEnumList(enumlistlist, storedtype);
                      list_pos=findEnumList(enumlistlist, storedtype);
                      if(list_pos>-1){
                      if(list_pos>-1){
                        //Calculate the number of bits needed to represent the enumerate
                        //Calculate the number of bits needed to represent the enumerate
                length=findEnumerateLength(enumlistlist,list_pos);
                length=findEnumerateLength(enumlistlist,list_pos);
                        InsertSignal(signalslist, (char *)$1,length);
                        InsertSignal(signalslist, (char *)$1,length);
                            InsertWrite(writeslist,(char *)$1);
                            InsertWrite(writeslist,(char *)$1);
                            multipledec=1;
                            multipledec=1;
              }else{
              }else{
                fprintf(stderr,"\nType %s unknow\n",(char *)$1);
                fprintf(stderr,"\nType %s unknow\n",(char *)$1);
                return(1);
                return(1);
              }
              }
                   }
                   }
                }
                }
                };
                };
word_closekey_word:
word_closekey_word:
        WORD CLOSEKEY WORD SEMICOLON
        WORD CLOSEKEY WORD SEMICOLON
                {
                {
                if(translate==1){
                if(translate==1){
                  //Finish enumerate var declaration
                  //Finish enumerate var declaration
                  if(reading_enumerates)
                  if(reading_enumerates)
                  {
                  {
                    InsertEnumerates(enumerateslist, (char *)$1);
                    InsertEnumerates(enumerateslist, (char *)$1);
                        InsertEnumList(enumlistlist,enumerateslist,(char *)$4,0); //Insert also the variable name
                        InsertEnumList(enumlistlist,enumerateslist,(char *)$4,0); //Insert also the variable name
                    reading_enumerates=0;
                    reading_enumerates=0;
                  }
                  }
                }
                }
                };
                };
word_closekey:
word_closekey:
        WORD CLOSEKEY SEMICOLON
        WORD CLOSEKEY SEMICOLON
                {
                {
                if(translate==1){
                if(translate==1){
                  //Finish enumerate type declaration
                  //Finish enumerate type declaration
                  if(reading_enumerates)
                  if(reading_enumerates)
                  {
                  {
                    InsertEnumerates(enumerateslist, (char *)$1);
                    InsertEnumerates(enumerateslist, (char *)$1);
                        InsertEnumList(enumlistlist,enumerateslist,enumname,1); //Insert also the variable name
                        InsertEnumList(enumlistlist,enumerateslist,enumname,1); //Insert also the variable name
                        free(enumname);
 
                    reading_enumerates=0;
                    reading_enumerates=0;
                  }
                  }
                }
                }
                };
                };
instantation:
instantation:
                WORD EQUALS NEW WORD OPENPAR QUOTE WORD QUOTE CLOSEPAR SEMICOLON
                WORD EQUALS NEW WORD OPENPAR QUOTE WORD QUOTE CLOSEPAR SEMICOLON
                {
                {
                if(translate==1){
                if(translate==1){
                        InsertInstance(instanceslist, (char *)$1, (char *)$4);
                        InsertInstance(instanceslist, (char *)$1, (char *)$4);
                }
                }
                };
                };
port_binding:
port_binding:
                WORD ARROW WORD OPENPAR WORD CLOSEPAR SEMICOLON
                WORD ARROW WORD OPENPAR WORD CLOSEPAR SEMICOLON
                {
                {
        if(translate==1){
        if(translate==1){
                        if(instanceslist->last == NULL)
                        if(instanceslist->last == NULL)
                        {
                        {
                                fprintf(stderr,"error: no instances found\n");
                                fprintf(stderr,"error: no instances found\n");
                        }
                        }
                        else
                        else
                        {
                        {
                                InstanceNode *aux;
                                InstanceNode *aux;
                                aux = instanceslist->first;
                                aux = instanceslist->first;
                                while(1)
                                while(1)
                                {
                                {
                                        if(strcmp(aux->nameinstance, (char *)$1) == 0)
                                        if(strcmp(aux->nameinstance, (char *)$1) == 0)
                                        {
                                        {
                                                break;
                                                break;
                                        }
                                        }
                                        else
                                        else
                                        {
                                        {
                                                if(aux->next == NULL)
                                                if(aux->next == NULL)
                                                {
                                                {
                                                        fprintf(stderr,"error: instance %s not found\n",$1);
                                                        fprintf(stderr,"error: instance %s not found\n",$1);
                                                        exit(1);
                                                        exit(1);
                                                }
                                                }
                                                else
                                                else
                                                {
                                                {
                                                        aux = aux->next;
                                                        aux = aux->next;
                                                }
                                                }
                                        }
                                        }
                                }
                                }
                                InsertBind(aux->bindslist, (char *)$3, (char *)$5);
                                InsertBind(aux->bindslist, (char *)$3, (char *)$5);
                        }
                        }
                }
                }
                };
                };
sc_ctor:
sc_ctor:
                SC_CTOR OPENPAR WORD CLOSEPAR OPENKEY
                SC_CTOR OPENPAR WORD CLOSEPAR OPENKEY
                {
                {
                };
                };
void:
void:
                VOID WORD OPENPAR CLOSEPAR SEMICOLON
                VOID WORD OPENPAR CLOSEPAR SEMICOLON
                {
                {
                };
                };
inst_decl:
inst_decl:
                WORD ASTERISCO WORD SEMICOLON
                WORD ASTERISCO WORD SEMICOLON
                {
                {
                };
                };
closekey_semicolon:     CLOSEKEY SEMICOLON
closekey_semicolon:     CLOSEKEY SEMICOLON
                {
                {
                };
                };
enumerates:
enumerates:
         ENUM OPENKEY
         ENUM OPENKEY
                 {
                 {
                 if(translate==1){
                 if(translate==1){
                   //New enumerate list
                   //New enumerate list
                   enumerateslist = (EnumeratesList *)malloc(sizeof(EnumeratesList));
                   enumerateslist = (EnumeratesList *)malloc(sizeof(EnumeratesList));
                   InitializeEnumeratesList(enumerateslist);
                   InitializeEnumeratesList(enumerateslist);
           reading_enumerates=1;
           reading_enumerates=1;
                 }
                 }
                 };
                 };
enumerates_type:
enumerates_type:
         ENUM WORD OPENKEY
         ENUM WORD OPENKEY
                 {
                 {
                 if(translate==1){
                 if(translate==1){
                   //In this case we define type e.g. enum state_t {S0,S1,S2};
                   //In this case we define type e.g. enum state_t {S0,S1,S2};
                   enumerateslist = (EnumeratesList *)malloc(sizeof(EnumeratesList));
                   enumerateslist = (EnumeratesList *)malloc(sizeof(EnumeratesList));
                   InitializeEnumeratesList(enumerateslist);
                   InitializeEnumeratesList(enumerateslist);
                   enumname=malloc(sizeof(char)*strlen((char *)$2));
                   enumname=malloc(sizeof(char)*strlen((char *)$2));
                   strcpy(enumname,(char *)$2);
                   strcpy(enumname,(char *)$2);
           reading_enumerates=1;
           reading_enumerates=1;
                 }
                 }
                 };
                 };
declaration:
declaration:
         WORD WORD SEMICOLON
         WORD WORD SEMICOLON
                 {
                 {
                 if(translate==1){
                 if(translate==1){
           int length,list_pos;
           int length,list_pos;
                   length=0;
                   length=0;
                   list_pos=0;
                   list_pos=0;
                   //Look in the enumerated list if it was declared e.j state_t state;
                   //Look in the enumerated list if it was declared e.j state_t state;
                   list_pos=findEnumList(enumlistlist, (char *)$1);
                   list_pos=findEnumList(enumlistlist, (char *)$1);
                   if(list_pos>-1){
                   if(list_pos>-1){
                      //Calculate the number of bits needed to represent the enumerate
                      //Calculate the number of bits needed to represent the enumerate
              length=findEnumerateLength(enumlistlist,list_pos);
              length=findEnumerateLength(enumlistlist,list_pos);
                      InsertSignal(signalslist, (char *)$2,length);
                      InsertSignal(signalslist, (char *)$2,length);
                          InsertWrite(writeslist,(char *)$2);
                          InsertWrite(writeslist,(char *)$2);
           }else{
           }else{
              fprintf(stderr,"\nType %s unknow\n",(char *)$1);
              fprintf(stderr,"\nType %s unknow\n",(char *)$1);
              return(1);
              return(1);
           }
           }
                 }
                 }
                 };
                 };
declaration_sc_signal:
declaration_sc_signal:
         SC_SIGNAL MENOR WORD MAYOR WORD SEMICOLON
         SC_SIGNAL MENOR WORD MAYOR WORD SEMICOLON
                 {
                 {
                 if(translate==1){
                 if(translate==1){
           int length,list_pos;
           int length,list_pos;
                   length=0;
                   length=0;
                   list_pos=0;
                   list_pos=0;
                   //Look in the enumerated list if it was declared e.j state_t state;
                   //Look in the enumerated list if it was declared e.j state_t state;
                   list_pos=findEnumList(enumlistlist, (char *)$3);
                   list_pos=findEnumList(enumlistlist, (char *)$3);
                   if(list_pos>-1){
                   if(list_pos>-1){
                      //Calculate the number of bits needed to represent the enumerate
                      //Calculate the number of bits needed to represent the enumerate
              length=findEnumerateLength(enumlistlist,list_pos);
              length=findEnumerateLength(enumlistlist,list_pos);
                      InsertSignal(signalslist, (char *)$5,length);
                      InsertSignal(signalslist, (char *)$5,length);
                          InsertWrite(writeslist,(char *)$5);
                          InsertWrite(writeslist,(char *)$5);
           }else{
           }else{
              fprintf(stderr,"\nType %s unknow\n",(char *)$3);
              fprintf(stderr,"\nType %s unknow\n",(char *)$3);
              return(1);
              return(1);
           }
           }
                 }
                 }
                 };
                 };
multiple_declaration:
multiple_declaration:
         WORD WORD COLON
         WORD WORD COLON
                 {
                 {
                 if(translate==1){
                 if(translate==1){
           int length,list_pos;
           int length,list_pos;
                   length=0;
                   length=0;
                   list_pos=0;
                   list_pos=0;
                   //Look in the enumerated list if it was declared e.j state_t state;
                   //Look in the enumerated list if it was declared e.j state_t state;
                   list_pos=findEnumList(enumlistlist, (char *)$1);
                   list_pos=findEnumList(enumlistlist, (char *)$1);
                   if(list_pos>-1){
                   if(list_pos>-1){
                      //Calculate the number of bits needed to represent the enumerate
                      //Calculate the number of bits needed to represent the enumerate
              length=findEnumerateLength(enumlistlist,list_pos);
              length=findEnumerateLength(enumlistlist,list_pos);
                          storedtype=malloc(sizeof(char)*strlen((char *)$1));
                          storedtype=malloc(sizeof(char)*strlen((char *)$1));
                          strcpy(storedtype,(char *)$1);
                          strcpy(storedtype,(char *)$1);
                      InsertSignal(signalslist, (char *)$2,length);
                      InsertSignal(signalslist, (char *)$2,length);
                          InsertWrite(writeslist,(char *)$2);
                          InsertWrite(writeslist,(char *)$2);
                          multipledec=1;
                          multipledec=1;
           }else{
           }else{
              fprintf(stderr,"\nType %s unknow\n",(char *)$1);
              fprintf(stderr,"\nType %s unknow\n",(char *)$1);
              return(1);
              return(1);
           }
           }
                 }
                 }
                 };
                 };
multiple_sc_signal_declaration:
multiple_sc_signal_declaration:
         SC_SIGNAL MENOR WORD MAYOR WORD COLON
         SC_SIGNAL MENOR WORD MAYOR WORD COLON
                 {
                 {
                 if(translate==1){
                 if(translate==1){
           int length,list_pos;
           int length,list_pos;
                   length=0;
                   length=0;
                   list_pos=0;
                   list_pos=0;
                   //Look in the enumerated list if it was declared e.j state_t state;
                   //Look in the enumerated list if it was declared e.j state_t state;
                   list_pos=findEnumList(enumlistlist, (char *)$3);
                   list_pos=findEnumList(enumlistlist, (char *)$3);
                   if(list_pos>-1){
                   if(list_pos>-1){
                      //Calculate the number of bits needed to represent the enumerate
                      //Calculate the number of bits needed to represent the enumerate
              length=findEnumerateLength(enumlistlist,list_pos);
              length=findEnumerateLength(enumlistlist,list_pos);
                          storedtype=malloc(sizeof(char)*strlen((char *)$3));
                          storedtype=malloc(sizeof(char)*strlen((char *)$3));
                          strcpy(storedtype,(char *)$3);
                          strcpy(storedtype,(char *)$3);
                      InsertSignal(signalslist, (char *)$5,length);
                      InsertSignal(signalslist, (char *)$5,length);
                          InsertWrite(writeslist,(char *)$5);
                          InsertWrite(writeslist,(char *)$5);
                          multipledec=1;
                          multipledec=1;
           }else{
           }else{
              fprintf(stderr,"\nType %s unknow\n",(char *)$3);
              fprintf(stderr,"\nType %s unknow\n",(char *)$3);
              return(1);
              return(1);
           }
           }
                 }
                 }
                 };
                 };
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");
        };
        };
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.