#!/usr/bin/perl

use Data::Dumper;
use Bit::Fast qw(popcount popcountl);

sub abs40
{
  my $x=$_[0];
  if($x<0)
  {
    $x = $x+1099511627776;
  }
  return($x);
}

sub analyze
{
  my $addr = $_[0];
  my $word = $_[1];
  if(popcountl($word)==1)
  {
    $m=1;
    for($i=39;$i>=0;$i--)
    {
      if($word == $m)
      {
	$old = substr($cell->{$addr},$i,1);
	if($old ne "0")
	{
	  print "UAKK! $addr $i $bitchar ".$cell->{$addr}."\n";
	  substr($cell->{$addr},$i,1)="?";
	  print "UAKK 2!         ".$cell->{$addr}."\n";
	}
	else
	{
	  substr($cell->{$addr},$i,1)=$bitchar;
	}
	last;
      }
      $m=$m*2;
    }
  }
}

for($i=0;$i<1024;$i++)
{
  $a0 = sprintf("%04d",$i);
  $a0h = sprintf("%04dh",$i);
  $trace->{$a0}=0;
  $trace->{$a0h}=0;
  $cell->{$a0} = "0000000000000000000000000000000000000000";
  $cell->{$a0h} = "0000000000000000000000000000000000000000";
}
$nbit = 12;
$chars = "123456789abc";

$MQ=0;
$AC=0;
$started=0;
$first = "ck 27";
$first = "tk 22";
$first = "hs r7";
$last = "gr p-1";
$baseaddr=0;

while($l = <>)
{
  chomp($l);
  if($l =~ /^   AC: \d \d{10} \d{10} \d{10} \d{10} \d{2} +(-{0,1}\d+) /)
  {
    $AC=abs40($1);
  }
  elsif($l =~ /^   MQ: \d \d{10} \d{10} \d{10} \d{10} \d{2} +(-{0,1}\d+) /)
  {
    $MQ=abs40($1);
  }
  elsif($l =~ /^Execute\[(\d+h{0,1})\]: (.*?) +clock:/)
  {
    $addr = $1;
    $instr = $2;
    $a0 = sprintf("%04d",$addr);
    $two = index($instr,",") != -1;
    $h = index($addr,"h") != -1;
    if($two)
    {
      if($h)
      {
	$addr = substr($addr,0,-1);
	$a0 = sprintf("%04dh",$addr-$baseaddr);
	if($instr =~ /^(.*?), (.*)$/)
	{
	  $instr = $2;
	}
      }
      else
      {
	$a0 = sprintf("%04d",$addr-$baseaddr);
	if($instr =~ /^(.*?), (.*)$/)
	{
	  $instr = $1;
	}
      }
    }
    else
    {
      $a0 = sprintf("%04d",$addr-$baseaddr);
    }
    print "'$addr' '$a0' '$instr' '$AC' '$MQ'\n";
    if($instr eq $first)
    {
      print "STARTED\n";
      $started=1;
      $baseaddr=int($addr);
      if($h)
      {
	$a0 = "0000h";
      }
      else
      {
	$a0 = "0000";
      }
      print "baseaddr: $baseaddr\n";
      $word1=$AC;
      $i=0;
      $j=$nbit;
      $m=1;
      $bitchar = "?";
      for($i=0; $i<$nbit; $i++)
      {
	if($word1==$m)
	{
	  $bitchar=substr($chars,$nbit-1-$i,1);
	  last;
	}
	$m = $m*2;
      }
      print "word1: $word1 bitchar: $bitchar\n";
    }
    if($started)
    {
      analyze($a0, $AC);
    }
    if($started && $instr eq $last)
    {
      print "STOPPED\n";
      $started=0;
    }
  }
  elsif($started && $l =~ /^Writing (\d+): (\d+) /)
  {
    $a0 = sprintf("%04d",$1-$baseaddr);
    $word = abs40($2);
    analyze($a0, $word);
  }
}

foreach $addr (sort keys %$cell)
{
  $word = $cell->{$addr};
  if($word ne "0000000000000000000000000000000000000000")
  {
    printf "%-5s ",$addr;
    print "$word\n";
  }
}

