#!/usr/bin/perl

# Ce programme prend en entre la description vhdl du composant et y
# rajoute vdd,vss,vdde,vsse et ventuellement clk afin de prparer le
# fichier  une comparaison avec proof. Ensuite, il prend la sortie de
# "lynx -v -t" (netliste logique extracte au niveau des transistors)
# pour liminer les problmes de registres(pour que proof fonctionne
# bien, les registres, et uniquement les registres, sont dans
# l'obligation de porter les mmes noms dans la description VHDL
# initiale et la description VHDL extracte par yagle).
#
# A CE NIVEAU, ON RAPPELLE QUE, POUR QUE LE SCRIPT FONCTIONNE BIEN, IL
# FAUT QUE LES REGISTRES NE PORTENT PAS DE NOM SE TERMINANT PAR _x,
# AVEC x NOMBRE QUELCONQUE. CETTE OBLIGATION NE PORTE QUE SUR LES
# REGISTRES.
#
# Entres : _fichier_.vbe      (La description initiale)
#           _fichier_e.al      (La description logique extracte par lynx)
# Sorties : _fichier_v.vbe     (= la description initiale + les
#                               lignes d'alimentation + la ligne
#                               clk si elle n'y tait pas)
#           _fichier_e.inf     (Le fichier servant  yagle pour
#                               renommer les registres)





# vrifie : 1) qu'il y a un et un seul paramtre, 2) que ce paramtre
# est un fichier .vbe lisible, 3) que a ressemble  un fichier de
# description vhdl (commence par entity  part les lignes de
# commentaire)

$f=@ARGV[0].".vbe";
$fw=@ARGV[0].".travail.$$";   # $fw nous sert  travailler sur un
			      # fichier libre de commentaires et
			      # lignes vides
$fv=@ARGV[0]."v.vbe";
$fe=@ARGV[0]."e.al";
$fi=@ARGV[0]."e.inf";

$usage="usage: $0 fichier_description_vhdl (sans le suffixe)\n";
$isvhdl="$f ne semble pas tre un fichier VHDL\n";
$syntaxerror="probable erreur dans la description de l'entit VHDL\n";

if (@ARGV!=1) {
	die $usage;
}

if (! (-f $f && -r $f)) {
	die "erreur: $f n'est pas un fichier lisible\n";
}

# limination de tous les commentaires et lignes vides

open (ENTREE,$f) || die "ne peut ouvrir $f\n";
open (SORTIE,">".$fw) || die "ne peut crer $fw\n";
while(<ENTREE>) {
	chop;
	s/--.*//;
	if (!/^\s*$/) { print SORTIE $_."\n"; }
}
close (ENTREE);
close (SORTIE);

open (ENTREE,$fw);
# on recherche le mot 'entity' en majuscules ou minuscules
$_=<ENTREE>;
chop;
if (!(/^\s*entity/i)) { die $isvhdl;}
close(ENTREE);

open(ENTREE,$fw);
open(SORTIE,">".$fv);
while (<ENTREE>) {
	chop;
	if (/port/i) { 
	    last;
	} else { 
	    print SORTIE $_."\n";
	}
}
if ($_ eq undef) {
	die $syntaxerror;
}

# On a trouv la dclaration de port, on recherche maintenant la
# parenthse ouvrante. Si la parenthse ouvrante ne se trouve pas sur
# cette ligne juste aprs la dclaration port, alors elle est sur la
# ligne suivante (on a supprim les lignes vides et les lignes de
# commentaire).
if (/port\s*[^\s\(]/i) { die $syntaxerror; }
if (/port\s*$/i) { 
    print SORTIE $_."\n";
    $_=<ENTREE>;
    chop;
    if (!/^\s*\(/) { die $syntaxerror; }
}

#on insre juste aprs les parenthses ouvrantes

$poindex=index($_,"(");
substr($_,$poindex+1,0)="vdd,vss,vdde,vsse:in bit;";
if (-f "noclk") {
    substr($_,$poindex+1,0)="clk:in bit;";
}
print SORTIE "$_\n";
while (<ENTREE>) {
    print SORTIE $_;
}
close (ENTREE);
close (SORTIE);
unlink ($fw);

# Maintenant, on s'occupe du fichier $fe
# attention a l'assomption : pas de noms de registres finissant par
# _x, o x est un nombre quelconque
open (ENTREE,$fe) || die "ne peut ouvrir $fe\n";
open (SORTIE,">".$fi) || die "ne peut crer $fi\n";
print SORTIE "rename\n";
while (<ENTREE>)
{
    chop;
    # on recherche tout ce qui ressemble  un registre
    if (/core\.[^.]*\..*s/) { 
	s/^.*,//;
	print SORTIE "$_ : ";
	s/^core\.//;
	s/\..*$//;
	if (/_[0-9]*$/) {
	    $i=rindex($_,"_");
	    substr($_,$i,1)="(";
	    $_.=")";
	}
	print SORTIE "$_;\n";
    }
}
print SORTIE "end\n";
close (ENTREE);
close (SORTIE);

