Update vvm_ram_dq to nexus style.
This commit is contained in:
parent
edc40f1792
commit
c790ccca5a
67
t-vvm.cc
67
t-vvm.cc
|
|
@ -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.122 2000/03/24 02:43:36 steve Exp $"
|
||||
#ident "$Id: t-vvm.cc,v 1.123 2000/03/24 03:47:01 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include <iostream>
|
||||
|
|
@ -1289,17 +1289,67 @@ void target_vvm::lpm_mux(ostream&os, const NetMux*mux)
|
|||
void target_vvm::lpm_ram_dq(ostream&os, const NetRamDq*ram)
|
||||
{
|
||||
string mname = mangle(ram->name());
|
||||
|
||||
os << "static vvm_ram_dq<" << ram->width() << "," <<
|
||||
ram->awidth() << "," << ram->size() << "> " << mname <<
|
||||
"(&" << mangle(ram->mem()->name()) << ");" << endl;
|
||||
|
||||
for (unsigned idx = 0 ; idx < ram->width() ; idx += 1) {
|
||||
unsigned pin = ram->pin_Q(idx).get_pin();
|
||||
string outfun = defn_gate_outputfun_(os, ram, pin);
|
||||
init_code << " " << mangle(ram->name()) <<
|
||||
".config_rout(" << idx << ", &" << outfun << ");" << endl;
|
||||
emit_gate_outputfun_(ram, pin);
|
||||
if (ram->pin_WE().is_linked()) {
|
||||
string nexus = nexus_from_link(&ram->pin_WE());
|
||||
unsigned ncode = nexus_wire_map[nexus];
|
||||
|
||||
init_code << " nexus_wire_table["<<ncode<<"].connect(&"
|
||||
<< mname << ", " << mname
|
||||
<< ".key_WE());" << endl;
|
||||
}
|
||||
|
||||
if (ram->pin_InClock().is_linked()) {
|
||||
string nexus = nexus_from_link(&ram->pin_InClock());
|
||||
unsigned ncode = nexus_wire_map[nexus];
|
||||
|
||||
init_code << " nexus_wire_table["<<ncode<<"].connect(&"
|
||||
<< mname << ", " << mname
|
||||
<< ".key_InClock());" << endl;
|
||||
}
|
||||
|
||||
/* Connect the address inputs... */
|
||||
for (unsigned idx = 0 ; idx < ram->awidth() ; idx += 1) {
|
||||
if (! ram->pin_Address(idx).is_linked())
|
||||
continue;
|
||||
|
||||
string nexus = nexus_from_link(&ram->pin_Address(idx));
|
||||
unsigned ncode = nexus_wire_map[nexus];
|
||||
|
||||
init_code << " nexus_wire_table["<<ncode<<"].connect(&"
|
||||
<< mname << ", " << mname
|
||||
<< ".key_Address(" << idx << "));" << endl;
|
||||
}
|
||||
|
||||
/* Connect the data inputs... */
|
||||
for (unsigned idx = 0 ; idx < ram->width() ; idx += 1) {
|
||||
if (! ram->pin_Data(idx).is_linked())
|
||||
continue;
|
||||
|
||||
string nexus = nexus_from_link(&ram->pin_Data(idx));
|
||||
unsigned ncode = nexus_wire_map[nexus];
|
||||
|
||||
init_code << " nexus_wire_table["<<ncode<<"].connect(&"
|
||||
<< mname << ", " << mname
|
||||
<< ".key_Data(" << idx << "));" << endl;
|
||||
}
|
||||
|
||||
/* Connect the data outputs... */
|
||||
for (unsigned idx = 0 ; idx < ram->width() ; idx += 1) {
|
||||
if (! ram->pin_Q(idx).is_linked())
|
||||
continue;
|
||||
|
||||
string nexus = nexus_from_link(&ram->pin_Q(idx));
|
||||
unsigned ncode = nexus_wire_map[nexus];
|
||||
|
||||
init_code << " nexus_wire_table["<<ncode<<"].connect("
|
||||
<< mname << ".config_rout(" << idx << "));" << endl;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void target_vvm::logic(ostream&os, const NetLogic*gate)
|
||||
|
|
@ -2317,6 +2367,9 @@ extern const struct target tgt_vvm = {
|
|||
};
|
||||
/*
|
||||
* $Log: t-vvm.cc,v $
|
||||
* Revision 1.123 2000/03/24 03:47:01 steve
|
||||
* Update vvm_ram_dq to nexus style.
|
||||
*
|
||||
* Revision 1.122 2000/03/24 02:43:36 steve
|
||||
* vvm_unop and vvm_binop pass result by reference
|
||||
* instead of returning a value.
|
||||
|
|
|
|||
|
|
@ -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.49 2000/03/22 04:26:41 steve Exp $"
|
||||
#ident "$Id: vvm_gates.h,v 1.50 2000/03/24 03:47:01 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "vvm.h"
|
||||
|
|
@ -422,66 +422,60 @@ class vvm_nor2 : public vvm_1bit_out, public vvm_nexus::recvr_t {
|
|||
* XXXX Only *synchronous* writes with WE are supported.
|
||||
*/
|
||||
template <unsigned WIDTH, unsigned AWIDTH, unsigned SIZE>
|
||||
class vvm_ram_dq : protected vvm_ram_callback {
|
||||
class vvm_ram_dq : protected vvm_ram_callback, public vvm_nexus::recvr_t {
|
||||
|
||||
public:
|
||||
vvm_ram_dq(vvm_memory_t<WIDTH,SIZE>*mem)
|
||||
: mem_(mem)
|
||||
{ mem->set_callback(this);
|
||||
for (unsigned idx = 0 ; idx < WIDTH ; idx += 1)
|
||||
out_[idx] = 0;
|
||||
for (unsigned idx = 0 ; idx < AWIDTH ; idx += 1)
|
||||
addr_[idx] = Vx;
|
||||
for (unsigned idx = 0 ; idx < AWIDTH+WIDTH+2 ; idx += 1)
|
||||
ibits_[idx] = StX;
|
||||
}
|
||||
|
||||
void init_Address(unsigned idx, vpip_bit_t val)
|
||||
{ addr_[idx] = val; }
|
||||
{ ibits_[idx] = val; }
|
||||
|
||||
void init_Data(unsigned idx, vpip_bit_t val)
|
||||
{ data_[idx] = val; }
|
||||
{ ibits_[AWIDTH+idx] = val; }
|
||||
|
||||
void init_WE(unsigned, vpip_bit_t val)
|
||||
{ we_ = val; }
|
||||
{ ibits_[AWIDTH+WIDTH] = val; }
|
||||
|
||||
void init_InClock(unsigned, vpip_bit_t val)
|
||||
{ iclk_ = val; }
|
||||
{ ibits_[AWIDTH+WIDTH+1] = val; }
|
||||
|
||||
void set_Address(unsigned idx, vpip_bit_t val)
|
||||
{ if (addr_[idx] == val) return;
|
||||
addr_[idx] = val;
|
||||
compute_();
|
||||
send_out_();
|
||||
}
|
||||
unsigned key_Address(unsigned idx) const { return idx; }
|
||||
unsigned key_Data(unsigned idx) const { return AWIDTH+idx; }
|
||||
unsigned key_WE() const { return AWIDTH+WIDTH + 0; }
|
||||
unsigned key_InClock() const { return AWIDTH+WIDTH + 1; }
|
||||
|
||||
void set_Data(unsigned idx, vpip_bit_t val)
|
||||
{ data_[idx] = val; }
|
||||
vvm_nexus::drive_t* config_rout(unsigned idx) { return out_+idx; }
|
||||
|
||||
void set_WE(unsigned, vpip_bit_t val)
|
||||
{ we_ = val; }
|
||||
void take_value(unsigned key, vpip_bit_t val)
|
||||
{ if (ibits_[key] == val) return;
|
||||
if (key == key_InClock()) {
|
||||
vpip_bit_t tmp = ibits_[key];
|
||||
ibits_[key] = val;
|
||||
if (B_IS1(ibits_[key_WE()])) return;
|
||||
if (posedge(tmp, val)) mem_->set_word(addr_val_, ibits_+AWIDTH);
|
||||
return;
|
||||
} else {
|
||||
ibits_[key] = val;
|
||||
if (key < AWIDTH) {
|
||||
compute_();
|
||||
send_out_();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void set_InClock(unsigned, vpip_bit_t val)
|
||||
{ if (val == iclk_) return;
|
||||
vpip_bit_t tmp = iclk_;
|
||||
iclk_ = val;
|
||||
if (we_ != V1) return;
|
||||
if (posedge(tmp, val)) mem_->set_word(addr_val_, data_);
|
||||
}
|
||||
|
||||
void handle_write(unsigned idx)
|
||||
{ if (idx == addr_val_) send_out_(); }
|
||||
|
||||
void config_rout(unsigned idx, vvm_out_event::action_t o)
|
||||
{ out_[idx] = o; }
|
||||
void handle_write(unsigned idx) { if (idx == addr_val_) send_out_(); }
|
||||
|
||||
private:
|
||||
vvm_memory_t<WIDTH,SIZE>*mem_;
|
||||
|
||||
vpip_bit_t addr_[AWIDTH];
|
||||
vpip_bit_t data_[WIDTH];
|
||||
vpip_bit_t we_;
|
||||
vpip_bit_t iclk_;
|
||||
|
||||
vvm_out_event::action_t out_[WIDTH];
|
||||
vpip_bit_t ibits_[AWIDTH+WIDTH+2];
|
||||
vvm_nexus::drive_t out_[WIDTH];
|
||||
|
||||
unsigned long addr_val_;
|
||||
|
||||
|
|
@ -490,17 +484,15 @@ class vvm_ram_dq : protected vvm_ram_callback {
|
|||
unsigned mask;
|
||||
addr_val_ = 0;
|
||||
for (bit = 0, mask = 1 ; bit < AWIDTH ; bit += 1, mask <<= 1)
|
||||
if (addr_[bit] == V1) addr_val_ |= mask;
|
||||
if (B_IS1(ibits_[bit])) addr_val_ |= mask;
|
||||
}
|
||||
|
||||
void send_out_()
|
||||
{ vvm_bitset_t<WIDTH>ov = mem_->get_word(addr_val_);
|
||||
for (unsigned bit = 0 ; bit < WIDTH ; bit += 1)
|
||||
if (out_[bit]) {
|
||||
vvm_event*ev = new vvm_out_event(ov[bit],
|
||||
out_[bit]);
|
||||
ev->schedule();
|
||||
}
|
||||
for (unsigned bit = 0 ; bit < WIDTH ; bit += 1) {
|
||||
vvm_out_event*ev = new vvm_out_event(ov[bit], out_+bit);
|
||||
ev->schedule();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -802,6 +794,9 @@ template <unsigned WIDTH> class vvm_pevent : public vvm_nexus::recvr_t {
|
|||
|
||||
/*
|
||||
* $Log: vvm_gates.h,v $
|
||||
* Revision 1.50 2000/03/24 03:47:01 steve
|
||||
* Update vvm_ram_dq to nexus style.
|
||||
*
|
||||
* Revision 1.49 2000/03/22 04:26:41 steve
|
||||
* Replace the vpip_bit_t with a typedef and
|
||||
* define values for all the different bit
|
||||
|
|
|
|||
Loading…
Reference in New Issue