114 lines
2.2 KiB
Perl
114 lines
2.2 KiB
Perl
#!/usr/bin/perl
|
|
use List::Util 'max';
|
|
use warnings;
|
|
use strict;
|
|
|
|
my $filename = shift || die("Please provide a input STL file");
|
|
|
|
my $numberOfRows = 16384;
|
|
my $numberOfBanks = 8;
|
|
my $numberOfColumns = 1024;
|
|
|
|
my $numberOfRowBits = log($numberOfRows)/log(2);
|
|
my $numberOfBankBits = log($numberOfBanks)/log(2);
|
|
my $numberOfColumnBits = log($numberOfColumns)/log(2);
|
|
|
|
open(FH, "$filename");
|
|
|
|
my @activityCounter;
|
|
my @mapping;
|
|
|
|
for(my $i = 0; $i < 32; $i++)
|
|
{
|
|
$activityCounter[$i] = 0;
|
|
$mapping[$i] = "X";
|
|
}
|
|
|
|
my $old_address = "00000000000000000000000000000000";
|
|
|
|
while(<FH>)
|
|
{
|
|
# Get the adress:
|
|
$_ =~ /\d+:\s+\w+\s+0x([\w\d]+)\s*[\d\w]*/;
|
|
my $address = $1;
|
|
$address = sprintf( "%032b", hex( $address ) );
|
|
|
|
# $i = 0 :: most significant bit
|
|
for(my $i = 0; $i < 32; $i++)
|
|
{
|
|
my $new = substr($address, $i, 1);
|
|
my $old = substr($old_address, $i, 1);
|
|
|
|
if($new ne $old)
|
|
{
|
|
$activityCounter[31-$i]++;
|
|
}
|
|
}
|
|
|
|
$old_address = $address;
|
|
}
|
|
|
|
# Print bit numbers:
|
|
print "Bits\t";
|
|
for(my $i = 31; $i >= 0; $i--)
|
|
{
|
|
print $i."\t";
|
|
}
|
|
|
|
#Print Activity
|
|
print "\nActivity\t";
|
|
for(my $i = 31; $i >= 0; $i--)
|
|
{
|
|
print $activityCounter[$i]."\t";
|
|
}
|
|
|
|
#Print relative Activity
|
|
print "\nPercent\t";
|
|
my $sum = 0;
|
|
for(my $i = 31; $i >= 0; $i--)
|
|
{
|
|
$sum = $sum + $activityCounter[$i];
|
|
}
|
|
for(my $i = 31; $i >= 0; $i--)
|
|
{
|
|
my $string = $activityCounter[$i]/$sum."\t";
|
|
$string =~ s/\./,/g;
|
|
print $string;
|
|
}
|
|
|
|
#Search Bank Locations
|
|
for(my $i = 0; $i < $numberOfBankBits; $i++)
|
|
{
|
|
my $maximum = max(@activityCounter);
|
|
my ($index) = grep $activityCounter[$_] == $maximum , 0.. $#activityCounter;
|
|
$mapping[$index] = "B$i";
|
|
$activityCounter[$index] = -1;
|
|
}
|
|
|
|
#Search Column Locations
|
|
for(my $i = 0; $i < $numberOfColumnBits; $i++)
|
|
{
|
|
my $maximum = max(@activityCounter);
|
|
my ($index) = grep $activityCounter[$_] == $maximum , 0.. $#activityCounter;
|
|
$mapping[$index] = "C$i";
|
|
$activityCounter[$index] = -1;
|
|
}
|
|
|
|
#Search Row Locations
|
|
for(my $i = 0; $i < $numberOfRowBits; $i++)
|
|
{
|
|
my $maximum = max(@activityCounter);
|
|
my ($index) = grep $activityCounter[$_] == $maximum , 0.. $#activityCounter;
|
|
$mapping[$index] = "R$i";
|
|
$activityCounter[$index] = -1;
|
|
}
|
|
|
|
#Print final mapping
|
|
print "\nMapping\t";
|
|
my $maximum = max(@activityCounter);
|
|
for(my $i = 31; $i >= 0; $i--)
|
|
{
|
|
print $mapping[$i]."\t";
|
|
}
|
|
print "\n";
|