diff --git a/testing/test1.sh b/testing/test1.sh index ad9a0e481e981699d91d82fb28d78a5c0564dc9a..d8c212f15d2337f6131a186fd15ccce71f30a62b 100755 --- a/testing/test1.sh +++ b/testing/test1.sh @@ -145,3 +145,5 @@ done echo '*** Filters' python3 testFilters.py +echo '*** Control Tables' +python3 testTables.py diff --git a/testing/testFilters.py b/testing/testFilters.py index 74703c7c9819eb9573029d007f0d5836531d539c..d4bb5200519b6c588992fc2f3c838164ed8f9933 100644 --- a/testing/testFilters.py +++ b/testing/testFilters.py @@ -45,7 +45,7 @@ def readReg(board, reg): return ret -def flot2Qmn(val, m, n, signed): +def float2Qmn(val, m, n, signed): pow_2_frac_bits = float(0x1 << n) pow_2_frac_bits_int_bits = float(0x1 << (m + n)) @@ -102,9 +102,9 @@ class TestLowPass(unittest.TestCase): res = self.calc_consts(cutoff, fsamp, n) - a = flot2Qmn(res[0], 1, 15, 1) + a = float2Qmn(res[0], 1, 15, 1) self.assertNotEqual(a, nan) - b = flot2Qmn(res[1], 1, 15, 1) + b = float2Qmn(res[1], 1, 15, 1) self.assertNotEqual(b, nan) a = hex(a) @@ -151,13 +151,13 @@ class TestNotch(unittest.TestCase): res = self.calc_consts(bwidth, freq, fsamp, n) - areal = flot2Qmn(res[0], 1, 15, 1) + areal = float2Qmn(res[0], 1, 15, 1) self.assertNotEqual(areal, nan) - aimag = flot2Qmn(res[1], 1, 15, 1) + aimag = float2Qmn(res[1], 1, 15, 1) self.assertNotEqual(aimag, nan) - breal = flot2Qmn(res[2], 1, 15, 1) + breal = float2Qmn(res[2], 1, 15, 1) self.assertNotEqual(breal, nan) - bimag = flot2Qmn(res[3], 1, 15, 1) + bimag = float2Qmn(res[3], 1, 15, 1) self.assertNotEqual(bimag, nan) reg1exp = hex((areal << 16) | aimag) diff --git a/testing/testTables.py b/testing/testTables.py new file mode 100644 index 0000000000000000000000000000000000000000..41000a1b1c0dc964dce12e1fcb9af8ff61b16f40 --- /dev/null +++ b/testing/testTables.py @@ -0,0 +1,207 @@ +#!/usr/bin/env python3 + +import unittest +from random import random, randint +from os import system, environ, popen + +from testFilters import readReg, getBoard, float2Qmn + +NELM = 16 +FF_REG="0x41e" +SP_REG="0x41f" + +# Normal mode + +# SP - PT0 - I +# SP - PT0 - Q +# FF - PT0 - I +# FF - PT0 - Q + +# Special mode + +# SP - SM - I +# SP - SM - Q +# FF - SM - I +# FF - SM - Q + +def getMinMaxMN(m, n, signed): + if signed: + min = -2**(m-1) + max = 2**(m-1) - 2**(-n) + else: + min = 0 + max = (2**m) - (2**(-n)) + + return (min, max) + +def readMem(board, offset, size): + p = popen("sis8300drv_mem %s -o %d -n %d" % (board, offset, size)) + ret = p.read() + p.close() + + return ret + +def set_table(pv_base, ctrl, type, qi, qmn, size = 16): + """Set values for one table (the same value) + ctrl = SP / FF + type = PT0 / SM + qi = I / Q + size = number of elements + qmn = (m, n, signed) + """ + + (min, max) = getMinMaxMN(*qmn) + + val = round(random()*(max-min)+min, qmn[2]) + while (val > max or val < min): + val = round(random()*(max-min)+min, qmn[2]) + + vals = [] + vals.extend([val]*size) + # let on format to caput + vals_str = str(size) + " " + (str(vals).replace(",",""))[1:-1] + + pv = pv_base + ":" + ctrl + "-" + type + + system("caput -a %s %s > /dev/null " % (pv + "-" + qi, vals_str)) + + # write table to the memory + system("caput %s %d > /dev/null " % (pv + "-WRTBL", 1)) + + # update readback + system("caput %s %d > /dev/null " % (pv + "-" + qi + "-GET.PROC", 1)) + + + return val + +class TestTablesNormal(unittest.TestCase): + """Class for test tables on Normal mode""" + def __init__(self, *args, **kw): + super().__init__(*args, **kw) + self.board = getBoard() + self.PV = environ.get("LLRF_IOC_NAME") + "1" + self.qmn = (1, 15, 1) + + def test_tables_sp_qi(self): + """Test tables SP Q/I on normal mode""" + q_val = set_table(self.PV, "SP", "PT0", "Q", self.qmn) + i_val = set_table(self.PV, "SP", "PT0", "I", self.qmn) + + mem_pos = int(readReg(self.board, SP_REG), NELM) + mem_values = (readMem(self.board, int(mem_pos/2), NELM*2).split('\n'))[:-1] + q_val_qmn = str(float2Qmn(q_val, *self.qmn)) + i_val_qmn = str(float2Qmn(i_val, *self.qmn)) + + # get a random position to check + pos = randint(1, 15) + # q pos = pos*2 + # i pos = pos*2 + 1 + + self.assertEqual(q_val_qmn, mem_values[pos*2]) + self.assertEqual(i_val_qmn, mem_values[pos*2+1]) + + def test_tables_ff_qi(self): + """Test tables FF Q/I on normal mode""" + q_val = set_table(self.PV, "FF", "PT0", "Q", self.qmn) + i_val = set_table(self.PV, "FF", "PT0", "I", self.qmn) + + mem_pos = int(readReg(self.board, FF_REG), NELM) + mem_values = (readMem(self.board, int(mem_pos/2), NELM*2).split('\n'))[:-1] + q_val_qmn = str(float2Qmn(q_val, *self.qmn)) + i_val_qmn = str(float2Qmn(i_val, *self.qmn)) + + # get a random position to check + pos = randint(1, 15) + # q pos = pos*2 + # i pos = pos*2 + 1 + + self.assertEqual(q_val_qmn, mem_values[pos*2]) + self.assertEqual(i_val_qmn, mem_values[pos*2+1]) + + +class TestTablesSpecial(unittest.TestCase): + """Class for test tables on Normal mode on normal mode""" + def __init__(self, *args, **kw): + super().__init__(*args, **kw) + self.board = getBoard() + self.PV = environ.get("LLRF_IOC_NAME") + "1" + self.qmn_ang = (3, 13, 1) + self.qmn_mag_sp = (0, 16, 0) + self.qmn_mag_ff = (1, 15, 1) + self.qmn_qi = (1, 15, 1) + + def test_tables_sp_mag_ang(self): + """Test tables SP Mag and Ang""" + ang_val = set_table(self.PV, "SP", "SM", "ANG", self.qmn_ang) + mag_val = set_table(self.PV, "SP", "SM", "MAG", self.qmn_mag_sp) + + mem_pos = int(readReg(self.board, SP_REG), NELM) + mem_values = (readMem(self.board, int(mem_pos/2), NELM*2).split('\n'))[:-1] + ang_val_qmn = str(float2Qmn(ang_val, *self.qmn_ang)) + mag_val_qmn = str(float2Qmn(mag_val, *self.qmn_mag_sp)) + + # get a random position to check + pos = randint(0, 15) + # ang pos = pos*2 + # mag pos = pos*2 + 1 + + self.assertEqual(ang_val_qmn, mem_values[pos*2]) + self.assertEqual(mag_val_qmn, mem_values[pos*2+1]) + + def test_tables_ff_mag_ang(self): + """Test tables FF Mag and Ang""" + ang_val = set_table(self.PV, "FF", "SM", "ANG", self.qmn_ang) + mag_val = set_table(self.PV, "FF", "SM", "MAG", self.qmn_mag_ff) + + mem_pos = int(readReg(self.board, FF_REG), NELM) + mem_values = (readMem(self.board, int(mem_pos/2), NELM*2).split('\n'))[:-1] + ang_val_qmn = str(float2Qmn(ang_val, *self.qmn_ang)) + mag_val_qmn = str(float2Qmn(mag_val, *self.qmn_mag_ff)) + + # get a random position to check + pos = randint(0, 15) + # q pos = pos*2 + # i pos = pos*2 + 1 + + self.assertEqual(ang_val_qmn, mem_values[pos*2]) + self.assertEqual(mag_val_qmn, mem_values[pos*2+1]) + + def test_tables_sp_qi(self): + """Test tables SP Q and I """ + q_val = set_table(self.PV, "SP", "SM", "Q", self.qmn_qi) + i_val = set_table(self.PV, "SP", "SM", "I", self.qmn_qi) + + mem_pos = int(readReg(self.board, SP_REG), NELM) + mem_values = (readMem(self.board, int(mem_pos/2), NELM*2).split('\n'))[:-1] + q_val_qmn = str(float2Qmn(q_val, *self.qmn_qi)) + i_val_qmn = str(float2Qmn(i_val, *self.qmn_qi)) + + # get a random position to check + pos = randint(0, 15) + # q pos = pos*2 + # i pos = pos*2 + 1 + + self.assertEqual(q_val_qmn, mem_values[pos*2]) + self.assertEqual(i_val_qmn, mem_values[pos*2+1]) + + def test_tables_ff_qi(self): + """Test tables FF Q and I """ + q_val = set_table(self.PV, "FF", "SM", "Q", self.qmn_qi) + i_val = set_table(self.PV, "FF", "SM", "I", self.qmn_qi) + + mem_pos = int(readReg(self.board, FF_REG), NELM) + mem_values = (readMem(self.board, int(mem_pos/2), NELM*2).split('\n'))[:-1] + q_val_qmn = str(float2Qmn(q_val, *self.qmn_qi)) + i_val_qmn = str(float2Qmn(i_val, *self.qmn_qi)) + + # get a random position to check + pos = randint(0, 15) + # q pos = pos*2 + # i pos = pos*2 + 1 + + self.assertEqual(q_val_qmn, mem_values[pos*2]) + self.assertEqual(i_val_qmn, mem_values[pos*2+1]) + +if __name__ == "__main__": + unittest.main(verbosity=2) +