review fixes, simpler validation of timers in ctb and xilinx ctb
Build on RHEL9 docker image / build (push) Successful in 3m35s
Build on RHEL8 docker image / build (push) Successful in 5m15s
Run Simulator Tests on local RHEL9 / build (push) Failing after 10m29s
Run Simulator Tests on local RHEL8 / build (push) Failing after 12m33s

This commit is contained in:
2026-05-05 09:42:01 +02:00
parent da6620e0f5
commit d8b8ccb2ed
8 changed files with 164 additions and 96 deletions
@@ -1144,15 +1144,26 @@ int getNumTransceiverSamples() { return ntSamples; }
int setExpTime(int64_t val, char *mess) {
setPatternWaitInterval(0, val);
// validate for tolerance
int64_t retval = 0;
if (getExpTime(&retval, mess) == FAIL) {
// validate
uint64_t arg_clocks = ns_to_clocks(val, clkFrequency[RUN_CLK]);
uint64_t retval_clocks = getPatternWaitClocks(0);
if (arg_clocks != retval_clocks) {
sprintf(mess,
"Failed to set exposure time. Could not set number of clocks "
"to %lld, read %lld\n",
(long long int)arg_clocks, (long long int)retval_clocks);
LOG(logERROR, (mess));
return FAIL;
}
int ret = OK;
validate64_timer(&ret, mess, val, retval, clkFrequency[RUN_CLK],
"exposure time");
return ret;
// log rounding if any
int64_t retval = getPatternWaitInterval(0);
if (val != retval) {
LOG(logWARNING, ("Rounding to %lld ns due to clock frequency\n",
(long long int)retval));
}
return OK;
}
int getExpTime(int64_t *retval, char *mess) {
@@ -1172,17 +1183,31 @@ int setPeriod(int64_t val, char *mess) {
return FAIL;
}
LOG(logINFO, ("Setting period %lld ns\n", (long long int)val));
uint64_t numClocks = ns_to_clocks(val, clkFrequency[SYNC_CLK]);
set64BitReg(numClocks, PERIOD_LSB_REG, PERIOD_MSB_REG);
uint64_t arg_clocks = ns_to_clocks(val, clkFrequency[SYNC_CLK]);
set64BitReg(arg_clocks, PERIOD_LSB_REG, PERIOD_MSB_REG);
// validate for tolerance
int64_t retval = 0;
int ret = getPeriod(&retval, mess);
if (ret == FAIL) {
// validate
uint64_t retval_clocks = get64BitReg(PERIOD_LSB_REG, PERIOD_MSB_REG);
if (arg_clocks != retval_clocks) {
sprintf(mess,
"Failed to set period. Could not set number of clocks "
"to %lld, red %lld\n",
(long long int)arg_clocks, (long long int)retval_clocks);
LOG(logERROR, (mess));
return FAIL;
}
validate64_timer(&ret, mess, val, retval, clkFrequency[SYNC_CLK], "period");
return ret;
// log rounding if any
int64_t retval = 0;
if (getPeriod(&retval, mess) == FAIL) {
return FAIL;
}
if (val != retval) {
LOG(logWARNING, ("Rounding to %lld ns due to clock frequency\n",
(long long int)retval));
}
return OK;
}
int getPeriod(int64_t *retval, char *mess) {
@@ -1204,18 +1229,32 @@ int setDelayAfterTrigger(int64_t val, char *mess) {
return FAIL;
}
LOG(logINFO, ("Setting delay after trigger %lld ns\n", (long long int)val));
uint64_t numClocks = ns_to_clocks(val, clkFrequency[SYNC_CLK]);
set64BitReg(numClocks, DELAY_LSB_REG, DELAY_MSB_REG);
uint64_t arg_clocks = ns_to_clocks(val, clkFrequency[SYNC_CLK]);
set64BitReg(arg_clocks, DELAY_LSB_REG, DELAY_MSB_REG);
// validate for tolerance
int64_t retval = 0;
int ret = getDelayAfterTrigger(&retval, mess);
if (ret == FAIL) {
// validate
uint64_t retval_clocks = get64BitReg(DELAY_LSB_REG, DELAY_MSB_REG);
if (arg_clocks != retval_clocks) {
sprintf(
mess,
"Failed to set delay after trigger. Could not set number of clocks "
"to %lld, read %lld\n",
(long long int)arg_clocks, (long long int)retval_clocks);
LOG(logERROR, (mess));
return FAIL;
}
validate64_timer(&ret, mess, val, retval, clkFrequency[SYNC_CLK],
"delay after trigger");
return ret;
// log rounding if any
int64_t retval = 0;
if (getDelayAfterTrigger(&retval, mess) == FAIL) {
return FAIL;
}
if (val != retval) {
LOG(logWARNING, ("Rounding to %lld ns due to clock frequency\n",
(long long int)retval));
}
return OK;
}
int getDelayAfterTrigger(int64_t *retval, char *mess) {
@@ -62,9 +62,6 @@ void validate(int *ret, char *mess, int arg, int retval, char *modename,
void validate64(int *ret, char *mess, int64_t arg, int64_t retval,
char *modename, enum numberMode nummode);
void validate64_timer(int *ret, char *message, uint64_t arg, uint64_t retval,
uint32_t runclk_hz, char *modename);
int getModuleIdInFile(int *ret, char *mess, char *fileName);
int verifyChecksumFromBuffer(char *mess, char *functionType,
char *clientChecksum, char *buffer, ssize_t bytes);
@@ -230,20 +230,6 @@ void validate64(int *ret, char *mess, int64_t arg, int64_t retval,
}
}
void validate64_timer(int *ret, char *message, uint64_t arg, uint64_t retval,
uint32_t clk_hz, char *modename) {
uint64_t arg_clks = ns_to_clocks(arg, clk_hz);
uint64_t retval_clks = ns_to_clocks(retval, clk_hz);
int64_t diff = (int64_t)retval_clks - (int64_t)arg_clks;
if (diff < 0) {
diff = -diff;
}
// tolerance = 1 clock
if (diff > 1) {
validate64(ret, message, arg, retval, modename, DEC);
}
}
int getModuleIdInFile(int *ret, char *mess, char *fileName) {
const int fileNameSize = 128;
char fname[fileNameSize];
@@ -329,43 +329,50 @@ int validate_setPatternWaitClocksAndInterval(char *message, int level,
return FAIL;
}
uint64_t retval = 0;
if (clocks) {
setPatternWaitClocks(level, waittime);
// validate result
retval = getPatternWaitClocks(level);
uint64_t retval = getPatternWaitClocks(level);
LOG(logDEBUG1, ("Pattern wait time in clocks (level:%d) retval: %d\n",
level, (long long int)retval));
} else {
setPatternWaitInterval(level, waittime);
// validate result
retval = getPatternWaitInterval(level);
LOG(logDEBUG1, ("Pattern wait time (level:%d) retval: %d\n", level,
(long long int)retval));
}
int ret = OK;
char mode[128];
memset(mode, 0, sizeof(mode));
sprintf(mode, "set pattern Loop %d wait time", level);
if (clocks) {
int ret = OK;
char mode[128];
memset(mode, 0, sizeof(mode));
sprintf(mode, "set pattern Loop %d wait time (clocks)", level);
validate64(&ret, message, waittime, retval, mode, DEC);
} else {
uint32_t runclk = 0;
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
runclk = clkFrequency[RUN_CLK];
#elif MYTHEN3D
runclk = getFrequency(SYSTEM_C0);
#endif
if (retval == (uint64_t)-1) {
sprintf(message, "runclk is 0. Cannot divide by 0 for patttern "
"wait interval.\n");
return FAIL;
}
validate64_timer(&ret, message, waittime, retval, runclk, mode);
return ret;
}
return ret;
// interval
setPatternWaitInterval(level, waittime);
// validate
uint32_t runclk = 0;
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
runclk = clkFrequency[RUN_CLK];
#elif MYTHEN3D
runclk = getFrequency(SYSTEM_C0);
#endif
uint64_t arg_clocks = ns_to_clocks(waittime, runclk);
uint64_t retval_clocks = getPatternWaitClocks(0);
if (arg_clocks != retval_clocks) {
sprintf(message,
"Failed to set exposure time. Could not set number of clocks "
"to %lld, read %lld\n",
(long long int)arg_clocks, (long long int)retval_clocks);
LOG(logERROR, (message));
return FAIL;
}
// log rounding if any
int64_t retval = getPatternWaitInterval(0);
if (waittime != retval) {
LOG(logWARNING, ("Rounding to %lld ns due to clock frequency\n",
(long long int)retval));
}
return OK;
}
void setPatternWaitClocks(int level, uint64_t t) {
@@ -779,15 +779,26 @@ int getNumTransceiverSamples() {
int setExpTime(int64_t val, char *mess) {
setPatternWaitInterval(0, val);
// validate for tolerance
int64_t retval = 0;
if (getExpTime(&retval, mess) == FAIL) {
// validate
uint64_t arg_clocks = ns_to_clocks(val, clkFrequency[RUN_CLK]);
uint64_t retval_clocks = getPatternWaitClocks(0);
if (arg_clocks != retval_clocks) {
sprintf(mess,
"Failed to set exposure time. Could not set number of clocks "
"to %lld, read %lld\n",
(long long int)arg_clocks, (long long int)retval_clocks);
LOG(logERROR, (mess));
return FAIL;
}
int ret = OK;
validate64_timer(&ret, mess, val, retval, clkFrequency[RUN_CLK],
"exposure time");
return ret;
// log rounding if any
int64_t retval = getPatternWaitInterval(0);
if (val != retval) {
LOG(logWARNING, ("Rounding to %lld ns due to clock frequency\n",
(long long int)retval));
}
return OK;
}
int getExpTime(int64_t *retval, char *mess) {
@@ -807,17 +818,31 @@ int setPeriod(int64_t val, char *mess) {
return FAIL;
}
LOG(logINFO, ("Setting period %lld ns\n", (long long int)val));
uint64_t numClocks = ns_to_clocks(val, clkFrequency[RUN_CLK]);
setU64BitReg(numClocks, PERIOD_IN_REG_1, PERIOD_IN_REG_2);
uint64_t arg_clocks = ns_to_clocks(val, clkFrequency[SYNC_CLK]);
setU64BitReg(arg_clocks, PERIOD_IN_REG_1, PERIOD_IN_REG_2);
// validate for tolerance
int64_t retval = 0;
int ret = getPeriod(&retval, mess);
if (ret == FAIL) {
// validate
uint64_t retval_clocks = getU64BitReg(PERIOD_IN_REG_1, PERIOD_IN_REG_2);
if (arg_clocks != retval_clocks) {
sprintf(mess,
"Failed to set period. Could not set number of clocks "
"to %lld, red %lld\n",
(long long int)arg_clocks, (long long int)retval_clocks);
LOG(logERROR, (mess));
return FAIL;
}
validate64_timer(&ret, mess, val, retval, clkFrequency[RUN_CLK], "period");
return ret;
// log rounding if any
int64_t retval = 0;
if (getPeriod(&retval, mess) == FAIL) {
return FAIL;
}
if (val != retval) {
LOG(logWARNING, ("Rounding to %lld ns due to clock frequency\n",
(long long int)retval));
}
return OK;
}
int getPeriod(int64_t *retval, char *mess) {
@@ -839,18 +864,32 @@ int setDelayAfterTrigger(int64_t val, char *mess) {
return FAIL;
}
LOG(logINFO, ("Setting delay after trigger %lld ns\n", (long long int)val));
uint64_t numClocks = ns_to_clocks(val, clkFrequency[RUN_CLK]);
setU64BitReg(numClocks, DELAY_IN_REG_1, DELAY_IN_REG_2);
uint64_t arg_clocks = ns_to_clocks(val, clkFrequency[SYNC_CLK]);
setU64BitReg(arg_clocks, DELAY_IN_REG_1, DELAY_IN_REG_2);
// validate for tolerance
int64_t retval = 0;
int ret = getDelayAfterTrigger(&retval, mess);
if (ret == FAIL) {
// validate
uint64_t retval_clocks = getU64BitReg(DELAY_IN_REG_1, DELAY_IN_REG_2);
if (arg_clocks != retval_clocks) {
sprintf(
mess,
"Failed to set delay after trigger. Could not set number of clocks "
"to %lld, read %lld\n",
(long long int)arg_clocks, (long long int)retval_clocks);
LOG(logERROR, (mess));
return FAIL;
}
validate64_timer(&ret, mess, val, retval, clkFrequency[RUN_CLK],
"delay after trigger");
return ret;
// log rounding if any
int64_t retval = 0;
if (getDelayAfterTrigger(&retval, mess) == FAIL) {
return FAIL;
}
if (val != retval) {
LOG(logWARNING, ("Rounding to %lld ns due to clock frequency\n",
(long long int)retval));
}
return OK;
}
int getDelayAfterTrigger(int64_t *retval, char *mess) {
+2 -2
View File
@@ -3,10 +3,10 @@
/** API versions */
#define APILIB "0.0.0 0x250909"
#define APIRECEIVER "0.0.0 0x250822"
#define APICTB "0.0.0 0x260501"
#define APICTB "0.0.0 0x260505"
#define APIGOTTHARD2 "0.0.0 0x260427"
#define APIMOENCH "0.0.0 0x260424"
#define APIEIGER "0.0.0 0x260424"
#define APIXILINXCTB "0.0.0 0x260501"
#define APIXILINXCTB "0.0.0 0x260505"
#define APIJUNGFRAU "0.0.0 0x260424"
#define APIMYTHEN3 "0.0.0 0x260501"