Fix up functor inputs to support C<?> values.
This commit is contained in:
parent
3f952a2fd2
commit
8057faccc1
|
|
@ -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.46 2001/04/29 23:13:33 steve Exp $"
|
#ident "$Id: compile.cc,v 1.47 2001/04/30 03:53:19 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "compile.h"
|
# include "compile.h"
|
||||||
|
|
@ -222,34 +222,50 @@ static void define_functor_symbol(char*label, vvp_ipoint_t fdx)
|
||||||
*
|
*
|
||||||
* 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.
|
||||||
*/
|
*
|
||||||
|
* If the source is a constant value, then set the ival of the functor
|
||||||
|
* and skip the symbol lookup.
|
||||||
|
*/
|
||||||
|
|
||||||
static void inputs_connect(vvp_ipoint_t fdx, unsigned argc, struct symb_s*argv)
|
static void inputs_connect(vvp_ipoint_t fdx, unsigned argc, struct symb_s*argv)
|
||||||
{
|
{
|
||||||
for (unsigned idx = 0; idx < argc; idx += 1)
|
/* Functors only have 4 inputs. The struct functor_s defines
|
||||||
{
|
this to be so. */
|
||||||
vvp_ipoint_t ifdx = ipoint_input_index(fdx, idx);
|
assert(argc <= 4);
|
||||||
functor_t iobj = functor_index(ifdx);
|
|
||||||
|
|
||||||
symbol_value_t val = sym_get_value(sym_functors, argv[idx].text);
|
for (unsigned idx = 0; idx < argc; idx += 1) {
|
||||||
vvp_ipoint_t tmp = val.num;
|
|
||||||
|
|
||||||
if (tmp)
|
vvp_ipoint_t ifdx = ipoint_input_index(fdx, idx);
|
||||||
{
|
functor_t iobj = functor_index(ifdx);
|
||||||
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);
|
if (strcmp(argv[idx].text, "C<0>") == 0) {
|
||||||
}
|
free(argv[idx].text);
|
||||||
else
|
iobj->ival &= ~(3 << idx*2);
|
||||||
{
|
continue;
|
||||||
postpone_functor_input(ifdx, argv[idx].text, argv[idx].idx);
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
free(argv);
|
if (strcmp(argv[idx].text, "C<1>") == 0) {
|
||||||
|
free(argv[idx].text);
|
||||||
|
iobj->ival &= ~(3 << idx*2);
|
||||||
|
iobj->ival |= 1 << idx*2;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -267,8 +283,6 @@ void compile_functor(char*label, char*type, unsigned init,
|
||||||
|
|
||||||
assert(argc <= 4);
|
assert(argc <= 4);
|
||||||
|
|
||||||
inputs_connect(fdx, argc, argv);
|
|
||||||
|
|
||||||
obj->ival = init;
|
obj->ival = init;
|
||||||
obj->oval = 2;
|
obj->oval = 2;
|
||||||
obj->mode = 0;
|
obj->mode = 0;
|
||||||
|
|
@ -310,6 +324,18 @@ void compile_functor(char*label, char*type, unsigned init,
|
||||||
yyerror("invalid functor type.");
|
yyerror("invalid functor type.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Connect the inputs of this functor to the given symbols. If
|
||||||
|
there are C<X> inputs, set the ival appropriately. */
|
||||||
|
inputs_connect(fdx, argc, argv);
|
||||||
|
|
||||||
|
/* Recalculate the output based on the given ival. if the oval
|
||||||
|
turns out to *not* be x, then schedule the functor so that
|
||||||
|
the value gets propagated. */
|
||||||
|
unsigned char out = obj->table[obj->ival >> 2];
|
||||||
|
obj->oval = 3 & (out >> 2 * (obj->ival&3));
|
||||||
|
if (obj->oval != 2)
|
||||||
|
schedule_functor(fdx, 0);
|
||||||
|
|
||||||
free(label);
|
free(label);
|
||||||
free(type);
|
free(type);
|
||||||
}
|
}
|
||||||
|
|
@ -937,6 +963,9 @@ void compile_dump(FILE*fd)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: compile.cc,v $
|
* $Log: compile.cc,v $
|
||||||
|
* Revision 1.47 2001/04/30 03:53:19 steve
|
||||||
|
* Fix up functor inputs to support C<?> values.
|
||||||
|
*
|
||||||
* Revision 1.46 2001/04/29 23:13:33 steve
|
* Revision 1.46 2001/04/29 23:13:33 steve
|
||||||
* Add bufif0 and bufif1 functors.
|
* Add bufif0 and bufif1 functors.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue