functor lookup includes vpi signal search.

This commit is contained in:
steve 2001-10-12 02:53:47 +00:00
parent f12864f69e
commit ad6bbe539f
1 changed files with 53 additions and 136 deletions

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/ */
#if !defined(WINNT) #if !defined(WINNT)
#ident "$Id: compile.cc,v 1.103 2001/10/11 18:29:21 steve Exp $" #ident "$Id: compile.cc,v 1.104 2001/10/12 02:53:47 steve Exp $"
#endif #endif
# include "arith.h" # include "arith.h"
@ -175,22 +175,7 @@ static symbol_table_t sym_vpi = 0;
/* /*
* Add a functor to the symbol table * Add a functor to the symbol table
*/ */
#if 0
static void define_fvector_symbol(char*label, vvp_fvector_t v)
{
symbol_value_t val;
val.ptr = v;
sym_set_value(sym_functors, label, val);
}
#endif
#if 0
static void define_functor_symbol(char*label, vvp_ipoint_t ipt, unsigned wid)
{
vvp_fvector_t v = vvp_fvector_continuous_new(wid, ipt);
define_fvector_symbol(label, v);
}
#else
static void define_functor_symbol(const char*label, vvp_ipoint_t ipt) static void define_functor_symbol(const char*label, vvp_ipoint_t ipt)
{ {
symbol_value_t val; symbol_value_t val;
@ -203,7 +188,28 @@ static vvp_ipoint_t lookup_functor_symbol(const char*label)
symbol_value_t val = sym_get_value(sym_functors, label); symbol_value_t val = sym_get_value(sym_functors, label);
return val.num; return val.num;
} }
#endif
static vvp_ipoint_t ipoint_lookup(const char *label, unsigned idx)
{
/* First, look to see if the symbol is a signal, whether net
or reg. If so, get the correct bit out. */
symbol_value_t val = sym_get_value(sym_vpi, label);
if (val.ptr) {
vpiHandle vpi = (vpiHandle) val.ptr;
assert((vpi->vpi_type->type_code == vpiNet)
|| (vpi->vpi_type->type_code == vpiReg));
__vpiSignal*sig = (__vpiSignal*)vpi;
return vvp_fvector_get(sig->bits, idx);
}
/* Failing that, look for a general functor. */
vvp_ipoint_t tmp = lookup_functor_symbol(label);
if (tmp)
tmp = ipoint_index(tmp, idx);
return tmp;
}
/* /*
* The resolv_list_s is the base class for a symbol resolve action, and * The resolv_list_s is the base class for a symbol resolve action, and
@ -255,11 +261,9 @@ struct functor_resolv_list_s: public resolv_list_s {
bool functor_resolv_list_s::resolve(bool mes) bool functor_resolv_list_s::resolve(bool mes)
{ {
vvp_ipoint_t tmp = lookup_functor_symbol(source); vvp_ipoint_t tmp = ipoint_lookup(source, idx);
if (tmp) { if (tmp) {
tmp = ipoint_index(tmp, idx);
functor_t fport = functor_index(tmp); functor_t fport = functor_index(tmp);
functor_t iobj = functor_index(port); functor_t iobj = functor_index(port);
@ -301,11 +305,9 @@ struct functor_gen_resolv_list_s: public resolv_list_s {
bool functor_gen_resolv_list_s::resolve(bool mes) bool functor_gen_resolv_list_s::resolve(bool mes)
{ {
vvp_ipoint_t tmp = lookup_functor_symbol(source); vvp_ipoint_t tmp = ipoint_lookup(source, idx);
if (tmp) { if (tmp) {
tmp = ipoint_index(tmp, idx);
*ref = tmp; *ref = tmp;
free(source); free(source);
@ -423,72 +425,6 @@ void code_label_lookup(struct vvp_code_s *code, char *label)
resolv_submit(res); resolv_submit(res);
} }
/*
* functor label lookup
*/
struct code_functor_resolv_list_s: public resolv_list_s {
struct vvp_code_s *code;
char *label;
unsigned idx;
virtual bool resolve(bool mes);
};
bool code_functor_resolv_list_s::resolve(bool mes)
{
vvp_ipoint_t tmp;
/* First, look to see if the symbol is a signal, whether net
or reg. If so, get the correct bit out. */
symbol_value_t val = sym_get_value(sym_vpi, label);
if (val.ptr) {
vpiHandle vpi = (vpiHandle) val.ptr;
assert((vpi->vpi_type->type_code == vpiNet)
|| (vpi->vpi_type->type_code == vpiReg));
__vpiSignal*sig = (__vpiSignal*)vpi;
tmp = vvp_fvector_get(sig->bits, idx);
if (tmp == 0)
goto error_out;
assert(tmp);
code->iptr = tmp;
free(label);
return true;
}
/* Failing that, look for a general functor. */
tmp = lookup_functor_symbol(label);
if (tmp) {
code->iptr = ipoint_index(tmp, idx);
free(label);
return true;
}
error_out:
/* lookup failed. Possibly try again. */
if (mes)
fprintf(stderr,
"unresolved code reference to functor: %s\n",
label);
return false;
}
inline static
void code_functor_lookup(struct vvp_code_s *code, char *label, unsigned idx)
{
struct code_functor_resolv_list_s *res
= new struct code_functor_resolv_list_s;
res->code = code;
res->label = label;
res->idx = idx;
resolv_submit(res);
}
/* /*
* When parsing is otherwise complete, this function is called to do * When parsing is otherwise complete, this function is called to do
* the final stuff. Clean up deferred linking here. * the final stuff. Clean up deferred linking here.
@ -662,55 +598,34 @@ static vvp_ipoint_t make_const_functor(unsigned val,
static void functor_reference(vvp_ipoint_t *ref, char *lab, unsigned idx) static void functor_reference(vvp_ipoint_t *ref, char *lab, unsigned idx)
{ {
if (lab == 0) { if (lab == 0)
static vvp_ipoint_t cf=0; *ref = make_const_functor(3,6,6);
if (!cf)
cf = make_const_functor(3,6,6);
*ref = cf;
} else
if (strcmp(lab, "C<0>") == 0) { else if (strcmp(lab, "C<0>") == 0)
static vvp_ipoint_t cf=0; *ref = make_const_functor(0,6,6);
if (!cf)
cf = make_const_functor(0,6,6);
*ref = cf;
} else
if (strcmp(lab, "C<su0>") == 0) { else if (strcmp(lab, "C<su0>") == 0)
static vvp_ipoint_t cf=0; *ref = make_const_functor(0,7,7);
if (!cf)
cf = make_const_functor(0,7,7);
*ref = cf;
} else
if (strcmp(lab, "C<1>") == 0) { else if (strcmp(lab, "C<pu0>") == 0)
static vvp_ipoint_t cf=0; *ref = make_const_functor(0,5,5);
if (!cf)
cf = make_const_functor(1,6,6);
*ref = cf;
} else
if (strcmp(lab, "C<su1>") == 0) { else if (strcmp(lab, "C<1>") == 0)
static vvp_ipoint_t cf=0; *ref = make_const_functor(1,6,6);
if (!cf)
cf = make_const_functor(1,7,7);
*ref = cf;
} else
if (strcmp(lab, "C<x>") == 0) { else if (strcmp(lab, "C<su1>") == 0)
static vvp_ipoint_t cf=0; *ref = make_const_functor(1,7,7);
if (!cf)
cf = make_const_functor(2,6,6);
*ref = cf;
} else
if (strcmp(lab, "C<z>") == 0) { else if (strcmp(lab, "C<pu1>") == 0)
static vvp_ipoint_t cf=0; *ref = make_const_functor(1,5,5);
if (!cf)
cf = make_const_functor(3,6,6);
*ref = cf;
} else {
else if (strcmp(lab, "C<x>") == 0)
*ref = make_const_functor(2,6,6);
else if (strcmp(lab, "C<z>") == 0)
*ref = make_const_functor(3,6,6);
else {
functor_ref_lookup(ref, lab, idx); functor_ref_lookup(ref, lab, idx);
return; return;
} }
@ -718,7 +633,6 @@ static void functor_reference(vvp_ipoint_t *ref, char *lab, unsigned idx)
free(lab); free(lab);
} }
/* /*
* The parser calls this function to create a functor. I allocate a * The parser calls this function to create a functor. I allocate a
* functor, and map the name to the vvp_ipoint_t address for the * functor, and map the name to the vvp_ipoint_t address for the
@ -1431,7 +1345,7 @@ void compile_code(char*label, char*mnem, comp_operands_t opa)
break; break;
} }
code_functor_lookup(code, functor_ref_lookup(&code->iptr,
opa->argv[idx].symb.text, opa->argv[idx].symb.text,
opa->argv[idx].symb.idx); opa->argv[idx].symb.idx);
break; break;
@ -1654,6 +1568,9 @@ vvp_ipoint_t debug_lookup_functor(const char*name)
/* /*
* $Log: compile.cc,v $ * $Log: compile.cc,v $
* Revision 1.104 2001/10/12 02:53:47 steve
* functor lookup includes vpi signal search.
*
* Revision 1.103 2001/10/11 18:29:21 steve * Revision 1.103 2001/10/11 18:29:21 steve
* Propagate initial value of UDP. * Propagate initial value of UDP.
* *