2014-07-23 22:39:29 +02:00
|
|
|
#ifndef IVL_logic_H
|
|
|
|
|
#define IVL_logic_H
|
2001-11-06 04:07:21 +01:00
|
|
|
/*
|
2020-07-09 10:44:44 +02:00
|
|
|
* Copyright (c) 2000-2020 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
|
2012-08-29 03:41:23 +02:00
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2001-11-06 04:07:21 +01:00
|
|
|
*/
|
|
|
|
|
|
2004-12-11 03:31:25 +01:00
|
|
|
# include "vvp_net.h"
|
2005-06-26 20:06:29 +02:00
|
|
|
# include "schedule.h"
|
2010-05-31 22:12:06 +02:00
|
|
|
# include <cstddef>
|
2001-11-06 04:07:21 +01:00
|
|
|
|
2005-04-13 08:34:20 +02:00
|
|
|
/*
|
|
|
|
|
* vvp_fun_boolean_ is just a common hook for holding operands.
|
|
|
|
|
*/
|
2005-06-26 20:06:29 +02:00
|
|
|
class vvp_fun_boolean_ : public vvp_net_fun_t, protected vvp_gen_event_s {
|
|
|
|
|
|
|
|
|
|
public:
|
2005-06-26 23:08:38 +02:00
|
|
|
explicit vvp_fun_boolean_(unsigned wid);
|
2005-06-26 20:06:29 +02:00
|
|
|
~vvp_fun_boolean_();
|
2007-08-29 01:52:44 +02:00
|
|
|
|
2008-10-28 18:52:39 +01:00
|
|
|
void recv_vec4(vvp_net_ptr_t p, const vvp_vector4_t&bit,
|
|
|
|
|
vvp_context_t);
|
2007-08-29 01:52:44 +02:00
|
|
|
void recv_vec4_pv(vvp_net_ptr_t p, const vvp_vector4_t&bit,
|
2022-05-28 13:04:53 +02:00
|
|
|
unsigned base, unsigned vwid, vvp_context_t);
|
2005-01-29 18:52:06 +01:00
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
vvp_vector4_t input_[4];
|
2005-06-26 20:06:29 +02:00
|
|
|
vvp_net_t*net_;
|
2005-01-29 18:52:06 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class vvp_fun_and : public vvp_fun_boolean_ {
|
|
|
|
|
|
|
|
|
|
public:
|
2006-11-28 06:57:20 +01:00
|
|
|
explicit vvp_fun_and(unsigned wid, bool invert);
|
2005-01-29 18:52:06 +01:00
|
|
|
~vvp_fun_and();
|
2005-06-26 20:06:29 +02:00
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
void run_run();
|
2006-11-28 06:57:20 +01:00
|
|
|
bool invert_;
|
|
|
|
|
};
|
|
|
|
|
|
2020-07-09 10:44:44 +02:00
|
|
|
class vvp_fun_equiv : public vvp_fun_boolean_ {
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
explicit vvp_fun_equiv();
|
|
|
|
|
~vvp_fun_equiv();
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
void run_run();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class vvp_fun_impl : public vvp_fun_boolean_ {
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
explicit vvp_fun_impl();
|
|
|
|
|
~vvp_fun_impl();
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
void run_run();
|
|
|
|
|
};
|
|
|
|
|
|
2004-12-30 00:45:13 +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.
|
2004-12-30 00:45:13 +01:00
|
|
|
*/
|
2005-09-19 23:45:09 +02:00
|
|
|
class vvp_fun_buf: public vvp_net_fun_t, private vvp_gen_event_s {
|
2004-12-30 00:45:13 +01:00
|
|
|
|
|
|
|
|
public:
|
2010-04-10 23:05:42 +02:00
|
|
|
explicit vvp_fun_buf(unsigned wid);
|
2004-12-30 00:45:13 +01:00
|
|
|
virtual ~vvp_fun_buf();
|
|
|
|
|
|
2008-10-28 18:52:39 +01:00
|
|
|
void recv_vec4(vvp_net_ptr_t p, const vvp_vector4_t&bit,
|
|
|
|
|
vvp_context_t);
|
2010-04-10 23:05:42 +02:00
|
|
|
void recv_vec4_pv(vvp_net_ptr_t p, const vvp_vector4_t&bit,
|
2022-05-28 13:04:53 +02:00
|
|
|
unsigned base, unsigned vwid, vvp_context_t);
|
2004-12-30 00:45:13 +01:00
|
|
|
|
|
|
|
|
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:
|
2005-05-14 21:43:23 +02:00
|
|
|
explicit vvp_fun_bufz();
|
2004-12-31 06:56:36 +01:00
|
|
|
virtual ~vvp_fun_bufz();
|
|
|
|
|
|
2008-10-28 18:52:39 +01:00
|
|
|
void recv_vec4(vvp_net_ptr_t p, const vvp_vector4_t&bit,
|
|
|
|
|
vvp_context_t);
|
2010-04-10 23:05:42 +02:00
|
|
|
void recv_vec4_pv(vvp_net_ptr_t p, const vvp_vector4_t&bit,
|
2022-05-28 13:04:53 +02:00
|
|
|
unsigned base, unsigned vwid, vvp_context_t);
|
2010-07-12 02:16:15 +02:00
|
|
|
//void recv_vec8(vvp_net_ptr_t port, const vvp_vector8_t&bit);
|
2008-10-28 18:52:39 +01:00
|
|
|
void recv_real(vvp_net_ptr_t p, double bit,
|
|
|
|
|
vvp_context_t);
|
2004-12-31 06:56:36 +01:00
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
};
|
|
|
|
|
|
2010-07-12 02:16:15 +02:00
|
|
|
/*
|
|
|
|
|
* The vp_fun_buft is like the vvp_fun_bufz, but is completely
|
|
|
|
|
* transparent to strengths.
|
|
|
|
|
*/
|
|
|
|
|
class vvp_fun_buft: public vvp_fun_bufz {
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
void recv_vec8(vvp_net_ptr_t port, const vvp_vector8_t&bit);
|
|
|
|
|
private:
|
|
|
|
|
};
|
|
|
|
|
|
2008-04-08 18:17:51 +02:00
|
|
|
enum sel_type {SEL_PORT0, SEL_PORT1, SEL_BOTH};
|
|
|
|
|
|
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
|
2008-01-29 21:19:59 +01:00
|
|
|
* 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
|
|
|
*/
|
2008-03-20 23:32:54 +01:00
|
|
|
class vvp_fun_muxz : public vvp_net_fun_t, private vvp_gen_event_s {
|
2005-02-12 23:50:52 +01:00
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
|
2008-10-28 18:52:39 +01:00
|
|
|
void recv_vec4(vvp_net_ptr_t p, const vvp_vector4_t&bit,
|
|
|
|
|
vvp_context_t);
|
2010-04-10 23:05:42 +02:00
|
|
|
void recv_vec4_pv(vvp_net_ptr_t p, const vvp_vector4_t&bit,
|
2022-05-28 13:04:53 +02:00
|
|
|
unsigned base, unsigned vwid, vvp_context_t);
|
2005-02-12 23:50:52 +01:00
|
|
|
|
2008-03-20 23:32:54 +01:00
|
|
|
private:
|
|
|
|
|
void run_run();
|
|
|
|
|
|
2005-02-12 23:50:52 +01:00
|
|
|
private:
|
|
|
|
|
vvp_vector4_t a_;
|
|
|
|
|
vvp_vector4_t b_;
|
2008-03-20 23:32:54 +01:00
|
|
|
vvp_net_t*net_;
|
2008-04-08 18:17:51 +02:00
|
|
|
sel_type select_;
|
2008-04-08 02:18:21 +02:00
|
|
|
bool has_run_;
|
2005-02-12 23:50:52 +01:00
|
|
|
};
|
|
|
|
|
|
2008-03-20 23:32:54 +01:00
|
|
|
class vvp_fun_muxr : public vvp_net_fun_t, private vvp_gen_event_s {
|
2005-09-01 06:08:47 +02:00
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
explicit vvp_fun_muxr();
|
|
|
|
|
virtual ~vvp_fun_muxr();
|
|
|
|
|
|
2008-10-28 18:52:39 +01:00
|
|
|
void recv_vec4(vvp_net_ptr_t p, const vvp_vector4_t&bit,
|
|
|
|
|
vvp_context_t);
|
|
|
|
|
void recv_real(vvp_net_ptr_t p, double bit,
|
|
|
|
|
vvp_context_t);
|
2005-09-01 06:08:47 +02:00
|
|
|
|
2008-03-20 23:32:54 +01:00
|
|
|
private:
|
|
|
|
|
void run_run();
|
|
|
|
|
|
2005-09-01 06:08:47 +02:00
|
|
|
private:
|
|
|
|
|
double a_;
|
|
|
|
|
double b_;
|
2008-03-20 23:32:54 +01:00
|
|
|
vvp_net_t*net_;
|
2008-04-08 18:17:51 +02:00
|
|
|
sel_type select_;
|
2005-09-01 06:08:47 +02:00
|
|
|
};
|
|
|
|
|
|
2005-09-19 23:45:09 +02:00
|
|
|
class vvp_fun_not: public vvp_net_fun_t, private vvp_gen_event_s {
|
|
|
|
|
|
|
|
|
|
public:
|
2010-04-10 23:05:42 +02:00
|
|
|
explicit vvp_fun_not(unsigned wid);
|
2005-09-19 23:45:09 +02:00
|
|
|
virtual ~vvp_fun_not();
|
|
|
|
|
|
2008-10-28 18:52:39 +01:00
|
|
|
void recv_vec4(vvp_net_ptr_t p, const vvp_vector4_t&bit,
|
|
|
|
|
vvp_context_t);
|
2010-04-10 23:05:42 +02:00
|
|
|
void recv_vec4_pv(vvp_net_ptr_t p, const vvp_vector4_t&bit,
|
2022-05-28 13:04:53 +02:00
|
|
|
unsigned base, unsigned vwid, vvp_context_t);
|
2005-09-19 23:45:09 +02:00
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
void run_run();
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
vvp_vector4_t input_;
|
|
|
|
|
vvp_net_t*net_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class vvp_fun_or : public vvp_fun_boolean_ {
|
|
|
|
|
|
|
|
|
|
public:
|
2006-11-28 06:57:20 +01:00
|
|
|
explicit vvp_fun_or(unsigned wid, bool invert);
|
2005-09-19 23:45:09 +02:00
|
|
|
~vvp_fun_or();
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
void run_run();
|
2006-11-28 06:57:20 +01:00
|
|
|
bool invert_;
|
2005-09-19 23:45:09 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class vvp_fun_xor : public vvp_fun_boolean_ {
|
|
|
|
|
|
|
|
|
|
public:
|
2006-11-28 06:57:20 +01:00
|
|
|
explicit vvp_fun_xor(unsigned wid, bool invert);
|
2005-09-19 23:45:09 +02:00
|
|
|
~vvp_fun_xor();
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
void run_run();
|
2006-11-28 06:57:20 +01:00
|
|
|
bool invert_;
|
2005-09-19 23:45:09 +02:00
|
|
|
};
|
|
|
|
|
|
2014-07-23 22:39:29 +02:00
|
|
|
#endif /* IVL_logic_H */
|