#!/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() { # 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";