Emit code for the bufif devices.

This commit is contained in:
steve 2000-04-23 21:15:07 +00:00
parent ebacf88b14
commit 6446add9cd
4 changed files with 100 additions and 14 deletions

View File

@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT) && !defined(macintosh)
#ident "$Id: netlist.h,v 1.128 2000/04/23 03:45:24 steve Exp $"
#ident "$Id: netlist.h,v 1.129 2000/04/23 21:15:07 steve Exp $"
#endif
/*
@ -823,7 +823,8 @@ class NetConst : public NetNode {
/*
* This class represents all manner of logic gates. Pin 0 is OUTPUT and
* all the remaining pins are INPUT
* all the remaining pins are INPUT. The BUFIF[01] gates have the
* additional restriction that pin 1 is the enable.
*/
class NetLogic : public NetNode {
@ -2440,6 +2441,9 @@ extern ostream& operator << (ostream&, NetNet::Type);
/*
* $Log: netlist.h,v $
* Revision 1.129 2000/04/23 21:15:07 steve
* Emit code for the bufif devices.
*
* Revision 1.128 2000/04/23 03:45:24 steve
* Add support for the procedural release statement.
*

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT) && !defined(macintosh)
#ident "$Id: t-xnf.cc,v 1.24 2000/04/20 02:34:47 steve Exp $"
#ident "$Id: t-xnf.cc,v 1.25 2000/04/23 21:15:07 steve Exp $"
#endif
/* XNF BACKEND
@ -773,21 +773,46 @@ void target_xnf::logic(ostream&os, const NetLogic*net)
case NetLogic::XOR:
os << "XOR";
break;
case NetLogic::BUFIF0:
case NetLogic::BUFIF1:
os << "TBUF";
break;
default:
cerr << "XNF: Unhandled logic type." << endl;
cerr << "internal error: XNF: Unhandled logic type." << endl;
break;
}
os << ", LIBVER=2.0.0" << endl;
/* All of these kinds of devices have an output on pin 0. */
draw_pin(os, "O", net->pin(0));
if (net->pin_count() == 2) {
/* Most devices have inputs called I<N> for all the remaining
pins. The TBUF devices are slightly different, but
essentially the same structure. */
switch (net->type()) {
case NetLogic::BUFIF0:
assert(net->pin_count() == 3);
draw_pin(os, "I", net->pin(1));
draw_pin(os, "~T", net->pin(2));
break;
case NetLogic::BUFIF1:
assert(net->pin_count() == 3);
draw_pin(os, "I", net->pin(1));
} else for (unsigned idx = 1 ; idx < net->pin_count() ; idx += 1) {
string name = "I";
assert(net->pin_count() <= 11);
name += (char)('0'+idx-1);
draw_pin(os, name, net->pin(idx));
draw_pin(os, "T", net->pin(2));
break;
default:
if (net->pin_count() == 2) {
draw_pin(os, "I", net->pin(1));
} else for (unsigned idx = 1; idx < net->pin_count(); idx += 1) {
string name = "I";
assert(net->pin_count() <= 11);
name += (char)('0'+idx-1);
draw_pin(os, name, net->pin(idx));
}
break;
}
os << "END" << endl;
@ -828,6 +853,9 @@ extern const struct target tgt_xnf = { "xnf", &target_xnf_obj };
/*
* $Log: t-xnf.cc,v $
* Revision 1.25 2000/04/23 21:15:07 steve
* Emit code for the bufif devices.
*
* Revision 1.24 2000/04/20 02:34:47 steve
* Generate code for identity compare. Use gates.
*

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT) && !defined(macintosh)
#ident "$Id: vvm_gates.cc,v 1.12 2000/03/22 04:26:41 steve Exp $"
#ident "$Id: vvm_gates.cc,v 1.13 2000/04/23 21:15:07 steve Exp $"
#endif
# include "vvm_gates.h"
@ -149,6 +149,38 @@ void vvm_buf::take_value(unsigned, vpip_bit_t val)
output(outval);
}
vvm_bufif0::vvm_bufif0(unsigned long d)
: vvm_1bit_out(d)
{
input_[0] = StX;
input_[1] = StX;
}
vvm_bufif0::~vvm_bufif0()
{
}
void vvm_bufif0::init_I(unsigned key, vpip_bit_t val)
{
assert(key < 2);
input_[key] = val;
}
void vvm_bufif0::take_value(unsigned key, vpip_bit_t val)
{
if (input_[key] == val) return;
input_[key] = val;
if (! B_IS0(input_[1]))
output(HiZ);
else if (B_ISXZ(input_[0]))
output(StX);
else if (B_IS1(input_[0]))
output(St1);
else
output(St0);
}
vvm_bufif1::vvm_bufif1(unsigned long d)
: vvm_1bit_out(d)
{
@ -160,8 +192,10 @@ vvm_bufif1::~vvm_bufif1()
{
}
void vvm_bufif1::init_I(unsigned, vpip_bit_t)
void vvm_bufif1::init_I(unsigned key, vpip_bit_t val)
{
assert(key < 2);
input_[key] = val;
}
void vvm_bufif1::take_value(unsigned key, vpip_bit_t val)
@ -173,7 +207,7 @@ void vvm_bufif1::take_value(unsigned key, vpip_bit_t val)
output(HiZ);
else if (B_ISXZ(input_[0]))
output(StX);
else if (B_IS1(val))
else if (B_IS1(input_[0]))
output(St1);
else
output(St0);
@ -285,6 +319,9 @@ void vvm_not::take_value(unsigned, vpip_bit_t val)
/*
* $Log: vvm_gates.cc,v $
* Revision 1.13 2000/04/23 21:15:07 steve
* Emit code for the bufif devices.
*
* Revision 1.12 2000/03/22 04:26:41 steve
* Replace the vpip_bit_t with a typedef and
* define values for all the different bit

View File

@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT) && !defined(macintosh)
#ident "$Id: vvm_gates.h,v 1.59 2000/04/23 03:45:25 steve Exp $"
#ident "$Id: vvm_gates.h,v 1.60 2000/04/23 21:15:07 steve Exp $"
#endif
# include "vvm.h"
@ -567,6 +567,20 @@ class vvm_buf : public vvm_1bit_out, public vvm_nexus::recvr_t {
void take_value(unsigned, vpip_bit_t val);
};
class vvm_bufif0 : public vvm_1bit_out, public vvm_nexus::recvr_t {
public:
explicit vvm_bufif0(unsigned long d);
~vvm_bufif0();
void init_I(unsigned, vpip_bit_t);
void start() { }
private:
vpip_bit_t input_[2];
void take_value(unsigned key, vpip_bit_t val);
};
class vvm_bufif1 : public vvm_1bit_out, public vvm_nexus::recvr_t {
public:
@ -916,6 +930,9 @@ class vvm_posedge : public vvm_nexus::recvr_t {
/*
* $Log: vvm_gates.h,v $
* Revision 1.60 2000/04/23 21:15:07 steve
* Emit code for the bufif devices.
*
* Revision 1.59 2000/04/23 03:45:25 steve
* Add support for the procedural release statement.
*