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

Subversion Repositories core_arm

[/] [core_arm/] [trunk/] [soft/] [modgen_depricated/] [init.pl] - Rev 4

Compare with Previous | Blame | View Log

#!/usr/bin/perl
# Purpose: Initialize the combinatorial tmp variables
#          to avoid instanciation in synthesis
 
if ($#ARGV < 0) {
    die ("# Call: init.pl [getinit <comp> <record>|infile <file>|rem <file>]\n");
}
$cmd = $ARGV[0];
$arg1 = $ARGV[1];
$arg2 = $ARGV[2];
$ident = "[a-zA-Z][a-zA-Z0-9_]*";
$exp = "[a-zA-Z0-9_\\-+*\\(\\)\s]*";
$space = "[[:space:]]*";
$nl = "\n";
 
if ($cmd eq "getinit") {
    getinit($arg1,$arg2);
} elsif ($cmd eq "infile") {
    infile($arg1);
} elsif ($cmd eq "remfile") {
    remfile($arg1);
}
 
sub infile {
    my ($file) = @_;
    my $comp = compname($file);
    ($s,$last,$lastfn) = readfiles($comp);
    if (!($file eq $lastfn)) {
	die ("Error: $file not last file of \"make $comp\"\n");
    } else {
	print STDERR ("Scanning file $file\n");
    }
    $last = process($s,$last);
 
    if (-f $file) {
	print STDERR ("Making backup of $file\n");
	`cp $file $file.bck`;
    }
    if (open(RF, ">$file")) {
	print RF $last;
	close(RF);
    } else {
	print "opening \"$n\": $!\n";
    }
}
 
sub remfile {
    my ($file) = @_;
    $s = readin($file);
    $s = removeinit($s);
    if (-f $file) {
	print STDERR ("Making backup of $file\n");
	`cp $file $file.bck`;
    }
    if (open(RF, ">$file")) {
	print RF $s;
	close(RF);
    } else {
	print "opening \"$n\": $!\n";
    }
}
 
 
sub getinit {
    my ($comp,$record) = @_;
    my $s,my $last,my $lastfn;
 
    ($s,$last,$lastfn) = readfiles($comp);
    $s .= $last;
    ($rec,$pos) = getrecord($record,$s);
    $i = InitRec("%start%",$record,$rec,$f.substr($s,0,$pos));
    print $i;
}
 
sub readfiles {
    my ($comp) = @_;
    my $r, my @r, my $f, my $rf,my @a,my $fn, my $s;
    my $last, my $lastfn;
    $r = `make clean`;
    $r = `make -n $comp`;
    @r = split("\n",$r);
    $f = "";
    $rf = "";
    $pr = "";
    @a = ();
    foreach(@r) {
	$fn = $_;
	if ($fn =~ /([^\s]*\.vhd)$/) {
	    push(@a,$1);
	}
    }
 
    $s = "";
    $last = "";
    $lastfn = "";
    foreach(@a) {
	print STDERR ("Append file: $_\n");
	$lastfn = $_;
	$last = readin($lastfn);
	$s .= $last;
    }
    return ($s,$last,$lastfn);
}
 
#$reg = "    -- \$(init-automatically-generated-for-synthesis:\(($ident):($record)\)$nl";
#$reg .= "    -- \$(/init-automatically-generated-for-synthesis:\(\1:\2\)$nl";
#$s =~ s/$reg//i;
#    
#	print STDERR ("Scanning $1\n");
#	$fn = $1;
#	$pr = process($fn);
#	$f .= $pr;
#	$rf .= $pr;
#print $rf;
 
sub removeinit {
    my ($s) = @_;
    my $reg;
    my $r = "";
 
    $reg = "    -- \\\$\\(init-automatically-generated-for-synthesis:\\(($ident):($ident)\\)\\)([^\\\$]*)?";
    $reg .= "    -- \\\$\\(/init-automatically-generated-for-synthesis:\\(\\1:\\2\\)\\)[\r\n]*";
    while ($s =~ /$reg/) {
	my $p = index($s,$&,0);
	print STDERR ("Removed previous init for $1:$2\n");
	$r .= substr($s,0,$p);
	$s = substr($s,$p+length($&));
    }
    $r .= $s;
    return $r;
}
 
sub process
{
    my ($def,$s)=@_;
    my $ns = "";
    my $pos,$n,$typ,$rec,$i;
    my @e,@s;
 
    $s = removeinit($s);
 
    @s = split("\n",$s);
    foreach (@s) {
	s/[\r\n]//g;
	if (/\$\(init\(($ident):($ident)\)\)/) {
	    #print("\n-Init: $1:$2\n");
	    $dn = $1,
	    $dtyp = $2;
	    ($rec,$pos) = getrecord($dtyp,$def.$s);
	    $i = InitRec($dn,$dtyp,$rec,$f.substr($def.$s,0,$pos));
	    $ns .= $_."$nl";
	    $ns .= "    -- \$(init-automatically-generated-for-synthesis:($dn:$dtyp))$nl";
	    $ns .= $i."$nl";
	    $ns .= "    -- \$(/init-automatically-generated-for-synthesis:($dn:$dtyp))$nl";
	}
	else {
	    $ns .= $_."$nl";
	}
    }
    return $ns;
}
 
sub InitRec
{
    my ($n,$typ,$rec,$beg)=@_;
    my $ntyp,$nn,$i,$enum;
    my $nrec,$npos;
    my $r = "";
    my @e = ();
    #print "\-Initialize $n:$typ";
 
    @e = ExpandRec($rec,$beg);
 
    for $i ( 0 .. $#e ) {
	$nn = $e[$i][0];
	$ntyp = $e[$i][1];
	#print ("-Elem $nn:$ntyp\n");
	if ($ntyp =~ /[[:space:]]*std_logic_vector[[:space:]]*\(/) {
	    $r .= "    $n.$nn := (others => '0');$nl";
	} 
	elsif ($ntyp =~ /[[:space:]]*std_logic$/)  {
	    $r .= "    $n.$nn := '0';$nl";
	}
	elsif ($ntyp =~ /[[:space:]]*integer/)  {
	    $r .= "    $n.$nn := 0;$nl";
	}
	else {
	    $enum = GetEnum($ntyp,$beg);
	    if ($enum eq "") {
		($nrec,$npos) = getrecord($ntyp,$beg);
		$r .= InitRec($n.".".$nn,$ntyp,$nrec,$beg);
	    }
	    else {
		$r .= "    $n.$nn := $enum;$nl";
	    }
	}
    }
    return $r;
} 
 
 
sub lin_log2 {
    my ($val) = @_;
    my $r;
    my @lin_log2a  = ("x",0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,
				5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6);
    if ($val > $#lin_log2a) {
	$r = 6;
    }
    $r = $lin_log2a[$val];
    return $r;
}
sub lin_log2x {
    my ($val) = @_;
    my $r;
    my @lin_log2xa :=("x",1,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,
				5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6);
    if ($val > $#lin_log2xa) {
	$r = 6;
    }
    $r = $lin_log2xa[$val];
    return $r;
}
 
sub ExpandRec 
{
    my ($rec,$beg)=@_;
    my $e,$typ,$reg,$typdef,$l,$r;
    my @rec,@n,@tmp;
    my @r = ();
 
    @rec = split("\n",$rec);
 
    for $e (@rec) {
	$e =~ s/--(.)*$//g;
	if ($e =~ /(.*?):(.*);/) {
	    $typ = $2;
	    @n = split (",",$1);
	    $typ =~ s/[[:space:]]*//g;
	    for $e (@n) {
		$e =~ s/[[:space:]]*//g;
		$reg = $space."(".$ident.")".$space."\\(".$space.
		    "([0-9]*)".$space."downto".$space."([0-9]*)".$space."\\)";
		$reg = $space."(".$ident.")".$space."\\(".$space.
		    "($exp)".$space."downto".$space."($exp)".$space."\\)";
 
		if (!($typ =~ /[[:space:]]*std_logic_vector[\s\r\n\(\)\$]/ || $typ =~ /[[:space:]]*std_logic[\s\r\n\$]/) && 
		      $typ =~ /$reg/ ) {
		    my $p = 0;
		    $typdef = $1;
		    $l = $2;
		    $r = $3;
		    ($typdef,$p) = GetType($typdef,$beg);
		    print STDERR ("Type resolve: $typdef\n");
 
		    $l = ResolveExp($l,$beg);
		    $r = ResolveExp($r,$beg);
		    print STDERR ("-Left resolved to $l:");
		    print STDERR ("eval($l)=");
		    $l = eval "$l";
		    print STDERR ($l."\n");
		    print STDERR ("-Right resolved to $r:");
		    print STDERR ("eval($r)=");
		    $r = eval "$r";
		    print STDERR ($r."\n");
 
		    for ($i=$r;$i<=$l;$i++) {
			@tmp = ($e."($i)",$typdef);
			push @r, [ @tmp ];
		    }
		}
		else {
		    @tmp = ($e,$typ);
		    push @r, [ @tmp ];
		}
	    }
	}
    }
    return @r;
}
 
sub ResolveExp 
{
    my ($exp,$beg) = @_;
    my $n = 0, my $p;
    my $resolve = "",my $id;
    print STDERR ("Resolve: $exp\n");
    while ($exp =~ /($ident)/) {
	$id = $1;
	$p = index($exp,$&,0);
	$resolve .= substr($exp,0,$p);
	if (($id eq "lin_log2") || ($id eq "log2")) {
	    $resolve .= "lin_log2";
	} elsif (($id eq "lin_log2x") || ($id eq "log2x")) {
	    $resolve .= "lin_log2x";
	} else {
	    $resolve .= GetConstant($id,$beg);
	}
	$exp = substr($exp,$p+length($id));
    }
    $resolve .= $exp;
    return $resolve;
}
 
sub GetConstant 
{
    my ($id,$beg) = @_;
    my $p,my $exp,$resolve="";
    print STDERR ("Search for constant $id \n"); 
    $exp2 = "[a-zA-Z0-9_\\-+*\\(\\)\s]*";
 
    if ($beg =~ /constant\s*$id\s*:\s*integer\s*[^:]*:=\s*([^;]*)\s*;/) {
	$exp = $1;
	$p = index($beg,$&,0);
	$beg = substr($beg,0,$p);
	print STDERR ("$id = $exp\n"); 
	if ($exp =~ /$ident/) {
	    $exp = ResolveExp($exp,substr($beg,0,$p));
	}
    } else {
	die ("Could not find constant $id\n");
    }
    return $exp;
}
 
sub GetType
{
    my ($typ,$beg)=@_;
    my $r = "",my $p = 0;
    if ($beg =~/type\s*$typ\s*is\s*array\s*\(\s*natural\s*range\s*<\s*>\s*\)\s*of\s*([^;]*)/) {
	$r = $1;
	$p = index($beg,$&,0);
    }
    else {
	die ("Did not find typedef $typ");
    }
    return ($r,$p);
}
 
sub GetEnum
{
    my ($typ,$beg)=@_;
    my $r = "";
 
    if ($beg =~/type\s*$typ\s*is\s*\(\s*($ident)/) {
	$r = $1;
    }
    return $r;
}
 
sub getrecord
{
    my ($rn,$s)=@_;
    my $rec,$pos=0;
 
    $reg = "type".$space.$rn.$space."is".$space."record([[:print:][:space:]]*?)end".$space."record";
 
    if ($s =~ /$reg/g) {
	$pos = index($s,$&,0);
	$rec = $1;
    } else {
	die ("Did not find record $rn with $reg ");
    }
    return ($rec,$pos);
}
 
sub compname() {
    my ($n) = @_;
    my ($f,$p) = splitpath($n);
    $f =~ s/\.vhd$//gi;
    return $f;
}
 
sub splitpath() {
    my ($n) = @_;
    my @n = split("/",$n);
    if ($#n > -1) {
	my $f = splice(@n,$#n,1);
	my $p = join("/",@n);
	return ($f,$p);
    }
    return $n;
}
 
sub readin() {
    my ($n) = @_;
    my $l = "";
    if (open(RF, "$n")) {
	while (<RF>) {
	    $l .= $_;
	}
	close(RF);
    } else {
	print "opening \"$n\": $!\n";
    }
 
    if ($l =~ /[\\r][\\n]/) {
	#$nl = "\r\n";
    }
    return $l;
}
 
sub getnewline {
    my ($f) = @_;
    if ($f =~ /[\\r][\\n]/) {
	return "\r\n";
    } else {
	return "\n";
    }
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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