|  | @@ -0,0 +1,95 @@
 | 
	
		
			
				|  |  | +#!/usr/bin/perl
 | 
	
		
			
				|  |  | +#
 | 
	
		
			
				|  |  | +# Routine to read define'd constants from a Verilog or C header
 | 
	
		
			
				|  |  | +# If expressions are used, they need to be defined with care to
 | 
	
		
			
				|  |  | +# be able to evaluate them. Conditionals are NOT processed.
 | 
	
		
			
				|  |  | +#
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +use strict;
 | 
	
		
			
				|  |  | +use Math::BigInt;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +sub header_const($) {
 | 
	
		
			
				|  |  | +    my($file) = @_;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    my %bases = ('d' => 10, 'b' => 2, 'o' => 8, 'q' => 8, 'h' => 16,
 | 
	
		
			
				|  |  | +		 'x' => 16, '0' => 8, '0x' => 16, '' => 10);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    my %syms = ();
 | 
	
		
			
				|  |  | +    open(my $f, '<', $file)
 | 
	
		
			
				|  |  | +	or die "$0: $file: $!\n";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    while (defined(my $l = <$f>)) {
 | 
	
		
			
				|  |  | +	chomp $l;
 | 
	
		
			
				|  |  | +	while ($l =~ /\/$/) {
 | 
	
		
			
				|  |  | +	    my $ll = <$f>;
 | 
	
		
			
				|  |  | +	    last unless (defined($ll));
 | 
	
		
			
				|  |  | +	    chomp $ll;
 | 
	
		
			
				|  |  | +	    $l = substr($l,0,-1) . $ll;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	$l =~ s/\/\/.*$//;
 | 
	
		
			
				|  |  | +	$l =~ s/\/\*.*?\*\///g;
 | 
	
		
			
				|  |  | +	if ($l =~ /^\s*[\`\#]\s*define\s+\`?([[:alpha:]_]\w*)\s+(.*?)\s*$/) {
 | 
	
		
			
				|  |  | +	    $syms{$1} = $2;
 | 
	
		
			
				|  |  | +	} elsif ($l =~ /^\s*[\`\#]\s*undef\s+\`?([[:alpha:]_]\w*)/) {
 | 
	
		
			
				|  |  | +	    delete $syms{$1};
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    close($f);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    foreach my $s (keys %syms) {
 | 
	
		
			
				|  |  | +	my $e = $syms{$s};
 | 
	
		
			
				|  |  | +	my $o = '';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	# Don't try to evaluate if...
 | 
	
		
			
				|  |  | +	next if ($e =~ /[\"\$\@\[\{\\]/);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	$e =~ s/\`//g;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	while ($e =~ /^(.*?)\b[0-9]*\'([bhod])([0-9a-f_]+)\b(.*)$/i ||
 | 
	
		
			
				|  |  | +	       $e =~ /^(.*?)\b()(0[0-7_]+|0b[0-1_]+|0x[0-9a-f_]+)\b(.*)$/i) {
 | 
	
		
			
				|  |  | +	    $e = $4;
 | 
	
		
			
				|  |  | +	    $o .= $1;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	    my $base = lc($2);
 | 
	
		
			
				|  |  | +	    my $dig = $3;
 | 
	
		
			
				|  |  | +	    $dig =~ s/_//g;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	    if ($base ne '') {
 | 
	
		
			
				|  |  | +		$base = $bases{$base};
 | 
	
		
			
				|  |  | +	    } elsif ($dig =~ /^0x/i) {
 | 
	
		
			
				|  |  | +		$base = 16;
 | 
	
		
			
				|  |  | +	    } elsif ($dig =~ /^0b/i) {
 | 
	
		
			
				|  |  | +		$base = 2;
 | 
	
		
			
				|  |  | +	    } elsif ($dig =~ /^0/) {
 | 
	
		
			
				|  |  | +		$base = 8;
 | 
	
		
			
				|  |  | +	    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	    $o .= Math::BigInt::from_base($dig, $base)->bstr();
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	$syms{$s} = $o.$e;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    foreach my $s (keys %syms) {
 | 
	
		
			
				|  |  | +	my $e = $syms{$s};
 | 
	
		
			
				|  |  | +	my $o = '';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	while ($e =~ /^(.*?)\b\`?([[:alpha:]_]\w*)\b(.*)$/) {
 | 
	
		
			
				|  |  | +	    $e = $3;
 | 
	
		
			
				|  |  | +	    $o .= $1;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	    if (defined($syms{$2})) {
 | 
	
		
			
				|  |  | +		$e = $syms{$2} . $e;
 | 
	
		
			
				|  |  | +	    } else {
 | 
	
		
			
				|  |  | +		$o .= $2;
 | 
	
		
			
				|  |  | +	    }
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	$syms{$s} = eval("{ use bigint; return ($o$e); }");
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return %syms;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +1;
 |