C++-ify the __vpiScope classes.

This commit is contained in:
Stephen Williams 2015-12-20 20:26:57 -08:00
parent c88a60537a
commit fff69390ac
11 changed files with 163 additions and 118 deletions

View File

@ -275,7 +275,7 @@ int __vpiArray::vpi_get(int code)
return get_size();
case vpiAutomatic:
return (int) scope->is_automatic;
return scope->is_automatic()? 1 : 0;
default:
return 0;
@ -361,7 +361,7 @@ int __vpiArrayWord::as_word_t::vpi_get(int code)
return val.value.integer;
case vpiAutomatic:
return (int) parent->get_scope()->is_automatic;
return parent->get_scope()->is_automatic()? 1 : 0;
#if defined(CHECK_WITH_VALGRIND) || defined(BR916_STOPGAP_FIX)
case _vpiFromThr:
@ -393,7 +393,7 @@ int __vpiArrayVthrA::vpi_get(int code)
return (int)get_address() + array->first_addr.get_value();
case vpiAutomatic:
return (int) array->get_scope()->is_automatic;
return array->get_scope()->is_automatic() ? 1 : 0;
#if defined(CHECK_WITH_VALGRIND) || defined(BR916_STOPGAP_FIX)
case _vpiFromThr:
@ -504,7 +504,7 @@ int __vpiArrayVthrAPV::vpi_get(int code)
return (int)word_sel;
case vpiAutomatic:
return (int) array->get_scope()->is_automatic;
return array->get_scope()->is_automatic() ? 1 : 0;
#if defined(CHECK_WITH_VALGRIND) || defined(BR916_STOPGAP_FIX)
case _vpiFromThr:
@ -855,7 +855,7 @@ void compile_var_array(char*label, char*name, int last, int first,
/* Make the words. */
arr->vals_width = labs(msb-lsb) + 1;
if (vpip_peek_current_scope()->is_automatic) {
if (vpip_peek_current_scope()->is_automatic()) {
arr->vals4 = new vvp_vector4array_aa(arr->vals_width,
arr->get_size());
} else {
@ -1201,7 +1201,7 @@ void vvp_fun_arrayport_aa::check_word_change_(unsigned long addr,
void vvp_fun_arrayport_aa::check_word_change(unsigned long addr)
{
if (arr_->get_scope()->is_automatic) {
if (arr_->get_scope()->is_automatic()) {
assert(vthread_get_wt_context());
check_word_change_(addr, vthread_get_wt_context());
} else {
@ -1218,7 +1218,7 @@ static void array_attach_port(vvp_array_t array, vvp_fun_arrayport*fun)
assert(fun->next_ == 0);
fun->next_ = array->ports_;
array->ports_ = fun;
if (!array->get_scope()->is_automatic) {
if (!array->get_scope()->is_automatic()) {
/* propagate initial values for variable arrays */
if (array->vals4) {
vvp_vector4_t tmp(array->vals_width, BIT4_X);
@ -1355,12 +1355,12 @@ bool array_port_resolv_list_t::resolve(bool mes)
vvp_fun_arrayport*fun;
if (use_addr)
if (vpip_peek_current_scope()->is_automatic)
if (vpip_peek_current_scope()->is_automatic())
fun = new vvp_fun_arrayport_aa(mem, ptr, addr);
else
fun = new vvp_fun_arrayport_sa(mem, ptr, addr);
else
if (vpip_peek_current_scope()->is_automatic)
if (vpip_peek_current_scope()->is_automatic())
fun = new vvp_fun_arrayport_aa(mem, ptr);
else
fun = new vvp_fun_arrayport_sa(mem, ptr);

View File

@ -768,7 +768,7 @@ void compile_event(char*label, char*type, unsigned argc, struct symb_s*argv)
free(type);
if (vpip_peek_current_scope()->is_automatic) {
if (vpip_peek_current_scope()->is_automatic()) {
fun = new vvp_fun_anyedge_aa;
} else {
fun = new vvp_fun_anyedge_sa;
@ -786,7 +786,7 @@ void compile_event(char*label, char*type, unsigned argc, struct symb_s*argv)
assert(argc <= 4);
free(type);
if (vpip_peek_current_scope()->is_automatic) {
if (vpip_peek_current_scope()->is_automatic()) {
fun = new vvp_fun_edge_aa(edge);
} else {
fun = new vvp_fun_edge_sa(edge);
@ -807,7 +807,7 @@ void compile_event(char*label, char*type, unsigned argc, struct symb_s*argv)
static void compile_event_or(char*label, unsigned argc, struct symb_s*argv)
{
vvp_net_t* ptr = new vvp_net_t;
if (vpip_peek_current_scope()->is_automatic) {
if (vpip_peek_current_scope()->is_automatic()) {
ptr->fun = new vvp_fun_event_or_aa;
} else {
ptr->fun = new vvp_fun_event_or_sa;
@ -835,7 +835,7 @@ void compile_named_event(char*label, char*name)
vpiHandle obj = vpip_make_named_event(name, ptr);
if (vpip_peek_current_scope()->is_automatic) {
if (vpip_peek_current_scope()->is_automatic()) {
ptr->fun = new vvp_named_event_aa(obj);
} else {
ptr->fun = new vvp_named_event_sa(obj);

View File

@ -411,7 +411,7 @@ void compile_part_select(char*label, char*source,
unsigned base, unsigned wid)
{
vvp_fun_part*fun = 0;
if (vpip_peek_current_scope()->is_automatic) {
if (vpip_peek_current_scope()->is_automatic()) {
fun = new vvp_fun_part_aa(base, wid);
} else {
fun = new vvp_fun_part_sa(base, wid);
@ -431,7 +431,7 @@ void compile_part_select_var(char*label, char*source, char*var,
unsigned wid, bool is_signed)
{
vvp_fun_part_var*fun = 0;
if (vpip_peek_current_scope()->is_automatic) {
if (vpip_peek_current_scope()->is_automatic()) {
fun = new vvp_fun_part_var_aa(wid, is_signed);
} else {
fun = new vvp_fun_part_var_sa(wid, is_signed);

View File

@ -139,7 +139,7 @@ static void cmd_call(unsigned argc, char*argv[])
case vpiNamedBegin:
case vpiNamedFork:
scope = dynamic_cast<__vpiScope*>(table[idx]);
if (strcmp(scope->name, argv[idx+1]) == 0)
if (strcmp(scope->scope_name(), argv[idx+1]) == 0)
handle = table[tmp];
break;
@ -234,32 +234,32 @@ static void cmd_list(unsigned, char*[])
switch (table[idx]->get_type_code()) {
case vpiModule:
scope = dynamic_cast<__vpiScope*>(table[idx]);
printf("module : %s\n", scope->name);
printf("module : %s\n", scope->scope_name());
break;
case vpiGenScope:
scope = dynamic_cast<__vpiScope*>(table[idx]);
printf("generate: %s\n", scope->name);
printf("generate: %s\n", scope->scope_name());
break;
case vpiTask:
scope = dynamic_cast<__vpiScope*>(table[idx]);
printf("task : %s\n", scope->name);
printf("task : %s\n", scope->scope_name());
break;
case vpiFunction:
scope = dynamic_cast<__vpiScope*>(table[idx]);
printf("function: %s\n", scope->name);
printf("function: %s\n", scope->scope_name());
break;
case vpiNamedBegin:
scope = dynamic_cast<__vpiScope*>(table[idx]);
printf("block : %s\n", scope->name);
printf("block : %s\n", scope->scope_name());
break;
case vpiNamedFork:
scope = dynamic_cast<__vpiScope*>(table[idx]);
printf("fork : %s\n", scope->name);
printf("fork : %s\n", scope->scope_name());
break;
case vpiParameter:
@ -343,7 +343,7 @@ static void cmd_push(unsigned argc, char* argv[])
/* This is a scope, and the name matches, then
report that I found the child. */
if (strcmp(cp->name, argv[idx]) == 0) {
if (strcmp(cp->scope_name(), argv[idx]) == 0) {
child = cp;
break;
}
@ -401,10 +401,10 @@ static void cmd_where(unsigned, char*[])
while (cur) {
switch (cur->get_type_code()) {
case vpiModule:
printf("module %s\n", cur->name);
printf("module %s\n", cur->scope_name());
break;
default:
printf("scope (%d) %s;\n", cur->get_type_code(), cur->name);
printf("scope (%d) %s;\n", cur->get_type_code(), cur->scope_name());
break;
}

View File

@ -49,7 +49,7 @@ int __vpiNamedEvent::vpi_get(int code)
switch (code) {
case vpiAutomatic:
return (int) scope_->is_automatic;
return scope_->is_automatic()? 1 : 0;
}
return 0;

View File

@ -236,21 +236,29 @@ struct __vpiPortInfo : public __vpiHandle {
* objects hold the items and properties that are knowingly bound to a
* scope.
*/
struct __vpiScope : public __vpiHandle {
class __vpiScope : public __vpiHandle {
public:
int vpi_get(int code);
char* vpi_get_str(int code);
vpiHandle vpi_handle(int code);
vpiHandle vpi_iterate(int code);
public:
// Return the BASE name of the scope. This does not include
// any of the parent hierarchy.
inline const char*scope_name() const { return name_; }
inline const char*scope_def_name() const { return tname_; }
// TRUE if this is an automatic func/task/block
inline bool is_automatic() const { return is_automatic_; }
public:
struct __vpiScope *scope;
/* The scope has a name. */
const char*name;
const char*tname;
unsigned file_idx;
unsigned lineno;
unsigned def_file_idx;
unsigned def_lineno;
bool is_automatic;
bool is_cell;
/* The scope has a system time of its own. */
struct __vpiScopedTime scoped_time;
@ -274,7 +282,15 @@ struct __vpiScope : public __vpiHandle {
signed int time_precision :8;
protected:
inline __vpiScope() { }
__vpiScope(const char*nam, const char*tnam);
private:
/* The scope has a name. */
const char*name_;
const char*tname_;
protected:
/* the scope may be "automatic" */
bool is_automatic_;
};
extern struct __vpiScope* vpip_peek_current_scope(void);

View File

@ -46,7 +46,7 @@ static int real_var_get(int code, vpiHandle ref)
return 0; // Not implemented for now!
case vpiAutomatic:
return (int) vpip_scope(rfp)->is_automatic;
return vpip_scope(rfp)->is_automatic()? 1 : 0;
}
return 0;

View File

@ -169,37 +169,6 @@ void root_table_delete(void)
}
#endif
static int scope_get(int code, vpiHandle obj)
{
struct __vpiScope*ref = dynamic_cast<__vpiScope*>(obj);
assert(obj);
switch (code) {
case vpiCellInstance:
return (int) ref->is_cell;
case vpiDefLineNo:
return ref->def_lineno;
case vpiLineNo:
return ref->lineno;
case vpiTimeUnit:
return ref->time_units;
case vpiTimePrecision:
return ref->time_precision;
case vpiTopModule:
return 0x0 == ref->scope;
case vpiAutomatic:
return (int) ref->is_automatic;
}
return vpiUndefined;
}
static void construct_scope_fullname(struct __vpiScope*ref, char*buf)
{
if (ref->scope) {
@ -207,7 +176,7 @@ static void construct_scope_fullname(struct __vpiScope*ref, char*buf)
strcat(buf, ".");
}
strcat(buf, ref->name);
strcat(buf, ref->scope_name());
}
static const char* scope_get_type(int code)
@ -254,11 +223,11 @@ static char* scope_get_str(int code, vpiHandle obj)
break;
case vpiName:
p = ref->name;
p = ref->scope_name();
break;
case vpiDefName:
p = ref->tname;
p = ref->scope_def_name();
break;
case vpiType:
@ -361,8 +330,41 @@ static vpiHandle module_iter(int code, vpiHandle obj)
}
__vpiScope::__vpiScope(const char*nam, const char*tnam)
: is_automatic_(false)
{
name_ = vpip_name_string(nam);
tname_ = vpip_name_string(tnam? tnam : "");
}
int __vpiScope::vpi_get(int code)
{ return scope_get(code, this); }
{
switch (code) {
case vpiCellInstance:
return is_cell? 1 : 0;
case vpiDefLineNo:
return def_lineno;
case vpiLineNo:
return lineno;
case vpiTimeUnit:
return time_units;
case vpiTimePrecision:
return time_precision;
case vpiTopModule:
return 0x0 == scope;
case vpiAutomatic:
return is_automatic_? 1 : 0;
}
return vpiUndefined;
}
char*__vpiScope::vpi_get_str(int code)
{ return scope_get_str(code, this); }
@ -374,43 +376,80 @@ vpiHandle __vpiScope::vpi_iterate(int code)
{ return module_iter(code, this); }
struct vpiScopeModule : public __vpiScope {
inline vpiScopeModule() { }
class vpiScopeModule : public __vpiScope {
public:
inline vpiScopeModule(const char*nam, const char*tnam)
: __vpiScope(nam,tnam) { }
int get_type_code(void) const { return vpiModule; }
};
struct vpiScopePackage : public __vpiScope {
inline vpiScopePackage() { }
inline vpiScopePackage(const char*nam, const char*tnam)
: __vpiScope(nam,tnam) { }
int get_type_code(void) const { return vpiPackage; }
};
struct vpiScopeTask : public __vpiScope {
inline vpiScopeTask() { }
inline vpiScopeTask(const char*nam, const char*tnam)
: __vpiScope(nam,tnam) { }
int get_type_code(void) const { return vpiTask; }
};
struct vpiScopeFunction : public __vpiScope {
inline vpiScopeFunction() { }
struct vpiScopeTaskAuto : public __vpiScope {
inline vpiScopeTaskAuto(const char*nam, const char*tnam)
: __vpiScope(nam,tnam) { is_automatic_=true; }
int get_type_code(void) const { return vpiTask; }
};
class vpiScopeFunction : public __vpiScope {
public:
inline vpiScopeFunction(const char*nam, const char*tnam)
: __vpiScope(nam,tnam) { }
int get_type_code(void) const { return vpiFunction; }
};
class vpiScopeFunctionAuto : public __vpiScope {
public:
inline vpiScopeFunctionAuto(const char*nam, const char*tnam)
: __vpiScope(nam,tnam) { is_automatic_=true; }
int get_type_code(void) const { return vpiFunction; }
};
struct vpiScopeBegin : public __vpiScope {
inline vpiScopeBegin() { }
inline vpiScopeBegin(const char*nam, const char*tnam)
: __vpiScope(nam,tnam) { }
int get_type_code(void) const { return vpiNamedBegin; }
};
class vpiScopeBeginAuto : public __vpiScope {
public:
inline vpiScopeBeginAuto(const char*nam, const char*tnam)
: __vpiScope(nam,tnam) { is_automatic_=true; }
int get_type_code(void) const { return vpiNamedBegin; }
};
struct vpiScopeGenerate : public __vpiScope {
inline vpiScopeGenerate() { }
inline vpiScopeGenerate(const char*nam, const char*tnam)
: __vpiScope(nam,tnam) { }
int get_type_code(void) const { return vpiGenScope; }
};
struct vpiScopeFork : public __vpiScope {
inline vpiScopeFork() { }
inline vpiScopeFork(const char*nam, const char*tnam)
: __vpiScope(nam,tnam) { }
int get_type_code(void) const { return vpiNamedFork; }
};
class vpiScopeForkAuto : public __vpiScope {
public:
inline vpiScopeForkAuto(const char*nam, const char*tnam)
: __vpiScope(nam,tnam) { is_automatic_=true; }
int get_type_code(void) const { return vpiNamedFork; }
};
struct vpiScopeClass : public __vpiScope {
inline vpiScopeClass() { }
inline vpiScopeClass(const char*nam, const char*tnam)
: __vpiScope(nam,tnam) { }
int get_type_code(void) const { return vpiClassTypespec; }
};
@ -449,50 +488,40 @@ compile_scope_decl(char*label, char*type, char*name, char*tname,
{
count_vpi_scopes += 1;
bool is_automatic = false;
struct __vpiScope*scope;
if (strcmp(type,"module") == 0) {
scope = new vpiScopeModule;
scope = new vpiScopeModule(name, tname);
} else if (strcmp(type,"function") == 0) {
scope = new vpiScopeFunction;
scope = new vpiScopeFunction(name, tname);
} else if (strcmp(type,"autofunction") == 0) {
scope = new vpiScopeFunction;
is_automatic = true;
scope = new vpiScopeFunctionAuto(name, tname);
} else if (strcmp(type,"task") == 0) {
scope = new vpiScopeTask;
scope = new vpiScopeTask(name, tname);
} else if (strcmp(type,"autotask") == 0) {
scope = new vpiScopeTask;
is_automatic = true;
scope = new vpiScopeTaskAuto(name, tname);
} else if (strcmp(type,"fork") == 0) {
scope = new vpiScopeFork;
scope = new vpiScopeFork(name, tname);
} else if (strcmp(type,"autofork") == 0) {
scope = new vpiScopeFork;
is_automatic = true;
scope = new vpiScopeForkAuto(name, tname);
} else if (strcmp(type,"begin") == 0) {
scope = new vpiScopeBegin;
scope = new vpiScopeBegin(name, tname);
} else if (strcmp(type,"autobegin") == 0) {
scope = new vpiScopeBegin;
is_automatic = true;
scope = new vpiScopeBeginAuto(name, tname);
} else if (strcmp(type,"generate") == 0) {
scope = new vpiScopeGenerate;
scope = new vpiScopeGenerate(name, tname);
} else if (strcmp(type,"package") == 0) {
scope = new vpiScopePackage;
scope = new vpiScopePackage(name, tname);
} else if (strcmp(type,"class") == 0) {
scope = new vpiScopeClass;
scope = new vpiScopeClass(name, tname);
} else {
scope = new vpiScopeModule;
scope = new vpiScopeModule(name, tname);
assert(0);
}
scope->name = vpip_name_string(name);
if (tname) scope->tname = vpip_name_string(tname);
else scope->tname = vpip_name_string("");
scope->file_idx = (unsigned) file_idx;
scope->lineno = (unsigned) lineno;
scope->def_file_idx = (unsigned) def_file_idx;
scope->def_lineno = (unsigned) def_lineno;
scope->is_automatic = is_automatic;
scope->intern = 0;
scope->nintern = 0;
scope->item = 0;
@ -577,7 +606,7 @@ struct __vpiScope* vpip_peek_context_scope(void)
/* A context is allocated for each automatic task or function.
Storage for nested scopes (named blocks) is allocated in
the parent context. */
while (scope->scope && scope->scope->is_automatic)
while (scope->scope && scope->scope->is_automatic())
scope = scope->scope;
return scope;
@ -587,7 +616,7 @@ unsigned vpip_add_item_to_context(automatic_hooks_s*item,
struct __vpiScope*scope)
{
assert(scope);
assert(scope->is_automatic);
assert(scope->is_automatic());
unsigned idx = scope->nitem++;

View File

@ -571,7 +571,7 @@ static int signal_get(int code, vpiHandle ref)
return (rfp->msb.get_value() != rfp->lsb.get_value());
case vpiAutomatic:
return (int) vpip_scope(rfp)->is_automatic;
return vpip_scope(rfp)->is_automatic() ? 1 : 0;
#ifdef BR916_STOPGAP_FIX
case _vpiFromThr:
@ -760,7 +760,7 @@ static void signal_get_value(vpiHandle ref, s_vpi_value*vp)
"value type %d not implemented."
" Signal is %s in scope %s\n",
(int)vp->format, vpi_get_str(vpiName, ref),
vpip_scope(rfp)->name);
vpip_scope(rfp)->scope_name());
assert(0);
}
}

View File

@ -425,7 +425,7 @@ static void multiply_array_imm(unsigned long*res, unsigned long*val,
*/
static vvp_context_t vthread_alloc_context(struct __vpiScope*scope)
{
assert(scope->is_automatic);
assert(scope->is_automatic());
vvp_context_t context = scope->free_contexts;
if (context) {
@ -453,7 +453,7 @@ static vvp_context_t vthread_alloc_context(struct __vpiScope*scope)
*/
static void vthread_free_context(vvp_context_t context, struct __vpiScope*scope)
{
assert(scope->is_automatic);
assert(scope->is_automatic());
assert(context);
if (context == scope->live_contexts) {
@ -2887,7 +2887,7 @@ bool of_FORK(vthread_t thr, vvp_code_t cp)
{
vthread_t child = vthread_new(cp->cptr2, cp->scope);
if (cp->scope->is_automatic) {
if (cp->scope->is_automatic()) {
/* The context allocated for this child is the top entry
on the write context stack. */
child->wt_context = thr->wt_context;
@ -5802,7 +5802,7 @@ bool of_EXEC_UFUNC(vthread_t thr, vvp_code_t cp)
/* If an automatic function, allocate a context for this call. */
vvp_context_t child_context = 0;
if (child_scope->is_automatic) {
if (child_scope->is_automatic()) {
child_context = vthread_alloc_context(child_scope);
thr->wt_context = child_context;
thr->rd_context = child_context;
@ -5845,7 +5845,7 @@ bool of_REAP_UFUNC(vthread_t thr, vvp_code_t cp)
cp->ufunc_core_ptr->finish_thread();
/* If an automatic function, free the context for this call. */
if (child_scope->is_automatic) {
if (child_scope->is_automatic()) {
vthread_free_context(thr->rd_context, child_scope);
thr->wt_context = 0;
thr->rd_context = 0;

View File

@ -37,7 +37,7 @@ static void __compile_var_real(char*label, char*name,
{
vvp_net_t*net = new vvp_net_t;
if (vpip_peek_current_scope()->is_automatic) {
if (vpip_peek_current_scope()->is_automatic()) {
vvp_fun_signal_real_aa*tmp = new vvp_fun_signal_real_aa;
net->fil = tmp;
net->fun = tmp;
@ -54,7 +54,7 @@ static void __compile_var_real(char*label, char*name,
if (name) {
assert(!array);
vpip_attach_to_current_scope(obj);
if (!vpip_peek_current_scope()->is_automatic)
if (!vpip_peek_current_scope()->is_automatic())
schedule_init_vector(vvp_net_ptr_t(net,0), 0.0);
}
if (array) {
@ -82,7 +82,7 @@ void compile_var_string(char*label, char*name)
{
vvp_net_t*net = new vvp_net_t;
if (vpip_peek_current_scope()->is_automatic) {
if (vpip_peek_current_scope()->is_automatic()) {
vvp_fun_signal_string_aa*tmp = new vvp_fun_signal_string_aa;
net->fil = tmp;
net->fun = tmp;
@ -105,7 +105,7 @@ void compile_var_darray(char*label, char*name)
{
vvp_net_t*net = new vvp_net_t;
if (vpip_peek_current_scope()->is_automatic) {
if (vpip_peek_current_scope()->is_automatic()) {
vvp_fun_signal_object_aa*tmp = new vvp_fun_signal_object_aa;
net->fil = tmp;
net->fun = tmp;
@ -128,7 +128,7 @@ void compile_var_queue(char*label, char*name)
{
vvp_net_t*net = new vvp_net_t;
if (vpip_peek_current_scope()->is_automatic) {
if (vpip_peek_current_scope()->is_automatic()) {
vvp_fun_signal_object_aa*tmp = new vvp_fun_signal_object_aa;
net->fil = tmp;
net->fun = tmp;
@ -151,7 +151,7 @@ void compile_var_cobject(char*label, char*name)
{
vvp_net_t*net = new vvp_net_t;
if (vpip_peek_current_scope()->is_automatic) {
if (vpip_peek_current_scope()->is_automatic()) {
vvp_fun_signal_object_aa*tmp = new vvp_fun_signal_object_aa;
net->fil = tmp;
net->fun = tmp;
@ -182,7 +182,7 @@ void compile_variable(char*label, char*name,
vvp_net_t*net = new vvp_net_t;
if (vpip_peek_current_scope()->is_automatic) {
if (vpip_peek_current_scope()->is_automatic()) {
vvp_fun_signal4_aa*tmp = new vvp_fun_signal4_aa(wid);
net->fil = tmp;
net->fun = tmp;
@ -221,7 +221,7 @@ void compile_variable(char*label, char*name,
// scope as a signal.
if (name) {
if (obj) vpip_attach_to_current_scope(obj);
if (!vpip_peek_current_scope()->is_automatic) {
if (!vpip_peek_current_scope()->is_automatic()) {
vvp_vector4_t tmp;
vfil->vec4_value(tmp);
schedule_init_vector(vvp_net_ptr_t(net,0), tmp);