input connect cleanup. (Stephan Boettcher)

This commit is contained in:
steve 2001-04-28 20:24:03 +00:00
parent f855cb19b8
commit efe41c2435
1 changed files with 69 additions and 114 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.43 2001/04/26 15:52:22 steve Exp $" #ident "$Id: compile.cc,v 1.44 2001/04/28 20:24:03 steve Exp $"
#endif #endif
# include "compile.h" # include "compile.h"
@ -202,6 +202,56 @@ void compile_load_vpi_module(char*name)
free(name); free(name);
} }
/*
* Add a functor to the symbol table
*/
static void define_functor_symbol(char*label, vvp_ipoint_t fdx)
{
symbol_value_t val;
val.num = fdx;
sym_set_value(sym_functors, label, val);
}
/*
* Run through the arguments looking for the functors that are
* connected to my input ports. For each source functor that I
* find, connect the output of that functor to the indexed
* input by inserting myself (complete with the port number in
* the vvp_ipoint_t) into the list that the source heads.
*
* If the source functor is not declared yet, then don't do
* the link yet. Save the reference to be resolved later.
*/
static void inputs_connect(vvp_ipoint_t fdx, unsigned argc, struct symb_s*argv)
{
for (unsigned idx = 0; idx < argc; idx += 1)
{
vvp_ipoint_t ifdx = ipoint_input_index(fdx, idx);
functor_t iobj = functor_index(ifdx);
symbol_value_t val = sym_get_value(sym_functors, argv[idx].text);
vvp_ipoint_t tmp = val.num;
if (tmp)
{
tmp = ipoint_index(tmp, argv[idx].idx);
functor_t fport = functor_index(tmp);
iobj->port[ipoint_port(ifdx)] = fport->out;
fport->out = ifdx;
free(argv[idx].text);
}
else
{
postpone_functor_input(ifdx, argv[idx].text, argv[idx].idx);
}
}
free(argv);
}
/* /*
* 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
@ -213,41 +263,11 @@ void compile_functor(char*label, char*type, unsigned init,
vvp_ipoint_t fdx = functor_allocate(1); vvp_ipoint_t fdx = functor_allocate(1);
functor_t obj = functor_index(fdx); functor_t obj = functor_index(fdx);
{ symbol_value_t val; define_functor_symbol(label, fdx);
val.num = fdx;
sym_set_value(sym_functors, label, val);
}
assert(argc <= 4); assert(argc <= 4);
/* Run through the arguments looking for the functors that are inputs_connect(fdx, argc, argv);
connected to my input ports. For each source functor that I
find, connect the output of that functor to the indexed
input by inserting myself (complete with the port number in
the vvp_ipoint_t) into the list that the source heads.
If the source functor is not declared yet, then don't do
the link yet. Save the reference to be resolved later. */
for (unsigned idx = 0 ; idx < argc ; idx += 1) {
symbol_value_t val = sym_get_value(sym_functors, argv[idx].text);
vvp_ipoint_t tmp = val.num;
if (tmp) {
tmp = ipoint_index(tmp, argv[idx].idx);
functor_t fport = functor_index(tmp);
obj->port[idx] = fport->out;
fport->out = ipoint_make(fdx, idx);
free(argv[idx].text);
} else {
postpone_functor_input(ipoint_make(fdx, idx),
argv[idx].text,
argv[idx].idx);
}
}
obj->ival = init; obj->ival = init;
obj->oval = 2; obj->oval = 2;
@ -284,7 +304,6 @@ void compile_functor(char*label, char*type, unsigned init,
yyerror("invalid functor type."); yyerror("invalid functor type.");
} }
free(argv);
free(label); free(label);
free(type); free(type);
} }
@ -298,6 +317,7 @@ void compile_udp_def(int sequ, char *label, char *name,
u->nin = nin; u->nin = nin;
u->init = init; u->init = init;
u->table = table; u->table = table;
free(label);
} }
char **compile_udp_table(char **table, char *row) char **compile_udp_table(char **table, char *row)
@ -327,11 +347,8 @@ void compile_udp_functor(char*label, char*type,
vvp_ipoint_t fdx = functor_allocate(nfun); vvp_ipoint_t fdx = functor_allocate(nfun);
functor_t obj = functor_index(fdx); functor_t obj = functor_index(fdx);
{ define_functor_symbol(label, fdx);
symbol_value_t val; free(label);
val.num = fdx;
sym_set_value(sym_functors, label, val);
}
for (unsigned idx = 0; idx < argc; idx += 4) for (unsigned idx = 0; idx < argc; idx += 4)
{ {
@ -353,40 +370,7 @@ void compile_udp_functor(char*label, char*type,
} }
} }
/* Run through the arguments looking for the functors that are inputs_connect(fdx, argc, argv);
connected to my input ports. For each source functor that I
find, connect the output of that functor to the indexed
input by inserting myself (complete with the port number in
the vvp_ipoint_t) into the list that the source heads.
If the source functor is not declared yet, then don't do
the link yet. Save the reference to be resolved later. */
for (unsigned idx = 0; idx < argc; idx += 1)
{
vvp_ipoint_t ifdx = ipoint_input_index(fdx, idx);
functor_t iobj = functor_index(ifdx);
symbol_value_t val = sym_get_value(sym_functors, argv[idx].text);
vvp_ipoint_t tmp = val.num;
if (tmp)
{
tmp = ipoint_index(tmp, argv[idx].idx);
functor_t fport = functor_index(tmp);
iobj->port[ipoint_port(ifdx)] = fport->out;
fport->out = ifdx;
free(argv[idx].text);
}
else
{
postpone_functor_input(ifdx, argv[idx].text, argv[idx].idx);
}
}
free(argv);
free(label);
} }
@ -396,10 +380,7 @@ void compile_event(char*label, char*type,
vvp_ipoint_t fdx = functor_allocate(1); vvp_ipoint_t fdx = functor_allocate(1);
functor_t obj = functor_index(fdx); functor_t obj = functor_index(fdx);
{ symbol_value_t val; define_functor_symbol(label, fdx);
val.num = fdx;
sym_set_value(sym_functors, label, val);
}
assert(argc <= 4); assert(argc <= 4);
@ -412,27 +393,7 @@ void compile_event(char*label, char*type,
If the source functor is not declared yet, then don't do If the source functor is not declared yet, then don't do
the link yet. Save the reference to be resolved later. */ the link yet. Save the reference to be resolved later. */
for (unsigned idx = 0 ; idx < argc ; idx += 1) { inputs_connect(fdx, argc, argv);
symbol_value_t val = sym_get_value(sym_functors, argv[idx].text);
vvp_ipoint_t tmp = val.num;
if (tmp) {
tmp = ipoint_index(tmp, argv[idx].idx);
functor_t fport = functor_index(tmp);
obj->port[idx] = fport->out;
fport->out = ipoint_make(fdx, idx);
free(argv[idx].text);
} else {
postpone_functor_input(ipoint_make(fdx, idx),
argv[idx].text,
argv[idx].idx);
}
}
free(argv);
obj->ival = 0xaa; obj->ival = 0xaa;
obj->oval = 2; obj->oval = 2;
@ -461,10 +422,7 @@ void compile_named_event(char*label, char*name)
vvp_ipoint_t fdx = functor_allocate(1); vvp_ipoint_t fdx = functor_allocate(1);
functor_t obj = functor_index(fdx); functor_t obj = functor_index(fdx);
{ symbol_value_t val; define_functor_symbol(label, fdx);
val.num = fdx;
sym_set_value(sym_functors, label, val);
}
obj->ival = 0xaa; obj->ival = 0xaa;
obj->oval = 2; obj->oval = 2;
@ -484,10 +442,7 @@ void compile_event_or(char*label, unsigned argc, struct symb_s*argv)
vvp_ipoint_t fdx = functor_allocate(1); vvp_ipoint_t fdx = functor_allocate(1);
functor_t obj = functor_index(fdx); functor_t obj = functor_index(fdx);
{ symbol_value_t val; define_functor_symbol(label, fdx);
val.num = fdx;
sym_set_value(sym_functors, label, val);
}
obj->ival = 0xaa; obj->ival = 0xaa;
obj->oval = 2; obj->oval = 2;
@ -517,7 +472,6 @@ void compile_event_or(char*label, unsigned argc, struct symb_s*argv)
} }
free(argv); free(argv);
free(label); free(label);
} }
@ -795,9 +749,8 @@ void compile_variable(char*label, char*name, int msb, int lsb,
{ {
unsigned wid = ((msb > lsb)? msb-lsb : lsb-msb) + 1; unsigned wid = ((msb > lsb)? msb-lsb : lsb-msb) + 1;
vvp_ipoint_t fdx = functor_allocate(wid); vvp_ipoint_t fdx = functor_allocate(wid);
symbol_value_t val;
val.num = fdx; define_functor_symbol(label, fdx);
sym_set_value(sym_functors, label, val);
for (unsigned idx = 0 ; idx < wid ; idx += 1) { for (unsigned idx = 0 ; idx < wid ; idx += 1) {
functor_t obj = functor_index(ipoint_index(fdx,idx)); functor_t obj = functor_index(ipoint_index(fdx,idx));
@ -819,9 +772,8 @@ void compile_net(char*label, char*name, int msb, int lsb, bool signed_flag,
{ {
unsigned wid = ((msb > lsb)? msb-lsb : lsb-msb) + 1; unsigned wid = ((msb > lsb)? msb-lsb : lsb-msb) + 1;
vvp_ipoint_t fdx = functor_allocate(wid); vvp_ipoint_t fdx = functor_allocate(wid);
symbol_value_t val;
val.num = fdx; define_functor_symbol(label, fdx);
sym_set_value(sym_functors, label, val);
/* Allocate all the functors for the net itself. */ /* Allocate all the functors for the net itself. */
for (unsigned idx = 0 ; idx < wid ; idx += 1) { for (unsigned idx = 0 ; idx < wid ; idx += 1) {
@ -846,7 +798,7 @@ void compile_net(char*label, char*name, int msb, int lsb, bool signed_flag,
continue; continue;
} }
val = sym_get_value(sym_functors, argv[idx].text); symbol_value_t val = sym_get_value(sym_functors, argv[idx].text);
if (val.num) { if (val.num) {
functor_t src = functor_index(ipoint_index(val.num, functor_t src = functor_index(ipoint_index(val.num,
@ -957,6 +909,9 @@ void compile_dump(FILE*fd)
/* /*
* $Log: compile.cc,v $ * $Log: compile.cc,v $
* Revision 1.44 2001/04/28 20:24:03 steve
* input connect cleanup. (Stephan Boettcher)
*
* Revision 1.43 2001/04/26 15:52:22 steve * Revision 1.43 2001/04/26 15:52:22 steve
* Add the mode-42 functor concept to UDPs. * Add the mode-42 functor concept to UDPs.
* *