Use new vvp_fun_XXX in place of old functor table for NAND/NOR/XNOR/EEQ.

This commit is contained in:
steve 2006-11-28 05:57:20 +00:00
parent a3da90aa4a
commit 4f8a7ea84a
3 changed files with 88 additions and 37 deletions

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: draw_tt.c,v 1.22 2005/09/19 21:45:09 steve Exp $"
#ident "$Id: draw_tt.c,v 1.23 2006/11/28 05:57:20 steve Exp $"
#endif
# include <stdio.h>
@ -57,7 +57,7 @@ static void draw_AND(void)
printf("};\n");
}
#endif
#if 0
static void draw_NAND(void)
{
unsigned i0, i1, i2, i3;
@ -91,7 +91,7 @@ static void draw_NAND(void)
printf("};\n");
}
#endif
#if 0
static void draw_BUF(void)
{
@ -373,7 +373,7 @@ static void draw_MUXZ(void)
printf("};\n");
}
#endif
#if 0
static void draw_EEQ(void)
{
unsigned i0, i1, i2, i3;
@ -405,7 +405,8 @@ static void draw_EEQ(void)
printf("};\n");
}
#endif
#if 0
static void draw_NOR(void)
{
unsigned i0, i1, i2, i3;
@ -439,7 +440,7 @@ static void draw_NOR(void)
printf("};\n");
}
#endif
#if 0
static void draw_NOT(void)
{
@ -508,7 +509,7 @@ static void draw_OR(void)
printf("};\n");
}
#endif
#if 0
static void draw_XNOR(void)
{
unsigned i0, i1, i2, i3;
@ -540,7 +541,7 @@ static void draw_XNOR(void)
printf("};\n");
}
#endif
#if 0
static void draw_XOR(void)
{
@ -750,12 +751,8 @@ main()
{
printf("# include \"logic.h\"\n");
draw_MUXX();
draw_EEQ();
draw_NAND();
draw_NOR();
draw_TRIAND();
draw_TRIOR();
draw_XNOR();
draw_hex_table();
draw_oct_table();
return 0;
@ -763,6 +760,9 @@ main()
/*
* $Log: draw_tt.c,v $
* Revision 1.23 2006/11/28 05:57:20 steve
* Use new vvp_fun_XXX in place of old functor table for NAND/NOR/XNOR/EEQ.
*
* Revision 1.22 2005/09/19 21:45:09 steve
* Use lazy eval of BUF/NOT/OR/XOR gates.
*

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: logic.cc,v 1.36 2006/01/02 05:32:07 steve Exp $"
#ident "$Id: logic.cc,v 1.37 2006/11/28 05:57:20 steve Exp $"
#endif
# include "logic.h"
@ -104,8 +104,8 @@ void vvp_fun_boolean_::recv_vec4(vvp_net_ptr_t ptr, const vvp_vector4_t&bit)
}
}
vvp_fun_and::vvp_fun_and(unsigned wid)
: vvp_fun_boolean_(wid)
vvp_fun_and::vvp_fun_and(unsigned wid, bool invert)
: vvp_fun_boolean_(wid), invert_(invert)
{
}
@ -129,6 +129,8 @@ void vvp_fun_and::run_run()
}
bitbit = bitbit & input_[pdx].value(idx);
if (invert_)
bitbit = ~bitbit;
}
result.set_bit(idx, bitbit);
@ -137,6 +139,34 @@ void vvp_fun_and::run_run()
vvp_send_vec4(ptr->out, result);
}
vvp_fun_eeq::vvp_fun_eeq(unsigned wid, bool invert)
: vvp_fun_boolean_(wid), invert_(invert)
{
}
vvp_fun_eeq::~vvp_fun_eeq()
{
}
void vvp_fun_eeq::run_run()
{
vvp_net_t*ptr = net_;
net_ = 0;
vvp_vector4_t result (input_[0]);
for (unsigned idx = 0 ; idx < result.size() ; idx += 1) {
vvp_bit4_t bitbit = result.value(idx);
bitbit = (bitbit == input_[1].value(idx))? BIT4_1 : BIT4_0;
if (invert_)
bitbit = ~bitbit;
result.set_bit(idx, bitbit);
}
vvp_send_vec4(ptr->out, result);
}
vvp_fun_buf::vvp_fun_buf()
{
net_ = 0;
@ -400,8 +430,8 @@ void vvp_fun_not::run_run()
vvp_send_vec4(ptr->out, result);
}
vvp_fun_or::vvp_fun_or(unsigned wid)
: vvp_fun_boolean_(wid)
vvp_fun_or::vvp_fun_or(unsigned wid, bool invert)
: vvp_fun_boolean_(wid), invert_(invert)
{
}
@ -427,14 +457,16 @@ void vvp_fun_or::run_run()
bitbit = bitbit | input_[pdx].value(idx);
}
if (invert_)
bitbit = ~bitbit;
result.set_bit(idx, bitbit);
}
vvp_send_vec4(ptr->out, result);
}
vvp_fun_xor::vvp_fun_xor(unsigned wid)
: vvp_fun_boolean_(wid)
vvp_fun_xor::vvp_fun_xor(unsigned wid, bool invert)
: vvp_fun_boolean_(wid), invert_(invert)
{
}
@ -460,6 +492,8 @@ void vvp_fun_xor::run_run()
bitbit = bitbit ^ input_[pdx].value(idx);
}
if (invert_)
bitbit = ~bitbit;
result.set_bit(idx, bitbit);
}
@ -480,10 +514,10 @@ void compile_functor(char*label, char*type, unsigned width,
bool strength_aware = false;
if (strcmp(type, "OR") == 0) {
obj = new vvp_fun_or(width);
obj = new vvp_fun_or(width, false);
} else if (strcmp(type, "AND") == 0) {
obj = new vvp_fun_and(width);
obj = new vvp_fun_and(width, false);
} else if (strcmp(type, "BUF") == 0) {
obj = new vvp_fun_buf();
@ -496,6 +530,12 @@ void compile_functor(char*label, char*type, unsigned width,
obj = new vvp_fun_bufif(false,false, ostr0, ostr1);
strength_aware = true;
} else if (strcmp(type, "NAND") == 0) {
obj = new vvp_fun_and(width, true);
} else if (strcmp(type, "NOR") == 0) {
obj = new vvp_fun_or(width, true);
} else if (strcmp(type, "NOTIF0") == 0) {
obj = new vvp_fun_bufif(true,true, ostr0, ostr1);
strength_aware = true;
@ -529,22 +569,16 @@ void compile_functor(char*label, char*type, unsigned width,
obj = new vvp_fun_rpmos(false);
} else if (strcmp(type, "EEQ") == 0) {
obj = new table_functor_s(ft_EEQ);
} else if (strcmp(type, "NAND") == 0) {
obj = new table_functor_s(ft_NAND);
} else if (strcmp(type, "NOR") == 0) {
obj = new table_functor_s(ft_NOR);
obj = new vvp_fun_eeq(width, false);
} else if (strcmp(type, "NOT") == 0) {
obj = new vvp_fun_not();
} else if (strcmp(type, "XNOR") == 0) {
obj = new table_functor_s(ft_XNOR);
obj = new vvp_fun_xor(width, true);
} else if (strcmp(type, "XOR") == 0) {
obj = new vvp_fun_xor(width);
obj = new vvp_fun_xor(width, false);
} else {
yyerror("invalid functor type.");
@ -586,6 +620,9 @@ void compile_functor(char*label, char*type, unsigned width,
/*
* $Log: logic.cc,v $
* Revision 1.37 2006/11/28 05:57:20 steve
* Use new vvp_fun_XXX in place of old functor table for NAND/NOR/XNOR/EEQ.
*
* Revision 1.36 2006/01/02 05:32:07 steve
* Require explicit delay node from source.
*

View File

@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#ifdef HAVE_CVS_IDENT
#ident "$Id: logic.h,v 1.24 2005/09/19 21:45:09 steve Exp $"
#ident "$Id: logic.h,v 1.25 2006/11/28 05:57:20 steve Exp $"
#endif
# include "vvp_net.h"
@ -64,11 +64,23 @@ class vvp_fun_boolean_ : public vvp_net_fun_t, protected vvp_gen_event_s {
class vvp_fun_and : public vvp_fun_boolean_ {
public:
explicit vvp_fun_and(unsigned wid);
explicit vvp_fun_and(unsigned wid, bool invert);
~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_;
};
/*
@ -168,35 +180,37 @@ class vvp_fun_not: public vvp_net_fun_t, private vvp_gen_event_s {
class vvp_fun_or : public vvp_fun_boolean_ {
public:
explicit vvp_fun_or(unsigned wid);
explicit vvp_fun_or(unsigned wid, bool invert);
~vvp_fun_or();
private:
void run_run();
bool invert_;
};
class vvp_fun_xor : public vvp_fun_boolean_ {
public:
explicit vvp_fun_xor(unsigned wid);
explicit vvp_fun_xor(unsigned wid, bool invert);
~vvp_fun_xor();
private:
void run_run();
bool invert_;
};
// table functor types
extern const unsigned char ft_MUXX[];
extern const unsigned char ft_EEQ[];
extern const unsigned char ft_NAND[];
extern const unsigned char ft_NOR[];
extern const unsigned char ft_TRIAND[];
extern const unsigned char ft_TRIOR[];
extern const unsigned char ft_XNOR[];
/*
* $Log: logic.h,v $
* Revision 1.25 2006/11/28 05:57:20 steve
* Use new vvp_fun_XXX in place of old functor table for NAND/NOR/XNOR/EEQ.
*
* Revision 1.24 2005/09/19 21:45:09 steve
* Use lazy eval of BUF/NOT/OR/XOR gates.
*