################################################################################
# tap diag assembler for OpenSPARC T1
################################################################################
open (TAP_IN, "< diag.tap") or die ("DIE. could not open diag.tap") ;
open (TAP_OUT, "> tap.cmd") or die ("DIE. could not open tap.cmd") ;
if ($line =~ /^\s*$/) { next ; }
my ($code, $addr, $data, $mask) = split (/\s+/, $line) ;
die ("DIE. Tap cmd address must be 40 bits wide at line $count") if (length ($addr) != 10) ;
die ("DIE. Tap cmd data must be 64 bits wide at line $count") if (length ($data) != 16) ;
die ("DIE. Tap cmd mask must be 64 bits wide at line $count") if (length ($mask) != 16) ;
$line = "${code}_${addr}_${data}_${mask}" ;
my ($code, $addr, $data) = split (/\s+/, $line) ;
die ("DIE. Tap cmd address must be 40 bits wide at line $count") if (length ($addr) != 10) ;
die ("DIE. Tap cmd data must be 64 bits wide at line $count") if (length ($data) != 16) ;
$line = "${code}_${addr}_${data}_ffffffffffffffff" ;
my ($code, $addr, $data, $mask) = split (/\s+/, $line) ;
die ("DIE. Tap cmd address must be 40 bits wide at line $count") if (length ($addr) != 10) ;
die ("DIE. Tap cmd data must be 64 bits wide at line $count") if (length ($data) != 16) ;
die ("DIE. Tap cmd mask must be 64 bits wide at line $count") if (length ($mask) != 16) ;
$line = "${code}_${addr}_${data}_${mask}" ;
my ($code, $addr, $data, $mask) = split (/\s+/, $line) ;
die ("DIE. Tap cmd address must be 40 bits wide at line $count") if (length ($addr) != 10) ;
die ("DIE. Tap cmd data must be 64 bits wide at line $count") if (length ($data) != 16) ;
die ("DIE. Tap cmd mask must be 64 bits wide at line $count") if (length ($mask) != 16) ;
$line = "${code}_${addr}_${data}_${mask}" ;
my ($code, $addr, $data, $mask) = split (/\s+/, $line) ;
die ("DIE. Tap cmd address must be 40 bits wide at line $count") if (length ($addr) != 10) ;
die ("DIE. Tap cmd data must be 64 bits wide at line $count") if (length ($data) != 16) ;
die ("DIE. Tap cmd mask must be 64 bits wide at line $count") if (length ($mask) != 16) ;
$line = "${code}_${addr}_${data}_${mask}" ;
$line = "b_0000000000_0000000000000000_0000000000000000" ;
elsif ($line =~ /^efc_byp/i)
$line =~ s/^efc_byp/c/i ;
my ($code, $addr, $data, $mask) = split (/\s+/, $line) ;
die ("DIE. Tap cmd address must be 40 bits wide at line $count") if (length ($addr) != 10) ;
die ("DIE. Tap cmd data must be 64 bits wide at line $count") if (length ($data) != 16) ;
die ("DIE. Tap cmd mask must be 64 bits wide at line $count") if (length ($mask) != 16) ;
$line = "${code}_${addr}_${data}_${mask}" ;
elsif ($line =~ /^bis_abrt/i)
$line = "d_0000000000_0000000000000000_0000000000000000" ;
elsif ($line =~ /^end/i) { $line = "5_0000000000_0000000000000000_0000000000000000" ; }
my ($code, $addr) = split (/\s+/, $line) ;
die ("DIE. Tap cmd address must be 40 bits wide at line $count") if (length ($addr) != 10) ;
$line = "${code}_${addr}_0000000000000000_0000000000000000" ;
elsif ($line =~ /^stc/i) ## clk stretch
my ($code, $addr) = split (/\s+/, $line) ;
die ("DIE. Tap cmd address must be 40 bits wide at line $count") if (length ($addr) != 10) ;
$line = "${code}_${addr}_0000000000000000_0000000000000000" ;
else { die ("DIE. Illegal command in diag.tap at line $count") ; }
print TAP_OUT "$line\n" ;
print TAP_OUT "5_0000000000_0000000000000000_0000000000000000\n" ;