tri01 support in vvm.

This commit is contained in:
steve 2000-08-02 00:57:02 +00:00
parent 60c2046be6
commit 2e3e9ecf37
3 changed files with 58 additions and 6 deletions

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-vvm.cc,v 1.164 2000/07/29 16:21:08 steve Exp $"
#ident "$Id: t-vvm.cc,v 1.165 2000/08/02 00:57:02 steve Exp $"
#endif
# include <iostream>
@ -1099,6 +1099,25 @@ void target_vvm::signal(ostream&os, const NetNet*sig)
init_code << " nexus_wire_table[" << ncode <<
"].connect(&" << net_name << ", " << idx << ");" << endl;
/* By default, the nexus object uses a resolution
function that is suitable for simulating wire and tri
signals. If the signal is some other sort, the write
a resolution function into the nexus that properly
handles the different semantics. */
switch (sig->type()) {
case NetNet::TRI0:
init_code << " nexus_wire_table[" << ncode
<< "].resolution_function = vvm_resolution_tri0;"
<< endl;
break;
case NetNet::TRI1:
init_code << " nexus_wire_table[" << ncode
<< "].resolution_function = vvm_resolution_tri1;"
<< endl;
break;
}
// Propogate the initial value to inputs throughout.
if (new_nexus_flag) {
verinum::V init = sig->pin(idx).nexus()->get_init();
@ -3088,6 +3107,9 @@ extern const struct target tgt_vvm = {
};
/*
* $Log: t-vvm.cc,v $
* Revision 1.165 2000/08/02 00:57:02 steve
* tri01 support in vvm.
*
* Revision 1.164 2000/07/29 16:21:08 steve
* Report code generation errors through proc_delay.
*

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_nexus.cc,v 1.8 2000/05/11 23:37:28 steve Exp $"
#ident "$Id: vvm_nexus.cc,v 1.9 2000/08/02 00:57:03 steve Exp $"
#endif
# include "vvm_nexus.h"
@ -36,6 +36,7 @@ vvm_nexus::vvm_nexus()
forcer_key_ = 0;
assigner_ = 0;
assigner_key_ = 0;
resolution_function = &vvm_resolution_wire;
}
vvm_nexus::~vvm_nexus()
@ -269,13 +270,32 @@ vvm_nexus::recvr_t::~recvr_t()
{
}
vpip_bit_t vvm_nexus::resolution_function(const vpip_bit_t*bits,
unsigned nbits) const
vpip_bit_t vvm_resolution_wire(const vpip_bit_t*bits, unsigned nbits)
{
if (nbits == 0) return HiZ;
return vpip_bits_resolve(bits, nbits);
}
vpip_bit_t vvm_resolution_tri0(const vpip_bit_t*bits, unsigned nbits)
{
if (nbits == 0) return Pu0;
vpip_bit_t res = vpip_bits_resolve(bits, nbits);
if (B_ISZ(res)) return Pu0;
return res;
}
vpip_bit_t vvm_resolution_tri1(const vpip_bit_t*bits, unsigned nbits)
{
if (nbits == 0) return Pu1;
vpip_bit_t res = vpip_bits_resolve(bits, nbits);
if (B_ISZ(res)) return Pu1;
return res;
}
class delayed_assign_event : public vvm_event {
public:
delayed_assign_event(vvm_nexus&l, vpip_bit_t r)
@ -297,6 +317,9 @@ void vvm_delayed_assign(vvm_nexus&l_val, vpip_bit_t r_val,
/*
* $Log: vvm_nexus.cc,v $
* Revision 1.9 2000/08/02 00:57:03 steve
* tri01 support in vvm.
*
* Revision 1.8 2000/05/11 23:37:28 steve
* Add support for procedural continuous assignment.
*

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_nexus.h,v 1.4 2000/05/11 23:37:28 steve Exp $"
#ident "$Id: vvm_nexus.h,v 1.5 2000/08/02 00:57:03 steve Exp $"
#endif
# include "vvm.h"
@ -123,7 +123,7 @@ class vvm_nexus {
// generates the current value for the nexus. It also passes
// that value on to the receuvers.
void run_values();
vpip_bit_t resolution_function(const vpip_bit_t*, unsigned) const;
vpip_bit_t (*resolution_function)(const vpip_bit_t*, unsigned);
private:
vpip_bit_t value_;
@ -150,6 +150,10 @@ class vvm_nexus {
};
extern vpip_bit_t vvm_resolution_wire(const vpip_bit_t*bits, unsigned nbits);
extern vpip_bit_t vvm_resolution_tri0(const vpip_bit_t*bits, unsigned nbits);
extern vpip_bit_t vvm_resolution_tri1(const vpip_bit_t*bits, unsigned nbits);
/*
* This function arranges for a non-blocking reg_assign to a nexus. It
* creates all the events needed to make it happen after the specified
@ -160,6 +164,9 @@ extern void vvm_delayed_assign(vvm_nexus&l_val, vpip_bit_t r_val,
/*
* $Log: vvm_nexus.h,v $
* Revision 1.5 2000/08/02 00:57:03 steve
* tri01 support in vvm.
*
* Revision 1.4 2000/05/11 23:37:28 steve
* Add support for procedural continuous assignment.
*