Refactor the logic for binary string value conversion.

This commit is contained in:
Wei Ren 2025-07-29 00:49:01 -07:00
parent aa6ae73740
commit b35b74ac9c
No known key found for this signature in database
GPG Key ID: 5FE20215B0F1F9A9
2 changed files with 33 additions and 38 deletions

View File

@ -987,28 +987,26 @@ static void real_signal_value(struct t_vpi_value*vp, double rval)
break;
case vpiBinStrVal: {
uint64_t val = vlg_round_to_u64(rval);
unsigned len = 0;
const uint64_t val = vlg_round_to_u64(rval);
unsigned len = 0;
while (val > 0) {
len += 1;
val /= 2;
}
// Compute bitwidth; For val==0, this yields len==1
uint64_t tmp = val;
do {
len += 1;
tmp /= 2;
} while (tmp > 0);
val = vlg_round_to_u64(rval);
for (unsigned idx = 0 ; idx < len ; idx += 1) {
rbuf[len-idx-1] = (val & 1)? '1' : '0';
val /= 2;
}
tmp = val;
for (unsigned idx = 0; idx < len; idx += 1) {
rbuf[len - idx - 1] = (tmp & 1) ? '1' : '0';
tmp /= 2;
}
rbuf[len] = 0;
if (len == 0) {
rbuf[0] = '0';
rbuf[1] = 0;
}
vp->value.str = rbuf;
break;
}
rbuf[len] = '\0';
vp->value.str = rbuf;
break;
}
case vpiSuppressVal:
break;

View File

@ -143,28 +143,25 @@ static void vthr_real_get_value(vpiHandle ref, s_vpi_value*vp)
break;
case vpiBinStrVal: {
uint64_t vali = vlg_round_to_u64(val);
unsigned len = 0;
const uint64_t vali = vlg_round_to_u64(val);
unsigned len = 0;
while (vali > 0) {
len += 1;
vali /= 2;
}
uint64_t tmp = vali;
do {
len += 1;
tmp /= 2;
} while (tmp > 0);
vali = vlg_round_to_u64(val);
for (unsigned idx = 0 ; idx < len ; idx += 1) {
rbuf[len-idx-1] = (vali & 1)? '1' : '0';
vali /= 2;
}
tmp = vali;
for (unsigned idx = 0; idx < len; idx += 1) {
rbuf[len - idx - 1] = (tmp & 1) ? '1' : '0';
tmp /= 2;
}
rbuf[len] = 0;
if (len == 0) {
rbuf[0] = '0';
rbuf[1] = 0;
}
vp->value.str = rbuf;
break;
}
rbuf[len] = '\0';
vp->value.str = rbuf;
break;
}
default:
fprintf(stderr, "vvp error: get %d not supported "