Clean up more vvp_bit4_t encoding dependencies.

This commit is contained in:
Stephen Williams 2008-04-23 11:16:24 -07:00
parent e7d463704c
commit 10ea9904f1
5 changed files with 54 additions and 49 deletions

View File

@ -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); rbuf = need_result_buf(width+1, RBUF_VAL);
for (unsigned idx = 0 ; idx < width ; idx += 1) { for (unsigned idx = 0 ; idx < width ; idx += 1) {
vvp_bit4_t bit = word_val.value(idx); vvp_bit4_t bit = word_val.value(idx);
switch (bit) { rbuf[width-idx-1] = vvp_bit4_to_ascii(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] = 0; rbuf[width] = 0;
vp->value.str = rbuf; vp->value.str = rbuf;

View File

@ -432,20 +432,7 @@ static void signal_get_value(vpiHandle ref, s_vpi_value*vp)
rbuf = need_result_buf(wid+1, RBUF_VAL); rbuf = need_result_buf(wid+1, RBUF_VAL);
for (unsigned idx = 0 ; idx < wid ; idx += 1) { for (unsigned idx = 0 ; idx < wid ; idx += 1) {
switch (vsig->value(idx)) { rbuf[wid-idx-1] = vvp_bit4_to_ascii(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] = 0; rbuf[wid] = 0;
vp->value.str = rbuf; vp->value.str = rbuf;

View File

@ -134,9 +134,9 @@ static void vthr_vec_StringVal(struct __vpiVThrVec*rfp, s_vpi_value*vp)
tmp <<= 1; tmp <<= 1;
switch(get_bit(rfp, bitnr)){ switch(get_bit(rfp, bitnr)){
case 0: case BIT4_0:
break; break;
case 1: case BIT4_1:
tmp |= 1; tmp |= 1;
break; break;
default: default:
@ -179,7 +179,7 @@ static void vthr_vec_get_value(vpiHandle ref, s_vpi_value*vp)
case vpiBinStrVal: case vpiBinStrVal:
rbuf = need_result_buf(wid+1, RBUF_VAL); rbuf = need_result_buf(wid+1, RBUF_VAL);
for (unsigned idx = 0 ; idx < wid ; idx += 1) { 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; rbuf[wid] = 0;
vp->value.str = rbuf; vp->value.str = rbuf;
@ -192,7 +192,22 @@ static void vthr_vec_get_value(vpiHandle ref, s_vpi_value*vp)
rbuf[hwid] = 0; rbuf[hwid] = 0;
hval = 0; hval = 0;
for (unsigned idx = 0 ; idx < wid ; idx += 1) { 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) { if (idx%4 == 3) {
hwid -= 1; hwid -= 1;
@ -217,7 +232,22 @@ static void vthr_vec_get_value(vpiHandle ref, s_vpi_value*vp)
rbuf[hwid] = 0; rbuf[hwid] = 0;
hval = 0; hval = 0;
for (unsigned idx = 0 ; idx < wid ; idx += 1) { 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) { if (idx%3 == 2) {
hwid -= 1; hwid -= 1;
@ -247,13 +277,12 @@ static void vthr_vec_get_value(vpiHandle ref, s_vpi_value*vp)
long ival = 0; long ival = 0;
for (unsigned idx = 0 ; idx < wid ; idx += 1) { for (unsigned idx = 0 ; idx < wid ; idx += 1) {
switch (get_bit(rfp, idx)) { switch (get_bit(rfp, idx)) {
case 0: case BIT4_0:
break; break;
case 1: case BIT4_1:
ival |= 1 << idx; ival |= 1 << idx;
break; break;
case 2: default:
case 3:
break; 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) { for (unsigned idx = wid ; idx > 0 ; idx -= 1) {
vp->value.real *= 2.0; vp->value.real *= 2.0;
switch (get_bit(rfp, idx-1)) { switch (get_bit(rfp, idx-1)) {
case 0: case BIT4_0:
break; break;
case 1: case BIT4_1:
vp->value.real += 1.0; vp->value.real += 1.0;
break; break;
case 2: default:
case 3:
break; break;
} }
} }
@ -288,19 +316,19 @@ static void vthr_vec_get_value(vpiHandle ref, s_vpi_value*vp)
PLI_INT32 mask = 1 << (idx%32); PLI_INT32 mask = 1 << (idx%32);
switch (get_bit(rfp,idx)) { switch (get_bit(rfp,idx)) {
case 0: case BIT4_0:
vp->value.vector[word].aval &= ~mask; vp->value.vector[word].aval &= ~mask;
vp->value.vector[word].bval &= ~mask; vp->value.vector[word].bval &= ~mask;
break; break;
case 1: case BIT4_1:
vp->value.vector[word].aval |= mask; vp->value.vector[word].aval |= mask;
vp->value.vector[word].bval &= ~mask; vp->value.vector[word].bval &= ~mask;
break; break;
case 2: case BIT4_X:
vp->value.vector[word].aval |= mask; vp->value.vector[word].aval |= mask;
vp->value.vector[word].bval |= mask; vp->value.vector[word].bval |= mask;
break; break;
case 3: case BIT4_Z:
vp->value.vector[word].aval &= ~mask; vp->value.vector[word].aval &= ~mask;
vp->value.vector[word].bval |= mask; vp->value.vector[word].bval |= mask;
break; break;

View File

@ -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 /* Calculate the pad value based on the top bit and the signed
flag. We may sign extend or zero extend. */ flag. We may sign extend or zero extend. */
switch (last) { switch (last) {
case 0: case BIT4_0:
last = BIT4_0; last = BIT4_0;
break; break;
case 1: case BIT4_1:
last = signed_flag? BIT4_1 : BIT4_0; last = signed_flag? BIT4_1 : BIT4_0;
break; break;
case 2: case BIT4_X:
last = BIT4_X; last = BIT4_X;
break; break;
case 3: case BIT4_Z:
last = BIT4_Z; last = BIT4_Z;
break; break;
} }

View File

@ -61,6 +61,9 @@ enum vvp_bit4_t {
BIT4_Z = 2 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); 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 /* Return TRUE if the bit is BIT4_X or BIT4_Z. The fast