diff --git a/design_dump.cc b/design_dump.cc index 266b7d976..d4d32991c 100644 --- a/design_dump.cc +++ b/design_dump.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: design_dump.cc,v 1.15 1999/03/01 03:27:53 steve Exp $" +#ident "$Id: design_dump.cc,v 1.16 1999/03/15 02:43:32 steve Exp $" #endif /* @@ -427,12 +427,18 @@ void NetEBinary::dump(ostream&o) const default: o << op_; break; + case 'a': + o << "&&"; + break; case 'e': o << "=="; break; case 'n': o << "!="; break; + case 'o': + o << "||"; + break; } o << "("; right_->dump(o); @@ -515,6 +521,9 @@ void Design::dump(ostream&o) const /* * $Log: design_dump.cc,v $ + * Revision 1.16 1999/03/15 02:43:32 steve + * Support more operators, especially logical. + * * Revision 1.15 1999/03/01 03:27:53 steve * Prevent the duplicate allocation of ESignal objects. * diff --git a/elaborate.cc b/elaborate.cc index ec9dfe395..63504317e 100644 --- a/elaborate.cc +++ b/elaborate.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: elaborate.cc,v 1.17 1999/03/01 03:27:53 steve Exp $" +#ident "$Id: elaborate.cc,v 1.18 1999/03/15 02:43:32 steve Exp $" #endif /* @@ -510,6 +510,19 @@ NetNet* PEBinary::elaborate_net(Design*des, const string&path) const des->add_node(gate); break; + case 'n': // != + assert(lsig->pin_count() == 1); + assert(rsig->pin_count() == 1); + gate = new NetLogic(des->local_symbol(path), 3, NetLogic::XOR); + connect(gate->pin(1), lsig->pin(0)); + connect(gate->pin(2), rsig->pin(0)); + osig = new NetNet(des->local_symbol(path), NetNet::WIRE); + osig->local_flag(true); + connect(gate->pin(0), osig->pin(0)); + des->add_signal(osig); + des->add_node(gate); + break; + default: cerr << "Unhandled BINARY '" << op_ << "'" << endl; osig = 0; @@ -699,6 +712,7 @@ NetProc* PAssign::elaborate(Design*des, const string&path) const assert(rval); NetAssign*cur = new NetAssign(reg, rval); + cur->set_line(*this); des->add_node(cur); return cur; @@ -963,6 +977,9 @@ Design* elaborate(const map&modules, /* * $Log: elaborate.cc,v $ + * Revision 1.18 1999/03/15 02:43:32 steve + * Support more operators, especially logical. + * * Revision 1.17 1999/03/01 03:27:53 steve * Prevent the duplicate allocation of ESignal objects. * diff --git a/lexor.lex b/lexor.lex index b5cc2b295..a6f91a804 100644 --- a/lexor.lex +++ b/lexor.lex @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: lexor.lex,v 1.9 1999/02/21 17:01:57 steve Exp $" +#ident "$Id: lexor.lex,v 1.10 1999/03/15 02:43:32 steve Exp $" #endif //# define YYSTYPE lexval @@ -69,6 +69,8 @@ static verinum*make_sized_hex(const char*txt); "!=" { return K_NE; } "===" { return K_CEQ; } "!==" { return K_CNE; } +"||" { return K_LOR; } +"&&" { return K_LAND; } [;:\[\],()#=.@&!<|^~+*/-] { return yytext[0]; } diff --git a/netlist.cc b/netlist.cc index 5d2e39f15..612d4c2e9 100644 --- a/netlist.cc +++ b/netlist.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: netlist.cc,v 1.18 1999/03/01 03:27:53 steve Exp $" +#ident "$Id: netlist.cc,v 1.19 1999/03/15 02:43:32 steve Exp $" #endif # include @@ -444,7 +444,12 @@ void NetEBinary::set_width(unsigned w) case 'e': assert(w == 1); expr_width(w); - break;; + break; + + case 'o': + assert(w == 1); + expr_width(w); + break; /* The default rule is that the operands of the binary operator might as well use the same width as the @@ -956,6 +961,9 @@ NetNet* Design::find_signal(bool (*func)(const NetNet*)) /* * $Log: netlist.cc,v $ + * Revision 1.19 1999/03/15 02:43:32 steve + * Support more operators, especially logical. + * * Revision 1.18 1999/03/01 03:27:53 steve * Prevent the duplicate allocation of ESignal objects. * diff --git a/netlist.h b/netlist.h index 0e12c16b1..7a051f27d 100644 --- a/netlist.h +++ b/netlist.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: netlist.h,v 1.21 1999/03/01 03:27:53 steve Exp $" +#ident "$Id: netlist.h,v 1.22 1999/03/15 02:43:32 steve Exp $" #endif /* @@ -558,11 +558,15 @@ class NetProc { NetProc*next_; }; -/* This is a procedural assignment. The lval is a register, and the - assignment happens when the code is executed by the design. The - node part of the NetAssign has as many pins as the width of the - lvalue object. */ -class NetAssign : public NetProc, public NetNode { +/* + * This is a procedural assignment. The lval is a register, and the + * assignment happens when the code is executed by the design. The + * node part of the NetAssign has as many pins as the width of the + * lvalue object and represents the elaborated lvalue. Thus, this + * appears as a procedural statement AND a structural node. The + * LineInfo is the location of the assignment statement in the source. + */ +class NetAssign : public NetProc, public NetNode, public LineInfo { public: explicit NetAssign(NetNet*lv, NetExpr*rv); ~NetAssign(); @@ -793,7 +797,23 @@ class NetProcTop : public LineInfo { NetProcTop*next_; }; - +/* + * This class represents a binary operator, with the left and right + * operands and a single character for the operator. The operator + * values are: + * + * ^ -- Bit-wise exclusive OR + * + -- Arithmetic add + * - -- Arighmetic minus + * & -- Bit-wise AND + * | -- Bit-wise OR + * e -- Logical equality (==) + * E -- Case equality (===) + * n -- Logical inequality (!=) + * N -- Case inequality (!==) + * a -- Logical AND (&&) + * o -- Logical OR (||) + */ class NetEBinary : public NetExpr { public: @@ -833,6 +853,14 @@ class NetEConst : public NetExpr { verinum value_; }; +/* + * This class represents a unaru operator, with the single operand + * and a single character for the operator. The operator values are: + * + * ~ -- Bit-wise negation + * ! -- Logical negation + * & -- Reduction AND + */ class NetEUnary : public NetExpr { public: @@ -1020,6 +1048,9 @@ extern ostream& operator << (ostream&, NetNet::Type); /* * $Log: netlist.h,v $ + * Revision 1.22 1999/03/15 02:43:32 steve + * Support more operators, especially logical. + * * Revision 1.21 1999/03/01 03:27:53 steve * Prevent the duplicate allocation of ESignal objects. * diff --git a/parse.y b/parse.y index 86f9e45ad..abd03ea88 100644 --- a/parse.y +++ b/parse.y @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: parse.y,v 1.14 1999/02/21 17:01:57 steve Exp $" +#ident "$Id: parse.y,v 1.15 1999/03/15 02:43:32 steve Exp $" #endif # include "parse_misc.h" @@ -60,6 +60,7 @@ extern void lex_end_table(); %token IDENTIFIER SYSTEM_IDENTIFIER STRING %token NUMBER %token K_LE K_GE K_EQ K_NE K_CEQ K_CNE +%token K_LOR K_LAND %token K_always K_and K_assign K_begin K_buf K_bufif0 K_bufif1 K_case %token K_casex K_casez K_cmos K_deassign K_default K_defparam K_disable %token K_edge K_else K_end K_endcase K_endfunction K_endmodule @@ -116,6 +117,9 @@ extern void lex_end_table(); %left K_EQ K_NE K_CEQ K_CNE %left '&' %left '^' +%left '|' +%left K_LAND +%left K_LOR %% @@ -229,6 +233,9 @@ expression | '&' expression %prec UNARY_PREC { $$ = new PEUnary('&', $2); } + | '!' expression %prec UNARY_PREC + { $$ = new PEUnary('!', $2); + } | expression '^' expression { $$ = new PEBinary('^', $1, $3); } @@ -241,6 +248,9 @@ expression | expression '&' expression { $$ = new PEBinary('&', $1, $3); } + | expression '|' expression + { $$ = new PEBinary('|', $1, $3); + } | expression K_EQ expression { $$ = new PEBinary('e', $1, $3); } @@ -253,6 +263,12 @@ expression | expression K_CNE expression { $$ = new PEBinary('N', $1, $3); } + | expression K_LOR expression + { $$ = new PEBinary('o', $1, $3); + } + | expression K_LAND expression + { $$ = new PEBinary('a', $1, $3); + } ; diff --git a/t-vvm.cc b/t-vvm.cc index df1287777..b2098adf3 100644 --- a/t-vvm.cc +++ b/t-vvm.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: t-vvm.cc,v 1.13 1999/02/22 03:01:12 steve Exp $" +#ident "$Id: t-vvm.cc,v 1.14 1999/03/15 02:43:32 steve Exp $" #endif # include @@ -144,6 +144,10 @@ void vvm_proc_rval::expr_unary(const NetEUnary*expr) os_ << "vvm_unop_not(" << result << ");" << endl; break; + case '!': + os_ << "vvm_unop_lnot(" << result << ");" + << endl; + break; default: cerr << "vvm: Unhandled unary op `" << expr->op() << "'" << endl; @@ -174,6 +178,10 @@ void vvm_proc_rval::expr_binary(const NetEBinary*expr) os_ << setw(indent_) << "" << result << " = vvm_binop_ne(" << lres << "," << rres << ");" << endl; break; + case 'o': + os_ << setw(indent_) << "" << result << " = vvm_binop_lor(" + << lres << "," << rres << ");" << endl; + break; case '+': os_ << setw(indent_) << "" << result << " = vvm_binop_plus(" << lres << "," << rres << ");" << endl; @@ -186,6 +194,10 @@ void vvm_proc_rval::expr_binary(const NetEBinary*expr) os_ << setw(indent_) << "" << result << " = vvm_binop_and(" << lres << "," << rres << ");" << endl; break; + case '|': + os_ << setw(indent_) << "" << result << " = vvm_binop_or(" + << lres << "," << rres << ");" << endl; + break; default: cerr << "vvm: Unhandled binary op `" << expr->op() << "': " << *expr << endl; @@ -585,7 +597,8 @@ void target_vvm::proc_assign(ostream&os, const NetAssign*net) net->find_lval_range(lval, msb, lsb); if ((lsb == 0) && (msb == (lval->pin_count()-1))) { - os << " // " << lval->name() << " = "; + os << " // " << net->get_line() << ": " + << lval->name() << " = "; net->rval()->dump(os); os << endl; } else { @@ -870,6 +883,9 @@ extern const struct target tgt_vvm = { }; /* * $Log: t-vvm.cc,v $ + * Revision 1.14 1999/03/15 02:43:32 steve + * Support more operators, especially logical. + * * Revision 1.13 1999/02/22 03:01:12 steve * Handle default case. *