Implement vvp_wire_real.

This brings real value variables into the vvp net rework.
This commit is contained in:
Stephen Williams 2009-08-24 21:50:56 -07:00
parent 9f11a23611
commit 0490be6b19
5 changed files with 197 additions and 10 deletions

View File

@ -614,6 +614,66 @@ void vvp_signal_value::get_signal_value(struct t_vpi_value*vp)
}
}
void vvp_wire_real::get_signal_value(struct t_vpi_value*vp)
{
char*rbuf = need_result_buf(64 + 1, RBUF_VAL);
switch (vp->format) {
case vpiObjTypeVal:
vp->format = vpiRealVal;
case vpiRealVal:
vp->value.real = real_value();
break;
case vpiIntVal:
vp->value.integer = (int)(real_value() + 0.5);
break;
case vpiDecStrVal:
sprintf(rbuf, "%0.0f", real_value());
vp->value.str = rbuf;
break;
case vpiHexStrVal:
sprintf(rbuf, "%lx", (long)real_value());
vp->value.str = rbuf;
break;
case vpiBinStrVal: {
unsigned long val = (unsigned long)real_value();
unsigned len = 0;
while (val > 0) {
len += 1;
val /= 2;
}
val = (unsigned long)real_value();
for (unsigned idx = 0 ; idx < len ; idx += 1) {
rbuf[len-idx-1] = (val & 1)? '1' : '0';
val /= 2;
}
rbuf[len] = 0;
if (len == 0) {
rbuf[0] = '0';
rbuf[1] = 0;
}
vp->value.str = rbuf;
break;
}
case vpiSuppressVal:
break;
default:
fprintf(stderr, "vpi_callback: value "
"format %d not supported (fun_signal_real)\n",
vp->format);
}
}
void vvp_fun_signal4::get_value(struct t_vpi_value*vp)
{
get_signal_value(vp);
@ -703,3 +763,8 @@ void vvp_wire_vec8::get_value(struct t_vpi_value*value)
{
assert(0);
}
void vvp_wire_real::get_value(struct t_vpi_value*value)
{
get_signal_value(value);
}

View File

@ -132,10 +132,10 @@ static void real_var_get_value(vpiHandle ref, s_vpi_value*vp)
struct __vpiRealVar*rfp
= (struct __vpiRealVar*)ref;
vvp_fun_signal_real*fun
= dynamic_cast<vvp_fun_signal_real*>(rfp->net->fun);
vvp_wire_real*fil
= dynamic_cast<vvp_wire_real*>(rfp->net->fil);
fun->get_value(vp);
fil->get_value(vp);
}
static vpiHandle real_var_put_value(vpiHandle ref, p_vpi_value vp, int)

View File

@ -69,6 +69,12 @@ vvp_signal_value::~vvp_signal_value()
{
}
double vvp_signal_value::real_value() const
{
assert(0);
return 0;
}
#if 0
const vvp_vector4_t* vvp_fun_signal4::filter_vec4(const vvp_vector4_t&val)
{
@ -1054,3 +1060,90 @@ vvp_vector4_t vvp_wire_vec8::vec4_value() const
{
assert(0);
}
vvp_wire_real::vvp_wire_real()
{
}
bool vvp_wire_real::filter_real(double&bit)
{
bit_ = bit;
if (test_force_mask(0)) {
bit = force_;
return false;
}
return true;
}
unsigned vvp_wire_real::filter_size() const
{
assert(0);
return 0;
}
void vvp_wire_real::force_fil_vec4(const vvp_vector4_t&val, vvp_vector2_t mask)
{
assert(0);
}
void vvp_wire_real::force_fil_vec8(const vvp_vector8_t&val, vvp_vector2_t mask)
{
assert(0);
}
void vvp_wire_real::force_fil_real(double val, vvp_vector2_t mask)
{
assert(0);
}
void vvp_wire_real::release(vvp_net_ptr_t ptr, bool net)
{
assert(net);
// Wires revert to their unforced value after release.
vvp_vector2_t mask (vvp_vector2_t::FILL1, 1);
release_mask(mask);
assert(0);
}
void vvp_wire_real::release_pv(vvp_net_ptr_t ptr, bool net,
unsigned base, unsigned wid)
{
assert(net);
vvp_vector2_t mask (vvp_vector2_t::FILL0, 1);
for (unsigned idx = 0 ; idx < wid ; idx += 1)
mask.set_bit(base+idx, 1);
release_mask(mask);
assert(0);
}
unsigned vvp_wire_real::value_size() const
{
assert(0);
return 1;
}
vvp_bit4_t vvp_wire_real::value(unsigned idx) const
{
assert(0);
}
vvp_scalar_t vvp_wire_real::scalar_value(unsigned idx) const
{
assert(0);
}
vvp_vector4_t vvp_wire_real::vec4_value() const
{
assert(0);
}
double vvp_wire_real::real_value() const
{
if (test_force_mask(0))
return force_;
else
return bit_;
}

View File

@ -100,6 +100,7 @@ class vvp_signal_value {
virtual vvp_bit4_t value(unsigned idx) const =0;
virtual vvp_scalar_t scalar_value(unsigned idx) const =0;
virtual vvp_vector4_t vec4_value() const =0;
virtual double real_value() const;
virtual void get_signal_value(struct t_vpi_value*vp);
};
@ -349,11 +350,6 @@ class vvp_wire_base : public vvp_net_fil_t, public vvp_signal_value {
public:
vvp_wire_base();
~vvp_wire_base();
// The main filter behavior for this class
const vvp_vector4_t* filter_vec4(const vvp_vector4_t&bit) =0;
const vvp_vector8_t* filter_vec8(const vvp_vector8_t&val) =0;
};
class vvp_wire_vec4 : public vvp_wire_base {
@ -426,4 +422,36 @@ class vvp_wire_vec8 : public vvp_wire_base {
vvp_vector8_t filter8_; // scratch space for filter_mask_ function.
};
class vvp_wire_real : public vvp_wire_base {
public:
explicit vvp_wire_real();
// The main filter behavior for this class
bool filter_real(double&bit);
// Abstract methods from vvp_vpi_callback
void get_value(struct t_vpi_value*value);
// Abstract methods from vvp_net_fit_t
unsigned filter_size() const;
void force_fil_vec4(const vvp_vector4_t&val, vvp_vector2_t mask);
void force_fil_vec8(const vvp_vector8_t&val, vvp_vector2_t mask);
void force_fil_real(double val, vvp_vector2_t mask);
void release(vvp_net_ptr_t ptr, bool net);
void release_pv(vvp_net_ptr_t ptr, bool net, unsigned base, unsigned wid);
// Implementation of vvp_signal_value methods
unsigned value_size() const;
vvp_bit4_t value(unsigned idx) const;
vvp_scalar_t scalar_value(unsigned idx) const;
vvp_vector4_t vec4_value() const;
double real_value() const;
void get_signal_value(struct t_vpi_value*vp);
private:
double bit_;
double force_;
};
#endif

View File

@ -37,6 +37,7 @@ static void __compile_var_real(char*label, char*name,
int msb, int lsb)
{
vvp_fun_signal_real*fun;
vvp_wire_real*fil = new vvp_wire_real;
if (vpip_peek_current_scope()->is_automatic) {
fun = new vvp_fun_signal_real_aa;
} else {
@ -44,7 +45,7 @@ static void __compile_var_real(char*label, char*name,
}
vvp_net_t*net = new vvp_net_t;
net->fun = fun;
assert(0 /* XXXX */); // Need to create a net_fil_t! net->fil = fun;
net->fil = fil;
define_functor_symbol(label, net);
@ -55,7 +56,7 @@ static void __compile_var_real(char*label, char*name,
assert(!array);
vpip_attach_to_current_scope(obj);
if (!vpip_peek_current_scope()->is_automatic)
schedule_init_vector(vvp_net_ptr_t(net,0), fun->real_value());
schedule_init_vector(vvp_net_ptr_t(net,0), 0.0);
}
if (array) {
assert(!name);