diff --git a/vvp/vpi_priv.cc b/vvp/vpi_priv.cc index 2b834cb83..ea3d2a1b5 100644 --- a/vvp/vpi_priv.cc +++ b/vvp/vpi_priv.cc @@ -444,20 +444,7 @@ void vpip_vec4_get_value(const vvp_vector4_t&word_val, unsigned width, rbuf = need_result_buf(width+1, RBUF_VAL); for (unsigned idx = 0 ; idx < width ; idx += 1) { vvp_bit4_t bit = word_val.value(idx); - switch (bit) { - case BIT4_0: - rbuf[width-idx-1] = '0'; - break; - case BIT4_1: - rbuf[width-idx-1] = '1'; - break; - case BIT4_Z: - rbuf[width-idx-1] = 'z'; - break; - case BIT4_X: - rbuf[width-idx-1] = 'x'; - break; - } + rbuf[width-idx-1] = vvp_bit4_to_ascii(bit); } rbuf[width] = 0; vp->value.str = rbuf; diff --git a/vvp/vpi_signal.cc b/vvp/vpi_signal.cc index c6a845b0f..7c0df884c 100644 --- a/vvp/vpi_signal.cc +++ b/vvp/vpi_signal.cc @@ -432,20 +432,7 @@ static void signal_get_value(vpiHandle ref, s_vpi_value*vp) rbuf = need_result_buf(wid+1, RBUF_VAL); for (unsigned idx = 0 ; idx < wid ; idx += 1) { - switch (vsig->value(idx)) { - case BIT4_0: - rbuf[wid-idx-1] = '0'; - break; - case BIT4_1: - rbuf[wid-idx-1] = '1'; - break; - case BIT4_Z: - rbuf[wid-idx-1] = 'z'; - break; - case BIT4_X: - rbuf[wid-idx-1] = 'x'; - break; - } + rbuf[wid-idx-1] = vvp_bit4_to_ascii(vsig->value(idx)); } rbuf[wid] = 0; vp->value.str = rbuf; diff --git a/vvp/vpi_vthr_vector.cc b/vvp/vpi_vthr_vector.cc index 025b474d1..e8ff50609 100644 --- a/vvp/vpi_vthr_vector.cc +++ b/vvp/vpi_vthr_vector.cc @@ -134,9 +134,9 @@ static void vthr_vec_StringVal(struct __vpiVThrVec*rfp, s_vpi_value*vp) tmp <<= 1; switch(get_bit(rfp, bitnr)){ - case 0: + case BIT4_0: break; - case 1: + case BIT4_1: tmp |= 1; break; default: @@ -179,7 +179,7 @@ static void vthr_vec_get_value(vpiHandle ref, s_vpi_value*vp) case vpiBinStrVal: rbuf = need_result_buf(wid+1, RBUF_VAL); for (unsigned idx = 0 ; idx < wid ; idx += 1) { - rbuf[wid-idx-1] = "01xz"[get_bit(rfp, idx)]; + rbuf[wid-idx-1] = vvp_bit4_to_ascii(get_bit(rfp, idx)); } rbuf[wid] = 0; vp->value.str = rbuf; @@ -192,7 +192,22 @@ static void vthr_vec_get_value(vpiHandle ref, s_vpi_value*vp) rbuf[hwid] = 0; hval = 0; for (unsigned idx = 0 ; idx < wid ; idx += 1) { - hval = hval | (get_bit(rfp, idx) << 2*(idx % 4)); + unsigned tmp = 0; + switch (get_bit(rfp, idx)) { + case BIT4_0: + tmp = 0; + break; + case BIT4_1: + tmp = 1; + break; + case BIT4_X: + tmp = 2; + break; + case BIT4_Z: + tmp = 3; + break; + } + hval = hval | (tmp << 2*(idx % 4)); if (idx%4 == 3) { hwid -= 1; @@ -217,7 +232,22 @@ static void vthr_vec_get_value(vpiHandle ref, s_vpi_value*vp) rbuf[hwid] = 0; hval = 0; for (unsigned idx = 0 ; idx < wid ; idx += 1) { - hval = hval | (get_bit(rfp,idx) << 2*(idx % 3)); + unsigned tmp = 0; + switch (get_bit(rfp, idx)) { + case BIT4_0: + tmp = 0; + break; + case BIT4_1: + tmp = 1; + break; + case BIT4_X: + tmp = 2; + break; + case BIT4_Z: + tmp = 3; + break; + } + hval = hval | (tmp << 2*(idx % 3)); if (idx%3 == 2) { hwid -= 1; @@ -247,13 +277,12 @@ static void vthr_vec_get_value(vpiHandle ref, s_vpi_value*vp) long ival = 0; for (unsigned idx = 0 ; idx < wid ; idx += 1) { switch (get_bit(rfp, idx)) { - case 0: + case BIT4_0: break; - case 1: + case BIT4_1: ival |= 1 << idx; break; - case 2: - case 3: + default: break; } } @@ -266,13 +295,12 @@ static void vthr_vec_get_value(vpiHandle ref, s_vpi_value*vp) for (unsigned idx = wid ; idx > 0 ; idx -= 1) { vp->value.real *= 2.0; switch (get_bit(rfp, idx-1)) { - case 0: + case BIT4_0: break; - case 1: + case BIT4_1: vp->value.real += 1.0; break; - case 2: - case 3: + default: break; } } @@ -288,19 +316,19 @@ static void vthr_vec_get_value(vpiHandle ref, s_vpi_value*vp) PLI_INT32 mask = 1 << (idx%32); switch (get_bit(rfp,idx)) { - case 0: + case BIT4_0: vp->value.vector[word].aval &= ~mask; vp->value.vector[word].bval &= ~mask; break; - case 1: + case BIT4_1: vp->value.vector[word].aval |= mask; vp->value.vector[word].bval &= ~mask; break; - case 2: + case BIT4_X: vp->value.vector[word].aval |= mask; vp->value.vector[word].bval |= mask; break; - case 3: + case BIT4_Z: vp->value.vector[word].aval &= ~mask; vp->value.vector[word].bval |= mask; break; diff --git a/vvp/vpip_bin.cc b/vvp/vpip_bin.cc index d4bd869e2..0aadeac78 100644 --- a/vvp/vpip_bin.cc +++ b/vvp/vpip_bin.cc @@ -63,16 +63,16 @@ void vpip_bin_str_to_vec4(vvp_vector4_t&vec4, /* Calculate the pad value based on the top bit and the signed flag. We may sign extend or zero extend. */ switch (last) { - case 0: + case BIT4_0: last = BIT4_0; break; - case 1: + case BIT4_1: last = signed_flag? BIT4_1 : BIT4_0; break; - case 2: + case BIT4_X: last = BIT4_X; break; - case 3: + case BIT4_Z: last = BIT4_Z; break; } diff --git a/vvp/vvp_net.h b/vvp/vvp_net.h index 70ac50edd..b3e550159 100644 --- a/vvp/vvp_net.h +++ b/vvp/vvp_net.h @@ -61,6 +61,9 @@ enum vvp_bit4_t { BIT4_Z = 2 }; + /* Return an ASCII character that represents the vvp_bit4_t value. */ +inline char vvp_bit4_to_ascii(vvp_bit4_t a) { return "01zx"[a]; } + extern vvp_bit4_t add_with_carry(vvp_bit4_t a, vvp_bit4_t b, vvp_bit4_t&c); /* Return TRUE if the bit is BIT4_X or BIT4_Z. The fast