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

Subversion Repositories sc2v

[/] [sc2v/] [trunk/] [src/] [sc2v_step2.y] - Rev 39

Compare with Previous | Blame | View Log

/* -----------------------------------------------------------------------------
 *
 *  SystemC to Verilog Translator v0.4
 *  Provided by Universidad Rey Juan Carlos
 *
 * -----------------------------------------------------------------------------
 *  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 <stdio.h>
#include <string.h>
#include <math.h>

#include "sc2v_step2.h"


  char *enumname;

  int reading_enumerates = 0;
  int lineno = 1;

/*Multiple Declarations*/
  int multipledec;
  char *storedtype;


/* Global var to store process module name*/
  char *module_name;
  int module_name_found = 0;


/* Global var to store last port type*/
  char *lastportkind;
  int lastportsize;
  int activeport = 0;           // 1 -> reading port list
  int portsign ;

/* Global var to store last signal type*/
  int lastsignalsize;
  int signalactive = 0;
  int signalsign ;


/* Global var to store last SC_METHOD found*/
  char *active_method;
  char *active_method_type;
  int method_found;


/* Global var to store last sensitivity found*/
  char *last_sensibility;
  int sensibility_active = 0;

/* Global var to store last function found*/
  char *functionname;
  int outputlenght = 0;
  int fsgnflag = 0;

  int translate;


  void yyerror (const char *str)
  {
    fprintf (stderr, "line: %d error: %s\n", lineno, str);
  }

  int yywrap ()
  {
    return 1;
  }


  main ()
  {

    /*Initialize lists */
    writeslist = NULL;
    portlist = NULL;;
    signalslist = NULL;
    sensibilitylist = NULL;
    processlist = NULL;
    instanceslist = NULL;
    enumlistlist = NULL;
    funcinputslist = NULL;
    functionslist = NULL;

    translate = 1;

    fprintf (stderr, "\nSystemC to Verilog Translator v0.6\n\n");
    fprintf (stderr, "Parsing header file.......\n\n");

    FILE *yyin = stdin;
    FILE *yyout = stdout;

    yyparse ();

    printf ("module %s(", module_name);
    EnumeratePorts (portlist);
    printf (");\n");

    ShowPortList (portlist);
    printf ("\n");
    RegOutputs (portlist,instanceslist);
    printf ("\n");

    ShowEnumListList (enumlistlist);

    writeslist = ReadWritesFile (writeslist, (char *) "file_writes.sc2v");

    ShowSignalsList (signalslist, writeslist);

    printf ("\n");

    ShowInstancedModules (instanceslist);
    printf ("\n");

    ShowDefines ((char *) "file_defines.sc2v");

    ShowFunctionCode (functionslist);

    ShowProcessCode (processlist);
    printf ("\n");

    printf ("endmodule\n");

    fprintf (stderr, "\nDone\n");
  }

%}

%error-verbose

%token NUMBER SC_MODULE WORD OPENPAR CLOSEPAR SC_IN SC_OUT BOOL ENUM 
%token MENOR MAYOR SC_REG SC_SGNREG SC_METHOD SENSITIVE_POS SENSITIVE_NEG SENSITIVE POS NEG
%token SENSIBLE CLOSEKEY OPENKEY SEMICOLON COLON SC_SIGNAL ARROW EQUALS NEW QUOTE 
%token SC_CTOR VOID ASTERISCO TRANSLATEON TRANSLATEOFF OPENCORCH CLOSECORCH

%% commands:    /* empty */
|commands command;

command:
module
  |
  in_bool
  |
  in_sc_reg
  |
  in_sc_reg_sgn
  |
  out_bool
  |
  out_sc_reg
  |
   out_sc_reg_sgn
  |
  sc_method
  |
  sensitive_pos
  |
  sensitive_neg
  |
  sensitive
  |
  sensible_word_colon
  |
  sensible_word_semicolon
  |
  sensible_word_pos_colon
  |
  sensible_word_pos_semicolon
  |
  sensible_word_neg_colon
  |
  sensible_word_neg_semicolon
  |
  sensible_par_colon
  |
  sensible_par_pos
  |
  sensible_par_neg
  |
  closekey
  |
  word_semicolon
  |
  word_colon
  |
  word_closekey
  |
  word_closekey_word
  |
  signal_bool
  |
  signal_reg
  |
  signal_reg_sgn
  |
  instantation
  |
  port_binding
  |
  sc_ctor
  |
  void
  |
  inst_decl
  |
  multiple_inst_decl
  |
  multiple_inst_decl_cont
  |
  multiple_inst_decl_end
  |
  closekey_semicolon
  |
  enumerates
  |
  enumerates_type
  |
  declaration
  |
  declaration_sc_signal
  |
  multiple_declaration
  |
  multiple_sc_signal_declaration
  |
  translateoff
  |
  translateon
  |
  function
  |
  functioninputs
  |
  finishfunctioninputs
  | 
  function_sgn
  |
  functioninputs_sgn
  |
  finishfunctioninputs_sgn
  | 
  boolfunction 
  | 
  boolfunctioninputs 
  | 
  arraycolon
  |
  arraysemicolon
  |
  boolfinishfunctioninputs;

module:
SC_MODULE OPENPAR WORD CLOSEPAR OPENKEY
{

  if (translate == 1)
    {

      if (module_name_found)
        {
          fprintf (stderr,
                   "line: %d error: two or more modules found in the file\n",
                   lineno);
          exit (1);
        }
      else
        {
          module_name = (char *) malloc (256 * sizeof (char));
          strcpy (module_name, (char *) $3);
          module_name_found = 1;
        }
    }

};


in_sc_reg:
SC_IN MENOR SC_REG MENOR NUMBER MAYOR MAYOR
{
  if (translate == 1)
    {
      activeport = 1;
      lastportsize = $5;
      lastportkind = (char *) "input";
      portsign = 0;
    }
};

in_sc_reg_sgn:
SC_IN MENOR SC_SGNREG MENOR NUMBER MAYOR MAYOR
{
  if (translate == 1)
    {
      activeport = 1;
      lastportsize = $5;
      lastportkind = (char *) "input";
      portsign = 1;
    }
};


in_bool:
SC_IN MENOR BOOL MAYOR
{
  if (translate == 1)
    {
      activeport = 1;
      lastportsize = 0;
      lastportkind = (char *) "input";
      portsign = 0;
    }
};


signal_bool:
SC_SIGNAL MENOR BOOL MAYOR
{
  if (translate == 1)
    {
      signalactive = 1;
      lastsignalsize = 0;
    }
};


signal_reg:
SC_SIGNAL MENOR SC_REG MENOR NUMBER MAYOR MAYOR
{
  if (translate == 1)
    {
      signalactive = 1;
      lastsignalsize = $5;
      signalsign = 0;
    }
};

signal_reg_sgn:
SC_SIGNAL MENOR SC_SGNREG MENOR NUMBER MAYOR MAYOR
{
  if (translate == 1)
    {
      signalactive = 1;
      lastsignalsize = $5;
      signalsign = 1;
    }
};

out_bool:
SC_OUT MENOR BOOL MAYOR
{
  if (translate == 1)
    {
      activeport = 1;
      lastportsize = 0;
      lastportkind = (char *) "output";
      portsign = 0;
    }
};

out_sc_reg:
SC_OUT MENOR SC_REG MENOR NUMBER MAYOR MAYOR
{
  if (translate == 1)
    {
      activeport = 1;
      lastportsize = $5;
      lastportkind = (char *) "output";
      portsign = 0;
    }

};

out_sc_reg_sgn:
SC_OUT MENOR SC_SGNREG MENOR NUMBER MAYOR MAYOR
{
  if (translate == 1)
    {
      activeport = 1;
      lastportsize = $5;
      lastportkind = (char *) "output";
      portsign = 1;
    }

};


sc_method:
SC_METHOD OPENPAR WORD CLOSEPAR SEMICOLON
{

  if (translate == 1)
    {
      if (method_found)
        {
          processlist =
            InsertProcess (processlist, active_method, sensibilitylist,
                           active_method_type);
        }
      active_method = (char *) $3;
      method_found = 1;
      /* New sensitivity list */
      sensibilitylist = NULL;
    }
};



sensible_par_neg:
SENSITIVE_NEG OPENPAR WORD CLOSEPAR SEMICOLON
{
  if (translate == 1)
    {
      active_method_type = (char *) "seq";      //comb
      sensibilitylist =
        InsertSensibility (sensibilitylist, (char *) $3, "negedge");
    }
};



sensible_par_pos:
SENSITIVE_POS OPENPAR WORD CLOSEPAR SEMICOLON
{
  if (translate == 1)
    {
      active_method_type = (char *) "seq";      //comb
      sensibilitylist =
        InsertSensibility (sensibilitylist, (char *) $3, "posedge");
    }
};



sensitive_pos:
SENSITIVE_POS
{
  if (translate == 1)
    {
      last_sensibility = (char *) "posedge";
      active_method_type = (char *) "seq";      //seq
      sensibility_active = 1;
    }
};

sensitive_neg:
SENSITIVE_NEG
{
  if (translate == 1)
    {
      last_sensibility = (char *) "negedge";
      active_method_type = (char *) "seq";      //seq
      sensibility_active = 1;
    }
};

sensitive:
SENSITIVE
{

  if (translate == 1)
    {
      last_sensibility = (char *) " ";
      active_method_type = (char *) "comb";     //comb
      sensibility_active = 1;
    }
};



sensible_par_colon:
SENSITIVE OPENPAR WORD CLOSEPAR SEMICOLON
{
  if (translate == 1)
    {
      active_method_type = (char *) "comb";     //comb
      sensibilitylist = InsertSensibility (sensibilitylist, (char *) $3, " ");
    }
};




sensible_word_colon:
SENSIBLE WORD
{
  if (translate == 1)
    {
      sensibilitylist =
        InsertSensibility (sensibilitylist, (char *) $2,
                           (char *) last_sensibility);
    }
};


sensible_word_pos_colon:
SENSIBLE WORD POS
{
  if (translate == 1)
    {
      last_sensibility = (char *) "posedge";
      active_method_type = (char *) "seq";      //seq
      sensibilitylist =
        InsertSensibility (sensibilitylist, (char *) $2,
                           (char *) last_sensibility);
    }
};

sensible_word_neg_colon:
SENSIBLE WORD POS
{
  if (translate == 1)
    {
      last_sensibility = (char *) "negedge";
      active_method_type = (char *) "seq";      //seq
      sensibilitylist =
        InsertSensibility (sensibilitylist, (char *) $2,
                           (char *) last_sensibility);
    }
};

sensible_word_semicolon:
SENSIBLE WORD SEMICOLON
{
  if (translate == 1)
    {
      sensibilitylist =
        InsertSensibility (sensibilitylist, (char *) $2,
                           (char *) last_sensibility);
      if (sensibility_active)
        {
          sensibility_active = 0;
        }
    }
};

sensible_word_pos_semicolon:
SENSIBLE WORD POS SEMICOLON
{
  if (translate == 1)
    {
      last_sensibility = (char *) "posedge";
      active_method_type = (char *) "seq";      //seq
      sensibilitylist =
        InsertSensibility (sensibilitylist, (char *) $2,
                           (char *) last_sensibility);
      if (sensibility_active)
        {
          sensibility_active = 0;
        }
    }
};

sensible_word_neg_semicolon:
SENSIBLE WORD POS SEMICOLON
{
  if (translate == 1)
    {
      last_sensibility = (char *) "negedge";
      active_method_type = (char *) "seq";      //seq
      sensibilitylist =
        InsertSensibility (sensibilitylist, (char *) $2,
                           (char *) last_sensibility);
      if (sensibility_active)
        {
          sensibility_active = 0;
        }
    }
};

closekey:
CLOSEKEY
{
  if (translate == 1)
    {
      if (method_found)
        {
          method_found = 0;
          processlist =
          InsertProcess (processlist, active_method, sensibilitylist,
                           active_method_type);
        }
    }
};

arraysemicolon:
WORD OPENCORCH NUMBER CLOSECORCH SEMICOLON
{
if (signalactive)
        {
          signalslist = InsertSignal (signalslist, (char *) $1, lastsignalsize,$3, signalsign);
          signalactive = 0;
        }
}

arraycolon:
WORD OPENCORCH NUMBER CLOSECORCH COLON
{
if (signalactive)
        {
          signalslist = InsertSignal (signalslist, (char *) $1, lastsignalsize,$3,signalsign);
          signalactive = 0;
        }
}

word_semicolon:
WORD SEMICOLON
{
  if (translate == 1)
    {
      if (activeport)
        {
          portlist =
            InsertPort (portlist, (char *) $1, lastportkind, lastportsize,portsign);
          activeport = 0;
        }
      else if (signalactive)
        {
          signalslist = InsertSignal (signalslist, (char *) $1, lastsignalsize,0,signalsign);
          signalactive = 0;
        }
      else if (multipledec)
        {
          int length, list_pos;
          length = 0;
          list_pos = 0;
          //Look in the enumerated list if it was declared e.j state_t state;
          list_pos = findEnumList (enumlistlist, storedtype);

          if (list_pos > -1)
            {
              //Calculate the number of bits needed to represent the enumerate
              length = findEnumerateLength (enumlistlist, list_pos);
              signalslist = InsertSignal (signalslist, (char *) $1, length, 0,0);
              writeslist = InsertWrite (writeslist, (char *) $1);
              free (storedtype);
              multipledec = 0;
            }
          else
            {
              fprintf (stderr, "\nline: %d Type %s unknow\n", lineno,
                       (char *) $1);
              return (1);
            }
        }
    }

};


word_colon:
WORD COLON
{

  if (translate == 1)
    {
      if (activeport)
        {
          portlist = InsertPort (portlist, (char *) $1, lastportkind, lastportsize, portsign);
        }
      else if (signalactive)
        {
          signalslist = InsertSignal (signalslist, (char *) $1, lastsignalsize, 0,signalsign);
        }
      else if (reading_enumerates)
        {
          enumerateslist = InsertEnumerates (enumerateslist, (char *) $1);
        }
      else if (multipledec)
        {

          int length, list_pos;
          length = 0;
          list_pos = 0;

          //Look in the enumerated list if it was declared e.j state_t state;
          list_pos = findEnumList (enumlistlist, storedtype);

          if (list_pos > -1)
            {
              //Calculate the number of bits needed to represent the enumerate
              length = findEnumerateLength (enumlistlist, list_pos);
              signalslist = InsertSignal (signalslist, (char *) $1, length, 0, 0);
              writeslist = InsertWrite (writeslist, (char *) $1);
              multipledec = 1;
            }
          else
            {
              fprintf (stderr, "\nline: %d Type %s unknow\n", lineno,
                       (char *) $1);
              return (1);
            }
        }
    }

};



word_closekey_word:
WORD CLOSEKEY WORD SEMICOLON
{
  if (translate == 1)
    {

      //Finish enumerate var declaration
      if (reading_enumerates)
        {
          enumerateslist = InsertEnumerates (enumerateslist, (char *) $1);
          enumlistlist = InsertEnumList (enumlistlist, enumerateslist, (char *) $4, 0); //Insert also the variable name
          reading_enumerates = 0;
        }
    }
};



word_closekey:
WORD CLOSEKEY SEMICOLON
{

  if (translate == 1)
    {

      //Finish enumerate type declaration
      if (reading_enumerates)

        {

          enumerateslist = InsertEnumerates (enumerateslist, (char *) $1);

          enumlistlist = InsertEnumList (enumlistlist, enumerateslist, enumname, 1);    //Insert also the variable name
          reading_enumerates = 0;

        }

    }

};


instantation:
WORD EQUALS NEW WORD OPENPAR QUOTE WORD QUOTE CLOSEPAR SEMICOLON
{
  if (translate == 1)
    {
      instanceslist =
        InsertInstance (instanceslist, (char *) $1, (char *) $4);
    }
};



port_binding:
WORD ARROW WORD OPENPAR WORD CLOSEPAR SEMICOLON
{

  if (translate == 1)
    {

      if (instanceslist == NULL)
        {
          fprintf (stderr, "line: %d error: no instances found\n", lineno);
        }
      else
        {

          InstanceNode *ill;
          SGLIB_LIST_MAP_ON_ELEMENTS (InstanceNode, instanceslist, ill, next,
                                      {
                                      if (strcmp
                                          (ill->nameinstance,
                                           (char *) $1) == 0)
                                      {
                                      ill->bindslist =
                                      InsertBind (ill->bindslist, (char *) $3,
                                                  (char *) $5); break;}
                                      }
          );
        }

    }
};


sc_ctor:
SC_CTOR OPENPAR WORD CLOSEPAR OPENKEY
{


};


void:
VOID WORD OPENPAR CLOSEPAR SEMICOLON
{

};


inst_decl:
WORD ASTERISCO WORD SEMICOLON
{
/*Ignore*/

};
multiple_inst_decl:
WORD ASTERISCO WORD COLON
{
/*Ignore*/

};
multiple_inst_decl_cont:
ASTERISCO WORD COLON
{
/*Ignore*/

};
multiple_inst_decl_end:
ASTERISCO WORD SEMICOLON
{
/*Ignore*/

};

closekey_semicolon:
CLOSEKEY SEMICOLON
{
 if (translate == 1)
    {
      if (method_found)
        {
          method_found = 0;
          processlist =
          InsertProcess (processlist, active_method, sensibilitylist,
                           active_method_type);
        }
    }
};



enumerates:
ENUM OPENKEY
{

  if (translate == 1)
    {

      //New enumerate list
      enumerateslist = NULL;

      reading_enumerates = 1;

    }

};



enumerates_type:
ENUM WORD OPENKEY
{

  if (translate == 1)
    {

      //In this case we define type e.g. enum state_t {S0,S1,S2};
      enumerateslist = NULL;

      enumname = (char *) malloc (sizeof (char) * strlen ((char *) $2));

      strcpy (enumname, (char *) $2);

      reading_enumerates = 1;

    }

};



declaration:
WORD WORD SEMICOLON
{

  if (translate == 1)
    {
      int length, list_pos;
      length = 0;

      list_pos = 0;

      //Look in the enumerated list if it was declared e.j state_t state;
      list_pos = findEnumList (enumlistlist, (char *) $1);

      if (list_pos > -1)
        {
          //Calculate the number of bits needed to represent the enumerate
          length = findEnumerateLength (enumlistlist, list_pos);
          signalslist = InsertSignal (signalslist, (char *) $2, length, 0,0);
          writeslist = InsertWrite (writeslist, (char *) $2);
        }
      else
        {
          fprintf (stderr, "\nline: %d Type %s unknow\n", lineno,
                   (char *) $1);
          return (1);
        }
    }
};



declaration_sc_signal:
SC_SIGNAL MENOR WORD MAYOR WORD SEMICOLON
{

  if (translate == 1)
    {

      int length, list_pos;

      length = 0;

      list_pos = 0;

      //Look in the enumerated list if it was declared e.j state_t state;
      list_pos = findEnumList (enumlistlist, (char *) $3);

      if (list_pos > -1)
        {

          //Calculate the number of bits needed to represent the enumerate
          length = findEnumerateLength (enumlistlist, list_pos);


          signalslist = InsertSignal (signalslist, (char *) $5, length, 0,signalsign);

          writeslist = InsertWrite (writeslist, (char *) $5);

        }
      else
        {

          fprintf (stderr, "\nline: %d Type %s unknow\n", lineno,
                   (char *) $3);

          return (1);

        }

    }

};



multiple_declaration:
WORD WORD COLON
{

  if (translate == 1)
    {

      int length, list_pos;

      length = 0;

      list_pos = 0;

      //Look in the enumerated list if it was declared e.j state_t state;
      list_pos = findEnumList (enumlistlist, (char *) $1);

      if (list_pos > -1)
        {

          //Calculate the number of bits needed to represent the enumerate
          length = findEnumerateLength (enumlistlist, list_pos);

          storedtype = (char *) malloc (sizeof (char) * strlen ((char *) $1));

          strcpy (storedtype, (char *) $1);

          signalslist = InsertSignal (signalslist, (char *) $2, length,0,0);

          writeslist = InsertWrite (writeslist, (char *) $2);

          multipledec = 1;

        }
      else
        {

          fprintf (stderr, "\nline: %d Type %s unknow\n", lineno,
                   (char *) $1);

          return (1);

        }

    }

};

multiple_sc_signal_declaration:
SC_SIGNAL MENOR WORD MAYOR WORD COLON
{
  if (translate == 1)
    {
      int length, list_pos;
      length = 0;
      list_pos = 0;

      //Look in the enumerated list if it was declared e.j state_t state;
      list_pos = findEnumList (enumlistlist, (char *) $3);
      if (list_pos > -1)
        {
          //Calculate the number of bits needed to represent the enumerate
          length = findEnumerateLength (enumlistlist, list_pos);
          storedtype = (char *) malloc (sizeof (char) * strlen ((char *) $3));
          strcpy (storedtype, (char *) $3);
          signalslist = InsertSignal (signalslist, (char *) $5, length, 0,0);
          writeslist = InsertWrite (writeslist, (char *) $5);
          multipledec = 1;
        }
      else
        {
          fprintf (stderr, "\nline: %d Type %s unknow\n", lineno,
                   (char *) $3);
          return (1);
        }
    }
};



translateoff:
TRANSLATEOFF
{
  translate = 0;
  fprintf (stderr, "line: %d Found Translate off directive \n", lineno);
};



translateon:
TRANSLATEON
{
  translate = 1;
  fprintf (stderr, "line: %d Found Translate on directive \n", lineno);
};

function:
SC_REG MENOR NUMBER MAYOR WORD OPENPAR
{
  fprintf (stderr, "line: %d Found Function Declaration \n", lineno);
  /* New inputs list */
  functionname = (char *) $5;
  outputlenght = $3;
  funcinputslist = NULL;
  fsgnflag = 0;
};

function_sgn:
SC_SGNREG MENOR NUMBER MAYOR WORD OPENPAR
{
  fprintf (stderr, "line: %d Found {signed} Function Declaration \n", lineno);
  /* New inputs list */
  functionname = (char *) $5;
  outputlenght = $3;
  funcinputslist = NULL;
  fsgnflag = 1;
  
};

functioninputs:
SC_REG MENOR NUMBER MAYOR WORD COLON
{
  funcinputslist = InsertFunctionInput (funcinputslist, (char *) $5, $3,0);
};

functioninputs_sgn:
SC_SGNREG MENOR NUMBER MAYOR WORD COLON
{
  funcinputslist = InsertFunctionInput (funcinputslist, (char *) $5, $3,1);
};

finishfunctioninputs:
SC_REG MENOR NUMBER MAYOR WORD CLOSEPAR SEMICOLON
{
  funcinputslist = InsertFunctionInput (funcinputslist, (char *) $5, $3,0);
  functionslist =
    InsertFunction (functionslist, functionname, funcinputslist,
                    outputlenght,fsgnflag);
};

finishfunctioninputs_sgn:
SC_SGNREG MENOR NUMBER MAYOR WORD CLOSEPAR SEMICOLON
{
  funcinputslist = InsertFunctionInput (funcinputslist, (char *) $5, $3, 1);
  functionslist =
    InsertFunction (functionslist, functionname, funcinputslist,
                    outputlenght, fsgnflag);
};

boolfunction:
BOOL WORD OPENPAR
{
  fprintf (stderr, "line: %d Found Function Declaration \n", lineno);
  /* New inputs list */
  functionname = (char *) $2;
  outputlenght = 1;
  funcinputslist = NULL;
};

boolfunctioninputs:
BOOL WORD COLON
{
  funcinputslist = InsertFunctionInput (funcinputslist, (char *) $2,1,0);
};

boolfinishfunctioninputs:
BOOL WORD CLOSEPAR SEMICOLON
{
  funcinputslist = InsertFunctionInput (funcinputslist, (char *) $2,1,0);
  functionslist =
    InsertFunction (functionslist, functionname, funcinputslist,
                    outputlenght,0);
};


Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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