Skip to content
Snippets Groups Projects
Commit 1e753467 authored by Pepping's avatar Pepping
Browse files

Fixed for statistics read-out

parent cc64cacc
No related branches found
No related tags found
No related merge requests found
#! /usr/bin/env python
###############################################################################
#
# Copyright (C) 2012
# ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
"""Test case for the apertif_unb1_correlator_mesh_distr_ref design.
Description:
Usage:
> python tc_apertif_unb1_correlator_mesh_distr_ref.py --gn 0:7 --sim
"""
###############################################################################
# System imports
import test_case
import node_io
import unb_apertif as apr
import pi_diag_block_gen
import pi_diag_data_buffer
import pi_st_sst
import pi_diag_wg_wideband
import pi_bsn_source
import pi_bsn_monitor
import pi_ppsh
import pi_st_sst
import dsp_test
import sys, os
import subprocess
import time
import pi_bsn_scheduler
import pi_fil_ppf_w
import pi_ss_ss_wide
import pi_bf_bf
import pylab as pl
import numpy as np
import scipy as sp
import random
from tools import *
from common import *
import mem_init_file
from common import *
from common_dsp import *
###############################################################################
# Setup
c_nof_regs_per_stat = 2 # The number of registers used for one statistic value
c_nof_streams = 1
c_fft_size = 64
c_nof_chan = 2
# Create a test case object
tc = test_case.Testcase('TB - ', '')
# Constants/Generics that are shared between VHDL and Python
# Name Value Default Description
# START_VHDL_GENERICS
g_nof_input_streams = 12 # 16
g_blocks_per_sync = 16 #32 # 781250
# Define settings for the block generator
c_bg_nof_streams = g_nof_input_streams
c_bg_ram_size = 128
c_db_nof_streams = g_nof_input_streams
c_db_ram_size = 8
c_samples_per_packet = 128
c_gapsize = 64
c_mem_low_addr = 0
c_mem_high_addr = c_samples_per_packet-1
c_bsn_init = 42
c_in_dat_w = 8
c_nof_read_back_samples = 1
c_nof_10GbE_streams = 3
c_nof_lanes = 4
c_nof_regs_per_stat = 2 # The number of registers used for one statistic value
c_write_bg_data = False
c_write_bg_data_to_file = False
tc.append_log(3, '>>>')
tc.append_log(1, '>>> Title : Test script for apertif_unb1_correlator_mesh_distr_ref' )
tc.set_result('PASSED')
tc.append_log(3, '>>>')
tc.append_log(1, '>>> Title : Test bench for bn_filterbank design')
tc.append_log(3, '>>>')
tc.append_log(3, '')
tc.set_result('PASSED')
# Create access object for nodes
io = node_io.NodeIO(tc.nodeImages, tc.base_ip)
# Create block generator instance
bg = pi_diag_block_gen.PiDiagBlockGen(tc, io, g_nof_input_streams, c_bg_ram_size, instanceName='INPUT')
# Create databuffer instances
db_proc = pi_diag_data_buffer.PiDiagDataBuffer(tc, io, instanceName = 'PROC', nofStreams=c_db_nof_streams, ramSizePerStream=c_db_ram_size)
# Create bsn-monitor instance
bsn = pi_bsn_monitor.PiBsnMonitor(tc, io, nofStreams=2)
# - Create statistics instance
st = pi_st_sst.PiStSst(tc, io, g_nof_input_streams, c_samples_per_packet, c_nof_regs_per_stat)
# Create dsp_test instance for helpful methods
dsp_test_bg = dsp_test.DspTest(inDatW=c_in_dat_w)
pps = pi_ppsh.PiPpsh(tc, io, nodeNr=tc.nodeFnNrs)
if __name__ == "__main__":
################################################################################
##
## Initialize the blockgenerators
##
################################################################################
# - Write settings to the block generator
tc.append_log(3, '>>>')
tc.append_log(3, '>>> Write settings to the block generator')
tc.append_log(3, '>>>')
bg.write_block_gen_settings(c_samples_per_packet, g_blocks_per_sync, c_gapsize, c_mem_low_addr, c_mem_high_addr, c_bsn_init)
# - Create a list with the input data and write it to the RAMs of the block generator
tc.append_log(3, '>>>')
tc.append_log(3, '>>> Write data to the waveform RAM of all channels')
tc.append_log(3, '>>>')
inputData = []
dataList=[]
for h in range(tc.nofNodes):
nodeData = []
for i in xrange(c_nof_10GbE_streams): #3
for j in xrange(c_nof_lanes): #4
data = []
for k in xrange(0, c_samples_per_packet):
real = (c_nof_10GbE_streams*h + i) & (2**c_in_dat_w-1) # Telescope-stream number [23:0] in real part. Used as source-identifier.
imag = (2*j+ (k % 2)) & (2**c_in_dat_w-1) # Alternatng destination number in imag part: (0,1) (2,3) 4,5) (6,7)
data.append((imag << c_in_dat_w) + real)
nodeData.append(data)
dataList.append(nodeData)
for i in dataList:
print i
inputData = []
in_h = 0
for h in tc.nodeNrs:
for i in xrange(g_nof_input_streams):
if c_write_bg_data == True:
bg.write_waveform_ram(dataList[in_h][i], i, [h])
if c_write_bg_data_to_file == True:
filename = "../../src/hex/node" + str(h) + "/bg_in_data_mesh_distr_" + str(i) + ".hex"
mem_init_file.list_to_hex(list_in=dataList[in_h][i], filename=filename, mem_width=c_nof_complex*c_in_dat_w, mem_depth=2**(ceil_log2(c_bg_ram_size)))
dataListComplex = bg.convert_concatenated_to_complex(dataList[in_h][i], c_in_dat_w)
inputData.append(dataListComplex)
in_h = in_h+1
# - Enable the block generator
tc.append_log(3, '>>>')
tc.append_log(3, '>>> Start the block generator')
tc.append_log(3, '>>>')
tc.append_log(3, '')
bg.write_enable_pps()
# bsn.read_bsn_monitor(0)
# bsn.read_bsn_monitor(1)
do_until_ge(db_proc.read_nof_words, ms_retry=3000, val=c_db_ram_size, s_timeout=3600)
# bsn.read_bsn_monitor(0)
# bsn.read_bsn_monitor(1)
###############################################################################
#
# Read data from data buffer
#
###############################################################################
db_out = []
for i in range(c_bg_nof_streams):
db_out.append(flatten(db_proc.read_data_buffer(streamNr=i, n=c_nof_read_back_samples, radix='uns', width=c_nof_complex*c_in_dat_w, nofColumns=8)))
###############################################################################
#
# Verify data
#
###############################################################################
tc.append_log(0, 'The Real output ')
for i in db_out:
db_re = []
for j in i:
real = j & 0xFF
db_re.append(real)
tc.append_log(0, '%s' % str(db_re))
tc.append_log(3, '')
tc.append_log(0, 'The Imaginary output ')
for i in db_out:
db_im = []
for j in i:
imag = (j & 0xFF00) >> c_in_dat_w
db_im.append(imag)
tc.append_log(0, '%s' % str(db_im))
# tc.append_log(0, '%s' % str((i & 0xFF00) >> c_in_dat_w))
# bsn.read_bsn_monitor(0)
# bsn.read_bsn_monitor(1)
# for i in range(c_bg_nof_streams):
# for j in range(tc.nofNodes):
# for k in range(c_nof_read_back_samples):
# if db_out_re[i][j*c_nof_read_back_samples + k] != i:
# tc.append_log(1, 'Error in real part. Expected %d. Received %d', (i,db_out_re[i][j*c_nof_read_back_samples + k]))
# tc.set_result('FAILED')
# if j < 4:
# if db_out_im[i][j*c_nof_read_back_samples + k] != j*2:
# tc.append_log(1, 'Error in imag part. Expected %d. Received %d', (j*2,db_out_im[i][j*c_nof_read_back_samples + k]))
# tc.set_result('FAILED')
# else:
# if db_out_im[i][j*c_nof_read_back_samples + k] != j*2+1:
# tc.append_log(1, 'Error in imag part. Expected %d. Received %d', (j*2+1,db_out_im[i][j*c_nof_read_back_samples + k]))
# tc.set_result('FAILED')
###############################################################################
# End
tc.set_section_id('')
tc.append_log(3, '')
tc.append_log(3, '>>>')
tc.append_log(0, '>>> Test bench result: %s' % tc.get_result())
tc.append_log(3, '>>>')
sys.exit(tc.get_result())
#def __init__(self, tc, io, nofStats=256, statDataWidth=56, nofRegsPerStat=2, xstEnable=False, instanceNr = 0, nodeNr=None):
# - Create statistics instance
cst = []
for i in xrange(c_nof_streams):
cst.append( pi_st_sst.PiStSst(tc, io, c_fft_size*c_nof_chan, 56, c_nof_regs_per_stat, False, i, tc.nodeBnNrs))
# Create bsn-monitor instance
bsn_input = pi_bsn_monitor.PiBsnMonitor(tc, io, instanceName='INPUT', nofStreams=3)
bsn_proc = pi_bsn_monitor.PiBsnMonitor(tc, io, instanceName='PROC', nofStreams=4)
# - Create filter instance
#fil = pi_fil_ppf_w.PiFilPpfw(tc, io, apr.c_nof_input_signals_per_bn, c_nof_taps, c_fft_size, apr.c_wb_factor)
# - Read statistics
tc.append_log(3, '>>>')
tc.append_log(3, '>>> Read BSN monitors ')
tc.append_log(3, '>>>')
tc.append_log(3, '')
#bsn_input.read_bsn_monitor(0)
#bsn_input.read_bsn_monitor(1)
#bsn_input.read_bsn_monitor(2)
#
#bsn_proc.read_bsn_monitor(0)
#bsn_proc.read_bsn_monitor(1)
#bsn_proc.read_bsn_monitor(2)
#bsn_proc.read_bsn_monitor(3)
# - Read statistics
tc.append_log(3, '>>>')
tc.append_log(3, '>>> Read Statistics for first instance')
tc.append_log(3, '>>>')
tc.append_log(3, '')
data = []
for k in range(c_nof_streams):
data.append(cst[k].read_stats(return_complex=False));
print data
tc.append_log(3, '')
spectrum1 = []
spectrum2 = []
for l in range(c_fft_size):
spectrum1.append(float(data[0][0][2*l]+1));
spectrum2.append(float(data[0][0][2*l+1]+1));
#spectrum3 = []
#spectrum4 = []
#for k in range(apr.c_wb_factor):
# for l in range(c_fft_size/8):
# spectrum3.append(float(data[4+k][0][2*l]+1));
# spectrum4.append(float(data[4+k][0][2*l+1]+1));
print len(spectrum1)
print spectrum1
spectrum1_reordered = fft_reorder(spectrum1)
spectrum2_reordered = fft_reorder(spectrum2)
print spectrum1_reordered
spectrum_log1 = []
spectrum_log2 = []
#spectrum_log3 = []
#spectrum_log4 = []
for k in range(c_fft_size):
spectrum_log1.append(10*math.log10(spectrum1_reordered[k]))
spectrum_log2.append(10*math.log10(spectrum2_reordered[k]))
## spectrum_log3.append(10*math.log10(spectrum3[k]))
## spectrum_log4.append(10*math.log10(spectrum4[k]))
f_as = []
for k in range(c_fft_size):
# f_as.append(k*0.781250/(c_fft_size))
f_as.append(k)
pl.figure(1)
pl.plot(f_as, spectrum_log1)
pl.grid(True)
pl.xlabel('Channel index')
pl.ylabel('channel power')
pl.figure(2)
pl.plot(f_as, spectrum_log2)
pl.grid(True)
pl.xlabel('Channel index')
pl.ylabel('channel power')
##pl.figure(3)
##pl.plot(f_as, spectrum_log3)
##pl.grid(True)
##pl.xlabel('frequency in Mhz')
##pl.ylabel('statistics')
##
##pl.figure(4)
##pl.plot(f_as, spectrum_log4)
##pl.grid(True)
##pl.xlabel('frequency in Mhz')
##pl.ylabel('statistics')
#
pl.show()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment