iverilog/vvp/logic.h

213 lines
5.2 KiB
C
Raw Normal View History

2001-11-06 04:07:21 +01:00
#ifndef __logic_H
#define __logic_H
/*
* Copyright (c) 2000-2007 Stephen Williams (steve@icarus.com)
2001-11-06 04:07:21 +01:00
*
* 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
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: logic.h,v 1.25 2006/11/28 05:57:20 steve Exp $"
2001-11-06 04:07:21 +01:00
#endif
# include "vvp_net.h"
# include "schedule.h"
2002-07-05 22:08:44 +02:00
# include <stddef.h>
2001-11-06 04:07:21 +01:00
/*
* Table driven functor. This kind of node takes 4 inputs and
* generates a single output. The logic is bitwise, and implemented
* with a lookup table.
2001-11-06 04:07:21 +01:00
*/
class table_functor_s: public vvp_net_fun_t {
2001-12-14 03:04:49 +01:00
public:
2001-11-06 04:07:21 +01:00
typedef const unsigned char *truth_t;
explicit table_functor_s(truth_t t);
2001-11-06 04:07:21 +01:00
virtual ~table_functor_s();
2001-12-14 03:04:49 +01:00
void recv_vec4(vvp_net_ptr_t p, const vvp_vector4_t&bit);
2001-12-14 03:04:49 +01:00
private:
2001-11-06 04:07:21 +01:00
truth_t table;
vvp_vector4_t input_[4];
};
/*
* vvp_fun_boolean_ is just a common hook for holding operands.
*/
class vvp_fun_boolean_ : public vvp_net_fun_t, protected vvp_gen_event_s {
public:
explicit vvp_fun_boolean_(unsigned wid);
~vvp_fun_boolean_();
void recv_vec4(vvp_net_ptr_t p, const vvp_vector4_t&bit);
void recv_vec4_pv(vvp_net_ptr_t p, const vvp_vector4_t&bit,
unsigned base, unsigned wid, unsigned vwid);
2005-01-29 18:52:06 +01:00
protected:
vvp_vector4_t input_[4];
vvp_net_t*net_;
2005-01-29 18:52:06 +01:00
};
class vvp_fun_and : public vvp_fun_boolean_ {
public:
explicit vvp_fun_and(unsigned wid, bool invert);
2005-01-29 18:52:06 +01:00
~vvp_fun_and();
private:
void run_run();
bool invert_;
};
class vvp_fun_eeq : public vvp_fun_boolean_ {
public:
explicit vvp_fun_eeq(unsigned wid, bool invert);
~vvp_fun_eeq();
private:
void run_run();
bool invert_;
2005-01-29 18:52:06 +01:00
};
/*
* The buffer functor is a very primitive functor that takes the input
* from port-0 (and only port-0) and retransmits it as a vvp_vector4_t.
2004-12-31 06:56:36 +01:00
* The retransmitted vector has all Z values changed to X, just like
* the buf(Q,D) gate in Verilog.
*/
2005-09-19 23:45:09 +02:00
class vvp_fun_buf: public vvp_net_fun_t, private vvp_gen_event_s {
public:
explicit vvp_fun_buf();
virtual ~vvp_fun_buf();
void recv_vec4(vvp_net_ptr_t p, const vvp_vector4_t&bit);
private:
2005-09-19 23:45:09 +02:00
void run_run();
private:
vvp_vector4_t input_;
vvp_net_t*net_;
2001-11-06 04:07:21 +01:00
};
2004-12-31 06:56:36 +01:00
/*
* The vvp_fun_bufz is like the vvp_fun_buf, but it does not change
* Z values to X -- it passes Z values unchanged.
*/
class vvp_fun_bufz: public vvp_net_fun_t {
public:
explicit vvp_fun_bufz();
2004-12-31 06:56:36 +01:00
virtual ~vvp_fun_bufz();
void recv_vec4(vvp_net_ptr_t p, const vvp_vector4_t&bit);
void recv_real(vvp_net_ptr_t p, double bit);
2004-12-31 06:56:36 +01:00
private:
};
2005-02-12 23:50:52 +01:00
/*
* The muxz functor is an A-B mux device, with the data inputs on
* ports 0 and 1. port 2 is the select input.
2005-02-13 00:05:25 +01:00
*
* The select input must be 1 bit wide. If it is 0, then the port-0
* vector is passed out. If select is 1, then port-1 is passed
* out. Otherwise, a vector is passed out that reflects x?: behavior
* in Verilog. The width of the blended output is the width of the largest
2005-02-13 00:05:25 +01:00
* input (port-0 or port-1) to enter the device. The narrow vector is
* padded with X values.
2005-02-12 23:50:52 +01:00
*/
class vvp_fun_muxz : public vvp_net_fun_t {
public:
2005-06-17 05:46:52 +02:00
explicit vvp_fun_muxz(unsigned width);
2005-02-12 23:50:52 +01:00
virtual ~vvp_fun_muxz();
void recv_vec4(vvp_net_ptr_t p, const vvp_vector4_t&bit);
2005-02-12 23:50:52 +01:00
private:
vvp_vector4_t a_;
vvp_vector4_t b_;
int select_;
};
2005-09-01 06:08:47 +02:00
class vvp_fun_muxr : public vvp_net_fun_t {
public:
explicit vvp_fun_muxr();
virtual ~vvp_fun_muxr();
void recv_vec4(vvp_net_ptr_t p, const vvp_vector4_t&bit);
void recv_real(vvp_net_ptr_t p, double bit);
private:
double a_;
double b_;
int select_;
};
2005-09-19 23:45:09 +02:00
class vvp_fun_not: public vvp_net_fun_t, private vvp_gen_event_s {
public:
explicit vvp_fun_not();
virtual ~vvp_fun_not();
void recv_vec4(vvp_net_ptr_t p, const vvp_vector4_t&bit);
private:
void run_run();
private:
vvp_vector4_t input_;
vvp_net_t*net_;
};
class vvp_fun_or : public vvp_fun_boolean_ {
public:
explicit vvp_fun_or(unsigned wid, bool invert);
2005-09-19 23:45:09 +02:00
~vvp_fun_or();
private:
void run_run();
bool invert_;
2005-09-19 23:45:09 +02:00
};
class vvp_fun_xor : public vvp_fun_boolean_ {
public:
explicit vvp_fun_xor(unsigned wid, bool invert);
2005-09-19 23:45:09 +02:00
~vvp_fun_xor();
private:
void run_run();
bool invert_;
2005-09-19 23:45:09 +02:00
};
2001-11-06 04:07:21 +01:00
// table functor types
extern const unsigned char ft_MUXX[];
2001-11-06 04:07:21 +01:00
extern const unsigned char ft_EEQ[];
2003-07-30 03:13:28 +02:00
extern const unsigned char ft_TRIAND[];
extern const unsigned char ft_TRIOR[];
2001-11-06 04:07:21 +01:00
#endif // __logic_H