################################################################################ # # tap diag assembler for OpenSPARC T1 # ################################################################################ # compile the tap diag 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") ; my $count = 0 ; while () { $count++ ; my $line = $_ ; $line =~ s/\/\/.*?$// ; $line =~ s/^\s+// ; $line =~ s/\s+$// ; if ($line =~ /^\s*$/) { next ; } elsif ($line =~ /^rd/i) { $line =~ s/^rdo/1/i ; $line =~ s/^rdc/2/i ; $line =~ s/^rdm/3/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 =~ /^wri/i) { $line =~ s/^wri/4/i ; 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" ; } elsif ($line =~ /^ssc/i) { $line =~ s/^ssc/8/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 =~ /^sid/i) { $line =~ s/^sid/9/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 =~ /^shs/i) { $line =~ s/^shs/a/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 =~ /^tpb/i) { $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" ; } elsif ($line =~ /^del/i) { $line =~ s/^del/7/i ; 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 { $line =~ s/^stc/6/i ; 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") ; } $line =~ s/\s+/_/g ; print TAP_OUT "$line\n" ; } # force the end command print TAP_OUT "5_0000000000_0000000000000000_0000000000000000\n" ; close (TAP_IN) ; close (TAP_OUT) ;