More unified vec4 to hex string functions.

This commit is contained in:
steve 2005-06-13 00:54:04 +00:00
parent f5ba93eeb6
commit 80cac983c6
7 changed files with 151 additions and 86 deletions

View File

@ -28,7 +28,7 @@
* Picture Elements, Inc., 777 Panoramic Way, Berkeley, CA 94704.
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: vpi_memory.cc,v 1.25 2005/03/05 05:43:03 steve Exp $"
#ident "$Id: vpi_memory.cc,v 1.26 2005/06/13 00:54:04 steve Exp $"
#endif
# include "vpi_priv.h"
@ -404,7 +404,7 @@ static void memory_word_get_value(vpiHandle ref, s_vpi_value*vp)
switch (vp->format) {
default:
assert("format not implemented");
assert(0 && "format not implemented");
case vpiBinStrVal:
rbuf = need_result_buf(width+1, RBUF_VAL);
@ -415,71 +415,25 @@ static void memory_word_get_value(vpiHandle ref, s_vpi_value*vp)
rbuf[width] = 0;
vp->value.str = rbuf;
break;
#if 0
/* XXXX Needs to be converted. */
case vpiOctStrVal: {
unsigned hwid = (width+2) / 3;
unsigned char*bits = new unsigned char[width];
for (unsigned idx = 0 ; idx < width ; idx += 1) {
unsigned bb = idx / 4;
unsigned bs = (idx % 4) * 2;
unsigned val = memory_get(rfp->mem->mem, bidx+idx);
if (bs == 0)
bits[bb] = val;
else
bits[bb] |= val << bs;
}
rbuf = need_result_buf(hwid+1, RBUF_VAL);
vpip_bits_to_oct_str(bits, width, rbuf, hwid+1, false);
delete[]bits;
vpip_vec4_to_oct_str(word_val, rbuf, hwid+1, false);
vp->value.str = rbuf;
break;
}
#endif
#if 0
/* XXXX Needs to be converted. */
case vpiHexStrVal: {
unsigned hval, hwid;
hwid = (width + 3) / 4;
unsigned hwid = (width + 3) / 4;
rbuf = need_result_buf(hwid+1, RBUF_VAL);
rbuf[hwid] = 0;
hval = 0;
for (unsigned idx = 0 ; idx < width ; idx += 1) {
unsigned bit = memory_get(rfp->mem->mem, bidx+idx);
hval = hval | (bit << 2*(idx % 4));
if (idx%4 == 3) {
hwid -= 1;
rbuf[hwid] = hex_digits[hval];
hval = 0;
}
}
if (hwid > 0) {
unsigned padd = 0;
hwid -= 1;
rbuf[hwid] = hex_digits[hval];
switch(rbuf[hwid]) {
case 'X': padd = 2; break;
case 'Z': padd = 3; break;
}
if (padd) {
for (unsigned idx = width % 4; idx < 4; idx += 1) {
hval = hval | padd << 2*idx;
}
rbuf[hwid] = hex_digits[hval];
}
}
vpip_vec4_to_hex_str(word_val, rbuf, hwid+1, false);
vp->value.str = rbuf;
break;
}
#endif
#if 0
case vpiDecStrVal: {
unsigned char*bits = new unsigned char[width];
@ -614,6 +568,9 @@ vpiHandle vpip_make_memory(vvp_memory_t mem, const char*name)
/*
* $Log: vpi_memory.cc,v $
* Revision 1.26 2005/06/13 00:54:04 steve
* More unified vec4 to hex string functions.
*
* Revision 1.25 2005/03/05 05:43:03 steve
* Get base address from word ranges that VPI user passed.
*

View File

@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: vpi_priv.h,v 1.62 2005/04/28 04:59:53 steve Exp $"
#ident "$Id: vpi_priv.h,v 1.63 2005/06/13 00:54:04 steve Exp $"
#endif
# include "vpi_user.h"
@ -395,11 +395,15 @@ extern void vpip_dec_str_to_bits(unsigned char*bits, unsigned nbits,
extern void vpip_bin_str_to_bits(unsigned char*bits, unsigned nbits,
const char*buf, bool signed_flag);
extern void vpip_vec4_to_hex_str(const vvp_vector4_t&bits, char*buf,
unsigned nbuf, bool signed_flag);
extern void vpip_hex_str_to_bits(unsigned char*bits, unsigned nbits,
const char*buf, bool signed_flag);
extern void vpip_bits_to_oct_str(const unsigned char*bits, unsigned nbits,
char*buf, unsigned nbuf, bool signed_flag);
extern void vpip_vec4_to_oct_str(const vvp_vector4_t&bits, char*buf,
unsigned nbuf, bool signed_flag);
extern void vpip_oct_str_to_bits(unsigned char*bits, unsigned nbits,
const char*buf, bool signed_flag);
@ -418,6 +422,9 @@ extern char *need_result_buf(unsigned cnt, vpi_rbuf_t type);
/*
* $Log: vpi_priv.h,v $
* Revision 1.63 2005/06/13 00:54:04 steve
* More unified vec4 to hex string functions.
*
* Revision 1.62 2005/04/28 04:59:53 steve
* Remove dead functor code.
*

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: vpi_signal.cc,v 1.67 2005/06/12 01:10:26 steve Exp $"
#ident "$Id: vpi_signal.cc,v 1.68 2005/06/13 00:54:04 steve Exp $"
#endif
/*
@ -380,37 +380,12 @@ static void signal_get_value(vpiHandle ref, s_vpi_value*vp)
break;
case vpiHexStrVal: {
unsigned hval, hwid;
hwid = (wid + 3) / 4;
unsigned hwid = (wid + 3) / 4;
rbuf = need_result_buf(hwid+1, RBUF_VAL);
rbuf[hwid] = 0;
hval = 0;
for (unsigned idx = 0 ; idx < wid ; idx += 1) {
hval = hval | (vsig->value(idx) << 2*(idx % 4));
if (idx%4 == 3) {
hwid -= 1;
rbuf[hwid] = hex_digits[hval];
hval = 0;
}
}
if (hwid > 0) {
hwid -= 1;
rbuf[hwid] = hex_digits[hval];
unsigned padd = 0;
switch(rbuf[hwid]) {
case 'X': padd = 2; break;
case 'Z': padd = 3; break;
}
if (padd) {
for (unsigned idx = wid % 4; idx < 4; idx += 1) {
hval = hval | padd << 2*idx;
}
rbuf[hwid] = hex_digits[hval];
}
}
vpip_vec4_to_hex_str(vsig->vec4_value(), rbuf, hwid+1, false);
vp->value.str = rbuf;
break;
}
@ -847,6 +822,9 @@ vpiHandle vpip_make_net(const char*name, int msb, int lsb,
/*
* $Log: vpi_signal.cc,v $
* Revision 1.68 2005/06/13 00:54:04 steve
* More unified vec4 to hex string functions.
*
* Revision 1.67 2005/06/12 01:10:26 steve
* Remove useless references to functor.h
*

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: vpip_hex.cc,v 1.2 2002/08/12 01:35:09 steve Exp $"
#ident "$Id: vpip_hex.cc,v 1.3 2005/06/13 00:54:04 steve Exp $"
#endif
# include "config.h"
@ -31,6 +31,58 @@
#endif
# include <assert.h>
extern const char hex_digits[256];
void vpip_vec4_to_hex_str(const vvp_vector4_t&bits, char*buf,
unsigned nbuf, bool signed_flag)
{
unsigned slen = (bits.size() + 3) / 4;
assert(slen < nbuf);
buf[slen] = 0;
unsigned val = 0;
for (unsigned idx = 0 ; idx < bits.size() ; idx += 1) {
unsigned vs = (idx%4) * 2;
switch (bits.value(idx)) {
case BIT4_0:
break;
case BIT4_1:
val |= 1 << vs;
break;
case BIT4_X:
val |= 2 << vs;
break;
case BIT4_Z:
val |= 3 << vs;
}
if (vs == 6) {
slen -= 1;
buf[slen] = hex_digits[val];
val = 0;
}
}
if (slen > 0) {
unsigned padd = 0;
slen -= 1;
buf[slen] = hex_digits[val];
switch(buf[slen]) {
case 'X': padd = 2; break;
case 'Z': padd = 3; break;
}
if (padd) {
for (unsigned idx = bits.size() % 4; idx < 4; idx += 1) {
val = val | padd << 2*idx;
}
buf[slen] = hex_digits[val];
}
}
}
void vpip_hex_str_to_bits(unsigned char*bits, unsigned nbits,
const char*buf, bool signed_flag)
{
@ -111,6 +163,9 @@ void vpip_hex_str_to_bits(unsigned char*bits, unsigned nbits,
/*
* $Log: vpip_hex.cc,v $
* Revision 1.3 2005/06/13 00:54:04 steve
* More unified vec4 to hex string functions.
*
* Revision 1.2 2002/08/12 01:35:09 steve
* conditional ident string using autoconfig.
*

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: vpip_oct.cc,v 1.2 2002/08/12 01:35:09 steve Exp $"
#ident "$Id: vpip_oct.cc,v 1.3 2005/06/13 00:54:04 steve Exp $"
#endif
# include "config.h"
@ -169,8 +169,49 @@ void vpip_bits_to_oct_str(const unsigned char*bits, unsigned nbits,
}
}
void vpip_vec4_to_oct_str(const vvp_vector4_t&bits, char*buf, unsigned nbuf,
bool signed_flag)
{
unsigned slen = (bits.size() + 2) / 3;
assert(slen < nbuf);
buf[slen] = 0;
unsigned val = 0;
for (unsigned idx = 0 ; idx < bits.size() ; idx += 1) {
unsigned vs = (idx%3) * 2;
switch (bits.value(idx)) {
case BIT4_0:
break;
case BIT4_1:
val |= 1 << vs;
break;
case BIT4_X:
val |= 2 << vs;
break;
case BIT4_Z:
val |= 3 << vs;
}
if (vs == 4) {
slen -= 1;
buf[slen] = oct_digits[val];
val = 0;
}
}
if (slen > 0) {
slen -= 1;
buf[slen] = oct_digits[val];
}
}
/*
* $Log: vpip_oct.cc,v $
* Revision 1.3 2005/06/13 00:54:04 steve
* More unified vec4 to hex string functions.
*
* Revision 1.2 2002/08/12 01:35:09 steve
* conditional ident string using autoconfig.
*

View File

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ident "$Id: vvp_net.cc,v 1.30 2005/06/12 15:13:37 steve Exp $"
#ident "$Id: vvp_net.cc,v 1.31 2005/06/13 00:54:04 steve Exp $"
# include "config.h"
# include "vvp_net.h"
@ -384,6 +384,20 @@ bool vector4_to_value(const vvp_vector4_t&vec, unsigned long&val)
return true;
}
vvp_vector4_t coerce_to_width(const vvp_vector4_t&that, unsigned width)
{
if (that.size() == width)
return that;
assert(that.size() > width);
vvp_vector4_t res (width);
for (unsigned idx = 0 ; idx < width ; idx += 1)
res.set_bit(idx, that.value(idx));
return res;
}
vvp_vector2_t::vvp_vector2_t()
{
vec_ = 0;
@ -747,6 +761,12 @@ void vvp_fun_signal::recv_vec4(vvp_net_ptr_t ptr, vvp_vector4_t bit)
break;
case 2: // Force value
// Force from a node may not have been sized completely
// by the source, so coerce the size here.
if (bit.size() != size())
bit = coerce_to_width(bit, size());
force_active_ = true;
force_ = bit;
vvp_send_vec4(ptr.ptr()->out, force_);
@ -1373,6 +1393,9 @@ vvp_bit4_t compare_gtge_signed(const vvp_vector4_t&a,
/*
* $Log: vvp_net.cc,v $
* Revision 1.31 2005/06/13 00:54:04 steve
* More unified vec4 to hex string functions.
*
* Revision 1.30 2005/06/12 15:13:37 steve
* Support resistive mos devices.
*

View File

@ -18,7 +18,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ident "$Id: vvp_net.h,v 1.31 2005/06/12 15:13:37 steve Exp $"
#ident "$Id: vvp_net.h,v 1.32 2005/06/13 00:54:04 steve Exp $"
# include "config.h"
# include <assert.h>
@ -117,6 +117,7 @@ extern vvp_bit4_t compare_gtge(const vvp_vector4_t&a,
extern vvp_bit4_t compare_gtge_signed(const vvp_vector4_t&a,
const vvp_vector4_t&b,
vvp_bit4_t val_if_equal);
extern vvp_vector4_t coerce_to_width(const vvp_vector4_t&that, unsigned width);
/*
* These functions extract the value of the vector as a native type,
@ -754,6 +755,9 @@ class vvp_wide_fun_t : public vvp_net_fun_t {
/*
* $Log: vvp_net.h,v $
* Revision 1.32 2005/06/13 00:54:04 steve
* More unified vec4 to hex string functions.
*
* Revision 1.31 2005/06/12 15:13:37 steve
* Support resistive mos devices.
*