# Links * * [Pypowersim](https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=src/openpower/decoder/isa/pypowersim.py) * [Media directory](https://git.libre-soc.org/?p=openpower-isa.git;a=tree;f=media;hb=HEAD) * [MP3 test directory](https://git.libre-soc.org/?p=openpower-isa.git;a=tree;f=media/audio/mp3;hb=HEAD) # Pypowersim Guide These are multimedia tests intended to cover the inner loops of various Audio/Video CODECs (such as MP3). **Note:** There's no GUI, UART, or console. To check that the tests ran succesfully, you need to dump the memory contents and inspect them. ## Pypowersim - PowerISA Simulator Pypowersim is a PowerISA simulator written and Python. PowerISA binaries are decoded by a given ISA class instance. SVP64 binaries are also supported. Simulation is managed cycle by cycle, for instruction and memory debugging. Use of QEMU as a co-simulator is also supported for verifying the binaries run identically. To find out about input arg information, run the script with "-h/--help" or no arguments to get the help message: * python3 openpower-isa/src/openpower/decoder/isa/pypowersim.py ## Tests ### About The tests consist of running Pypowersim with several input arg's: * ".gpr" text file for initialising the General Purpose (integer) Registers * ".spr" text file for initialising the Special Purpose Registers * Initialising the Program Counter * Loading given binaries into specified memory locations * Select which memory regions to dump to a file * Select the executable to run There are other options available (such as initialising the Floating Point Registers). for **Example GPR file**: See This file sets the GPRs to explicit values prior to execution. This allows for example a function call's parameters, according to Power ISA [ABI calling convention](https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=media/calling-conv;hb=HEAD), to be set conveniently and quickly, but more importantly without requiring execution of additional instructions. In this example below the parameters point to areas of memory that are loaded or dumped, containing the input and output areas of the function. They match up with the other parameters to the example script ``` 1 # void ff_mpadsp_apply_window_float(float *synth_buf, float *window, 2 # int *dither_state, float *samples, 3 # ptrdiff_t incr); 4 1: 0x8000 # stack pointer 5 3: 0x600000 # param 1: float *sunth_buf buf 6 4: 0x700000 # param 2: float *window win 7 5: 0x800000 # param 3: int *dither_state &unused 8 6: 0x900000 # param 3: float *samples out 9 7: 1 # param 5: ptr_diff_t incr 1 ``` **Example SPR file** See This file sets SPRs to explicit values prior to execution. In this example Link Register LR is set to 0xffffffff which on completion of the function sets PC to an invalid out-of-bounds value causing program termination. ``` 1 LR: 0xffffffff ``` **Example Execution** ``` 1 #!/bin/sh -xe 2 3 pypowersim -g audio/mp3/mp3_0.gpr \ 4 -s common.spr \ 5 -p 0x20000000 \ 6 -l data/audio/mp3/mp3_0_data/buf${1}:0x600000 \ 7 -l data/audio/mp3/mp3_0_data/win0:0x700000 \ 8 -d ${2}:0x900000:128 \ 9 -i audio/mp3/mp3_0_apply_window_float.bin ``` ### Before running the tests! **NOTE**: Is this correct? As the SVP64 spec and Libre-SOC CPU is developing, the available opcodes will grow. Make sure to update the auto-generated Python functions simulating the instructions by calling: * run "pywriter" (This is an installed utility, so should be in your PATH) ### Download audio data (**only need to do this once?**) Call the Makefile inside "openpower-isa/media" to download the audio samples: * run "make wget" ### Running both tests Run the Makefile in the "openpower-isa/media" directory with "tests" arg: * run "make tests" All the debug will go to standard output, so you may wish to direct it to a log file (the file will be **big**!). To suppress verbose debug log, uncomment "#export SILENCELOG = 1" in the Makefile. ### Running "mp3_x" tests individually Inside "openpower-isa/media" directory run: * ./audio/mp3/mp3_0.sh 0 out The "out" file will be created in the "media" directory. Change the name if you don't want the second test to overwrite the results of the first. ### Checking results If you run both tests through the makefile, the shell script automatically compares the input "sample0" file with the generated "out" file. For manual checking, you need to know where the "out" file is, and then use the "cmp" program to compare byte by byte the sample and output files. * cmp out0 data/audio/mp3/mp3_0_data/samples0 No output indicates the files are identical.