Fix handling of bool(bit) vectors with odd widths.

This commit is contained in:
Stephen Williams 2011-04-02 15:50:49 -07:00
parent 9bdc040520
commit 7d53ac342f
3 changed files with 27 additions and 20 deletions

View File

@ -48,6 +48,7 @@ EXTERN_C_START
#define vpiIntVar 612
#define vpiByteVar 614
#define vpiLogicVar vpiReg
#define vpiBitVar 620
/********* TYPESPECS *************/
#define vpiEnumTypespec 633

View File

@ -924,6 +924,20 @@ static const struct __vpirt vpip_byte_rt = {
0
};
static const struct __vpirt vpip_bitvar_rt = {
vpiBitVar,
signal_get,
signal_get_str,
signal_get_value,
signal_put_value,
signal_get_handle,
signal_iterate,
0,
0,
0,
0
};
static const struct __vpirt vpip_shortint_rt = {
vpiShortIntVar,
signal_get,
@ -979,6 +993,9 @@ vpiHandle vpip_make_int4(const char*name, int msb, int lsb, vvp_net_t*vec)
return obj;
}
/*
* Construct a vpi
*/
vpiHandle vpip_make_int2(const char*name, int msb, int lsb, vvp_net_t*vec)
{
vpiHandle obj = vpip_make_net4(name, msb,lsb, true, vec);
@ -998,7 +1015,10 @@ vpiHandle vpip_make_int2(const char*name, int msb, int lsb, vvp_net_t*vec)
obj->vpi_type = &vpip_longint_rt;
break;
default:
assert(0);
// Every other type of bit vector is a vpiBitVar with
// array dimensions.
obj->vpi_type = &vpip_bitvar_rt;
break;
}
return obj;

View File

@ -83,10 +83,9 @@ void compile_varw_real(char*label, vvp_array_t array,
* A variable is a special functor, so we allocate that functor and
* write the label into the symbol table.
*/
static void __compile_var(char*label, char*name,
vvp_array_t array, unsigned long array_addr,
int msb, int lsb, int vpi_type_code,
bool signed_flag, bool local_flag)
void compile_variable(char*label, char*name,
int msb, int lsb, int vpi_type_code,
bool signed_flag, bool local_flag)
{
unsigned wid = ((msb > lsb)? msb-lsb : lsb-msb) + 1;
@ -108,7 +107,7 @@ static void __compile_var(char*label, char*name,
define_functor_symbol(label, net);
vpiHandle obj = 0;
if (! local_flag && !array) {
if (! local_flag) {
/* Make the vpiHandle for the reg. */
switch (vpi_type_code) {
case vpiLogicVar:
@ -130,7 +129,6 @@ static void __compile_var(char*label, char*name,
// If the signal has a name, then it goes into the current
// scope as a signal.
if (name) {
assert(!array);
if (obj) vpip_attach_to_current_scope(obj);
if (!vpip_peek_current_scope()->is_automatic) {
vvp_vector4_t tmp;
@ -138,23 +136,11 @@ static void __compile_var(char*label, char*name,
schedule_init_vector(vvp_net_ptr_t(net,0), tmp);
}
}
// If this is an array word, then it does not have a name, and
// it is attached to the addressed array.
if (array) {
assert(!name);
if (obj) array_attach_word(array, array_addr, obj);
}
free(label);
delete[] name;
}
void compile_variable(char*label, char*name,
int msb, int lsb, int vpi_type_code,
bool signed_flag, bool local_flag)
{
__compile_var(label, name, 0, 0, msb, lsb, vpi_type_code, signed_flag, local_flag);
}
vvp_net_t* create_constant_node(const char*val_str)
{
if (c4string_test(val_str)) {