Permalink
Browse files

Add support for bit select of parameters.

 This leads to a NetESelect node and the
 vvp code generator to support that.
  • Loading branch information...
1 parent 712080f commit 364ffc9024a018a111e959778edea3188fbdaf7a steve committed Jan 28, 2002
Showing with 225 additions and 81 deletions.
  1. +3 −3 Makefile.in
  2. +3 −0 README.txt
  3. +12 −1 dup_expr.cc
  4. +23 −1 elab_expr.cc
  5. +12 −1 elab_pexpr.cc
  6. +11 −1 emit.cc
  7. +7 −1 ivl_target.h
  8. +33 −2 netlist.h
  9. +8 −1 t-dll-api.cc
  10. +28 −1 t-dll-expr.cc
  11. +7 −1 t-dll.h
  12. +12 −1 target.cc
  13. +7 −1 target.h
  14. +59 −66 tgt-vvp/eval_expr.c
View
6 Makefile.in
@@ -16,7 +16,7 @@
# 59 Temple Place - Suite 330
# Boston, MA 02111-1307, USA
#
-#ident "$Id: Makefile.in,v 1.112 2002/01/25 03:25:16 steve Exp $"
+#ident "$Id: Makefile.in,v 1.113 2002/01/28 00:52:41 steve Exp $"
#
#
SHELL = /bin/sh
@@ -117,8 +117,8 @@ elab_lval.o elab_net.o elab_anet.o elab_pexpr.o elab_scope.o \
elab_sig.o emit.o eval.o eval_rconst.o \
eval_tree.o expr_synth.o functor.o lexor.o lexor_keyword.o link_const.o \
load_module.o mangle.o netlist.o netmisc.o net_assign.o \
-net_design.o net_event.o net_force.o net_link.o net_modulo.o net_proc.o \
-net_scope.o net_udp.o pad_to_width.o \
+net_design.o net_event.o net_expr.o net_force.o net_link.o net_modulo.o \
+net_proc.o net_scope.o net_udp.o pad_to_width.o \
parse.o parse_misc.o pform.o pform_dump.o \
set_width.o \
verinum.o verireal.o target.o targets.o \
View
3 README.txt
@@ -405,6 +405,8 @@ constructs.
- trireg is not supported. tri0 and tri1 are supported.
+ - force to nets are not supported. Force to variables, and
+ assign/deassign, are supported.
6.0 CREDITS
@@ -430,6 +432,7 @@ Verilog guidance, and especially testing from many people, including
Stuart Sutherland <stuart@sutherland.com>
Stephen Tell <tell@cs.unc.edu>
Stefan Theide <Stefan.Thiede@sv.sc.philips.com>
+ Tom Verbeure
Steve Wilson <stevew@home.com>
and others. Testers in particular include a larger community of people
View
13 dup_expr.cc
@@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT) && !defined(macintosh)
-#ident "$Id: dup_expr.cc,v 1.6 2001/11/19 01:54:14 steve Exp $"
+#ident "$Id: dup_expr.cc,v 1.7 2002/01/28 00:52:41 steve Exp $"
#endif
# include "config.h"
@@ -31,6 +31,12 @@ NetEScope* NetEScope::dup_expr() const
return 0;
}
+NetESelect* NetESelect::dup_expr() const
+{
+ return new NetESelect(expr_->dup_expr(), base_->dup_expr(),
+ expr_width());
+}
+
NetESFunc* NetESFunc::dup_expr() const
{
NetESFunc*tmp = new NetESFunc(name_, expr_width(), nparms());
@@ -68,6 +74,11 @@ NetEUnary* NetEUnary::dup_expr() const
/*
* $Log: dup_expr.cc,v $
+ * Revision 1.7 2002/01/28 00:52:41 steve
+ * Add support for bit select of parameters.
+ * This leads to a NetESelect node and the
+ * vvp code generator to support that.
+ *
* Revision 1.6 2001/11/19 01:54:14 steve
* Port close cropping behavior from mcrgb
* Move window array reset to libmc.
View
24 elab_expr.cc
@@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT) && !defined(macintosh)
-#ident "$Id: elab_expr.cc,v 1.49 2002/01/11 05:25:45 steve Exp $"
+#ident "$Id: elab_expr.cc,v 1.50 2002/01/28 00:52:41 steve Exp $"
#endif
# include "config.h"
@@ -415,6 +415,23 @@ NetExpr* PEIdent::elaborate_expr(Design*des, NetScope*scope) const
else
tmp = new NetEParam(des, scope, path_);
+ if (msb_ && lsb_) {
+ cerr << get_line() << ": error: part select of "
+ << "parameter " << path_ << " in " << scope->name()
+ << " is illegal." << endl;
+ des->errors += 1;
+
+ } else if (msb_) {
+ /* Handle the case where a parameter has a bit
+ select attached to it. Generate a NetESelect
+ object to select the bit as desired. */
+ NetExpr*mtmp = msb_->elaborate_expr(des, scope);
+ NetESelect*stmp = new NetESelect(tmp, mtmp, 1);
+ tmp->set_line(*this);
+ tmp = stmp;
+ }
+
+
tmp->set_line(*this);
return tmp;
}
@@ -673,6 +690,11 @@ NetEUnary* PEUnary::elaborate_expr(Design*des, NetScope*scope) const
/*
* $Log: elab_expr.cc,v $
+ * Revision 1.50 2002/01/28 00:52:41 steve
+ * Add support for bit select of parameters.
+ * This leads to a NetESelect node and the
+ * vvp code generator to support that.
+ *
* Revision 1.49 2002/01/11 05:25:45 steve
* The stime system function is 32bits.
*
View
13 elab_pexpr.cc
@@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT) && !defined(macintosh)
-#ident "$Id: elab_pexpr.cc,v 1.12 2001/12/03 04:47:14 steve Exp $"
+#ident "$Id: elab_pexpr.cc,v 1.13 2002/01/28 00:52:41 steve Exp $"
#endif
# include "config.h"
@@ -152,6 +152,12 @@ NetExpr*PEIdent::elaborate_pexpr(Design*des, NetScope*scope) const
return 0;
}
+ if (msb_ || lsb_ || idx_) {
+ cerr << get_line() << ": error: Cannot bit/part select "
+ "bits of parameters." << endl;
+ des->errors += 1;
+ }
+
NetExpr*res = new NetEParam(des, pscope, hname_t(name));
assert(res);
delete name;
@@ -218,6 +224,11 @@ NetExpr*PEUnary::elaborate_pexpr (Design*des, NetScope*scope) const
/*
* $Log: elab_pexpr.cc,v $
+ * Revision 1.13 2002/01/28 00:52:41 steve
+ * Add support for bit select of parameters.
+ * This leads to a NetESelect node and the
+ * vvp code generator to support that.
+ *
* Revision 1.12 2001/12/03 04:47:14 steve
* Parser and pform use hierarchical names as hname_t
* objects instead of encoded strings.
View
12 emit.cc
@@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT) && !defined(macintosh)
-#ident "$Id: emit.cc,v 1.64 2002/01/19 19:02:08 steve Exp $"
+#ident "$Id: emit.cc,v 1.65 2002/01/28 00:52:41 steve Exp $"
#endif
# include "config.h"
@@ -434,6 +434,11 @@ void NetEScope::expr_scan(struct expr_scan_t*tgt) const
tgt->expr_scope(this);
}
+void NetESelect::expr_scan(struct expr_scan_t*tgt) const
+{
+ tgt->expr_select(this);
+}
+
void NetESFunc::expr_scan(struct expr_scan_t*tgt) const
{
tgt->expr_sfunc(this);
@@ -477,6 +482,11 @@ bool emit(const Design*des, const char*type)
/*
* $Log: emit.cc,v $
+ * Revision 1.65 2002/01/28 00:52:41 steve
+ * Add support for bit select of parameters.
+ * This leads to a NetESelect node and the
+ * vvp code generator to support that.
+ *
* Revision 1.64 2002/01/19 19:02:08 steve
* Pass back target errors processing conditionals.
*
View
8 ivl_target.h
@@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT) && !defined(macintosh)
-#ident "$Id: ivl_target.h,v 1.91 2002/01/03 04:19:01 steve Exp $"
+#ident "$Id: ivl_target.h,v 1.92 2002/01/28 00:52:41 steve Exp $"
#endif
#ifdef __cplusplus
@@ -164,6 +164,7 @@ typedef enum ivl_expr_type_e {
IVL_EX_MEMORY,
IVL_EX_NUMBER,
IVL_EX_SCOPE,
+ IVL_EX_SELECT,
IVL_EX_SFUNC,
IVL_EX_SIGNAL,
IVL_EX_STRING,
@@ -977,6 +978,11 @@ _END_DECL
/*
* $Log: ivl_target.h,v $
+ * Revision 1.92 2002/01/28 00:52:41 steve
+ * Add support for bit select of parameters.
+ * This leads to a NetESelect node and the
+ * vvp code generator to support that.
+ *
* Revision 1.91 2002/01/03 04:19:01 steve
* Add structural modulus support down to vvp.
*
View
35 netlist.h
@@ -1,7 +1,7 @@
#ifndef __netlist_H
#define __netlist_H
/*
- * Copyright (c) 1998-2000 Stephen Williams (steve@icarus.com)
+ * Copyright (c) 1998-2002 Stephen Williams (steve@icarus.com)
*
* This source code is free software; you can redistribute it
* and/or modify it in source code form under the terms of the GNU
@@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT) && !defined(macintosh)
-#ident "$Id: netlist.h,v 1.230 2002/01/22 01:40:04 steve Exp $"
+#ident "$Id: netlist.h,v 1.231 2002/01/28 00:52:41 steve Exp $"
#endif
/*
@@ -2309,6 +2309,32 @@ class NetEParam : public NetExpr {
/*
+ * This expression node supports bit/part selects from general
+ * expressions. The sub-expression is self-sized, and has bits
+ * selected from it. The base is the expression that identifies the
+ * lsb of the expression, and the wid is the width of the part select,
+ * or 1 for a bit select.
+ */
+class NetESelect : public NetExpr {
+
+ public:
+ NetESelect(NetExpr*exp, NetExpr*base, unsigned wid);
+ ~NetESelect();
+
+ const NetExpr*sub_expr() const;
+ const NetExpr*select() const;
+
+ virtual bool set_width(unsigned w);
+ virtual bool has_width() const;
+ virtual void expr_scan(struct expr_scan_t*) const;
+ virtual NetESelect* dup_expr() const;
+
+ private:
+ NetExpr*expr_;
+ NetExpr*base_;
+};
+
+/*
* This class is a special (and magical) expression node type that
* represents scope names. These can only be found as parameters to
* NetSTask objects.
@@ -2865,6 +2891,11 @@ extern ostream& operator << (ostream&, NetNet::Type);
/*
* $Log: netlist.h,v $
+ * Revision 1.231 2002/01/28 00:52:41 steve
+ * Add support for bit select of parameters.
+ * This leads to a NetESelect node and the
+ * vvp code generator to support that.
+ *
* Revision 1.230 2002/01/22 01:40:04 steve
* Precalculate constant results of memory index expressions.
*
View
9 t-dll-api.cc
@@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT) && !defined(macintosh)
-#ident "$Id: t-dll-api.cc,v 1.74 2002/01/03 04:19:01 steve Exp $"
+#ident "$Id: t-dll-api.cc,v 1.75 2002/01/28 00:52:41 steve Exp $"
#endif
# include "config.h"
@@ -272,6 +272,7 @@ extern "C" ivl_expr_t ivl_expr_oper1(ivl_expr_t net)
assert(net);
switch (net->type_) {
case IVL_EX_BINARY:
+ case IVL_EX_SELECT:
return net->u_.binary_.lef_;
case IVL_EX_BITSEL:
@@ -298,6 +299,7 @@ extern "C" ivl_expr_t ivl_expr_oper2(ivl_expr_t net)
assert(net);
switch (net->type_) {
case IVL_EX_BINARY:
+ case IVL_EX_SELECT:
return net->u_.binary_.rig_;
case IVL_EX_TERNARY:
@@ -1450,6 +1452,11 @@ extern "C" ivl_statement_t ivl_stmt_sub_stmt(ivl_statement_t net)
/*
* $Log: t-dll-api.cc,v $
+ * Revision 1.75 2002/01/28 00:52:41 steve
+ * Add support for bit select of parameters.
+ * This leads to a NetESelect node and the
+ * vvp code generator to support that.
+ *
* Revision 1.74 2002/01/03 04:19:01 steve
* Add structural modulus support down to vvp.
*
View
29 t-dll-expr.cc
@@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT) & !defined(macintosh)
-#ident "$Id: t-dll-expr.cc,v 1.21 2001/12/31 00:08:14 steve Exp $"
+#ident "$Id: t-dll-expr.cc,v 1.22 2002/01/28 00:52:41 steve Exp $"
#endif
# include "config.h"
@@ -161,6 +161,28 @@ void dll_target::expr_scope(const NetEScope*net)
expr_->u_.scope_.scope = lookup_scope_(net->scope());
}
+void dll_target::expr_select(const NetESelect*net)
+{
+ assert(expr_ == 0);
+
+ net->sub_expr()->expr_scan(this);
+ ivl_expr_t left = expr_;
+
+ expr_ = 0;
+ net->select()->expr_scan(this);
+ ivl_expr_t rght = expr_;
+
+ expr_ = (ivl_expr_t)calloc(1, sizeof(struct ivl_expr_s));
+ assert(expr_);
+
+ expr_->type_ = IVL_EX_SELECT;
+ expr_->width_= net->expr_width();
+ expr_->signed_ = net->has_sign()? 1 : 0;
+
+ expr_->u_.binary_.lef_ = left;
+ expr_->u_.binary_.rig_ = rght;
+}
+
void dll_target::expr_sfunc(const NetESFunc*net)
{
assert(expr_ == 0);
@@ -347,6 +369,11 @@ void dll_target::expr_unary(const NetEUnary*net)
/*
* $Log: t-dll-expr.cc,v $
+ * Revision 1.22 2002/01/28 00:52:41 steve
+ * Add support for bit select of parameters.
+ * This leads to a NetESelect node and the
+ * vvp code generator to support that.
+ *
* Revision 1.21 2001/12/31 00:08:14 steve
* Support $signed cast of expressions.
*
View
8 t-dll.h
@@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT) && !defined(macintosh)
-#ident "$Id: t-dll.h,v 1.74 2002/01/19 19:02:08 steve Exp $"
+#ident "$Id: t-dll.h,v 1.75 2002/01/28 00:52:41 steve Exp $"
#endif
# include "target.h"
@@ -131,6 +131,7 @@ struct dll_target : public target_t, public expr_scan_t {
void expr_memory(const NetEMemory*);
void expr_const(const NetEConst*);
void expr_scope(const NetEScope*);
+ void expr_select(const NetESelect*);
void expr_sfunc(const NetESFunc*);
void expr_subsignal(const NetEBitSel*);
void expr_ternary(const NetETernary*);
@@ -590,6 +591,11 @@ struct ivl_statement_s {
/*
* $Log: t-dll.h,v $
+ * Revision 1.75 2002/01/28 00:52:41 steve
+ * Add support for bit select of parameters.
+ * This leads to a NetESelect node and the
+ * vvp code generator to support that.
+ *
* Revision 1.74 2002/01/19 19:02:08 steve
* Pass back target errors processing conditionals.
*
View
13 target.cc
@@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT) && !defined(macintosh)
-#ident "$Id: target.cc,v 1.58 2002/01/19 19:02:08 steve Exp $"
+#ident "$Id: target.cc,v 1.59 2002/01/28 00:52:41 steve Exp $"
#endif
# include "config.h"
@@ -340,6 +340,12 @@ void expr_scan_t::expr_scope(const NetEScope*)
"unhandled expr_scope." << endl;
}
+void expr_scan_t::expr_select(const NetESelect*)
+{
+ cerr << "expr_scan_t (" << typeid(*this).name() << "): "
+ "unhandled expr_select." << endl;
+}
+
void expr_scan_t::expr_sfunc(const NetESFunc*)
{
cerr << "expr_scan_t (" << typeid(*this).name() << "): "
@@ -384,6 +390,11 @@ void expr_scan_t::expr_binary(const NetEBinary*ex)
/*
* $Log: target.cc,v $
+ * Revision 1.59 2002/01/28 00:52:41 steve
+ * Add support for bit select of parameters.
+ * This leads to a NetESelect node and the
+ * vvp code generator to support that.
+ *
* Revision 1.58 2002/01/19 19:02:08 steve
* Pass back target errors processing conditionals.
*
View
8 target.h
@@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT) && !defined(macintosh)
-#ident "$Id: target.h,v 1.55 2002/01/19 19:02:08 steve Exp $"
+#ident "$Id: target.h,v 1.56 2002/01/28 00:52:41 steve Exp $"
#endif
# include "netlist.h"
@@ -132,6 +132,7 @@ struct expr_scan_t {
virtual void expr_concat(const NetEConcat*);
virtual void expr_memory(const NetEMemory*);
virtual void expr_scope(const NetEScope*);
+ virtual void expr_select(const NetESelect*);
virtual void expr_sfunc(const NetESFunc*);
virtual void expr_signal(const NetESignal*);
virtual void expr_subsignal(const NetEBitSel*);
@@ -162,6 +163,11 @@ extern const struct target *target_table[];
/*
* $Log: target.h,v $
+ * Revision 1.56 2002/01/28 00:52:41 steve
+ * Add support for bit select of parameters.
+ * This leads to a NetESelect node and the
+ * vvp code generator to support that.
+ *
* Revision 1.55 2002/01/19 19:02:08 steve
* Pass back target errors processing conditionals.
*
View
125 tgt-vvp/eval_expr.c
@@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT)
-#ident "$Id: eval_expr.c,v 1.54 2002/01/11 05:23:05 steve Exp $"
+#ident "$Id: eval_expr.c,v 1.55 2002/01/28 00:52:42 steve Exp $"
#endif
# include "vvp_priv.h"
@@ -977,6 +977,55 @@ static struct vector_info draw_memory_expr(ivl_expr_t exp, unsigned wid)
return res;
}
+static struct vector_info draw_select_expr(ivl_expr_t exp, unsigned wid)
+{
+ struct vector_info subv, shiv, res;
+ ivl_expr_t sube = ivl_expr_oper1(exp);
+ ivl_expr_t shift = ivl_expr_oper2(exp);
+
+ /* Evaluate the sub-expression. */
+ subv = draw_eval_expr(sube);
+
+ /* Any bit select of a constant zero is another constant zero,
+ so short circuit and return the value we know. */
+ if (subv.base == 0) {
+ subv.wid = wid;
+ return subv;
+ }
+
+ /* Evaluate the bit select base expression and store the
+ result into index register 0. */
+ shiv = draw_eval_expr(shift);
+ fprintf(vvp_out, " %%ix/get 0, %u, %u;\n", shiv.base, shiv.wid);
+ clr_vector(shiv);
+
+ /* If the subv result is a magic constant, then make a copy in
+ writeable vector space and work from there instead. */
+ if (subv.base < 0) {
+ res.base = allocate_vector(subv.wid);
+ res.wid = wid;
+ fprintf(vvp_out, " %%mov %u, %u, %u;\n", res.base,
+ subv.base, res.wid);
+ subv = res;
+ }
+
+ fprintf(vvp_out, " %%shiftr/i0 %u, %u;\n", subv.base, subv.wid);
+
+ assert(subv.wid >= wid);
+ if (subv.wid > wid) {
+ res.base = subv.base;
+ res.wid = wid;
+
+ subv.base += wid;
+ clr_vector(subv);
+
+ } else if (subv.wid == wid) {
+ res = subv;
+ }
+
+ return res;
+}
+
static struct vector_info draw_ternary_expr(ivl_expr_t exp, unsigned wid)
{
struct vector_info res, tmp;
@@ -1415,6 +1464,10 @@ struct vector_info draw_eval_expr_wid(ivl_expr_t exp, unsigned wid)
res = draw_number_expr(exp, wid);
break;
+ case IVL_EX_SELECT:
+ res = draw_select_expr(exp, wid);
+ break;
+
case IVL_EX_SIGNAL:
res = draw_signal_expr(exp, wid);
break;
@@ -1450,6 +1503,11 @@ struct vector_info draw_eval_expr(ivl_expr_t exp)
/*
* $Log: eval_expr.c,v $
+ * Revision 1.55 2002/01/28 00:52:42 steve
+ * Add support for bit select of parameters.
+ * This leads to a NetESelect node and the
+ * vvp code generator to support that.
+ *
* Revision 1.54 2002/01/11 05:23:05 steve
* Handle certain special cases of stime.
*
@@ -1499,70 +1557,5 @@ struct vector_info draw_eval_expr(ivl_expr_t exp)
*
* Revision 1.39 2001/07/27 02:41:56 steve
* Fix binding of dangling function ports. do not elide them.
- *
- * Revision 1.38 2001/07/22 19:33:51 steve
- * Handle repeat for concatenation expressions.
- *
- * Revision 1.37 2001/07/22 00:17:50 steve
- * Support the NetESubSignal expressions in vvp.tgt.
- *
- * Revision 1.36 2001/07/09 15:38:35 steve
- * Properly step through wide inputs. (Stephan Boettcher)
- *
- * Revision 1.35 2001/07/07 20:20:10 steve
- * Pass parameters to system functions.
- *
- * Revision 1.34 2001/06/30 21:07:26 steve
- * Support non-const right shift (unsigned).
- *
- * Revision 1.33 2001/06/23 18:40:34 steve
- * Generate %shiftl instructions for shift.
- *
- * Revision 1.32 2001/06/21 04:53:59 steve
- * Escaped identifiers in behavioral expressions. (Stephan Boettcher)
- *
- * Revision 1.31 2001/06/18 01:09:32 steve
- * More behavioral unary reduction operators.
- * (Stephan Boettcher)
- *
- * Revision 1.30 2001/06/16 23:45:05 steve
- * Add support for structural multiply in t-dll.
- * Add code generators and vvp support for both
- * structural and behavioral multiply.
- *
- * Revision 1.29 2001/05/24 04:20:10 steve
- * Add behavioral modulus.
- *
- * Revision 1.28 2001/05/20 01:18:38 steve
- * Implement reduction nor.
- *
- * Revision 1.27 2001/05/20 01:02:55 steve
- * Initial support for system functions.
- *
- * Revision 1.26 2001/05/17 04:37:02 steve
- * Behavioral ternary operators for vvp.
- *
- * Revision 1.25 2001/05/10 00:26:53 steve
- * VVP support for memories in expressions,
- * including general support for thread bit
- * vectors as system task parameters.
- * (Stephan Boettcher)
- *
- * Revision 1.24 2001/05/06 17:54:33 steve
- * Behavioral code to read memories. (Stephan Boettcher)
- *
- * Revision 1.23 2001/05/02 01:57:25 steve
- * Support behavioral subtraction.
- *
- * Revision 1.22 2001/05/01 02:07:34 steve
- * Comparisons cant leave their results in the opcode
- * result area or their values will be clobbered by other
- * parts of a complex expression.
- *
- * Revision 1.21 2001/04/30 05:11:18 steve
- * OR is %or. Get this right.
- *
- * Revision 1.20 2001/04/29 20:47:39 steve
- * Evalulate logical or (||)
*/

0 comments on commit 364ffc9

Please sign in to comment.