Detemplate some and, or and nor methods.

This commit is contained in:
steve 1999-11-22 00:30:52 +00:00
parent 85ab6d160b
commit eb72a83e5f
5 changed files with 173 additions and 87 deletions

View File

@ -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 \

View File

@ -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 <vector>
# include <string>
# include <cassert>
# 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 <unsigned WIDTH> class vvm_bitset_t : public vvm_bits_t {
}
vvm_bitset_t(const vvm_bitset_t<WIDTH>&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.
*

View File

@ -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 <iostream>
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.
*

95
vvm/vvm_gates.cc Normal file
View File

@ -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.
*
*/

View File

@ -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 <assert.h>
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 <unsigned WIDTH> class vvm_add_sub {
}
};
template <unsigned WIDTH, unsigned long DELAY> class vvm_and {
template <unsigned WIDTH, unsigned long DELAY>
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 <unsigned WIDTH, unsigned WDIST> class vvm_clshift {
@ -481,7 +479,9 @@ template <unsigned WIDTH, unsigned long DELAY> 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 <unsigned WIDTH, unsigned long DELAY> 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 <unsigned WIDTH, unsigned long DELAY> class vvm_nor {
template <unsigned WIDTH, unsigned long DELAY>
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 <unsigned WIDTH, unsigned AWIDTH, unsigned SIZE>
@ -718,27 +694,19 @@ template <unsigned WIDTH, unsigned long DELAY> class vvm_nand {
/*
* Simple inverter buffer.
*/
template <unsigned long DELAY> class vvm_not {
template <unsigned long DELAY> 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 <unsigned WIDTH, unsigned long DELAY> class vvm_xnor {
@ -1011,6 +979,9 @@ template <unsigned WIDTH> 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.