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,25 +987,23 @@ 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
uint64_t tmp = val;
do {
len += 1; len += 1;
val /= 2; 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) {
rbuf[0] = '0';
rbuf[1] = 0;
}
vp->value.str = rbuf; vp->value.str = rbuf;
break; break;
} }

View File

@ -143,25 +143,22 @@ 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;
do {
len += 1; len += 1;
vali /= 2; 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) {
rbuf[0] = '0';
rbuf[1] = 0;
}
vp->value.str = rbuf; vp->value.str = rbuf;
break; break;
} }