From eb72a83e5f072dbc6d17ada8931b2508a7dff615 Mon Sep 17 00:00:00 2001 From: steve Date: Mon, 22 Nov 1999 00:30:52 +0000 Subject: [PATCH] Detemplate some and, or and nor methods. --- vvm/Makefile.in | 4 +- vvm/vvm.h | 25 +++++------ vvm/vvm_bit.cc | 25 ++++++++++- vvm/vvm_gates.cc | 95 ++++++++++++++++++++++++++++++++++++++++ vvm/vvm_gates.h | 111 +++++++++++++++++------------------------------ 5 files changed, 173 insertions(+), 87 deletions(-) create mode 100644 vvm/vvm_gates.cc diff --git a/vvm/Makefile.in b/vvm/Makefile.in index 84ff6ab37..9aa9dcba9 100644 --- a/vvm/Makefile.in +++ b/vvm/Makefile.in @@ -18,7 +18,7 @@ # 59 Temple Place - Suite 330 # Boston, MA 02111-1307, USA # -#ident "$Id: Makefile.in,v 1.12 1999/11/21 20:02:37 steve Exp $" +#ident "$Id: Makefile.in,v 1.13 1999/11/22 00:30:52 steve Exp $" # # SHELL = /bin/sh @@ -58,7 +58,7 @@ all: libvvm.a $(CC) -Wall $(CFLAGS) -MD -c $< -o $*.o mv $*.d dep -O = vvm_bit.o vvm_calltf.o vvm_event.o vvm_pevent.o \ +O = vvm_bit.o vvm_calltf.o vvm_event.o vvm_gates.o vvm_pevent.o \ vvm_simulation.o vvm_thread.o vpip.o P = vpi_callback.o \ diff --git a/vvm/vvm.h b/vvm/vvm.h index 6679f9104..7d43a9657 100644 --- a/vvm/vvm.h +++ b/vvm/vvm.h @@ -1,7 +1,7 @@ #ifndef __vvm_H #define __vvm_H /* - * Copyright (c) 1998 Stephen Williams (steve@icarus.com) + * Copyright (c) 1998-1999 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,11 +19,9 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: vvm.h,v 1.22 1999/11/21 00:13:09 steve Exp $" +#ident "$Id: vvm.h,v 1.23 1999/11/22 00:30:52 steve Exp $" #endif -# include -# include # include # include "vpi_priv.h" @@ -38,6 +36,7 @@ class vvm_event; class vvm_simulation; class vvm_simulation_cycle; class vvm_thread; +class ostream; inline vpip_bit_t operator & (vpip_bit_t l, vpip_bit_t r) @@ -106,6 +105,8 @@ class vvm_bits_t { virtual ~vvm_bits_t() =0; virtual unsigned get_width() const =0; virtual vpip_bit_t get_bit(unsigned idx) const =0; + + unsigned as_unsigned(); }; extern ostream& operator << (ostream&os, vpip_bit_t); @@ -136,22 +137,15 @@ template class vvm_bitset_t : public vvm_bits_t { } + vvm_bitset_t(const vvm_bitset_t&that) + { bits = that.bits; } + vpip_bit_t operator[] (unsigned idx) const { return bits[idx]; } vpip_bit_t&operator[] (unsigned idx) { return bits[idx]; } unsigned get_width() const { return WIDTH; } vpip_bit_t get_bit(unsigned idx) const { return bits[idx]; } - unsigned as_unsigned() const - { unsigned result = 0; - for (unsigned idx = WIDTH ; idx > 0 ; idx -= 1) { - result <<= 1; - if (bits[idx-1]) result |= 1; - } - return result; - } - - public: vpip_bit_t bits[WIDTH]; }; @@ -300,6 +294,9 @@ class vvm_memory_t : public __vpiMemory { /* * $Log: vvm.h,v $ + * Revision 1.23 1999/11/22 00:30:52 steve + * Detemplate some and, or and nor methods. + * * Revision 1.22 1999/11/21 00:13:09 steve * Support memories in continuous assignments. * diff --git a/vvm/vvm_bit.cc b/vvm/vvm_bit.cc index 5c7c1a0ab..5be1dab27 100644 --- a/vvm/vvm_bit.cc +++ b/vvm/vvm_bit.cc @@ -17,10 +17,11 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: vvm_bit.cc,v 1.5 1999/11/21 00:13:09 steve Exp $" +#ident "$Id: vvm_bit.cc,v 1.6 1999/11/22 00:30:52 steve Exp $" #endif # include "vvm.h" +# include ostream& operator << (ostream&os, vpip_bit_t bit) { @@ -68,6 +69,25 @@ vvm_bits_t::~vvm_bits_t() { } +unsigned vvm_bits_t::as_unsigned() +{ + unsigned result = 0; + unsigned width = get_width(); + for (unsigned idx = width ; idx > 0 ; idx -= 1) { + result <<= 1; + switch (get_bit(idx-1)) { + case V0: + case Vx: + case Vz: + break; + case V1: + result |= 1; + break; + } + } + return result; +} + vvm_ram_callback::vvm_ram_callback() { } @@ -122,6 +142,9 @@ vpip_bit_t add_with_carry(vpip_bit_t l, vpip_bit_t r, vpip_bit_t&carry) /* * $Log: vvm_bit.cc,v $ + * Revision 1.6 1999/11/22 00:30:52 steve + * Detemplate some and, or and nor methods. + * * Revision 1.5 1999/11/21 00:13:09 steve * Support memories in continuous assignments. * diff --git a/vvm/vvm_gates.cc b/vvm/vvm_gates.cc new file mode 100644 index 000000000..1ba725e22 --- /dev/null +++ b/vvm/vvm_gates.cc @@ -0,0 +1,95 @@ +/* + * Copyright (c) 1999 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 + * General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * --- + * You should also have recieved a copy of the Picture Elements + * Binary Software License offer along with the source. This offer + * allows you to obtain the right to redistribute the software in + * binary (compiled) form. If you have not received it, contact + * Picture Elements, Inc., 777 Panoramic Way, Berkeley, CA 94704. + */ +#if !defined(WINNT) +#ident "$Id: vvm_gates.cc,v 1.1 1999/11/22 00:30:52 steve Exp $" +#endif + +# include "vvm_gates.h" + +vvm_out_event::vvm_out_event(vvm_simulation*s, vpip_bit_t v, action_t o) +: output_(o), sim_(s), val_(v) +{ +} + +vvm_out_event::~vvm_out_event() +{ +} + +void vvm_out_event::event_function() +{ + output_(sim_, val_); +} + +vvm_1bit_out::vvm_1bit_out(vvm_out_event::action_t o, unsigned d) +: output_(o), delay_(d) +{ +} + +vvm_1bit_out::~vvm_1bit_out() +{ +} + +void vvm_1bit_out::output(vvm_simulation*sim, vpip_bit_t val) +{ + vvm_event*ev = new vvm_out_event(sim, val, output_); + if (delay_ > 0) + sim->insert_event(delay_, ev); + else + sim->active_event(ev); +} + + +vpip_bit_t compute_and(const vpip_bit_t*inp, unsigned count) +{ + vpip_bit_t outval = inp[0]; + for (unsigned i = 1 ; i < count ; i += 1) + outval = outval & inp[i]; + return outval; +} + +vpip_bit_t compute_or(const vpip_bit_t*inp, unsigned count) +{ + vpip_bit_t outval = inp[0]; + for (unsigned i = 1 ; i < count ; i += 1) + outval = outval | inp[i]; + return outval; +} + +vpip_bit_t compute_nor(const vpip_bit_t*inp, unsigned count) +{ + vpip_bit_t outval = inp[0]; + for (unsigned i = 1 ; i < count ; i += 1) + outval = outval | inp[i]; + return not(outval); +} + + +/* + * $Log: vvm_gates.cc,v $ + * Revision 1.1 1999/11/22 00:30:52 steve + * Detemplate some and, or and nor methods. + * + */ + diff --git a/vvm/vvm_gates.h b/vvm/vvm_gates.h index 0d74eb638..9ce5f5766 100644 --- a/vvm/vvm_gates.h +++ b/vvm/vvm_gates.h @@ -19,12 +19,16 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: vvm_gates.h,v 1.25 1999/11/21 01:16:51 steve Exp $" +#ident "$Id: vvm_gates.h,v 1.26 1999/11/22 00:30:52 steve Exp $" #endif # include "vvm.h" # include +extern vpip_bit_t compute_and(const vpip_bit_t*inp, unsigned count); +extern vpip_bit_t compute_nor(const vpip_bit_t*inp, unsigned count); +extern vpip_bit_t compute_or(const vpip_bit_t*inp, unsigned count); + /* * A vvm gate is constructed with an input width and an output * function. The input width represents all the input signals that go @@ -37,11 +41,11 @@ class vvm_out_event : public vvm_event { public: typedef void (*action_t)(vvm_simulation*, vpip_bit_t); - vvm_out_event(vvm_simulation*s, vpip_bit_t v, action_t o) - : output_(o), sim_(s), val_(v) { } - void event_function() - { output_(sim_, val_); } + vvm_out_event(vvm_simulation*s, vpip_bit_t v, action_t o); + ~vvm_out_event(); + + void event_function(); private: const action_t output_; @@ -49,6 +53,18 @@ class vvm_out_event : public vvm_event { const vpip_bit_t val_; }; +class vvm_1bit_out { + + public: + vvm_1bit_out(vvm_out_event::action_t, unsigned delay); + ~vvm_1bit_out(); + void output(vvm_simulation*sim, vpip_bit_t); + + private: + vvm_out_event::action_t output_; + unsigned delay_; +}; + /* * This template implements the LPM_ADD_SUB device type. The width of * the device is a template parameter. The device handles addition and @@ -111,45 +127,27 @@ template class vvm_add_sub { } }; -template class vvm_and { +template +class vvm_and : private vvm_1bit_out { public: explicit vvm_and(vvm_out_event::action_t o) - : output_(o) { } + : vvm_1bit_out(o, DELAY) { } void init_I(unsigned idx, vpip_bit_t val) { input_[idx] = val; } void start(vvm_simulation*sim) - { vvm_event*ev = new vvm_out_event(sim, compute_(), output_); - if (DELAY > 0) - sim->insert_event(DELAY, ev); - else - sim->active_event(ev); - } + { output(sim, compute_and(input_,WIDTH)); } void set_I(vvm_simulation*sim, unsigned idx, vpip_bit_t val) - { if (input_[idx] == val) - return; + { if (input_[idx] == val) return; input_[idx] = val; - - vvm_event*ev = new vvm_out_event(sim, compute_(), output_); - if (DELAY > 0) - sim->insert_event(DELAY, ev); - else - sim->active_event(ev); + output(sim, compute_and(input_,WIDTH)); } private: - vpip_bit_t compute_() const - { vpip_bit_t outval = input_[0]; - for (unsigned i = 1 ; i < WIDTH ; i += 1) - outval = outval & input_[i]; - return outval; - } - vpip_bit_t input_[WIDTH]; - vvm_out_event::action_t output_; }; template class vvm_clshift { @@ -481,7 +479,9 @@ template class vvm_or { { input_[idx] = val; } void start(vvm_simulation*sim) - { vvm_event*ev = new vvm_out_event(sim, compute_(), output_); + { vvm_event*ev = new vvm_out_event(sim, + compute_or(input_,WIDTH), + output_); if (DELAY > 0) sim->insert_event(DELAY, ev); else @@ -501,56 +501,32 @@ template class vvm_or { } private: - vpip_bit_t compute_() const - { vpip_bit_t outval = input_[0]; - for (unsigned i = 1 ; i < WIDTH ; i += 1) - outval = outval | input_[i]; - return outval; - } - vpip_bit_t input_[WIDTH]; vvm_out_event::action_t output_; }; -template class vvm_nor { +template +class vvm_nor : private vvm_1bit_out { public: explicit vvm_nor(vvm_out_event::action_t o) - : output_(o) { } + : vvm_1bit_out(o, DELAY) { } void init_I(unsigned idx, vpip_bit_t val) { input_[idx] = val; } void start(vvm_simulation*sim) - { vvm_event*ev = new vvm_out_event(sim, compute_(), output_); - if (DELAY > 0) - sim->insert_event(DELAY, ev); - else - sim->active_event(ev); - } + { output(sim, compute_nor(input_,WIDTH)); } void set_I(vvm_simulation*sim, unsigned idx, vpip_bit_t val) { if (input_[idx] == val) return; input_[idx] = val; - - vvm_event*ev = new vvm_out_event(sim, compute_(), output_); - if (DELAY > 0) - sim->insert_event(DELAY, ev); - else - sim->active_event(ev); + output(sim, compute_nor(input_,WIDTH)); } private: - vpip_bit_t compute_() const - { vpip_bit_t outval = input_[0]; - for (unsigned i = 1 ; i < WIDTH ; i += 1) - outval = outval | input_[i]; - return not(outval); - } - vpip_bit_t input_[WIDTH]; - vvm_out_event::action_t output_; }; template @@ -718,27 +694,19 @@ template class vvm_nand { /* * Simple inverter buffer. */ -template class vvm_not { +template class vvm_not : private vvm_1bit_out { public: explicit vvm_not(vvm_out_event::action_t o) - : output_(o) - { } + : vvm_1bit_out(o, DELAY) { } void init_I(unsigned, vpip_bit_t) { } void start(vvm_simulation*) { } void set_I(vvm_simulation*sim, unsigned, vpip_bit_t val) - { vpip_bit_t outval = not(val); - vvm_event*ev = new vvm_out_event(sim, outval, output_); - if (DELAY > 0) - sim->insert_event(DELAY, ev); - else - sim->active_event(ev); - } + { output(sim, not(val)); } private: - vvm_out_event::action_t output_; }; template class vvm_xnor { @@ -1011,6 +979,9 @@ template class vvm_pevent { /* * $Log: vvm_gates.h,v $ + * Revision 1.26 1999/11/22 00:30:52 steve + * Detemplate some and, or and nor methods. + * * Revision 1.25 1999/11/21 01:16:51 steve * Fix coding errors handling names of logic devices, * and add support for buf device in vvm.