From e71413123e17d86acea9f9b216ec6d7e72f5ca77 Mon Sep 17 00:00:00 2001 From: steve Date: Fri, 17 Mar 2000 19:23:59 +0000 Subject: [PATCH] nor2 and and2 optimized gates. --- t-vvm.cc | 15 +++++++++--- vvm/vvm_gates.cc | 64 +++++++++++++++++++++++++++++++++++++++++++++++- vvm/vvm_gates.h | 41 +++++++++++++++++++++++++++++-- 3 files changed, 114 insertions(+), 6 deletions(-) diff --git a/t-vvm.cc b/t-vvm.cc index 530ba82ff..082009913 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) && !defined(macintosh) -#ident "$Id: t-vvm.cc,v 1.113 2000/03/17 17:25:53 steve Exp $" +#ident "$Id: t-vvm.cc,v 1.114 2000/03/17 19:23:59 steve Exp $" #endif # include @@ -1256,7 +1256,10 @@ void target_vvm::logic(ostream&os, const NetLogic*gate) switch (gate->type()) { case NetLogic::AND: - os << "static vvm_and" << "<" << gate->pin_count()-1 << "> "; + if ((gate->pin_count()-1) == 2) + os << "static vvm_and2 "; + else + os << "static vvm_and" << "<" << gate->pin_count()-1 << "> "; break; case NetLogic::BUF: os << "static vvm_buf "; @@ -1271,7 +1274,10 @@ void target_vvm::logic(ostream&os, const NetLogic*gate) os << "static vvm_nand" << "<" << gate->pin_count()-1 << "> "; break; case NetLogic::NOR: - os << "static vvm_nor" << "<" << gate->pin_count()-1 << "> "; + if ((gate->pin_count()-1) == 2) + os << "static vvm_nor2 "; + else + os << "static vvm_nor" << "<" << gate->pin_count()-1 << "> "; break; case NetLogic::NOT: os << "static vvm_not "; @@ -2239,6 +2245,9 @@ extern const struct target tgt_vvm = { }; /* * $Log: t-vvm.cc,v $ + * Revision 1.114 2000/03/17 19:23:59 steve + * nor2 and and2 optimized gates. + * * Revision 1.113 2000/03/17 17:25:53 steve * Adder and comparator in nexus style. * diff --git a/vvm/vvm_gates.cc b/vvm/vvm_gates.cc index 1490acdc3..6f5da7e31 100644 --- a/vvm/vvm_gates.cc +++ b/vvm/vvm_gates.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: vvm_gates.cc,v 1.8 2000/03/17 03:36:07 steve Exp $" +#ident "$Id: vvm_gates.cc,v 1.9 2000/03/17 19:24:00 steve Exp $" #endif # include "vvm_gates.h" @@ -134,6 +134,36 @@ void compute_mux(vpip_bit_t*out, unsigned wid, } } +vvm_and2::vvm_and2(unsigned long d) +: vvm_1bit_out(d) +{ +} + +vvm_and2::~vvm_and2() +{ +} + +void vvm_and2::init_I(unsigned idx, vpip_bit_t val) +{ + assert(idx < 2); + input_[idx] = val; +} + +void vvm_and2::start() +{ + output(input_[0] & input_[1]); +} + +void vvm_and2::take_value(unsigned key, vpip_bit_t val) +{ + if (input_[key] == val) + return; + + input_[key] = val; + output(input_[0] & input_[1]); +} + + vvm_buf::vvm_buf(unsigned long d) : vvm_1bit_out(d) { @@ -214,6 +244,35 @@ vpip_bit_t vvm_eeq::compute_() const return outval; } +vvm_nor2::vvm_nor2(unsigned long d) +: vvm_1bit_out(d) +{ +} + +vvm_nor2::~vvm_nor2() +{ +} + +void vvm_nor2::init_I(unsigned idx, vpip_bit_t val) +{ + assert(idx < 2); + input_[idx] = val; +} + +void vvm_nor2::start() +{ + output(v_not(input_[0] | input_[1])); +} + +void vvm_nor2::take_value(unsigned key, vpip_bit_t val) +{ + if (input_[key] == val) + return; + + input_[key] = val; + output(v_not(input_[0] | input_[1])); +} + vvm_not::vvm_not(unsigned long d) : vvm_1bit_out(d) { @@ -239,6 +298,9 @@ void vvm_not::take_value(unsigned, vpip_bit_t val) /* * $Log: vvm_gates.cc,v $ + * Revision 1.9 2000/03/17 19:24:00 steve + * nor2 and and2 optimized gates. + * * Revision 1.8 2000/03/17 03:36:07 steve * Remove some useless template parameters. * diff --git a/vvm/vvm_gates.h b/vvm/vvm_gates.h index e61aeb779..a46194ea2 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) && !defined(macintosh) -#ident "$Id: vvm_gates.h,v 1.44 2000/03/17 17:25:53 steve Exp $" +#ident "$Id: vvm_gates.h,v 1.45 2000/03/17 19:24:00 steve Exp $" #endif # include "vvm.h" @@ -119,7 +119,12 @@ class vvm_add_sub : public vvm_nexus::recvr_t { vvm_add_sub& operator= (const vvm_add_sub&); }; - +/* + * These are implementations of reduction AND. the vvm_and class is + * the parameterized form, that takes the width of the gate input as a + * parameter. The vvm_andN classes are versions that have specific + * widths. The latter should be preferred over the generic form. + */ template class vvm_and : public vvm_1bit_out, public vvm_nexus::recvr_t { @@ -146,6 +151,21 @@ class vvm_and : public vvm_1bit_out, public vvm_nexus::recvr_t { vpip_bit_t input_[WIDTH]; }; +class vvm_and2 : public vvm_1bit_out, public vvm_nexus::recvr_t { + + public: + explicit vvm_and2(unsigned long d); + ~vvm_and2(); + + void init_I(unsigned idx, vpip_bit_t val); + void start(); + + private: + void take_value(unsigned key, vpip_bit_t val); + + vpip_bit_t input_[2]; +}; + /* * This class implements LPM_CLSHIFT devices with specified data width * and selector input width. The direction bit is a single bit input. @@ -427,6 +447,20 @@ class vvm_nor : public vvm_1bit_out, public vvm_nexus::recvr_t { vpip_bit_t input_[WIDTH]; }; +class vvm_nor2 : public vvm_1bit_out, public vvm_nexus::recvr_t { + + public: + explicit vvm_nor2(unsigned long d); + ~vvm_nor2(); + + void init_I(unsigned idx, vpip_bit_t val); + void start(); + + private: + void take_value(unsigned key, vpip_bit_t val); + vpip_bit_t input_[2]; +}; + /* * This object implements a LPM_RAM_DQ device, except for the actual * contents of the memory, which are stored in a vvm_memory_t @@ -814,6 +848,9 @@ template class vvm_pevent : public vvm_nexus::recvr_t { /* * $Log: vvm_gates.h,v $ + * Revision 1.45 2000/03/17 19:24:00 steve + * nor2 and and2 optimized gates. + * * Revision 1.44 2000/03/17 17:25:53 steve * Adder and comparator in nexus style. *