#!/usr/bin/perl

#     28  29
#   39  30  35
# 33  34  38  36
#   32  31  37

open IN,$ARGV[0];

@writelist=(102,103,104,116);
@readlist=(217);
@nimbilist=(102,103,104);
for($i=270;$i<544;$i++)
{
  push @readlist, $i;
  push @nimbilist, $i;
}

%addrtext = ( 102 => "c: stilling", 103 => "c1: blink", 104 => "c2: " );

%writehash = map { $_ => 1 } @writelist;
%readhash = map { $_ => 1 } @readlist;
%nimbihash = map { $_ => 1 } @nimbilist;
$lastMQ=0;
$OA=0;
$OB=0;
$lastOA=0;
$lastOB=0;
$OAcount=0;
$OBcount=0;

for($i=0;$i<1024;$i++)
{
  $cells[$i] = -1;
}

sub nimbiprint
{
  my $value=shift;
  my $mask = 1;
  for(my $i=39; $i>=28; $i--)
  {
    $nimbi[$i] = (($value&$mask)!=0)?1:0;
    $mask *= 2;
  }
#       x x
#      x x x
#     x x x x
#      x x x
  print "-------\n";
  print "  ".$nimbi[28]." ".$nimbi[29]."\n";
  print " ".$nimbi[39]." ".$nimbi[30]." ".$nimbi[35]."\n";
  print $nimbi[33]." ".$nimbi[34]." ".$nimbi[38]." ".$nimbi[36]."\n";
  print " ".$nimbi[32]." ".$nimbi[31]." ".$nimbi[37]."\n";
  print "-------\n";
}

sub quad
{
  my ($value,$v1,$v2,$v3,$v4);
  $value = shift;
  $v4=$value & 1023;
  $value=$value>>10;
  $v3=$value & 1023;
  $value=$value>>10;
  $v2=$value & 1023;
  $value=$value>>10;
  $v1=$value & 1023;
  return sprintf("%d/%d/%d/%d",$v1,$v2,$v3,$v4);
}
while($l=<IN>)
{
  chomp($l);
  if($l =~ /^Execute/)
  {
    print "$l\n";
  }
  if($l =~ /OA: (\d) OB: (\d) /)
  {
    $OA = $1;
    $OB = $2;
  }
  if($l =~ /^   MQ: \d \d+ \d+ \d+ \d+ \d+ \s+(\d+) /)
  {
    $MQ = $1;
  }
  if($l =~ /^Writing (\d+): (\d+) = /)
  {
    $cell = $1;
    $value = $2;
    if(exists($addrtext{$cell}))
    {
      $celltext = $cell." ".$addrtext{$cell};
    }
    else
    {
      $celltext = $cell;
    }
#   print "$celltext $value\n";
    if(exists($writehash{$cell}))
    {
      if($cells[$cell] != $value)
      {
	print " - [$celltext] = $value: ".quad($value)." OBcount: $OBcount\n";
	if(exists($nimbihash{$cell}))
	{
	  nimbiprint($value);
	}
	$cells[$cell] = $value;
      }
    }
  }
  if($l =~ /^Reading (\d+): (\d+) \d+ = /)
  {
    $cell = $1;
    $value = $2;
    if(exists($addrtext{$cell}))
    {
      $celltext = $cell." ".$addrtext{$cell};
    }
    else
    {
      $celltext = $cell;
    }
#   print "read: $cell $value\n";
    if(exists($readhash{$cell}))
    {
      print " - Read [$celltext]: $value: ".quad($value)." OBcount: $OBcount\n";
      if(exists($nimbihash{$cell}))
      {
	nimbiprint($value);
      }
    }
  }
  if($MQ != $lastMQ || $OA != $lastOA || $OB != $lastOB)
  {
    if($OA && !$lastOA)
    {
      $OAcount++;
    }
    if($OB && !$lastOB)
    {
      $OBcount++;
    }
    print "MQ: $MQ OA: $OA OB: $OB OBcount: $OBcount\n";
    nimbiprint($MQ);
    $lastMQ = $MQ;
    $lastOA = $OA;
    $lastOB = $OB;
  }
}

