MarginCalc.pl 2.47 KB
#!/usr/local/bin/perl
#use strict;

my $filename;
my $argc = @ARGV;
if($argc < 1 || $argc > 4)
{
    print "Error: Please give correct arguments...\nMarginCal.pl LIS_FILE_PATH ROM_SIZE RAM_DEDUCTION (output_tag)\n";
    exit 1;
}
my $filename = @ARGV[0];
my $ROM_size = @ARGV[1];
my $RAM_deduction = @ARGV[2];
my $output_tag = @ARGV[3];
#print "argc=$argc\n";
if ($argc ==1)
{
	$ROM_size = 0;
	$RAM_deduction = 0;
}
elsif ($argc == 2)
{
	$RAM_deduction = 0;
}
elsif ($argc == 4)
{
	print "\<$output_tag\>\n";
}

my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $mtime, $ctime, $blksize, $blocks) = stat($filename);
open FILE, "<$filename" or die "$!";
seek FILE, $size-30*1024*1024, 0;
my $previous_base;
my $previous_size;
my $current_base;
my $current_size;
my $ram_margin_calculated = 0;
$real_filename = substr($filename, rindex($filename, '\\')+1);
print "In $real_filename:\n";
while (<FILE>)
{
    my $data = $_;
    if($ram_margin_calculated == 0 && $data =~ m/.*Execution Region (.*) .*Base: (\w+).*Size: (\w+)/)
    {
        $previous_base = $current_base;
        $previous_size = $current_size;
        $current_base = $2;
        $current_size = $3;
        
        if($1 =~ /CACHED_DUMMY_END/)
        {
            #print "previous_base: $previous_base\n";
            #print "previous_size: $previous_size\n";
            #print "current_base: $current_base\n";
            #print "current_size: $current_size\n";
            my $ret = (hex $current_base) - (hex $previous_base) - (hex $previous_size);
            $margin = $ret - ($RAM_deduction*1024*1024);
            my $margin_inK = sprintf("%0.2f", $margin/1024);
            my $margin_inM = sprintf("%0.2f", $margin/1024/1024);
            print "RAM Margin: $margin($margin_inK KB/ $margin_inM MB)\n";
            $ram_margin_calculated = 1;
        }
    }
    elsif($ram_margin_calculated == 1 && $data =~ m/.*Total ROM Size \(Code \+ RO Data \+ RW Data\) *(\d+)/)
    {
        my $ret = $1;
        $ret = ($ROM_size*1024*1024) - $ret; 
        my $ret_inK = sprintf("%0.2f", $ret/1024);
        my $ret_inM = sprintf("%0.2f", $ret/1024/1024);
		my $rom_usage = $1;
		my $rom_usage_inK = sprintf("%0.2f", $rom_usage/1024);
        my $rom_usage_inM = sprintf("%0.2f", $rom_usage/1024/1024);
        print "ROM Usage: $rom_usage($rom_usage_inK KB/ $rom_usage_inM MB)\n";
        if($ROM_size >0)
        {
        	print "ROM Margin: $ret($ret_inK KB/ $ret_inM MB)\n";
        }
        Last;
    }
}
close FILE;
print "Done!\n";