Rearrange NetAssign to make NetAssign_ separate.
This commit is contained in:
parent
ff32325d07
commit
ac81f6a201
|
|
@ -18,7 +18,7 @@
|
||||||
# 59 Temple Place - Suite 330
|
# 59 Temple Place - Suite 330
|
||||||
# Boston, MA 02111-1307, USA
|
# Boston, MA 02111-1307, USA
|
||||||
#
|
#
|
||||||
#ident "$Id: Makefile.in,v 1.63 2000/08/20 04:13:56 steve Exp $"
|
#ident "$Id: Makefile.in,v 1.64 2000/09/02 20:54:20 steve Exp $"
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
SHELL = /bin/sh
|
SHELL = /bin/sh
|
||||||
|
|
@ -75,7 +75,7 @@ FF = nodangle.o synth.o syn-rules.o xnfio.o
|
||||||
O = main.o cprop.o design_dump.o dup_expr.o elaborate.o elab_expr.o \
|
O = main.o cprop.o design_dump.o dup_expr.o elaborate.o elab_expr.o \
|
||||||
elab_net.o elab_pexpr.o elab_scope.o elab_sig.o emit.o eval.o eval_tree.o \
|
elab_net.o elab_pexpr.o elab_scope.o elab_sig.o emit.o eval.o eval_tree.o \
|
||||||
expr_synth.o functor.o lexor.o lexor_keyword.o link_const.o \
|
expr_synth.o functor.o lexor.o lexor_keyword.o link_const.o \
|
||||||
mangle.o netlist.o \
|
mangle.o netlist.o net_assign.o \
|
||||||
net_design.o net_event.o net_force.o net_link.o net_proc.o net_scope.o \
|
net_design.o net_event.o net_force.o net_link.o net_proc.o net_scope.o \
|
||||||
net_udp.o \
|
net_udp.o \
|
||||||
pad_to_width.o \
|
pad_to_width.o \
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT) && !defined(macintosh)
|
#if !defined(WINNT) && !defined(macintosh)
|
||||||
#ident "$Id: design_dump.cc,v 1.94 2000/07/30 18:25:43 steve Exp $"
|
#ident "$Id: design_dump.cc,v 1.95 2000/09/02 20:54:20 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -217,23 +217,12 @@ void NetMux::dump_node(ostream&o, unsigned ind) const
|
||||||
dump_obj_attr(o, ind+4);
|
dump_obj_attr(o, ind+4);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetAssign::dump_node(ostream&o, unsigned ind) const
|
void NetAssign_::dump_node(ostream&o, unsigned ind) const
|
||||||
{
|
{
|
||||||
o << setw(ind) << "" << "Procedural assign (NetAssign): " << name();
|
o << setw(ind) << "" << "Procedural assign (NetAssign_): " << name();
|
||||||
if (bmux())
|
if (bmux())
|
||||||
o << "[" << *bmux() << "]";
|
o << "[" << *bmux() << "]";
|
||||||
o << " = " << *rval() << endl;
|
o << endl;
|
||||||
dump_node_pins(o, ind+4);
|
|
||||||
}
|
|
||||||
|
|
||||||
void NetAssignNB::dump_node(ostream&o, unsigned ind) const
|
|
||||||
{
|
|
||||||
if (bmux())
|
|
||||||
o << setw(ind) << "" << "Procedural NB assign (NetAssignNB): "
|
|
||||||
<< name() << "[" << *bmux() << "] <= " << *rval() << endl;
|
|
||||||
else
|
|
||||||
o << setw(ind) << "" << "Procedural NB assign (NetAssignNB): "
|
|
||||||
<< name() << " <= " << *rval() << endl;
|
|
||||||
dump_node_pins(o, ind+4);
|
dump_node_pins(o, ind+4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -438,16 +427,16 @@ void NetAssign::dump(ostream&o, unsigned ind) const
|
||||||
{
|
{
|
||||||
o << setw(ind) << "";
|
o << setw(ind) << "";
|
||||||
|
|
||||||
if (bmux()) {
|
if (l_val(0)->bmux()) {
|
||||||
o << name() << "[" << *bmux() << "] = ";
|
o << l_val(0)->name() << "[" << *l_val(0)->bmux() << "] = ";
|
||||||
if (rise_time())
|
if (l_val(0)->rise_time())
|
||||||
o << "#" << rise_time() << " ";
|
o << "#" << l_val(0)->rise_time() << " ";
|
||||||
o << *rval() << ";" << endl;
|
o << *rval() << ";" << endl;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
o << name() << " = ";
|
o << l_val(0)->name() << " = ";
|
||||||
if (rise_time())
|
if (l_val(0)->rise_time())
|
||||||
o << "#" << rise_time() << " ";
|
o << "#" << l_val(0)->rise_time() << " ";
|
||||||
o << *rval() << ";" << endl;
|
o << *rval() << ";" << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -456,16 +445,16 @@ void NetAssignNB::dump(ostream&o, unsigned ind) const
|
||||||
{
|
{
|
||||||
o << setw(ind) << "";
|
o << setw(ind) << "";
|
||||||
|
|
||||||
if (bmux()) {
|
if (l_val(0)->bmux()) {
|
||||||
o << name() << "[" << *bmux() << "] <= ";
|
o << l_val(0)->name() << "[" << *l_val(0)->bmux() << "] <= ";
|
||||||
if (rise_time())
|
if (l_val(0)->rise_time())
|
||||||
o << "#" << rise_time() << " ";
|
o << "#" << l_val(0)->rise_time() << " ";
|
||||||
o << *rval() << ";" << endl;
|
o << *rval() << ";" << endl;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
o << name() << " <= ";
|
o << l_val(0)->name() << " <= ";
|
||||||
if (rise_time())
|
if (l_val(0)->rise_time())
|
||||||
o << "#" << rise_time() << " ";
|
o << "#" << l_val(0)->rise_time() << " ";
|
||||||
o << *rval() << ";" << endl;
|
o << *rval() << ";" << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -978,6 +967,9 @@ void Design::dump(ostream&o) const
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: design_dump.cc,v $
|
* $Log: design_dump.cc,v $
|
||||||
|
* Revision 1.95 2000/09/02 20:54:20 steve
|
||||||
|
* Rearrange NetAssign to make NetAssign_ separate.
|
||||||
|
*
|
||||||
* Revision 1.94 2000/07/30 18:25:43 steve
|
* Revision 1.94 2000/07/30 18:25:43 steve
|
||||||
* Rearrange task and function elaboration so that the
|
* Rearrange task and function elaboration so that the
|
||||||
* NetTaskDef and NetFuncDef functions are created during
|
* NetTaskDef and NetFuncDef functions are created during
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT) && !defined(macintosh)
|
#if !defined(WINNT) && !defined(macintosh)
|
||||||
#ident "$Id: elab_net.cc,v 1.44 2000/08/18 04:38:57 steve Exp $"
|
#ident "$Id: elab_net.cc,v 1.45 2000/09/02 20:54:20 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "PExpr.h"
|
# include "PExpr.h"
|
||||||
|
|
@ -1178,7 +1178,7 @@ NetNet* PEIdent::elaborate_lnet(Design*des, const string&path) const
|
||||||
verinum*mval = msb_->eval_const(des, path);
|
verinum*mval = msb_->eval_const(des, path);
|
||||||
if (mval == 0) {
|
if (mval == 0) {
|
||||||
cerr << get_line() << ": index of " << text_ <<
|
cerr << get_line() << ": index of " << text_ <<
|
||||||
" needs to be constant in this context." <<
|
" needs to be constant in l-value of assignment." <<
|
||||||
endl;
|
endl;
|
||||||
des->errors += 1;
|
des->errors += 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -1286,7 +1286,7 @@ NetNet* PEIdent::elaborate_port(Design*des, NetScope*scope) const
|
||||||
verinum*mval = msb_->eval_const(des, path);
|
verinum*mval = msb_->eval_const(des, path);
|
||||||
if (mval == 0) {
|
if (mval == 0) {
|
||||||
cerr << get_line() << ": index of " << text_ <<
|
cerr << get_line() << ": index of " << text_ <<
|
||||||
" needs to be constant in this context." <<
|
" needs to be constant in port context." <<
|
||||||
endl;
|
endl;
|
||||||
des->errors += 1;
|
des->errors += 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -1662,6 +1662,9 @@ NetNet* PEUnary::elaborate_net(Design*des, const string&path,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: elab_net.cc,v $
|
* $Log: elab_net.cc,v $
|
||||||
|
* Revision 1.45 2000/09/02 20:54:20 steve
|
||||||
|
* Rearrange NetAssign to make NetAssign_ separate.
|
||||||
|
*
|
||||||
* Revision 1.44 2000/08/18 04:38:57 steve
|
* Revision 1.44 2000/08/18 04:38:57 steve
|
||||||
* Proper error messages when port direction is missing.
|
* Proper error messages when port direction is missing.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
45
elaborate.cc
45
elaborate.cc
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT) && !defined(macintosh)
|
#if !defined(WINNT) && !defined(macintosh)
|
||||||
#ident "$Id: elaborate.cc,v 1.183 2000/08/18 04:38:57 steve Exp $"
|
#ident "$Id: elaborate.cc,v 1.184 2000/09/02 20:54:20 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -745,7 +745,7 @@ NetNet* PAssign_::elaborate_lval(Design*des, const string&path,
|
||||||
/* Get the l-value, and assume that it is an identifier. */
|
/* Get the l-value, and assume that it is an identifier. */
|
||||||
const PEIdent*id = dynamic_cast<const PEIdent*>(lval());
|
const PEIdent*id = dynamic_cast<const PEIdent*>(lval());
|
||||||
|
|
||||||
/* If the l-value is not a register, then make a structural
|
/* If the l-value is not a reg, then make a structural
|
||||||
elaboration. Make a synthetic register that connects to the
|
elaboration. Make a synthetic register that connects to the
|
||||||
generated circuit and return that as the l-value. */
|
generated circuit and return that as the l-value. */
|
||||||
if (id == 0) {
|
if (id == 0) {
|
||||||
|
|
@ -778,7 +778,7 @@ NetNet* PAssign_::elaborate_lval(Design*des, const string&path,
|
||||||
|
|
||||||
if ((reg->type() != NetNet::REG) && (reg->type() != NetNet::INTEGER)) {
|
if ((reg->type() != NetNet::REG) && (reg->type() != NetNet::INTEGER)) {
|
||||||
cerr << get_line() << ": error: " << *lval() <<
|
cerr << get_line() << ": error: " << *lval() <<
|
||||||
" is not a register." << endl;
|
" is not a reg." << endl;
|
||||||
des->errors += 1;
|
des->errors += 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -946,20 +946,18 @@ NetProc* PAssign::elaborate(Design*des, const string&path) const
|
||||||
n = des->local_symbol(path);
|
n = des->local_symbol(path);
|
||||||
NetAssign*a1 = new NetAssign(n, des, wid, rv);
|
NetAssign*a1 = new NetAssign(n, des, wid, rv);
|
||||||
a1->set_line(*this);
|
a1->set_line(*this);
|
||||||
des->add_node(a1);
|
|
||||||
|
|
||||||
for (unsigned idx = 0 ; idx < wid ; idx += 1)
|
for (unsigned idx = 0 ; idx < wid ; idx += 1)
|
||||||
connect(a1->pin(idx), tmp->pin(idx));
|
connect(a1->l_val(0)->pin(idx), tmp->pin(idx));
|
||||||
|
|
||||||
/* Generate an assignment of the temporary to the r-value... */
|
/* Generate an assignment of the temporary to the r-value... */
|
||||||
n = des->local_symbol(path);
|
n = des->local_symbol(path);
|
||||||
NetESignal*sig = new NetESignal(tmp);
|
NetESignal*sig = new NetESignal(tmp);
|
||||||
NetAssign*a2 = new NetAssign(n, des, wid, sig);
|
NetAssign*a2 = new NetAssign(n, des, wid, sig);
|
||||||
a2->set_line(*this);
|
a2->set_line(*this);
|
||||||
des->add_node(a2);
|
|
||||||
|
|
||||||
for (unsigned idx = 0 ; idx < wid ; idx += 1)
|
for (unsigned idx = 0 ; idx < wid ; idx += 1)
|
||||||
connect(a2->pin(idx), reg->pin(idx));
|
connect(a2->l_val(0)->pin(idx), reg->pin(idx));
|
||||||
|
|
||||||
/* Generate the delay statement with the final
|
/* Generate the delay statement with the final
|
||||||
assignment attached to it. If this is an event delay,
|
assignment attached to it. If this is an event delay,
|
||||||
|
|
@ -1006,7 +1004,7 @@ NetProc* PAssign::elaborate(Design*des, const string&path) const
|
||||||
unsigned off = reg->sb_to_idx(lsb);
|
unsigned off = reg->sb_to_idx(lsb);
|
||||||
assert((off+wid) <= reg->pin_count());
|
assert((off+wid) <= reg->pin_count());
|
||||||
for (unsigned idx = 0 ; idx < wid ; idx += 1)
|
for (unsigned idx = 0 ; idx < wid ; idx += 1)
|
||||||
connect(cur->pin(idx), reg->pin(idx+off));
|
connect(cur->l_val(0)->pin(idx), reg->pin(idx+off));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
|
@ -1014,12 +1012,11 @@ NetProc* PAssign::elaborate(Design*des, const string&path) const
|
||||||
cur = new NetAssign(des->local_symbol(path), des,
|
cur = new NetAssign(des->local_symbol(path), des,
|
||||||
reg->pin_count(), mux, rv);
|
reg->pin_count(), mux, rv);
|
||||||
for (unsigned idx = 0 ; idx < reg->pin_count() ; idx += 1)
|
for (unsigned idx = 0 ; idx < reg->pin_count() ; idx += 1)
|
||||||
connect(cur->pin(idx), reg->pin(idx));
|
connect(cur->l_val(0)->pin(idx), reg->pin(idx));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
cur->set_line(*this);
|
cur->set_line(*this);
|
||||||
des->add_node(cur);
|
|
||||||
|
|
||||||
return cur;
|
return cur;
|
||||||
}
|
}
|
||||||
|
|
@ -1105,7 +1102,7 @@ NetProc* PAssignNB::elaborate(Design*des, const string&path) const
|
||||||
|
|
||||||
cur = new NetAssignNB(des->local_symbol(path), des, wid, rv);
|
cur = new NetAssignNB(des->local_symbol(path), des, wid, rv);
|
||||||
for (unsigned idx = 0 ; idx < wid ; idx += 1)
|
for (unsigned idx = 0 ; idx < wid ; idx += 1)
|
||||||
connect(cur->pin(idx), reg->pin(reg->sb_to_idx(idx+lsb)));
|
connect(cur->l_val(0)->pin(idx), reg->pin(reg->sb_to_idx(idx+lsb)));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
|
@ -1117,20 +1114,19 @@ NetProc* PAssignNB::elaborate(Design*des, const string&path) const
|
||||||
cur = new NetAssignNB(des->local_symbol(path), des,
|
cur = new NetAssignNB(des->local_symbol(path), des,
|
||||||
reg->pin_count(), mux, rv);
|
reg->pin_count(), mux, rv);
|
||||||
for (unsigned idx = 0 ; idx < reg->pin_count() ; idx += 1)
|
for (unsigned idx = 0 ; idx < reg->pin_count() ; idx += 1)
|
||||||
connect(cur->pin(idx), reg->pin(idx));
|
connect(cur->l_val(0)->pin(idx), reg->pin(idx));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned long rise_time, fall_time, decay_time;
|
unsigned long rise_time, fall_time, decay_time;
|
||||||
delay_.eval_delays(des, path, rise_time, fall_time, decay_time);
|
delay_.eval_delays(des, path, rise_time, fall_time, decay_time);
|
||||||
cur->rise_time(rise_time);
|
cur->l_val(0)->rise_time(rise_time);
|
||||||
cur->fall_time(fall_time);
|
cur->l_val(0)->fall_time(fall_time);
|
||||||
cur->decay_time(decay_time);
|
cur->l_val(0)->decay_time(decay_time);
|
||||||
|
|
||||||
|
|
||||||
/* All done with this node. mark its line number and check it in. */
|
/* All done with this node. mark its line number and check it in. */
|
||||||
cur->set_line(*this);
|
cur->set_line(*this);
|
||||||
des->add_node(cur);
|
|
||||||
return cur;
|
return cur;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1445,8 +1441,7 @@ NetProc* PCallTask::elaborate_usr(Design*des, const string&path) const
|
||||||
NetExpr*rv = parms_[idx]->elaborate_expr(des, scope);
|
NetExpr*rv = parms_[idx]->elaborate_expr(des, scope);
|
||||||
NetAssign*pr = new NetAssign("@", des, port->pin_count(), rv);
|
NetAssign*pr = new NetAssign("@", des, port->pin_count(), rv);
|
||||||
for (unsigned pi = 0 ; pi < port->pin_count() ; pi += 1)
|
for (unsigned pi = 0 ; pi < port->pin_count() ; pi += 1)
|
||||||
connect(port->pin(pi), pr->pin(pi));
|
connect(port->pin(pi), pr->l_val(0)->pin(pi));
|
||||||
des->add_node(pr);
|
|
||||||
block->append(pr);
|
block->append(pr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1535,9 +1530,8 @@ NetProc* PCallTask::elaborate_usr(Design*des, const string&path) const
|
||||||
/* Generate the assignment statement. */
|
/* Generate the assignment statement. */
|
||||||
NetAssign*ass = new NetAssign("@", des, val->pin_count(), pexp);
|
NetAssign*ass = new NetAssign("@", des, val->pin_count(), pexp);
|
||||||
for (unsigned pi = 0 ; pi < val->pin_count() ; pi += 1)
|
for (unsigned pi = 0 ; pi < val->pin_count() ; pi += 1)
|
||||||
connect(val->pin(pi), ass->pin(pi));
|
connect(val->pin(pi), ass->l_val(0)->pin(pi));
|
||||||
|
|
||||||
des->add_node(ass);
|
|
||||||
block->append(ass);
|
block->append(ass);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2009,8 +2003,8 @@ NetProc* PForStatement::elaborate(Design*des, const string&path) const
|
||||||
assert(sig);
|
assert(sig);
|
||||||
NetAssign*init = new NetAssign("@for-assign", des, sig->pin_count(),
|
NetAssign*init = new NetAssign("@for-assign", des, sig->pin_count(),
|
||||||
expr1_->elaborate_expr(des, scope));
|
expr1_->elaborate_expr(des, scope));
|
||||||
for (unsigned idx = 0 ; idx < init->pin_count() ; idx += 1)
|
for (unsigned idx = 0 ; idx < init->l_val(0)->pin_count() ; idx += 1)
|
||||||
connect(init->pin(idx), sig->pin(idx));
|
connect(init->l_val(0)->pin(idx), sig->pin(idx));
|
||||||
|
|
||||||
top->append(init);
|
top->append(init);
|
||||||
|
|
||||||
|
|
@ -2032,8 +2026,8 @@ NetProc* PForStatement::elaborate(Design*des, const string&path) const
|
||||||
assert(sig);
|
assert(sig);
|
||||||
NetAssign*step = new NetAssign("@for-assign", des, sig->pin_count(),
|
NetAssign*step = new NetAssign("@for-assign", des, sig->pin_count(),
|
||||||
expr2_->elaborate_expr(des, scope));
|
expr2_->elaborate_expr(des, scope));
|
||||||
for (unsigned idx = 0 ; idx < step->pin_count() ; idx += 1)
|
for (unsigned idx = 0 ; idx < step->l_val(0)->pin_count() ; idx += 1)
|
||||||
connect(step->pin(idx), sig->pin(idx));
|
connect(step->l_val(0)->pin(idx), sig->pin(idx));
|
||||||
|
|
||||||
body->append(step);
|
body->append(step);
|
||||||
|
|
||||||
|
|
@ -2384,6 +2378,9 @@ Design* elaborate(const map<string,Module*>&modules,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: elaborate.cc,v $
|
* $Log: elaborate.cc,v $
|
||||||
|
* Revision 1.184 2000/09/02 20:54:20 steve
|
||||||
|
* Rearrange NetAssign to make NetAssign_ separate.
|
||||||
|
*
|
||||||
* Revision 1.183 2000/08/18 04:38:57 steve
|
* Revision 1.183 2000/08/18 04:38:57 steve
|
||||||
* Proper error messages when port direction is missing.
|
* Proper error messages when port direction is missing.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
13
emit.cc
13
emit.cc
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT) && !defined(macintosh)
|
#if !defined(WINNT) && !defined(macintosh)
|
||||||
#ident "$Id: emit.cc,v 1.51 2000/08/14 04:39:56 steve Exp $"
|
#ident "$Id: emit.cc,v 1.52 2000/09/02 20:54:20 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -59,18 +59,12 @@ bool NetAddSub::emit_node(struct target_t*tgt) const
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NetAssign::emit_node(struct target_t*tgt) const
|
bool NetAssign_::emit_node(struct target_t*tgt) const
|
||||||
{
|
{
|
||||||
tgt->net_assign(this);
|
tgt->net_assign(this);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NetAssignNB::emit_node(struct target_t*tgt) const
|
|
||||||
{
|
|
||||||
tgt->net_assign_nb(this);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool NetCaseCmp::emit_node(struct target_t*tgt) const
|
bool NetCaseCmp::emit_node(struct target_t*tgt) const
|
||||||
{
|
{
|
||||||
tgt->net_case_cmp(this);
|
tgt->net_case_cmp(this);
|
||||||
|
|
@ -481,6 +475,9 @@ bool emit(const Design*des, const char*type)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: emit.cc,v $
|
* $Log: emit.cc,v $
|
||||||
|
* Revision 1.52 2000/09/02 20:54:20 steve
|
||||||
|
* Rearrange NetAssign to make NetAssign_ separate.
|
||||||
|
*
|
||||||
* Revision 1.51 2000/08/14 04:39:56 steve
|
* Revision 1.51 2000/08/14 04:39:56 steve
|
||||||
* add th t-dll functions for net_const, net_bufz and processes.
|
* add th t-dll functions for net_const, net_bufz and processes.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,155 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2000 Stephen Williams (steve@icarus.com)
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
|
*/
|
||||||
|
#if !defined(WINNT) && !defined(macintosh)
|
||||||
|
#ident "$Id: net_assign.cc,v 1.1 2000/09/02 20:54:20 steve Exp $"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
# include "netlist.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NetAssign
|
||||||
|
*/
|
||||||
|
|
||||||
|
NetAssign_::NetAssign_(const string&n, unsigned w)
|
||||||
|
: NetNode(n, w), bmux_(0)
|
||||||
|
{
|
||||||
|
for (unsigned idx = 0 ; idx < pin_count() ; idx += 1) {
|
||||||
|
pin(idx).set_dir(Link::OUTPUT);
|
||||||
|
pin(idx).set_name("P", idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
NetAssign_::~NetAssign_()
|
||||||
|
{
|
||||||
|
if (bmux_) delete bmux_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NetAssign_::set_bmux(NetExpr*r)
|
||||||
|
{
|
||||||
|
assert(bmux_ == 0);
|
||||||
|
bmux_ = r;
|
||||||
|
}
|
||||||
|
|
||||||
|
const NetExpr* NetAssign_::bmux() const
|
||||||
|
{
|
||||||
|
return bmux_;
|
||||||
|
}
|
||||||
|
|
||||||
|
NetAssignBase::NetAssignBase(NetAssign_*lv, NetExpr*rv)
|
||||||
|
: lval_(lv), rval_(rv)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NetAssignBase::~NetAssignBase()
|
||||||
|
{
|
||||||
|
if (rval_) delete rval_;
|
||||||
|
if (lval_) delete lval_;
|
||||||
|
}
|
||||||
|
|
||||||
|
NetExpr* NetAssignBase::rval()
|
||||||
|
{
|
||||||
|
return rval_;
|
||||||
|
}
|
||||||
|
|
||||||
|
const NetExpr* NetAssignBase::rval() const
|
||||||
|
{
|
||||||
|
return rval_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NetAssignBase::set_rval(NetExpr*r)
|
||||||
|
{
|
||||||
|
if (rval_) delete rval_;
|
||||||
|
rval_ = r;
|
||||||
|
}
|
||||||
|
|
||||||
|
NetAssign_* NetAssignBase::l_val(unsigned idx)
|
||||||
|
{
|
||||||
|
assert(idx == 0);
|
||||||
|
return lval_;
|
||||||
|
}
|
||||||
|
|
||||||
|
const NetAssign_* NetAssignBase::l_val(unsigned idx) const
|
||||||
|
{
|
||||||
|
assert(idx == 0);
|
||||||
|
return lval_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NetAssign::NetAssign(const string&n, Design*des, unsigned w, NetExpr*rv)
|
||||||
|
: NetAssignBase(new NetAssign_(n, w), rv)
|
||||||
|
{
|
||||||
|
des->add_node(l_val(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
NetAssign::NetAssign(const string&n, Design*des, unsigned w,
|
||||||
|
NetExpr*mu, NetExpr*rv)
|
||||||
|
: NetAssignBase(new NetAssign_(n, w), rv)
|
||||||
|
{
|
||||||
|
des->add_node(l_val(0));
|
||||||
|
bool flag = rv->set_width(1);
|
||||||
|
if (flag == false) {
|
||||||
|
cerr << rv->get_line() << ": Expression bit width" <<
|
||||||
|
" conflicts with l-value bit width." << endl;
|
||||||
|
des->errors += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
l_val(0)->set_bmux(mu);
|
||||||
|
}
|
||||||
|
|
||||||
|
NetAssign::~NetAssign()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NetAssignNB::NetAssignNB(const string&n, Design*des, unsigned w, NetExpr*rv)
|
||||||
|
: NetAssignBase(new NetAssign_(n, w), rv)
|
||||||
|
{
|
||||||
|
if (rval()->expr_width() < w) {
|
||||||
|
cerr << rval()->get_line() << ": Expression bit width (" <<
|
||||||
|
rval()->expr_width() << ") conflicts with l-value "
|
||||||
|
"bit width (" << w << ")." << endl;
|
||||||
|
des->errors += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NetAssignNB::NetAssignNB(const string&n, Design*des, unsigned w,
|
||||||
|
NetExpr*mu, NetExpr*rv)
|
||||||
|
: NetAssignBase(new NetAssign_(n, w), rv)
|
||||||
|
{
|
||||||
|
bool flag = rval()->set_width(1);
|
||||||
|
if (flag == false) {
|
||||||
|
cerr << rval()->get_line() << ": Expression bit width" <<
|
||||||
|
" conflicts with l-value bit width." << endl;
|
||||||
|
des->errors += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
l_val(0)->set_bmux(mu);
|
||||||
|
}
|
||||||
|
|
||||||
|
NetAssignNB::~NetAssignNB()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* $Log: net_assign.cc,v $
|
||||||
|
* Revision 1.1 2000/09/02 20:54:20 steve
|
||||||
|
* Rearrange NetAssign to make NetAssign_ separate.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
110
netlist.cc
110
netlist.cc
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT) && !defined(macintosh)
|
#if !defined(WINNT) && !defined(macintosh)
|
||||||
#ident "$Id: netlist.cc,v 1.134 2000/08/27 15:51:50 steve Exp $"
|
#ident "$Id: netlist.cc,v 1.135 2000/09/02 20:54:20 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include <cassert>
|
# include <cassert>
|
||||||
|
|
@ -1370,111 +1370,6 @@ const Link& NetRamDq::pin_Q(unsigned idx) const
|
||||||
return pin(3+awidth_+width()+idx);
|
return pin(3+awidth_+width()+idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* NetAssign
|
|
||||||
*/
|
|
||||||
|
|
||||||
NetAssign_::NetAssign_(const string&n, unsigned w)
|
|
||||||
: NetNode(n, w), rval_(0), bmux_(0)
|
|
||||||
{
|
|
||||||
for (unsigned idx = 0 ; idx < pin_count() ; idx += 1) {
|
|
||||||
pin(idx).set_dir(Link::OUTPUT);
|
|
||||||
pin(idx).set_name("P", idx);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
NetAssign_::~NetAssign_()
|
|
||||||
{
|
|
||||||
if (rval_) delete rval_;
|
|
||||||
if (bmux_) delete bmux_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void NetAssign_::set_rval(NetExpr*r)
|
|
||||||
{
|
|
||||||
if (rval_) delete rval_;
|
|
||||||
rval_ = r;
|
|
||||||
}
|
|
||||||
|
|
||||||
void NetAssign_::set_bmux(NetExpr*r)
|
|
||||||
{
|
|
||||||
assert(bmux_ == 0);
|
|
||||||
bmux_ = r;
|
|
||||||
}
|
|
||||||
|
|
||||||
NetExpr* NetAssign_::rval()
|
|
||||||
{
|
|
||||||
return rval_;
|
|
||||||
}
|
|
||||||
|
|
||||||
const NetExpr* NetAssign_::rval() const
|
|
||||||
{
|
|
||||||
return rval_;
|
|
||||||
}
|
|
||||||
|
|
||||||
const NetExpr* NetAssign_::bmux() const
|
|
||||||
{
|
|
||||||
return bmux_;
|
|
||||||
}
|
|
||||||
|
|
||||||
NetAssign::NetAssign(const string&n, Design*des, unsigned w, NetExpr*rv)
|
|
||||||
: NetAssign_(n, w)
|
|
||||||
{
|
|
||||||
set_rval(rv);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetAssign::NetAssign(const string&n, Design*des, unsigned w,
|
|
||||||
NetExpr*mu, NetExpr*rv)
|
|
||||||
: NetAssign_(n, w)
|
|
||||||
{
|
|
||||||
bool flag = rv->set_width(1);
|
|
||||||
if (flag == false) {
|
|
||||||
cerr << rv->get_line() << ": Expression bit width" <<
|
|
||||||
" conflicts with l-value bit width." << endl;
|
|
||||||
des->errors += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
set_rval(rv);
|
|
||||||
set_bmux(mu);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetAssign::~NetAssign()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
NetAssignNB::NetAssignNB(const string&n, Design*des, unsigned w, NetExpr*rv)
|
|
||||||
: NetAssign_(n, w)
|
|
||||||
{
|
|
||||||
if (rv->expr_width() < w) {
|
|
||||||
cerr << rv->get_line() << ": Expression bit width (" <<
|
|
||||||
rv->expr_width() << ") conflicts with l-value "
|
|
||||||
"bit width (" << w << ")." << endl;
|
|
||||||
des->errors += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
set_rval(rv);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetAssignNB::NetAssignNB(const string&n, Design*des, unsigned w,
|
|
||||||
NetExpr*mu, NetExpr*rv)
|
|
||||||
: NetAssign_(n, w)
|
|
||||||
{
|
|
||||||
bool flag = rv->set_width(1);
|
|
||||||
if (flag == false) {
|
|
||||||
cerr << rv->get_line() << ": Expression bit width" <<
|
|
||||||
" conflicts with l-value bit width." << endl;
|
|
||||||
des->errors += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
set_rval(rv);
|
|
||||||
set_bmux(mu);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetAssignNB::~NetAssignNB()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
NetAssignMem_::NetAssignMem_(NetMemory*m, NetExpr*i, NetExpr*r)
|
NetAssignMem_::NetAssignMem_(NetMemory*m, NetExpr*i, NetExpr*r)
|
||||||
: mem_(m), index_(i), rval_(r)
|
: mem_(m), index_(i), rval_(r)
|
||||||
{
|
{
|
||||||
|
|
@ -2467,6 +2362,9 @@ bool NetUDP::sequ_glob_(string input, char output)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: netlist.cc,v $
|
* $Log: netlist.cc,v $
|
||||||
|
* Revision 1.135 2000/09/02 20:54:20 steve
|
||||||
|
* Rearrange NetAssign to make NetAssign_ separate.
|
||||||
|
*
|
||||||
* Revision 1.134 2000/08/27 15:51:50 steve
|
* Revision 1.134 2000/08/27 15:51:50 steve
|
||||||
* t-dll iterates signals, and passes them to the
|
* t-dll iterates signals, and passes them to the
|
||||||
* target module.
|
* target module.
|
||||||
|
|
|
||||||
83
netlist.h
83
netlist.h
|
|
@ -19,7 +19,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT) && !defined(macintosh)
|
#if !defined(WINNT) && !defined(macintosh)
|
||||||
#ident "$Id: netlist.h,v 1.158 2000/08/27 15:51:50 steve Exp $"
|
#ident "$Id: netlist.h,v 1.159 2000/09/02 20:54:20 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -1108,46 +1108,75 @@ class NetProc : public LineInfo {
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is a procedural assignment. The lval is a register, and the
|
* Procedural assignment is broken into a suite of classes. These
|
||||||
* assignment happens when the code is executed by the design. The
|
* classes represent the various aspects of the assignment statement
|
||||||
* node part of the NetAssign has as many pins as the width of the
|
* in behavioral code. (The continuous assignment is *not*
|
||||||
* lvalue object and represents the elaborated lvalue. Thus, this
|
* represented here.)
|
||||||
* appears as a procedural statement AND a structural node. The
|
*
|
||||||
* LineInfo is the location of the assignment statement in the source.
|
* The NetAssignBase carries the common aspects of an assignment,
|
||||||
|
* including the r-value. This class has no cares of blocking vs
|
||||||
|
* non-blocking, however it carries nearly all the other properties
|
||||||
|
* of the assignment statement. It is abstract because it does not
|
||||||
|
* differentiate the virtual behaviors.
|
||||||
|
*
|
||||||
|
* The NetAssign and NetAssignNB classes are the concrete classes that
|
||||||
|
* give the assignment its final, precise meaning. These classes fill
|
||||||
|
* in the NetProc behaviors.
|
||||||
|
*
|
||||||
|
* The l-value of the assignment is a collection of NetAssign_
|
||||||
|
* objects. These are nodes that connect to the structural netlist
|
||||||
|
* where the assignment has its effect. The NetAssign_ class is not to
|
||||||
|
* be derived from.
|
||||||
*
|
*
|
||||||
* NOTE: The elaborator will make an effort to match the width of the
|
* NOTE: The elaborator will make an effort to match the width of the
|
||||||
* r-value to the with of the assign node, but targets and functions
|
* r-value to the with of the l-value, but targets and functions
|
||||||
* should know that this is not a guarantee.
|
* should know that this is not a guarantee.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class NetAssign_ : public NetProc, public NetNode {
|
class NetAssign_ : public NetNode {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
NetAssign_(const string&n, unsigned w);
|
||||||
// This is the (procedural) value that is to be assigned when
|
~NetAssign_();
|
||||||
// the assignment is executed.
|
|
||||||
NetExpr*rval();
|
|
||||||
const NetExpr*rval() const;
|
|
||||||
|
|
||||||
// If this expression exists, then only a single bit is to be
|
// If this expression exists, then only a single bit is to be
|
||||||
// set from the rval, and the value of this expression selects
|
// set from the rval, and the value of this expression selects
|
||||||
// the pin that gets the value.
|
// the pin that gets the value.
|
||||||
const NetExpr*bmux() const;
|
const NetExpr*bmux() const;
|
||||||
|
|
||||||
void set_rval(NetExpr*);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
NetAssign_(const string&n, unsigned w);
|
|
||||||
virtual ~NetAssign_() =0;
|
|
||||||
|
|
||||||
void set_bmux(NetExpr*);
|
void set_bmux(NetExpr*);
|
||||||
|
|
||||||
|
virtual bool emit_node(struct target_t*) const;
|
||||||
|
virtual void dump_node(ostream&, unsigned ind) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
NetExpr*rval_;
|
|
||||||
NetExpr*bmux_;
|
NetExpr*bmux_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class NetAssign : public NetAssign_ {
|
class NetAssignBase : public NetProc {
|
||||||
|
|
||||||
|
public:
|
||||||
|
NetAssignBase(NetAssign_*lv, NetExpr*rv);
|
||||||
|
virtual ~NetAssignBase() =0;
|
||||||
|
|
||||||
|
// This is the (procedural) value that is to be assigned when
|
||||||
|
// the assignment is executed.
|
||||||
|
NetExpr*rval();
|
||||||
|
const NetExpr*rval() const;
|
||||||
|
|
||||||
|
void set_rval(NetExpr*);
|
||||||
|
|
||||||
|
NetAssign_* l_val(unsigned);
|
||||||
|
const NetAssign_* l_val(unsigned) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
NetAssign_*lval_;
|
||||||
|
NetExpr *rval_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class NetAssign : public NetAssignBase {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit NetAssign(const string&, Design*des, unsigned w, NetExpr*rv);
|
explicit NetAssign(const string&, Design*des, unsigned w, NetExpr*rv);
|
||||||
explicit NetAssign(const string&, Design*des, unsigned w,
|
explicit NetAssign(const string&, Design*des, unsigned w,
|
||||||
|
|
@ -1155,18 +1184,13 @@ class NetAssign : public NetAssign_ {
|
||||||
~NetAssign();
|
~NetAssign();
|
||||||
|
|
||||||
virtual bool emit_proc(struct target_t*) const;
|
virtual bool emit_proc(struct target_t*) const;
|
||||||
virtual bool emit_node(struct target_t*) const;
|
|
||||||
virtual int match_proc(struct proc_match_t*);
|
virtual int match_proc(struct proc_match_t*);
|
||||||
virtual void dump(ostream&, unsigned ind) const;
|
virtual void dump(ostream&, unsigned ind) const;
|
||||||
virtual void dump_node(ostream&, unsigned ind) const;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
class NetAssignNB : public NetAssignBase {
|
||||||
* ... and this is a non-blocking version of above.
|
|
||||||
*/
|
|
||||||
class NetAssignNB : public NetAssign_ {
|
|
||||||
public:
|
public:
|
||||||
explicit NetAssignNB(const string&, Design*des, unsigned w, NetExpr*rv);
|
explicit NetAssignNB(const string&, Design*des, unsigned w, NetExpr*rv);
|
||||||
explicit NetAssignNB(const string&, Design*des, unsigned w,
|
explicit NetAssignNB(const string&, Design*des, unsigned w,
|
||||||
|
|
@ -1175,10 +1199,8 @@ class NetAssignNB : public NetAssign_ {
|
||||||
|
|
||||||
|
|
||||||
virtual bool emit_proc(struct target_t*) const;
|
virtual bool emit_proc(struct target_t*) const;
|
||||||
virtual bool emit_node(struct target_t*) const;
|
|
||||||
virtual int match_proc(struct proc_match_t*);
|
virtual int match_proc(struct proc_match_t*);
|
||||||
virtual void dump(ostream&, unsigned ind) const;
|
virtual void dump(ostream&, unsigned ind) const;
|
||||||
virtual void dump_node(ostream&, unsigned ind) const;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
};
|
};
|
||||||
|
|
@ -2726,6 +2748,9 @@ extern ostream& operator << (ostream&, NetNet::Type);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: netlist.h,v $
|
* $Log: netlist.h,v $
|
||||||
|
* Revision 1.159 2000/09/02 20:54:20 steve
|
||||||
|
* Rearrange NetAssign to make NetAssign_ separate.
|
||||||
|
*
|
||||||
* Revision 1.158 2000/08/27 15:51:50 steve
|
* Revision 1.158 2000/08/27 15:51:50 steve
|
||||||
* t-dll iterates signals, and passes them to the
|
* t-dll iterates signals, and passes them to the
|
||||||
* target module.
|
* target module.
|
||||||
|
|
|
||||||
24
syn-rules.y
24
syn-rules.y
|
|
@ -19,7 +19,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT) && !defined(macintosh)
|
#if !defined(WINNT) && !defined(macintosh)
|
||||||
#ident "$Id: syn-rules.y,v 1.8 2000/08/01 02:48:42 steve Exp $"
|
#ident "$Id: syn-rules.y,v 1.9 2000/09/02 20:54:21 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -38,7 +38,7 @@
|
||||||
struct syn_token_t {
|
struct syn_token_t {
|
||||||
int token;
|
int token;
|
||||||
|
|
||||||
NetAssign_*assign;
|
NetAssignBase*assign;
|
||||||
NetAssignMem_*assign_mem;
|
NetAssignMem_*assign_mem;
|
||||||
NetProcTop*top;
|
NetProcTop*top;
|
||||||
NetEvWait*evwait;
|
NetEvWait*evwait;
|
||||||
|
|
@ -54,10 +54,10 @@ static void yyerror(const char*);
|
||||||
static Design*des_;
|
static Design*des_;
|
||||||
|
|
||||||
static void make_DFF_CE(Design*des, NetProcTop*top, NetEvWait*wclk,
|
static void make_DFF_CE(Design*des, NetProcTop*top, NetEvWait*wclk,
|
||||||
NetEvent*eclk, NetExpr*cexp, NetAssign_*asn);
|
NetEvent*eclk, NetExpr*cexp, NetAssignBase*asn);
|
||||||
static void make_RAM_CE(Design*des, NetProcTop*top, NetEvWait*wclk,
|
static void make_RAM_CE(Design*des, NetProcTop*top, NetEvWait*wclk,
|
||||||
NetEvent*eclk, NetExpr*cexp, NetAssignMem_*asn);
|
NetEvent*eclk, NetExpr*cexp, NetAssignMem_*asn);
|
||||||
static void make_initializer(Design*des, NetProcTop*top, NetAssign_*asn);
|
static void make_initializer(Design*des, NetProcTop*top, NetAssignBase*asn);
|
||||||
|
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
|
@ -131,7 +131,7 @@ start
|
||||||
|
|
||||||
/* Various actions. */
|
/* Various actions. */
|
||||||
static void make_DFF_CE(Design*des, NetProcTop*top, NetEvWait*wclk,
|
static void make_DFF_CE(Design*des, NetProcTop*top, NetEvWait*wclk,
|
||||||
NetEvent*eclk, NetExpr*cexp, NetAssign_*asn)
|
NetEvent*eclk, NetExpr*cexp, NetAssignBase*asn)
|
||||||
{
|
{
|
||||||
NetEvProbe*pclk = eclk->probe(0);
|
NetEvProbe*pclk = eclk->probe(0);
|
||||||
NetESignal*d = dynamic_cast<NetESignal*> (asn->rval());
|
NetESignal*d = dynamic_cast<NetESignal*> (asn->rval());
|
||||||
|
|
@ -139,11 +139,11 @@ static void make_DFF_CE(Design*des, NetProcTop*top, NetEvWait*wclk,
|
||||||
|
|
||||||
assert(d);
|
assert(d);
|
||||||
|
|
||||||
NetFF*ff = new NetFF(asn->name(), asn->pin_count());
|
NetFF*ff = new NetFF(asn->l_val(0)->name(), asn->l_val(0)->pin_count());
|
||||||
|
|
||||||
for (unsigned idx = 0 ; idx < ff->width() ; idx += 1) {
|
for (unsigned idx = 0 ; idx < ff->width() ; idx += 1) {
|
||||||
connect(ff->pin_Data(idx), d->pin(idx));
|
connect(ff->pin_Data(idx), d->pin(idx));
|
||||||
connect(ff->pin_Q(idx), asn->pin(idx));
|
connect(ff->pin_Q(idx), asn->l_val(0)->pin(idx));
|
||||||
}
|
}
|
||||||
|
|
||||||
connect(ff->pin_Clock(), pclk->pin(0));
|
connect(ff->pin_Clock(), pclk->pin(0));
|
||||||
|
|
@ -198,16 +198,16 @@ static void make_RAM_CE(Design*des, NetProcTop*top, NetEvWait*wclk,
|
||||||
* the initial value for the link and get rid of the assignment
|
* the initial value for the link and get rid of the assignment
|
||||||
* process.
|
* process.
|
||||||
*/
|
*/
|
||||||
static void make_initializer(Design*des, NetProcTop*top, NetAssign_*asn)
|
static void make_initializer(Design*des, NetProcTop*top, NetAssignBase*asn)
|
||||||
{
|
{
|
||||||
NetESignal*rsig = dynamic_cast<NetESignal*> (asn->rval());
|
NetESignal*rsig = dynamic_cast<NetESignal*> (asn->rval());
|
||||||
assert(rsig);
|
assert(rsig);
|
||||||
|
|
||||||
for (unsigned idx = 0 ; idx < asn->pin_count() ; idx += 1) {
|
for (unsigned idx = 0 ; idx < asn->l_val(0)->pin_count() ; idx += 1) {
|
||||||
|
|
||||||
verinum::V bit = driven_value(rsig->pin(idx));
|
verinum::V bit = driven_value(rsig->pin(idx));
|
||||||
|
|
||||||
Nexus*nex = asn->pin(idx).nexus();
|
Nexus*nex = asn->l_val(0)->pin(idx).nexus();
|
||||||
for (Link*cur = nex->first_nlink()
|
for (Link*cur = nex->first_nlink()
|
||||||
; cur ; cur = cur->next_nlink()) {
|
; cur ; cur = cur->next_nlink()) {
|
||||||
|
|
||||||
|
|
@ -237,7 +237,7 @@ struct tokenize : public proc_match_t {
|
||||||
{
|
{
|
||||||
syn_token_t*cur;
|
syn_token_t*cur;
|
||||||
cur = new syn_token_t;
|
cur = new syn_token_t;
|
||||||
cur->token = dev->bmux() ? S_ASSIGN_MUX : S_ASSIGN;
|
cur->token = dev->l_val(0)->bmux() ? S_ASSIGN_MUX : S_ASSIGN;
|
||||||
cur->assign = dev;
|
cur->assign = dev;
|
||||||
cur->next_ = 0;
|
cur->next_ = 0;
|
||||||
last_->next_ = cur;
|
last_->next_ = cur;
|
||||||
|
|
@ -249,7 +249,7 @@ struct tokenize : public proc_match_t {
|
||||||
{
|
{
|
||||||
syn_token_t*cur;
|
syn_token_t*cur;
|
||||||
cur = new syn_token_t;
|
cur = new syn_token_t;
|
||||||
cur->token = dev->bmux() ? S_ASSIGN_MUX : S_ASSIGN;
|
cur->token = dev->l_val(0)->bmux() ? S_ASSIGN_MUX : S_ASSIGN;
|
||||||
cur->assign = dev;
|
cur->assign = dev;
|
||||||
cur->next_ = 0;
|
cur->next_ = 0;
|
||||||
last_->next_ = cur;
|
last_->next_ = cur;
|
||||||
|
|
|
||||||
58
t-vvm.cc
58
t-vvm.cc
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT) && !defined(macintosh)
|
#if !defined(WINNT) && !defined(macintosh)
|
||||||
#ident "$Id: t-vvm.cc,v 1.169 2000/08/20 17:49:04 steve Exp $"
|
#ident "$Id: t-vvm.cc,v 1.170 2000/09/02 20:54:21 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include <iostream>
|
# include <iostream>
|
||||||
|
|
@ -166,7 +166,6 @@ class target_vvm : public target_t {
|
||||||
virtual void udp(const NetUDP*);
|
virtual void udp(const NetUDP*);
|
||||||
virtual void udp_comb(const NetUDP_COMB*);
|
virtual void udp_comb(const NetUDP_COMB*);
|
||||||
void udp_sequ_(ostream&os, const NetUDP*);
|
void udp_sequ_(ostream&os, const NetUDP*);
|
||||||
virtual void net_assign_nb(const NetAssignNB*);
|
|
||||||
virtual void net_case_cmp(const NetCaseCmp*);
|
virtual void net_case_cmp(const NetCaseCmp*);
|
||||||
virtual bool net_cassign(const NetCAssign*);
|
virtual bool net_cassign(const NetCAssign*);
|
||||||
virtual bool net_const(const NetConst*);
|
virtual bool net_const(const NetConst*);
|
||||||
|
|
@ -1970,10 +1969,6 @@ void target_vvm::udp_sequ_(ostream&os, const NetUDP*gate)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void target_vvm::net_assign_nb(const NetAssignNB*net)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void target_vvm::net_case_cmp(const NetCaseCmp*gate)
|
void target_vvm::net_case_cmp(const NetCaseCmp*gate)
|
||||||
{
|
{
|
||||||
string mname = mangle(gate->name());
|
string mname = mangle(gate->name());
|
||||||
|
|
@ -2157,7 +2152,7 @@ void target_vvm::proc_assign(const NetAssign*net)
|
||||||
|
|
||||||
const verinum value = rc->value();
|
const verinum value = rc->value();
|
||||||
|
|
||||||
if (net->bmux()) {
|
if (net->l_val(0)->bmux()) {
|
||||||
|
|
||||||
// This is a bit select. Assign the low bit of the
|
// This is a bit select. Assign the low bit of the
|
||||||
// constant to the selected bit of the lval.
|
// constant to the selected bit of the lval.
|
||||||
|
|
@ -2166,14 +2161,14 @@ void target_vvm::proc_assign(const NetAssign*net)
|
||||||
Link::STRONG,
|
Link::STRONG,
|
||||||
Link::STRONG);
|
Link::STRONG);
|
||||||
|
|
||||||
string bval = emit_proc_rval(this, net->bmux());
|
string bval = emit_proc_rval(this, net->l_val(0)->bmux());
|
||||||
|
|
||||||
defn << " switch (" << bval
|
defn << " switch (" << bval
|
||||||
<< ".as_unsigned()) {" << endl;
|
<< ".as_unsigned()) {" << endl;
|
||||||
|
|
||||||
for (unsigned idx = 0; idx < net->pin_count(); idx += 1) {
|
for (unsigned idx = 0; idx < net->l_val(0)->pin_count(); idx += 1) {
|
||||||
|
|
||||||
string nexus = net->pin(idx).nexus()->name();
|
string nexus = net->l_val(0)->pin(idx).nexus()->name();
|
||||||
unsigned ncode = nexus_wire_map[nexus];
|
unsigned ncode = nexus_wire_map[nexus];
|
||||||
|
|
||||||
defn << " case " << idx << ":" << endl;
|
defn << " case " << idx << ":" << endl;
|
||||||
|
|
@ -2188,8 +2183,8 @@ void target_vvm::proc_assign(const NetAssign*net)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned idx = 0 ; idx < net->pin_count() ; idx += 1) {
|
for (unsigned idx = 0 ; idx < net->l_val(0)->pin_count() ; idx += 1) {
|
||||||
string nexus = net->pin(idx).nexus()->name();
|
string nexus = net->l_val(0)->pin(idx).nexus()->name();
|
||||||
unsigned ncode = nexus_wire_map[nexus];
|
unsigned ncode = nexus_wire_map[nexus];
|
||||||
|
|
||||||
verinum::V val = idx < value.len()
|
verinum::V val = idx < value.len()
|
||||||
|
|
@ -2219,12 +2214,12 @@ void target_vvm::proc_assign(const NetAssign*net)
|
||||||
|
|
||||||
if (const NetESignal*rs = dynamic_cast<const NetESignal*>(net->rval())) {
|
if (const NetESignal*rs = dynamic_cast<const NetESignal*>(net->rval())) {
|
||||||
|
|
||||||
if (net->pin_count() > rs->pin_count()) {
|
if (net->l_val(0)->pin_count() > rs->pin_count()) {
|
||||||
rval = emit_proc_rval(this, net->rval());
|
rval = emit_proc_rval(this, net->rval());
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
assert((net->pin_count() <= rs->pin_count())
|
assert((net->l_val(0)->pin_count() <= rs->pin_count())
|
||||||
|| (net->bmux() && (rs->pin_count() >= 1)));
|
|| (net->l_val(0)->bmux() && (rs->pin_count() >= 1)));
|
||||||
rval = mangle(rs->name()) + ".bits";
|
rval = mangle(rs->name()) + ".bits";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2242,17 +2237,17 @@ void target_vvm::proc_assign(const NetAssign*net)
|
||||||
l-value. Otherwise, generate code for a complete
|
l-value. Otherwise, generate code for a complete
|
||||||
assignment. */
|
assignment. */
|
||||||
|
|
||||||
if (net->bmux()) {
|
if (net->l_val(0)->bmux()) {
|
||||||
|
|
||||||
// This is a bit select. Assign the low bit of the rval
|
// This is a bit select. Assign the low bit of the rval
|
||||||
// to the selected bit of the lval.
|
// to the selected bit of the lval.
|
||||||
string bval = emit_proc_rval(this, net->bmux());
|
string bval = emit_proc_rval(this, net->l_val(0)->bmux());
|
||||||
|
|
||||||
defn << " switch (" << bval << ".as_unsigned()) {" << endl;
|
defn << " switch (" << bval << ".as_unsigned()) {" << endl;
|
||||||
|
|
||||||
for (unsigned idx = 0 ; idx < net->pin_count() ; idx += 1) {
|
for (unsigned idx = 0 ; idx < net->l_val(0)->pin_count() ; idx += 1) {
|
||||||
|
|
||||||
string nexus = net->pin(idx).nexus()->name();
|
string nexus = net->l_val(0)->pin(idx).nexus()->name();
|
||||||
unsigned ncode = nexus_wire_map[nexus];
|
unsigned ncode = nexus_wire_map[nexus];
|
||||||
|
|
||||||
defn << " case " << idx << ":" << endl;
|
defn << " case " << idx << ":" << endl;
|
||||||
|
|
@ -2266,19 +2261,19 @@ void target_vvm::proc_assign(const NetAssign*net)
|
||||||
defn << " }" << endl;
|
defn << " }" << endl;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
unsigned min_count = net->pin_count();
|
unsigned min_count = net->l_val(0)->pin_count();
|
||||||
if (net->rval()->expr_width() < min_count)
|
if (net->rval()->expr_width() < min_count)
|
||||||
min_count = net->rval()->expr_width();
|
min_count = net->rval()->expr_width();
|
||||||
|
|
||||||
for (unsigned idx = 0 ; idx < min_count ; idx += 1) {
|
for (unsigned idx = 0 ; idx < min_count ; idx += 1) {
|
||||||
string nexus = net->pin(idx).nexus()->name();
|
string nexus = net->l_val(0)->pin(idx).nexus()->name();
|
||||||
unsigned ncode = nexus_wire_map[nexus];
|
unsigned ncode = nexus_wire_map[nexus];
|
||||||
defn << " nexus_wire_table["<<ncode<<"].reg_assign("
|
defn << " nexus_wire_table["<<ncode<<"].reg_assign("
|
||||||
<< rval << "[" << idx << "]);" << endl;
|
<< rval << "[" << idx << "]);" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned idx = min_count; idx < net->pin_count(); idx += 1) {
|
for (unsigned idx = min_count; idx < net->l_val(0)->pin_count(); idx += 1) {
|
||||||
string nexus = net->pin(idx).nexus()->name();
|
string nexus = net->l_val(0)->pin(idx).nexus()->name();
|
||||||
unsigned ncode = nexus_wire_map[nexus];
|
unsigned ncode = nexus_wire_map[nexus];
|
||||||
defn << " nexus_wire_table["<<ncode<<"]"
|
defn << " nexus_wire_table["<<ncode<<"]"
|
||||||
<< ".reg_assign(St0);" << endl;
|
<< ".reg_assign(St0);" << endl;
|
||||||
|
|
@ -2319,9 +2314,9 @@ void target_vvm::proc_assign_mem(const NetAssignMem*amem)
|
||||||
void target_vvm::proc_assign_nb(const NetAssignNB*net)
|
void target_vvm::proc_assign_nb(const NetAssignNB*net)
|
||||||
{
|
{
|
||||||
string rval = emit_proc_rval(this, net->rval());
|
string rval = emit_proc_rval(this, net->rval());
|
||||||
const unsigned long delay = net->rise_time();
|
const unsigned long delay = net->l_val(0)->rise_time();
|
||||||
|
|
||||||
if (net->bmux()) {
|
if (net->l_val(0)->bmux()) {
|
||||||
/* If the l-value has a bit select, set the output bit
|
/* If the l-value has a bit select, set the output bit
|
||||||
to only the desired bit. Evaluate the index and use
|
to only the desired bit. Evaluate the index and use
|
||||||
that to drive a switch statement.
|
that to drive a switch statement.
|
||||||
|
|
@ -2330,11 +2325,11 @@ void target_vvm::proc_assign_nb(const NetAssignNB*net)
|
||||||
better generating a demux device and doing the assign
|
better generating a demux device and doing the assign
|
||||||
to the device input. Food for thought. */
|
to the device input. Food for thought. */
|
||||||
|
|
||||||
string bval = emit_proc_rval(this, net->bmux());
|
string bval = emit_proc_rval(this, net->l_val(0)->bmux());
|
||||||
defn << " switch (" << bval << ".as_unsigned()) {" << endl;
|
defn << " switch (" << bval << ".as_unsigned()) {" << endl;
|
||||||
|
|
||||||
for (unsigned idx = 0 ; idx < net->pin_count() ; idx += 1) {
|
for (unsigned idx = 0 ; idx < net->l_val(0)->pin_count() ; idx += 1) {
|
||||||
string nexus = net->pin(idx).nexus()->name();
|
string nexus = net->l_val(0)->pin(idx).nexus()->name();
|
||||||
unsigned ncode = nexus_wire_map[nexus];
|
unsigned ncode = nexus_wire_map[nexus];
|
||||||
|
|
||||||
defn << " case " << idx << ":" << endl;
|
defn << " case " << idx << ":" << endl;
|
||||||
|
|
@ -2347,8 +2342,8 @@ void target_vvm::proc_assign_nb(const NetAssignNB*net)
|
||||||
defn << " }" << endl;
|
defn << " }" << endl;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
for (unsigned idx = 0 ; idx < net->pin_count() ; idx += 1) {
|
for (unsigned idx = 0 ; idx < net->l_val(0)->pin_count() ; idx += 1) {
|
||||||
string nexus = net->pin(idx).nexus()->name();
|
string nexus = net->l_val(0)->pin(idx).nexus()->name();
|
||||||
unsigned ncode = nexus_wire_map[nexus];
|
unsigned ncode = nexus_wire_map[nexus];
|
||||||
defn << " vvm_delayed_assign(nexus_wire_table["
|
defn << " vvm_delayed_assign(nexus_wire_table["
|
||||||
<< ncode << "], " << rval << "[" << idx << "], "
|
<< ncode << "], " << rval << "[" << idx << "], "
|
||||||
|
|
@ -3117,6 +3112,9 @@ extern const struct target tgt_vvm = {
|
||||||
};
|
};
|
||||||
/*
|
/*
|
||||||
* $Log: t-vvm.cc,v $
|
* $Log: t-vvm.cc,v $
|
||||||
|
* Revision 1.170 2000/09/02 20:54:21 steve
|
||||||
|
* Rearrange NetAssign to make NetAssign_ separate.
|
||||||
|
*
|
||||||
* Revision 1.169 2000/08/20 17:49:04 steve
|
* Revision 1.169 2000/08/20 17:49:04 steve
|
||||||
* Clean up warnings and portability issues.
|
* Clean up warnings and portability issues.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
13
target.cc
13
target.cc
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT) && !defined(macintosh)
|
#if !defined(WINNT) && !defined(macintosh)
|
||||||
#ident "$Id: target.cc,v 1.45 2000/08/27 15:51:51 steve Exp $"
|
#ident "$Id: target.cc,v 1.46 2000/09/02 20:54:21 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "target.h"
|
# include "target.h"
|
||||||
|
|
@ -126,14 +126,10 @@ void target_t::lpm_ram_dq(const NetRamDq*)
|
||||||
"Unhandled NetRamDq." << endl;
|
"Unhandled NetRamDq." << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void target_t::net_assign(const NetAssign*)
|
void target_t::net_assign(const NetAssign_*)
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void target_t::net_assign_nb(const NetAssignNB*)
|
|
||||||
{
|
{
|
||||||
cerr << "target (" << typeid(*this).name() << "): "
|
cerr << "target (" << typeid(*this).name() << "): "
|
||||||
"Unhandled non-blocking assignment node." << endl;
|
"Unhandled assignment node." << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void target_t::net_case_cmp(const NetCaseCmp*)
|
void target_t::net_case_cmp(const NetCaseCmp*)
|
||||||
|
|
@ -392,6 +388,9 @@ void expr_scan_t::expr_binary(const NetEBinary*ex)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: target.cc,v $
|
* $Log: target.cc,v $
|
||||||
|
* Revision 1.46 2000/09/02 20:54:21 steve
|
||||||
|
* Rearrange NetAssign to make NetAssign_ separate.
|
||||||
|
*
|
||||||
* Revision 1.45 2000/08/27 15:51:51 steve
|
* Revision 1.45 2000/08/27 15:51:51 steve
|
||||||
* t-dll iterates signals, and passes them to the
|
* t-dll iterates signals, and passes them to the
|
||||||
* target module.
|
* target module.
|
||||||
|
|
|
||||||
8
target.h
8
target.h
|
|
@ -19,7 +19,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT) && !defined(macintosh)
|
#if !defined(WINNT) && !defined(macintosh)
|
||||||
#ident "$Id: target.h,v 1.44 2000/08/27 15:51:51 steve Exp $"
|
#ident "$Id: target.h,v 1.45 2000/09/02 20:54:21 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "netlist.h"
|
# include "netlist.h"
|
||||||
|
|
@ -87,8 +87,7 @@ struct target_t {
|
||||||
virtual bool bufz(const NetBUFZ*);
|
virtual bool bufz(const NetBUFZ*);
|
||||||
virtual void udp(const NetUDP*);
|
virtual void udp(const NetUDP*);
|
||||||
virtual void udp_comb(const NetUDP_COMB*);
|
virtual void udp_comb(const NetUDP_COMB*);
|
||||||
virtual void net_assign(const NetAssign*);
|
virtual void net_assign(const NetAssign_*);
|
||||||
virtual void net_assign_nb(const NetAssignNB*);
|
|
||||||
virtual void net_case_cmp(const NetCaseCmp*);
|
virtual void net_case_cmp(const NetCaseCmp*);
|
||||||
virtual bool net_cassign(const NetCAssign*);
|
virtual bool net_cassign(const NetCAssign*);
|
||||||
virtual bool net_const(const NetConst*);
|
virtual bool net_const(const NetConst*);
|
||||||
|
|
@ -160,6 +159,9 @@ extern const struct target *target_table[];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: target.h,v $
|
* $Log: target.h,v $
|
||||||
|
* Revision 1.45 2000/09/02 20:54:21 steve
|
||||||
|
* Rearrange NetAssign to make NetAssign_ separate.
|
||||||
|
*
|
||||||
* Revision 1.44 2000/08/27 15:51:51 steve
|
* Revision 1.44 2000/08/27 15:51:51 steve
|
||||||
* t-dll iterates signals, and passes them to the
|
* t-dll iterates signals, and passes them to the
|
||||||
* target module.
|
* target module.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue