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; break;
case vpiBinStrVal: { case vpiBinStrVal: {
uint64_t val = vlg_round_to_u64(rval); const uint64_t val = vlg_round_to_u64(rval);
unsigned len = 0; unsigned len = 0;
while (val > 0) { // Compute bitwidth; For val==0, this yields len==1
len += 1; uint64_t tmp = val;
val /= 2; do {
} len += 1;
tmp /= 2;
} while (tmp > 0);
val = vlg_round_to_u64(rval); tmp = val;
for (unsigned idx = 0 ; idx < len ; idx += 1) { for (unsigned idx = 0; idx < len; idx += 1) {
rbuf[len-idx-1] = (val & 1)? '1' : '0'; rbuf[len - idx - 1] = (tmp & 1) ? '1' : '0';
val /= 2; tmp /= 2;
} }
rbuf[len] = 0; rbuf[len] = '\0';
if (len == 0) { vp->value.str = rbuf;
rbuf[0] = '0'; break;
rbuf[1] = 0; }
}
vp->value.str = rbuf;
break;
}
case vpiSuppressVal: case vpiSuppressVal:
break; break;

View File

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