#! /bin/sh
# La puissance d'un shell et d'un awk a l'etat meme
#                ,,,
#               (o o)
#  ####=====oOO--(_)--OOO========================================####
#  ##                                                              ##
#  ##  This file is part of FPT : A Formal Proof Toolkit           ##
#  ##  (C) 1996, MASI, CAO-VLSI Team                               ##
#  ##                                                              ##
#  ##  Shell script to generate fsm...                             ##
#  ##                                                              ##
#  ##  File            :  testfsm                                  ##
#  ##  Author          :  Olivier SIROL                            ##
#  ##  Date            :  Apr 1996                                 ##
#  ##                                                              ##
#  ##  E-mail support  :  sirol@ecoledoc.ibp.fr                    ##
#  ##                                                              ##
#  ####==========================================================####
#
#
#  $Id: mkfsm,v 1.2 1996/09/16 12:58:39 olivier Exp $
#
#
if [ $# -ne 3 ]
then echo "Usage : `basename $0` nb_eta nb_in nb_out"
     echo "Purpose : gawk script for generating fsm"
     echo "          whith 'nb_eta' states, 'nb_in' inputs, 'nb_out' outputs"
     echo "          'nb_in' and 'nb_out' must be multiple of 4"
     echo "          where E(n) has ( E(n+1), E(0), E(?) ) as successors"
     exit 1
fi

echo generating  prof${2}x${3}_${1}.fsm

cat <<EOF |

ENTITY circuit is

PORT 
( 
   ck    : in  BIT;
   reset : in  BIT; 
   LE_PORT_IN
   LE_PORT_OUT
);
END circuit;


ARCHITECTURE MOORE OF circuit is

   
   
   TYPE ETAT_TYPE IS (

LA_LISTE_ETAT
   
   );   

   SIGNAL EF, CS : ETAT_TYPE;


--PRAGMA CURRENT_STATE CS
--PRAGMA NEXT_STATE EF
--PRAGMA CLOCK ck
--PRAGMA FIRST_STATE E0

BEGIN

PROCESS ( CS, o, reset )
BEGIN
  IF ( reset = '1' )
  THEN
    EF    <= E0;

LA_LISTE_WHEN

  EF <= E0;

  END CASE;
  END IF;
END PROCESS;

PROCESS( ck )
BEGIN
    IF ( ck = '1' AND NOT ck'STABLE )
--  IF ( ck = '1' )
    THEN
      CS <= EF;
    END IF;
END PROCESS;

END MOORE;

EOF

gawk -v nb_eta=$1 -v nb_in=$2 -v nb_out=$3 '

BEGIN { 
       nb_eta-- ; 
       outfmt = int ( (nb_out+3) / 4 );
       outmax = 2^nb_out - 1 ;
       infmt = int ( (nb_in+3) / 4 );
       inmax = 2^nb_in - 1 ;
      }

  /LE_PORT_IN/  {
                   printf ( "   i     : in  BIT_VECTOR(%d DOWNTO 0);\n", (nb_in - 1));
                   continue;
                  }
                
  /LE_PORT_OUT/  {
                   printf ( "   o     : out BIT_VECTOR(%d DOWNTO 0)\n", (nb_out - 1));
                   continue;
                  }
                
  /LA_LISTE_ETAT/ {
                   for (i = 0; i <= nb_eta; i++)
                      {
	               printf (" E%d", i);
                         if (i < nb_eta)
	                    printf (",");
                         if (((i+1) % 8 ) == 0)
	                    printf ("\n");
                      }
                   printf (" \n");
                   continue;
                  }

  /LA_LISTE_WHEN/ {
	               printf ("      o <= X\"%0*X\";\n",outfmt, rand () * outmax );
                       printf ("      ELSE\n");
                       printf ("      CASE CS is\n");
                   for (i = 0; i < nb_eta; i++)
                      {
	               printf ("WHEN  E%d =>\n", i);
                       printf ("    IF ( i = X\"%0*X\" )\n", infmt, rand () * inmax);
                       printf ("    THEN\n");
	               printf ("      o <= X\"%0*X\";\n",outfmt, rand () * outmax );
	               printf ("      EF <= E%d;\n", i + 1);
                       printf ("    ELSE IF ( i = X\"%0*X\" )\n", infmt, rand () * inmax);
                       printf ("         THEN\n");
	               printf ("           o <= X\"%0*X\";\n",outfmt, rand () * outmax );
	               printf ("           EF <= E%d;\n", rand () * (nb_eta - 1));
	               printf ("         ELSE\n");
	               printf ("           EF <= E0;\n");
	               printf ("         END IF;\n");
	               printf ("    END IF;\n\n");
                      }
                    printf ("WHEN  E%d =>\n", nb_eta);
                    printf ("      o <= X\"%0*X\";\n",outfmt, rand () * outmax );
                   continue;
                  }
  {print $0}
' > prof${2}x${3}_${1}.fsm
 
