From 513ade9b95d875e797d5979ac6723c8398bf9968 Mon Sep 17 00:00:00 2001 From: steve Date: Sun, 14 Nov 1999 23:43:45 +0000 Subject: [PATCH] Support combinatorial comparators. --- design_dump.cc | 13 ++++- elab_net.cc | 41 ++++++++++++- emit.cc | 10 +++- netlist.cc | 133 +++++++++++++++++++++++++++++++++++++++++- netlist.h | 51 +++++++++++++++- t-vvm.cc | 150 +++++++++--------------------------------------- target.cc | 11 +++- target.h | 6 +- vvm/vvm_gates.h | 93 +++++++++++++++++++++++++++++- 9 files changed, 377 insertions(+), 131 deletions(-) diff --git a/design_dump.cc b/design_dump.cc index dc2986caf..3f128a8fa 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.56 1999/11/14 20:24:28 steve Exp $" +#ident "$Id: design_dump.cc,v 1.57 1999/11/14 23:43:45 steve Exp $" #endif /* @@ -138,6 +138,14 @@ void NetCLShift::dump_node(ostream&o, unsigned ind) const dump_obj_attr(o, ind+4); } +void NetCompare::dump_node(ostream&o, unsigned ind) const +{ + o << setw(ind) << "" << "LPM_COMPARE (NetCompare): " << + name() << endl; + dump_node_pins(o, ind+4); + dump_obj_attr(o, ind+4); +} + void NetMux::dump_node(ostream&o, unsigned ind) const { o << setw(ind) << "" << "Multiplexer (NetMux): " << name() << endl; @@ -826,6 +834,9 @@ void Design::dump(ostream&o) const /* * $Log: design_dump.cc,v $ + * Revision 1.57 1999/11/14 23:43:45 steve + * Support combinatorial comparators. + * * Revision 1.56 1999/11/14 20:24:28 steve * Add support for the LPM_CLSHIFT device. * diff --git a/elab_net.cc b/elab_net.cc index 24c2c75bc..09e34c115 100644 --- a/elab_net.cc +++ b/elab_net.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: elab_net.cc,v 1.5 1999/11/14 20:24:28 steve Exp $" +#ident "$Id: elab_net.cc,v 1.6 1999/11/14 23:43:45 steve Exp $" #endif # include "PExpr.h" @@ -41,6 +41,10 @@ NetNet* PEBinary::elaborate_net(Design*des, const string&path, case 'E': case 'e': case 'n': + case '<': + case '>': + case 'L': // <= + case 'G': // >= return elaborate_net_cmp_(des, path, width, rise, fall, decay); case 'l': // << case 'r': // >> @@ -165,6 +169,10 @@ NetNet* PEBinary::elaborate_net(Design*des, const string&path, case 'E': // === (Case equals) case 'e': // == case 'n': // != + case '<': + case '>': + case 'G': // >= + case 'L': // <= assert(0); break; @@ -305,6 +313,34 @@ NetNet* PEBinary::elaborate_net_cmp_(Design*des, const string&path, NetNode*gate_t; switch (op_) { + case '<': + case '>': + case 'L': + case 'G': { + NetCompare*cmp = new NetCompare(des->local_symbol(path), + lsig->pin_count()); + for (unsigned idx = 0 ; idx < lsig->pin_count() ; idx += 1) { + connect(cmp->pin_DataA(idx), lsig->pin(idx)); + connect(cmp->pin_DataB(idx), rsig->pin(idx)); + } + switch (op_) { + case '<': + connect(cmp->pin_ALB(), osig->pin(0)); + break; + case '>': + connect(cmp->pin_AGB(), osig->pin(0)); + break; + case 'L': + connect(cmp->pin_ALEB(), osig->pin(0)); + break; + case 'G': + connect(cmp->pin_AGEB(), osig->pin(0)); + break; + } + gate = cmp; + break; + } + case 'E': // Case equals (===) // The comparison generates gates to bitwise compare // each pair, and AND all the comparison results. @@ -528,6 +564,9 @@ NetNet* PETernary::elaborate_net(Design*des, const string&path, /* * $Log: elab_net.cc,v $ + * Revision 1.6 1999/11/14 23:43:45 steve + * Support combinatorial comparators. + * * Revision 1.5 1999/11/14 20:24:28 steve * Add support for the LPM_CLSHIFT device. * diff --git a/emit.cc b/emit.cc index 61ac4ae19..fc2f7cc07 100644 --- a/emit.cc +++ b/emit.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: emit.cc,v 1.27 1999/11/14 20:24:28 steve Exp $" +#ident "$Id: emit.cc,v 1.28 1999/11/14 23:43:45 steve Exp $" #endif /* @@ -70,6 +70,11 @@ void NetCLShift::emit_node(ostream&o, struct target_t*tgt) const tgt->lpm_clshift(o, this); } +void NetCompare::emit_node(ostream&o, struct target_t*tgt) const +{ + tgt->lpm_compare(o, this); +} + void NetConst::emit_node(ostream&o, struct target_t*tgt) const { tgt->net_const(o, this); @@ -372,6 +377,9 @@ bool emit(ostream&o, const Design*des, const char*type) /* * $Log: emit.cc,v $ + * Revision 1.28 1999/11/14 23:43:45 steve + * Support combinatorial comparators. + * * Revision 1.27 1999/11/14 20:24:28 steve * Add support for the LPM_CLSHIFT device. * diff --git a/netlist.cc b/netlist.cc index 8882d642c..ebf7c3e80 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.85 1999/11/14 20:24:28 steve Exp $" +#ident "$Id: netlist.cc,v 1.86 1999/11/14 23:43:45 steve Exp $" #endif # include @@ -700,6 +700,134 @@ const NetObj::Link& NetCLShift::pin_Distance(unsigned idx) const return pin(3+2*width_+idx); } +NetCompare::NetCompare(const string&n, unsigned wi) +: NetNode(n, 8+2*wi), width_(wi) +{ + pin(0).set_dir(NetObj::Link::INPUT); pin(0).set_name("Aclr"); + pin(1).set_dir(NetObj::Link::INPUT); pin(1).set_name("Clock"); + pin(2).set_dir(NetObj::Link::OUTPUT); pin(2).set_name("AGB"); + pin(3).set_dir(NetObj::Link::OUTPUT); pin(3).set_name("AGEB"); + pin(4).set_dir(NetObj::Link::OUTPUT); pin(4).set_name("AEB"); + pin(5).set_dir(NetObj::Link::OUTPUT); pin(5).set_name("ANEB"); + pin(6).set_dir(NetObj::Link::OUTPUT); pin(6).set_name("ALB"); + pin(7).set_dir(NetObj::Link::OUTPUT); pin(7).set_name("ALEB"); + for (unsigned idx = 0 ; idx < width_ ; idx += 1) { + pin(8+idx).set_dir(NetObj::Link::INPUT); + pin(8+idx).set_name("DataA", idx); + pin(8+width_+idx).set_dir(NetObj::Link::INPUT); + pin(8+width_+idx).set_name("DataB", idx); + } +} + +NetCompare::~NetCompare() +{ +} + +unsigned NetCompare::width() const +{ + return width_; +} + +NetObj::Link& NetCompare::pin_Aclr() +{ + return pin(0); +} + +const NetObj::Link& NetCompare::pin_Aclr() const +{ + return pin(0); +} + +NetObj::Link& NetCompare::pin_Clock() +{ + return pin(1); +} + +const NetObj::Link& NetCompare::pin_Clock() const +{ + return pin(1); +} + +NetObj::Link& NetCompare::pin_AGB() +{ + return pin(2); +} + +const NetObj::Link& NetCompare::pin_AGB() const +{ + return pin(2); +} + +NetObj::Link& NetCompare::pin_AGEB() +{ + return pin(3); +} + +const NetObj::Link& NetCompare::pin_AGEB() const +{ + return pin(3); +} + +NetObj::Link& NetCompare::pin_AEB() +{ + return pin(4); +} + +const NetObj::Link& NetCompare::pin_AEB() const +{ + return pin(4); +} + +NetObj::Link& NetCompare::pin_ANEB() +{ + return pin(5); +} + +const NetObj::Link& NetCompare::pin_ANEB() const +{ + return pin(5); +} + +NetObj::Link& NetCompare::pin_ALB() +{ + return pin(6); +} + +const NetObj::Link& NetCompare::pin_ALB() const +{ + return pin(6); +} + +NetObj::Link& NetCompare::pin_ALEB() +{ + return pin(7); +} + +const NetObj::Link& NetCompare::pin_ALEB() const +{ + return pin(7); +} + +NetObj::Link& NetCompare::pin_DataA(unsigned idx) +{ + return pin(8+idx); +} + +const NetObj::Link& NetCompare::pin_DataA(unsigned idx) const +{ + return pin(8+idx); +} + +NetObj::Link& NetCompare::pin_DataB(unsigned idx) +{ + return pin(8+width_+idx); +} + +const NetObj::Link& NetCompare::pin_DataB(unsigned idx) const +{ + return pin(8+width_+idx); +} + /* * The NetMux class represents an LPM_MUX device. The pinout is assigned * like so: @@ -2214,6 +2342,9 @@ NetNet* Design::find_signal(bool (*func)(const NetNet*)) /* * $Log: netlist.cc,v $ + * Revision 1.86 1999/11/14 23:43:45 steve + * Support combinatorial comparators. + * * Revision 1.85 1999/11/14 20:24:28 steve * Add support for the LPM_CLSHIFT device. * diff --git a/netlist.h b/netlist.h index 0fbf663d0..b1f76524a 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.87 1999/11/14 20:24:28 steve Exp $" +#ident "$Id: netlist.h,v 1.88 1999/11/14 23:43:45 steve Exp $" #endif /* @@ -359,6 +359,52 @@ class NetCLShift : public NetNode { unsigned width_dist_; }; +/* + * This class supports the LPM_COMPARE device. + * + * NOTE: This is not the same as the device used to support case + * compare. Case comparisons handle Vx and Vz values, whereas this + * device need not. + */ +class NetCompare : public NetNode { + + public: + NetCompare(const string&n, unsigned width); + ~NetCompare(); + + unsigned width() const; + + NetObj::Link& pin_Aclr(); + NetObj::Link& pin_Clock(); + NetObj::Link& pin_AGB(); + NetObj::Link& pin_AGEB(); + NetObj::Link& pin_AEB(); + NetObj::Link& pin_ANEB(); + NetObj::Link& pin_ALB(); + NetObj::Link& pin_ALEB(); + + NetObj::Link& pin_DataA(unsigned idx); + NetObj::Link& pin_DataB(unsigned idx); + + const NetObj::Link& pin_Aclr() const; + const NetObj::Link& pin_Clock() const; + const NetObj::Link& pin_AGB() const; + const NetObj::Link& pin_AGEB() const; + const NetObj::Link& pin_AEB() const; + const NetObj::Link& pin_ANEB() const; + const NetObj::Link& pin_ALB() const; + const NetObj::Link& pin_ALEB() const; + + const NetObj::Link& pin_DataA(unsigned idx) const; + const NetObj::Link& pin_DataB(unsigned idx) const; + + virtual void dump_node(ostream&, unsigned ind) const; + virtual void emit_node(ostream&, struct target_t*) const; + + private: + unsigned width_; +}; + /* * This class represents an LPM_FF device. There is no literal gate * type in Verilog that maps, but gates of this type can be inferred. @@ -1892,6 +1938,9 @@ extern ostream& operator << (ostream&, NetNet::Type); /* * $Log: netlist.h,v $ + * Revision 1.88 1999/11/14 23:43:45 steve + * Support combinatorial comparators. + * * Revision 1.87 1999/11/14 20:24:28 steve * Add support for the LPM_CLSHIFT device. * diff --git a/t-vvm.cc b/t-vvm.cc index 4626d40f4..0a6a1dcb0 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.75 1999/11/14 20:24:28 steve Exp $" +#ident "$Id: t-vvm.cc,v 1.76 1999/11/14 23:43:45 steve Exp $" #endif # include @@ -61,6 +61,7 @@ class target_vvm : public target_t { virtual void lpm_add_sub(ostream&os, const NetAddSub*); virtual void lpm_clshift(ostream&os, const NetCLShift*); + virtual void lpm_compare(ostream&os, const NetCompare*); virtual void lpm_ff(ostream&os, const NetFF*); virtual void lpm_mux(ostream&os, const NetMux*); @@ -884,6 +885,28 @@ void target_vvm::lpm_clshift(ostream&os, const NetCLShift*gate) } } +void target_vvm::lpm_compare(ostream&os, const NetCompare*gate) +{ + os << "static vvm_compare<" << gate->width() << "> " << + mangle(gate->name()) << ";" << endl; + + if (gate->pin_ALEB().is_linked()) { + unsigned pin = gate->pin_ALEB().get_pin(); + string outfun = defn_gate_outputfun_(os, gate, pin); + init_code << " " << mangle(gate->name()) << + ".config_ALEB_out(&" << outfun << ");" << endl; + emit_gate_outputfun_(gate, pin); + } + + if (gate->pin_AGEB().is_linked()) { + unsigned pin = gate->pin_AGEB().get_pin(); + string outfun = defn_gate_outputfun_(os, gate, pin); + init_code << " " << mangle(gate->name()) << + ".config_AGEB_out(&" << outfun << ");" << endl; + emit_gate_outputfun_(gate, pin); + } +} + void target_vvm::lpm_ff(ostream&os, const NetFF*gate) { string mname = mangle(gate->name()); @@ -1879,6 +1902,9 @@ extern const struct target tgt_vvm = { }; /* * $Log: t-vvm.cc,v $ + * Revision 1.76 1999/11/14 23:43:45 steve + * Support combinatorial comparators. + * * Revision 1.75 1999/11/14 20:24:28 steve * Add support for the LPM_CLSHIFT device. * @@ -1948,127 +1974,5 @@ extern const struct target tgt_vvm = { * * Revision 1.55 1999/10/01 03:58:37 steve * More resilient assignment to memory location. - * - * Revision 1.54 1999/10/01 03:15:00 steve - * Rewrite vvm output to separateclass declarations - * from method definitions. This is required to allow - * for mutual referencing, for example by tasks. - * - * Revision 1.53 1999/09/30 21:26:59 steve - * Remember to declare the calee_ member. - * - * Revision 1.52 1999/09/29 18:36:04 steve - * Full case support - * - * Revision 1.51 1999/09/29 00:42:25 steve - * Comment on where binary operator came from. - * - * Revision 1.50 1999/09/28 23:45:09 steve - * Use files instead of strstreams for delayed output, - * and fix a missing ends in case output code. - * - * Revision 1.49 1999/09/28 03:11:09 steve - * save the thread class name so that behaviors in tasks have it. - * - * Revision 1.48 1999/09/28 01:53:37 steve - * Generate code for repeat concatenations. - * - * Revision 1.47 1999/09/28 01:21:27 steve - * Proper syntax for method pointers. - * - * Revision 1.46 1999/09/28 01:13:15 steve - * Support in vvm > and >= behavioral operators. - * - * Revision 1.45 1999/09/23 03:56:57 steve - * Support shift operators. - * - * Revision 1.44 1999/09/22 16:57:24 steve - * Catch parallel blocks in vvm emit. - * - * Revision 1.43 1999/09/22 04:30:04 steve - * Parse and elaborate named for/join blocks. - * - * Revision 1.42 1999/09/16 04:18:15 steve - * elaborate concatenation repeats. - * - * Revision 1.41 1999/09/11 04:43:17 steve - * Support ternary and <= operators in vvm. - * - * Revision 1.40 1999/09/08 02:24:39 steve - * Empty conditionals (pmonta@imedia.com) - * - * Revision 1.39 1999/09/04 19:11:46 steve - * Add support for delayed non-blocking assignments. - * - * Revision 1.38 1999/09/04 01:57:15 steve - * Generate fake adder code in vvm. - * - * Revision 1.37 1999/09/01 20:46:19 steve - * Handle recursive functions and arbitrary function - * references to other functions, properly pass - * function parameters and save function results. - * - * Revision 1.36 1999/08/31 22:38:29 steve - * Elaborate and emit to vvm procedural functions. - * - * Revision 1.35 1999/08/15 01:23:56 steve - * Convert vvm to implement system tasks with vpi. - * - * Revision 1.34 1999/08/02 00:19:16 steve - * Get rid of excess set/init of NetESignal objects. - * - * Revision 1.33 1999/08/01 16:34:50 steve - * Parse and elaborate rise/fall/decay times - * for gates, and handle the rules for partial - * lists of times. - * - * Revision 1.32 1999/07/18 21:17:51 steve - * Add support for CE input to XNF DFF, and do - * complete cleanup of replaced design nodes. - * - * Revision 1.31 1999/07/17 03:39:11 steve - * simplified process scan for targets. - * - * Revision 1.30 1999/07/10 03:00:05 steve - * Proper initialization of registers. - * - * Revision 1.29 1999/07/10 01:02:08 steve - * Handle number constants as parameters. - * - * Revision 1.28 1999/07/07 04:20:57 steve - * Emit vvm for user defined tasks. - * - * Revision 1.27 1999/07/03 02:12:52 steve - * Elaborate user defined tasks. - * - * Revision 1.26 1999/06/24 04:21:45 steve - * Add the === and !== binary operators. - * - * Revision 1.25 1999/06/19 21:06:16 steve - * Elaborate and supprort to vvm the forever - * and repeat statements. - * - * Revision 1.24 1999/06/10 04:03:43 steve - * Do not bother trying to print lvalue name in comment. - * - * Revision 1.23 1999/06/09 03:00:06 steve - * Add support for procedural concatenation expression. - * - * Revision 1.22 1999/06/07 02:23:31 steve - * Support non-blocking assignment down to vvm. - * - * Revision 1.21 1999/05/12 04:03:19 steve - * emit NetAssignMem objects in vvm target. - * - * Revision 1.20 1999/05/03 01:51:29 steve - * Restore support for wait event control. - * - * Revision 1.19 1999/05/01 20:43:55 steve - * Handle wide events, such as @(a) where a has - * many bits in it. - * - * Add to vvm the binary ^ and unary & operators. - * - * Dump events a bit more completely. */ diff --git a/target.cc b/target.cc index 7d0a5ae81..b4f18b17b 100644 --- a/target.cc +++ b/target.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: target.cc,v 1.24 1999/11/14 20:24:28 steve Exp $" +#ident "$Id: target.cc,v 1.25 1999/11/14 23:43:45 steve Exp $" #endif # include "target.h" @@ -81,6 +81,12 @@ void target_t::lpm_clshift(ostream&, const NetCLShift*) "Unhandled NetCLShift." << endl; } +void target_t::lpm_compare(ostream&, const NetCompare*) +{ + cerr << "target (" << typeid(*this).name() << "): " + "Unhandled NetCompare." << endl; +} + void target_t::lpm_ff(ostream&, const NetFF*) { cerr << "target (" << typeid(*this).name() << "): " @@ -293,6 +299,9 @@ void expr_scan_t::expr_binary(const NetEBinary*ex) /* * $Log: target.cc,v $ + * Revision 1.25 1999/11/14 23:43:45 steve + * Support combinatorial comparators. + * * Revision 1.24 1999/11/14 20:24:28 steve * Add support for the LPM_CLSHIFT device. * diff --git a/target.h b/target.h index 8f1ac6bdb..e88ab06e7 100644 --- a/target.h +++ b/target.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: target.h,v 1.23 1999/11/14 20:24:28 steve Exp $" +#ident "$Id: target.h,v 1.24 1999/11/14 23:43:46 steve Exp $" #endif # include "netlist.h" @@ -68,6 +68,7 @@ struct target_t { /* LPM style components are handled here. */ virtual void lpm_add_sub(ostream&os, const NetAddSub*); virtual void lpm_clshift(ostream&os, const NetCLShift*); + virtual void lpm_compare(ostream&os, const NetCompare*); virtual void lpm_ff(ostream&os, const NetFF*); virtual void lpm_mux(ostream&os, const NetMux*); @@ -140,6 +141,9 @@ extern const struct target *target_table[]; /* * $Log: target.h,v $ + * Revision 1.24 1999/11/14 23:43:46 steve + * Support combinatorial comparators. + * * Revision 1.23 1999/11/14 20:24:28 steve * Add support for the LPM_CLSHIFT device. * diff --git a/vvm/vvm_gates.h b/vvm/vvm_gates.h index 2893570d1..e27e6ae48 100644 --- a/vvm/vvm_gates.h +++ b/vvm/vvm_gates.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: vvm_gates.h,v 1.21 1999/11/14 20:24:28 steve Exp $" +#ident "$Id: vvm_gates.h,v 1.22 1999/11/14 23:43:46 steve Exp $" #endif # include "vvm.h" @@ -244,6 +244,94 @@ template class vvm_clshift { } }; +template class vvm_compare { + + public: + explicit vvm_compare() + { out_lt_ = 0; + out_le_ = 0; + gt_ = Vx; + lt_ = Vx; + for (unsigned idx = 0 ; idx < WIDTH ; idx += 1) { + a_[idx] = Vx; + b_[idx] = Vx; + } + } + ~vvm_compare() { } + + void init_DataA(unsigned idx, vpip_bit_t val) + { a_[idx] = val; } + void init_DataB(unsigned idx, vpip_bit_t val) + { b_[idx] = val; } + + void set_DataA(vvm_simulation*sim, unsigned idx, vpip_bit_t val) + { if (a_[idx] == val) return; + a_[idx] = val; + compute_(sim); + } + + void set_DataB(vvm_simulation*sim, unsigned idx, vpip_bit_t val) + { if (b_[idx] == val) return; + b_[idx] = val; + compute_(sim); + } + + void config_ALB_out(vvm_out_event::action_t o) + { out_lt_ = o; } + + void config_ALEB_out(vvm_out_event::action_t o) + { out_le_ = o; } + + void config_AGB_out(vvm_out_event::action_t o) + { out_gt_ = o; } + + void config_AGEB_out(vvm_out_event::action_t o) + { out_ge_ = o; } + + private: + vpip_bit_t a_[WIDTH]; + vpip_bit_t b_[WIDTH]; + + vpip_bit_t gt_; + vpip_bit_t lt_; + + vvm_out_event::action_t out_lt_; + vvm_out_event::action_t out_le_; + vvm_out_event::action_t out_gt_; + vvm_out_event::action_t out_ge_; + + void compute_(vvm_simulation*sim) + { vpip_bit_t gt = V0; + vpip_bit_t lt = V0; + vvm_event*ev; + for (unsigned idx = 0 ; idx < WIDTH ; idx += 1) { + gt = greater_with_cascade(a_[idx], b_[idx], gt); + lt = less_with_cascade(a_[idx], b_[idx], lt); + } + + if ((gt_ == gt) || (lt_ == lt)) return; + gt_ = gt; + lt_ = lt; + if (out_lt_) { + ev = new vvm_out_event(sim, lt_, out_lt_); + sim->active_event(ev); + } + if (out_le_) { + ev = new vvm_out_event(sim, not(gt_), out_le_); + sim->active_event(ev); + } + if (out_gt_) { + ev = new vvm_out_event(sim, gt_, out_gt_); + sim->active_event(ev); + } + if (out_ge_) { + ev = new vvm_out_event(sim, not(lt_), out_ge_); + sim->active_event(ev); + } + } +}; + + /* * This class simulates the LPM flip-flop device. * XXXX Inverted clock not yet supported. @@ -832,6 +920,9 @@ template class vvm_pevent { /* * $Log: vvm_gates.h,v $ + * Revision 1.22 1999/11/14 23:43:46 steve + * Support combinatorial comparators. + * * Revision 1.21 1999/11/14 20:24:28 steve * Add support for the LPM_CLSHIFT device. *