diff --git a/sim/testsuite/sky/ChangeLog b/sim/testsuite/sky/ChangeLog index e0d2133847..7da1bac5b7 100644 --- a/sim/testsuite/sky/ChangeLog +++ b/sim/testsuite/sky/ChangeLog @@ -1,3 +1,9 @@ +Tue Mar 17 15:41:07 1998 Frank Ch. Eigler + + * c_gen.pl: Added file from Toronto's /build directory. + * Makefile.in (C_GEN): Use local c_gen.pl script. + * ChangeLog: Added this entry. + Mon Mar 16 19:04:26 1998 Frank Ch. Eigler * tsv308_1.trc: Fixed test case as per SCEI email. diff --git a/sim/testsuite/sky/Makefile.in b/sim/testsuite/sky/Makefile.in index eb504576db..3b537c113c 100644 --- a/sim/testsuite/sky/Makefile.in +++ b/sim/testsuite/sky/Makefile.in @@ -71,7 +71,7 @@ GCC_FOR_TARGET = `\ echo $(target_alias)-gcc ; \ fi` -C_GEN = /build/sky-tools/c_gen.pl +C_GEN = perl $(srcdir)/c_gen.pl .SUFFIXES: .trc .c .run .ok .vif0out .vif0ok .vif0expect .vif1out .vif1ok .vif1expect .uu diff --git a/sim/testsuite/sky/c_gen.pl b/sim/testsuite/sky/c_gen.pl new file mode 100755 index 0000000000..c7397dc156 --- /dev/null +++ b/sim/testsuite/sky/c_gen.pl @@ -0,0 +1,260 @@ +#!/usr/local/bin/perl +# +#*********************************************************** +# +# A tool to read quad-data input and generate a +# c test-program to help testing PKE/GIF, etc. +# +# To Invoke: +# c_gen +# +# Expected input format: +# +# (indicator ) ( quad_word ) ( source_addr) (flag) +# ------------- --------------- -------------- ------------- +# n (for data) 0xH_H_H_H 0xH 4-CHARs +# ? (for test) 0xH (addr) 0xH (value) 0xH (mask) +# ! (reg wrt) 0xH (addr) 0xH (data) +# # comment line +# Note: n can be 0 (for VU1), 1 (for VU2), or 2 (for GIF). +# H is hex data in the format of FFFFFFFF +# +# +# Result output: +# A c file, either with the name specified, or default.c +# +#***********************************************************/ + + + +###################### +# Main script: +###################### + +$numargs = @ARGV; +if ( $numargs == 2 ) { + $infile_name = $ARGV[0]; + $outfile_name = $ARGV[1]; +} +elsif ( $numargs == 1) +{ + $infile_name = $ARGV[0]; + $outfile_name = "default.c" +} +else +{ + die ("Usage: c_gen \n"); +} + +# Header containing SCEI system addresses +$date=`date`; +chop($date); + +die ("Cannot open input file $infile_name.\n") + unless (open (INFILE, $infile_name)); +die ("Cannot open output file $outfile_name.\n") + unless (open (OUTFILE, ">".$outfile_name)); + +print ("The input data file is: $infile_name \n"); +print ("The output c file is: $outfile_name \n"); + +&print_header_part_of_c_code; + +$current_line_number = 0; + +#Now process the input and print the body_part_of_c_code: +while( $inputline = ) +{ + chop($inputline); # get rid of the new line char; + $current_line_number ++; + + print OUTFILE ("/* #line \"$infile_name\" $current_line_number */\n"); + if ($inputline =~ /^\#/ ) # A line starts with "#" is a comment + { + &process_comment; + } + elsif ( $inputline =~ /^\?/ ) # A line starts with "?" is a verification request + { + &perform_test; + } + elsif ( $inputline =~ /^[012]/ ) # This is a data line + { + &process_data; + } + elsif ( $inputline =~ /^\!/ ) # This is a different type of data line + { + &process_data2; + } + else # ignore this input + { + print OUTFILE ("\n"); + } +} + +&print_foot_part_of_c_code; + +close(INFILE); +close(OUTFILE); + +print ("Done!\n"); +exit(0); + + + + +################### +# Subroutines: +################### + +sub process_comment { + $inputline =~ s/#//; + print OUTFILE ("/*".$inputline."*/\n"); +} + +sub perform_test { + print OUTFILE ("\n"); + print OUTFILE ("/******************************************************************/\n"); + print OUTFILE ("/*Verify the data in the specified address with the input value: */\n\n"); + + @columns = split ( /[\s]+/, $inputline ); + + #column[1] is the address; + #column[2] is the value, in the format of oxH; + #column[3] is the mask, in the format of oxH; + + print OUTFILE ("\n{\n"); + print OUTFILE (" volatile unsigned* test_ptr = \(unsigned *\)".$columns[1].";\n"); + print OUTFILE (" unsigned test_data = *test_ptr;\n"); + print OUTFILE (" if \( \( test_data & $columns[3] \) == $columns[2] \) {\n"); + print OUTFILE (" num_passed ++;\n"); + print OUTFILE (" } else {\n"); + print OUTFILE (" printf \(\"Data Verification (line $current_line_number) failed!\\n\"\); \n" ); + print OUTFILE (" printf \(\"Expecting \%08x mask \%08x in address \%08x but got \%08x !\\n\", $columns[2], $columns[3], $columns[1], test_data\); \n"); + print OUTFILE (" num_failed++;\n"); + print OUTFILE (" }\n}\n"); + +} + +sub process_data { + print OUTFILE ("/*****************************************************************/\n"); + print OUTFILE ("/* Assign a quadword: */\n"); + + @columns = split ( /[\s]+/, $inputline ); + $data_count = @columns; + + #column[0] tells to which unit (VU0, VU1, or GIF) these data should go to. + $src_addr_name = "SRC_ADDR_CONST_".$columns[0]; + $data_addr_name = "DATA_ADDR_CONST_".$columns[0]; + $flag_addr_name = "FLAG_ADDR_CONST_".$columns[0]; + + #column[1] is the qual_word in format of 0xH_H_H_H: + @quadword = split ("_", $columns[1]); + $quadword[0] =~ s/0x//i; + + print OUTFILE ("\n{\n"); + + print OUTFILE (" volatile unsigned* flag_ptr = \(unsigned *\)$flag_addr_name;\n"); + print OUTFILE (" volatile unsigned* src_ptr = \(unsigned *\)$src_addr_name;\n"); + print OUTFILE (" volatile unsigned* data_ptr = \(unsigned *\)$data_addr_name;\n"); + + if ( $data_count > 3 ) + { #column[3] is the DMA_tag flag, if exist + $flag = $columns[3]; + if ( $flag =~ /d/i ) { + print OUTFILE (" *flag_ptr = 1;\n"); + } + else { + print OUTFILE (" *flag_ptr = 0;\n"); + } + } + + if ( $data_count > 2 ) + { + #column[2] is the src_address, if exist + $src_addr = $columns[2]; + print OUTFILE (" *src_ptr = $src_addr; \n"); + } + + #Now write the quadword: + print OUTFILE ("\n"); + print OUTFILE (" *data_ptr++ = 0x".$quadword[3].";\n"); + print OUTFILE (" *data_ptr++ = 0x".$quadword[2].";\n"); + print OUTFILE (" *data_ptr++ = 0x".$quadword[1].";\n"); + print OUTFILE (" *data_ptr = 0x".$quadword[0].";\n"); + print OUTFILE (" num_qw_written ++;\n"); + print OUTFILE ("\n"); + + print OUTFILE (" *flag_ptr = 0;\n") unless ($data_count < 4); + print OUTFILE (" *src_ptr = 0;\n") unless ( $data_count < 3); + print OUTFILE ("}\n"); +} + + +sub process_data2 { + print OUTFILE ("\n"); + print OUTFILE ("/******************************************************************/\n"); + print OUTFILE ("/*Writing the specified data into the specified address: */\n\n"); + + @columns = split ( /[\s]+/, $inputline ); + + #column[1] is the address, column[2] is the value, both in the format of oxH; + + print OUTFILE ("\n{\n"); + print OUTFILE (" volatile unsigned* addr_ptr = \(unsigned *\)".$columns[1].";\n"); + print OUTFILE (" *addr_ptr = ".$columns[2].";\n"); + print OUTFILE (" num_w_written ++;\n"); + print OUTFILE ("}\n"); + +} + + + +sub print_header_part_of_c_code { + +print OUTFILE ("\n/*"); +print OUTFILE ("\n * This file is automatically generated."); +$version='$Revision$ $Date$'; +print OUTFILE ("\n * c_gen.pl $version"); +print OUTFILE ("\n * Input file: $infile_name"); +print OUTFILE ("\n * Date: $date"); +print OUTFILE ("\n */"); +print OUTFILE ("\n"); +print OUTFILE ("\n#include \n"); +print OUTFILE ("\n"); +print OUTFILE (" +/* Memory mapping constants: */ + +/* VIF0 */ +#define SRC_ADDR_CONST_0 0x10008010 +#define DATA_ADDR_CONST_0 0x10004000 +#define FLAG_ADDR_CONST_0 0x10008060 + +/* VIF1 */ +#define SRC_ADDR_CONST_1 0x10009010 +#define DATA_ADDR_CONST_1 0x10005000 +#define FLAG_ADDR_CONST_1 0x10009060 + +/* GIF */ +#define SRC_ADDR_CONST_2 0x1000a010 +#define DATA_ADDR_CONST_2 0x10006000 +#define FLAG_ADDR_CONST_2 0x1000a060 +"); +print OUTFILE ("\n\n"); + +print OUTFILE ("int main()\n"); +print OUTFILE ("{\n"); +print OUTFILE (" unsigned num_qw_written = 0;\n"); +print OUTFILE (" unsigned num_w_written = 0;\n"); +print OUTFILE (" unsigned num_passed = 0;\n"); +print OUTFILE (" unsigned num_failed = 0;\n"); +print OUTFILE (" printf \(\"Start of execution...\\n\"\); \n" ); +print OUTFILE ("\n\n"); +} + +sub print_foot_part_of_c_code { + +print OUTFILE ("\n"); +print OUTFILE (" printf \(\"End of execution. %d FIFO quadwords, %d pokes, %d checks ok, %d failed.\\n\", num_qw_written, num_w_written, num_passed, num_failed\); \n\n" ); +print OUTFILE ("exit (num_failed);\n"); +print OUTFILE ("}\n"); +}