Parse and elaborate rise/fall/decay times
for gates, and handle the rules for partial lists of times.
This commit is contained in:
parent
dae5916ae1
commit
71d35f32b2
89
PGate.cc
89
PGate.cc
|
|
@ -17,10 +17,92 @@
|
||||||
* 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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: PGate.cc,v 1.1 1999/02/15 02:06:15 steve Exp $"
|
#ident "$Id: PGate.cc,v 1.2 1999/08/01 16:34:50 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "PGate.h"
|
# include "PGate.h"
|
||||||
|
# include "PExpr.h"
|
||||||
|
# include <assert.h>
|
||||||
|
|
||||||
|
PGate::PGate(const string&name,
|
||||||
|
svector<PExpr*>*pins,
|
||||||
|
const svector<PExpr*>*del)
|
||||||
|
: name_(name), pins_(pins)
|
||||||
|
{
|
||||||
|
for (unsigned idx = 0 ; idx < 3 ; idx += 1)
|
||||||
|
delay_[idx] = 0;
|
||||||
|
|
||||||
|
if (del) {
|
||||||
|
assert(del->count() <= 3);
|
||||||
|
for (unsigned idx = 0 ; idx < del->count() ; idx += 1)
|
||||||
|
delay_[idx] = (*del)[idx];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PGate::PGate(const string&name,
|
||||||
|
svector<PExpr*>*pins,
|
||||||
|
PExpr*del)
|
||||||
|
: name_(name), pins_(pins)
|
||||||
|
{
|
||||||
|
delay_[0] = del;
|
||||||
|
delay_[1] = 0;
|
||||||
|
delay_[2] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
PGate::PGate(const string&name, svector<PExpr*>*pins)
|
||||||
|
: name_(name), pins_(pins)
|
||||||
|
{
|
||||||
|
delay_[0] = 0;
|
||||||
|
delay_[1] = 0;
|
||||||
|
delay_[2] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
PGate::~PGate()
|
||||||
|
{
|
||||||
|
for (unsigned idx = 0 ; idx < 3 ; idx += 1)
|
||||||
|
delete delay_[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
const PExpr* PGate::get_delay(unsigned idx) const
|
||||||
|
{
|
||||||
|
assert(idx < 3);
|
||||||
|
return delay_[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
PGAssign::PGAssign(svector<PExpr*>*pins)
|
||||||
|
: PGate("", pins)
|
||||||
|
{
|
||||||
|
assert(pins->count() == 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
PGAssign::PGAssign(svector<PExpr*>*pins, svector<PExpr*>*dels)
|
||||||
|
: PGate("", pins, dels)
|
||||||
|
{
|
||||||
|
assert(pins->count() == 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
PGAssign::~PGAssign()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
PGBuiltin::PGBuiltin(Type t, const string&name,
|
||||||
|
svector<PExpr*>*pins,
|
||||||
|
svector<PExpr*>*del)
|
||||||
|
: PGate(name, pins, del), type_(t), msb_(0), lsb_(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
PGBuiltin::PGBuiltin(Type t, const string&name,
|
||||||
|
svector<PExpr*>*pins,
|
||||||
|
PExpr*del)
|
||||||
|
: PGate(name, pins, del), type_(t), msb_(0), lsb_(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PGBuiltin::~PGBuiltin()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void PGBuiltin::set_range(PExpr*msb, PExpr*lsb)
|
void PGBuiltin::set_range(PExpr*msb, PExpr*lsb)
|
||||||
{
|
{
|
||||||
|
|
@ -33,6 +115,11 @@ void PGBuiltin::set_range(PExpr*msb, PExpr*lsb)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: PGate.cc,v $
|
* $Log: PGate.cc,v $
|
||||||
|
* Revision 1.2 1999/08/01 16:34:50 steve
|
||||||
|
* Parse and elaborate rise/fall/decay times
|
||||||
|
* for gates, and handle the rules for partial
|
||||||
|
* lists of times.
|
||||||
|
*
|
||||||
* Revision 1.1 1999/02/15 02:06:15 steve
|
* Revision 1.1 1999/02/15 02:06:15 steve
|
||||||
* Elaborate gate ranges.
|
* Elaborate gate ranges.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
41
PGate.h
41
PGate.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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: PGate.h,v 1.6 1999/05/29 02:36:17 steve Exp $"
|
#ident "$Id: PGate.h,v 1.7 1999/08/01 16:34:50 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "svector.h"
|
# include "svector.h"
|
||||||
|
|
@ -41,14 +41,19 @@ class Module;
|
||||||
class PGate : public LineInfo {
|
class PGate : public LineInfo {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit PGate(const string&name, svector<PExpr*>*pins, long del)
|
explicit PGate(const string&name, svector<PExpr*>*pins,
|
||||||
: name_(name), delay_(del), pins_(pins) { }
|
const svector<PExpr*>*del);
|
||||||
|
|
||||||
virtual ~PGate() { }
|
explicit PGate(const string&name, svector<PExpr*>*pins,
|
||||||
|
PExpr*del);
|
||||||
|
|
||||||
|
explicit PGate(const string&name, svector<PExpr*>*pins);
|
||||||
|
|
||||||
|
virtual ~PGate();
|
||||||
|
|
||||||
const string& get_name() const { return name_; }
|
const string& get_name() const { return name_; }
|
||||||
|
|
||||||
long get_delay() const { return delay_; }
|
const PExpr* get_delay(unsigned idx) const;
|
||||||
|
|
||||||
unsigned pin_count() const { return pins_? pins_->count() : 0; }
|
unsigned pin_count() const { return pins_? pins_->count() : 0; }
|
||||||
const PExpr*pin(unsigned idx) const { return (*pins_)[idx]; }
|
const PExpr*pin(unsigned idx) const { return (*pins_)[idx]; }
|
||||||
|
|
@ -60,10 +65,11 @@ class PGate : public LineInfo {
|
||||||
const svector<PExpr*>* get_pins() const { return pins_; }
|
const svector<PExpr*>* get_pins() const { return pins_; }
|
||||||
|
|
||||||
void dump_pins(ostream&out) const;
|
void dump_pins(ostream&out) const;
|
||||||
|
void dump_delays(ostream&out) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const string name_;
|
const string name_;
|
||||||
const unsigned long delay_;
|
PExpr* delay_[3];
|
||||||
svector<PExpr*>*pins_;
|
svector<PExpr*>*pins_;
|
||||||
|
|
||||||
private: // not implemented
|
private: // not implemented
|
||||||
|
|
@ -78,8 +84,9 @@ class PGate : public LineInfo {
|
||||||
class PGAssign : public PGate {
|
class PGAssign : public PGate {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit PGAssign(svector<PExpr*>*pins)
|
explicit PGAssign(svector<PExpr*>*pins);
|
||||||
: PGate("", pins, 0) { assert(pins->count() == 2); }
|
explicit PGAssign(svector<PExpr*>*pins, svector<PExpr*>*dels);
|
||||||
|
~PGAssign();
|
||||||
|
|
||||||
void dump(ostream&out) const;
|
void dump(ostream&out) const;
|
||||||
virtual void elaborate(Design*des, const string&path) const;
|
virtual void elaborate(Design*des, const string&path) const;
|
||||||
|
|
@ -108,9 +115,12 @@ class PGBuiltin : public PGate {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit PGBuiltin(Type t, const string&name,
|
explicit PGBuiltin(Type t, const string&name,
|
||||||
svector<PExpr*>*pins, long del = 0)
|
svector<PExpr*>*pins,
|
||||||
: PGate(name, pins, del), type_(t), msb_(0), lsb_(0)
|
svector<PExpr*>*del);
|
||||||
{ }
|
explicit PGBuiltin(Type t, const string&name,
|
||||||
|
svector<PExpr*>*pins,
|
||||||
|
PExpr*del);
|
||||||
|
~PGBuiltin();
|
||||||
|
|
||||||
Type type() const { return type_; }
|
Type type() const { return type_; }
|
||||||
void set_range(PExpr*msb, PExpr*lsb);
|
void set_range(PExpr*msb, PExpr*lsb);
|
||||||
|
|
@ -138,7 +148,7 @@ class PGModule : public PGate {
|
||||||
// builds everything all at once.
|
// builds everything all at once.
|
||||||
explicit PGModule(const string&type, const string&name,
|
explicit PGModule(const string&type, const string&name,
|
||||||
svector<PExpr*>*pins)
|
svector<PExpr*>*pins)
|
||||||
: PGate(name, pins, 0), type_(type), pins_(0), npins_(0) { }
|
: PGate(name, pins), type_(type), pins_(0), npins_(0) { }
|
||||||
|
|
||||||
// If the binding of ports is by name, this constructor takes
|
// If the binding of ports is by name, this constructor takes
|
||||||
// the bindings and stores them for later elaboration.
|
// the bindings and stores them for later elaboration.
|
||||||
|
|
@ -148,7 +158,7 @@ class PGModule : public PGate {
|
||||||
};
|
};
|
||||||
explicit PGModule(const string&type, const string&name,
|
explicit PGModule(const string&type, const string&name,
|
||||||
bind_t*pins, unsigned npins)
|
bind_t*pins, unsigned npins)
|
||||||
: PGate(name, 0, 0), type_(type), pins_(pins), npins_(npins) { }
|
: PGate(name, 0), type_(type), pins_(pins), npins_(npins) { }
|
||||||
|
|
||||||
|
|
||||||
virtual void dump(ostream&out) const;
|
virtual void dump(ostream&out) const;
|
||||||
|
|
@ -165,6 +175,11 @@ class PGModule : public PGate {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: PGate.h,v $
|
* $Log: PGate.h,v $
|
||||||
|
* Revision 1.7 1999/08/01 16:34:50 steve
|
||||||
|
* Parse and elaborate rise/fall/decay times
|
||||||
|
* for gates, and handle the rules for partial
|
||||||
|
* lists of times.
|
||||||
|
*
|
||||||
* Revision 1.6 1999/05/29 02:36:17 steve
|
* Revision 1.6 1999/05/29 02:36:17 steve
|
||||||
* module parameter bind by name.
|
* module parameter bind by name.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: design_dump.cc,v 1.33 1999/07/24 02:11:20 steve Exp $"
|
#ident "$Id: design_dump.cc,v 1.34 1999/08/01 16:34:50 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -49,8 +49,8 @@ void NetNet::dump_net(ostream&o, unsigned ind) const
|
||||||
pin_count() << "]";
|
pin_count() << "]";
|
||||||
if (local_flag_)
|
if (local_flag_)
|
||||||
o << " (local)";
|
o << " (local)";
|
||||||
o << " #(" << delay1() << "," << delay2() << "," << delay3() <<
|
o << " #(" << rise_time() << "," << fall_time() << "," <<
|
||||||
") init=";
|
decay_time() << ") init=";
|
||||||
for (unsigned idx = pin_count() ; idx > 0 ; idx -= 1)
|
for (unsigned idx = pin_count() ; idx > 0 ; idx -= 1)
|
||||||
o << ivalue_[idx-1];
|
o << ivalue_[idx-1];
|
||||||
o << endl;
|
o << endl;
|
||||||
|
|
@ -70,8 +70,8 @@ void NetMemory::dump(ostream&o, unsigned ind) const
|
||||||
void NetNode::dump_node(ostream&o, unsigned ind) const
|
void NetNode::dump_node(ostream&o, unsigned ind) const
|
||||||
{
|
{
|
||||||
o << setw(ind) << "" << "node: ";
|
o << setw(ind) << "" << "node: ";
|
||||||
o << typeid(*this).name() << " #(" << delay1()
|
o << typeid(*this).name() << " #(" << rise_time()
|
||||||
<< "," << delay2() << "," << delay3() << ") " << name()
|
<< "," << fall_time() << "," << decay_time() << ") " << name()
|
||||||
<< endl;
|
<< endl;
|
||||||
|
|
||||||
dump_node_pins(o, ind+4);
|
dump_node_pins(o, ind+4);
|
||||||
|
|
@ -185,8 +185,8 @@ void NetLogic::dump_node(ostream&o, unsigned ind) const
|
||||||
o << "xor";
|
o << "xor";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
o << " #(" << delay1()
|
o << " #(" << rise_time()
|
||||||
<< "," << delay2() << "," << delay3() << ") " << name()
|
<< "," << fall_time() << "," << decay_time() << ") " << name()
|
||||||
<< endl;
|
<< endl;
|
||||||
|
|
||||||
dump_node_pins(o, ind+4);
|
dump_node_pins(o, ind+4);
|
||||||
|
|
@ -227,8 +227,8 @@ void NetUDP::dump_sequ_(ostream&o, unsigned ind) const
|
||||||
for (unsigned idx = 0 ; idx < ind ; idx += 1)
|
for (unsigned idx = 0 ; idx < ind ; idx += 1)
|
||||||
tmp += " ";
|
tmp += " ";
|
||||||
|
|
||||||
o << tmp << "Sequential UDP" << " #(" << delay1() <<
|
o << tmp << "Sequential UDP" << " #(" << rise_time() <<
|
||||||
"," << delay2() << "," << delay3() << ") " << name() <<
|
"," << fall_time() << "," << decay_time() << ") " << name() <<
|
||||||
endl;
|
endl;
|
||||||
|
|
||||||
for (FSM_::const_iterator ent = fsm_.begin()
|
for (FSM_::const_iterator ent = fsm_.begin()
|
||||||
|
|
@ -270,7 +270,7 @@ void NetUDP::dump_sequ_(ostream&o, unsigned ind) const
|
||||||
void NetUDP::dump_comb_(ostream&o, unsigned ind) const
|
void NetUDP::dump_comb_(ostream&o, unsigned ind) const
|
||||||
{
|
{
|
||||||
o << setw(ind) << "" << "Combinational UDP: ";
|
o << setw(ind) << "" << "Combinational UDP: ";
|
||||||
o << " #(" << delay1() << "," << delay2() << "," << delay3() <<
|
o << " #(" << rise_time() << "," << fall_time() << "," << decay_time() <<
|
||||||
") " << name() << endl;
|
") " << name() << endl;
|
||||||
|
|
||||||
dump_node_pins(o, ind+4);
|
dump_node_pins(o, ind+4);
|
||||||
|
|
@ -690,6 +690,11 @@ void Design::dump(ostream&o) const
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: design_dump.cc,v $
|
* $Log: design_dump.cc,v $
|
||||||
|
* Revision 1.34 1999/08/01 16:34:50 steve
|
||||||
|
* Parse and elaborate rise/fall/decay times
|
||||||
|
* for gates, and handle the rules for partial
|
||||||
|
* lists of times.
|
||||||
|
*
|
||||||
* Revision 1.33 1999/07/24 02:11:20 steve
|
* Revision 1.33 1999/07/24 02:11:20 steve
|
||||||
* Elaborate task input ports.
|
* Elaborate task input ports.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
183
elaborate.cc
183
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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: elaborate.cc,v 1.62 1999/07/31 03:16:54 steve Exp $"
|
#ident "$Id: elaborate.cc,v 1.63 1999/08/01 16:34:50 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -232,6 +232,12 @@ void PGAssign::elaborate(Design*des, const string&path) const
|
||||||
}
|
}
|
||||||
|
|
||||||
do_assign(des, path, lval, rval);
|
do_assign(des, path, lval, rval);
|
||||||
|
|
||||||
|
if (get_delay(0)) {
|
||||||
|
cerr << get_line() << ": Sorry, elaboration does not support"
|
||||||
|
" delayed continuous assignments." << endl;
|
||||||
|
des->errors += 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -281,6 +287,59 @@ void PGBuiltin::elaborate(Design*des, const string&path) const
|
||||||
NetLogic**cur = new NetLogic*[count];
|
NetLogic**cur = new NetLogic*[count];
|
||||||
assert(cur);
|
assert(cur);
|
||||||
|
|
||||||
|
/* Calculate the gate delays from the delay expressions
|
||||||
|
given in the source. For logic gates, the decay time
|
||||||
|
is meaningless because it can never go to high
|
||||||
|
impedence. However, the bufif devices can generate
|
||||||
|
'bz output, so we will pretend that anything can.
|
||||||
|
|
||||||
|
If only one delay value expression is given (i.e. #5
|
||||||
|
nand(foo,...)) then rise, fall and decay times are
|
||||||
|
all the same value. If two values are given, rise and
|
||||||
|
fall times are use, and the decay time is the minimum
|
||||||
|
of the rise and fall times. Finally, if all three
|
||||||
|
values are given, they are taken as specified. */
|
||||||
|
|
||||||
|
verinum*dv;
|
||||||
|
unsigned long rise_time, fall_time, decay_time;
|
||||||
|
|
||||||
|
if (get_delay(0)) {
|
||||||
|
dv = get_delay(0)->eval_const(des, path);
|
||||||
|
assert(dv);
|
||||||
|
rise_time = dv->as_ulong();
|
||||||
|
delete dv;
|
||||||
|
|
||||||
|
if (get_delay(1)) {
|
||||||
|
dv = get_delay(1)->eval_const(des, path);
|
||||||
|
assert(dv);
|
||||||
|
fall_time = dv->as_ulong();
|
||||||
|
delete dv;
|
||||||
|
|
||||||
|
if (get_delay(2)) {
|
||||||
|
dv = get_delay(2)->eval_const(des, path);
|
||||||
|
assert(dv);
|
||||||
|
decay_time = dv->as_ulong();
|
||||||
|
delete dv;
|
||||||
|
} else {
|
||||||
|
if (rise_time < fall_time)
|
||||||
|
decay_time = rise_time;
|
||||||
|
else
|
||||||
|
decay_time = fall_time;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
assert(get_delay(2) == 0);
|
||||||
|
fall_time = rise_time;
|
||||||
|
decay_time = rise_time;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
rise_time = 0;
|
||||||
|
fall_time = 0;
|
||||||
|
decay_time = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now make as many gates as the bit count dictates. Give each
|
||||||
|
a unique name, and set the delay times. */
|
||||||
|
|
||||||
for (unsigned idx = 0 ; idx < count ; idx += 1) {
|
for (unsigned idx = 0 ; idx < count ; idx += 1) {
|
||||||
strstream tmp;
|
strstream tmp;
|
||||||
unsigned index;
|
unsigned index;
|
||||||
|
|
@ -325,9 +384,11 @@ void PGBuiltin::elaborate(Design*des, const string&path) const
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
cur[idx]->delay1(get_delay());
|
|
||||||
cur[idx]->delay2(get_delay());
|
cur[idx]->rise_time(rise_time);
|
||||||
cur[idx]->delay3(get_delay());
|
cur[idx]->fall_time(fall_time);
|
||||||
|
cur[idx]->decay_time(decay_time);
|
||||||
|
|
||||||
des->add_node(cur[idx]);
|
des->add_node(cur[idx]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1991,6 +2052,11 @@ Design* elaborate(const map<string,Module*>&modules,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: elaborate.cc,v $
|
* $Log: elaborate.cc,v $
|
||||||
|
* Revision 1.63 1999/08/01 16:34:50 steve
|
||||||
|
* Parse and elaborate rise/fall/decay times
|
||||||
|
* for gates, and handle the rules for partial
|
||||||
|
* lists of times.
|
||||||
|
*
|
||||||
* Revision 1.62 1999/07/31 03:16:54 steve
|
* Revision 1.62 1999/07/31 03:16:54 steve
|
||||||
* move binary operators to derived classes.
|
* move binary operators to derived classes.
|
||||||
*
|
*
|
||||||
|
|
@ -2140,114 +2206,5 @@ Design* elaborate(const map<string,Module*>&modules,
|
||||||
*
|
*
|
||||||
* Revision 1.22 1999/05/01 02:57:53 steve
|
* Revision 1.22 1999/05/01 02:57:53 steve
|
||||||
* Handle much more complex event expressions.
|
* Handle much more complex event expressions.
|
||||||
*
|
|
||||||
* Revision 1.21 1999/04/29 02:16:26 steve
|
|
||||||
* Parse OR of event expressions.
|
|
||||||
*
|
|
||||||
* Revision 1.20 1999/04/25 00:44:10 steve
|
|
||||||
* Core handles subsignal expressions.
|
|
||||||
*
|
|
||||||
* Revision 1.19 1999/04/19 01:59:36 steve
|
|
||||||
* Add memories to the parse and elaboration phases.
|
|
||||||
*
|
|
||||||
* Revision 1.18 1999/03/15 02:43:32 steve
|
|
||||||
* Support more operators, especially logical.
|
|
||||||
*
|
|
||||||
* Revision 1.17 1999/03/01 03:27:53 steve
|
|
||||||
* Prevent the duplicate allocation of ESignal objects.
|
|
||||||
*
|
|
||||||
* Revision 1.16 1999/02/21 17:01:57 steve
|
|
||||||
* Add support for module parameters.
|
|
||||||
*
|
|
||||||
* Revision 1.15 1999/02/15 02:06:15 steve
|
|
||||||
* Elaborate gate ranges.
|
|
||||||
*
|
|
||||||
* Revision 1.14 1999/02/08 02:49:56 steve
|
|
||||||
* Turn the NetESignal into a NetNode so
|
|
||||||
* that it can connect to the netlist.
|
|
||||||
* Implement the case statement.
|
|
||||||
* Convince t-vvm to output code for
|
|
||||||
* the case statement.
|
|
||||||
*
|
|
||||||
* Revision 1.13 1999/02/03 04:20:11 steve
|
|
||||||
* Parse and elaborate the Verilog CASE statement.
|
|
||||||
*
|
|
||||||
* Revision 1.12 1999/02/01 00:26:49 steve
|
|
||||||
* Carry some line info to the netlist,
|
|
||||||
* Dump line numbers for processes.
|
|
||||||
* Elaborate prints errors about port vector
|
|
||||||
* width mismatch
|
|
||||||
* Emit better handles null statements.
|
|
||||||
*
|
|
||||||
* Revision 1.11 1999/01/25 05:45:56 steve
|
|
||||||
* Add the LineInfo class to carry the source file
|
|
||||||
* location of things. PGate, Statement and PProcess.
|
|
||||||
*
|
|
||||||
* elaborate handles module parameter mismatches,
|
|
||||||
* missing or incorrect lvalues for procedural
|
|
||||||
* assignment, and errors are propogated to the
|
|
||||||
* top of the elaboration call tree.
|
|
||||||
*
|
|
||||||
* Attach line numbers to processes, gates and
|
|
||||||
* assignment statements.
|
|
||||||
*
|
|
||||||
* Revision 1.10 1998/12/14 02:01:34 steve
|
|
||||||
* Fully elaborate Sequential UDP behavior.
|
|
||||||
*
|
|
||||||
* Revision 1.9 1998/12/07 04:53:17 steve
|
|
||||||
* Generate OBUF or IBUF attributes (and the gates
|
|
||||||
* to garry them) where a wire is a pad. This involved
|
|
||||||
* figuring out enough of the netlist to know when such
|
|
||||||
* was needed, and to generate new gates and signales
|
|
||||||
* to handle what's missing.
|
|
||||||
*
|
|
||||||
* Revision 1.8 1998/12/02 04:37:13 steve
|
|
||||||
* Add the nobufz function to eliminate bufz objects,
|
|
||||||
* Object links are marked with direction,
|
|
||||||
* constant propagation is more careful will wide links,
|
|
||||||
* Signal folding is aware of attributes, and
|
|
||||||
* the XNF target can dump UDP objects based on LCA
|
|
||||||
* attributes.
|
|
||||||
*
|
|
||||||
* Revision 1.7 1998/12/01 00:42:14 steve
|
|
||||||
* Elaborate UDP devices,
|
|
||||||
* Support UDP type attributes, and
|
|
||||||
* pass those attributes to nodes that
|
|
||||||
* are instantiated by elaboration,
|
|
||||||
* Put modules into a map instead of
|
|
||||||
* a simple list.
|
|
||||||
*
|
|
||||||
* Revision 1.6 1998/11/23 00:20:22 steve
|
|
||||||
* NetAssign handles lvalues as pin links
|
|
||||||
* instead of a signal pointer,
|
|
||||||
* Wire attributes added,
|
|
||||||
* Ability to parse UDP descriptions added,
|
|
||||||
* XNF generates EXT records for signals with
|
|
||||||
* the PAD attribute.
|
|
||||||
*
|
|
||||||
* Revision 1.5 1998/11/21 19:19:44 steve
|
|
||||||
* Give anonymous modules a name when elaborated.
|
|
||||||
*
|
|
||||||
* Revision 1.4 1998/11/11 03:13:04 steve
|
|
||||||
* Handle while loops.
|
|
||||||
*
|
|
||||||
* Revision 1.3 1998/11/09 18:55:34 steve
|
|
||||||
* Add procedural while loops,
|
|
||||||
* Parse procedural for loops,
|
|
||||||
* Add procedural wait statements,
|
|
||||||
* Add constant nodes,
|
|
||||||
* Add XNOR logic gate,
|
|
||||||
* Make vvm output look a bit prettier.
|
|
||||||
*
|
|
||||||
* Revision 1.2 1998/11/07 17:05:05 steve
|
|
||||||
* Handle procedural conditional, and some
|
|
||||||
* of the conditional expressions.
|
|
||||||
*
|
|
||||||
* Elaborate signals and identifiers differently,
|
|
||||||
* allowing the netlist to hold signal information.
|
|
||||||
*
|
|
||||||
* Revision 1.1 1998/11/03 23:28:56 steve
|
|
||||||
* Introduce verilog to CVS.
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
||||||
26
netlist.h
26
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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: netlist.h,v 1.52 1999/07/31 03:16:54 steve Exp $"
|
#ident "$Id: netlist.h,v 1.53 1999/08/01 16:34:50 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -58,6 +58,13 @@ struct functor_t;
|
||||||
* A link can be INPUT, OUTPUT or PASSIVE. An input never drives the
|
* A link can be INPUT, OUTPUT or PASSIVE. An input never drives the
|
||||||
* signal, and PASSIVE never receives the value of the signal. Wires
|
* signal, and PASSIVE never receives the value of the signal. Wires
|
||||||
* are PASSIVE, for example.
|
* are PASSIVE, for example.
|
||||||
|
*
|
||||||
|
* A NetObj also has delays specified as rise_time, fall_time and
|
||||||
|
* decay_time. The rise and fall time are the times to transition to 1
|
||||||
|
* or 0 values. The decay_time is the time needed to decay to a 'bz
|
||||||
|
* value, or to decay of the net is a trireg. The exact and precise
|
||||||
|
* interpretation of the rise/fall/decay times is typically left to
|
||||||
|
* the target to properly interpret.
|
||||||
*/
|
*/
|
||||||
class NetObj {
|
class NetObj {
|
||||||
|
|
||||||
|
|
@ -143,13 +150,13 @@ class NetObj {
|
||||||
|
|
||||||
unsigned pin_count() const { return npins_; }
|
unsigned pin_count() const { return npins_; }
|
||||||
|
|
||||||
unsigned delay1() const { return delay1_; }
|
unsigned rise_time() const { return delay1_; }
|
||||||
unsigned delay2() const { return delay2_; }
|
unsigned fall_time() const { return delay2_; }
|
||||||
unsigned delay3() const { return delay3_; }
|
unsigned decay_time() const { return delay3_; }
|
||||||
|
|
||||||
void delay1(unsigned d) { delay1_ = d; }
|
void rise_time(unsigned d) { delay1_ = d; }
|
||||||
void delay2(unsigned d) { delay2_ = d; }
|
void fall_time(unsigned d) { delay2_ = d; }
|
||||||
void delay3(unsigned d) { delay3_ = d; }
|
void decay_time(unsigned d) { delay3_ = d; }
|
||||||
|
|
||||||
void set_attributes(const map<string,string>&);
|
void set_attributes(const map<string,string>&);
|
||||||
string attribute(const string&key) const;
|
string attribute(const string&key) const;
|
||||||
|
|
@ -1437,6 +1444,11 @@ extern ostream& operator << (ostream&, NetNet::Type);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: netlist.h,v $
|
* $Log: netlist.h,v $
|
||||||
|
* Revision 1.53 1999/08/01 16:34:50 steve
|
||||||
|
* Parse and elaborate rise/fall/decay times
|
||||||
|
* for gates, and handle the rules for partial
|
||||||
|
* lists of times.
|
||||||
|
*
|
||||||
* Revision 1.52 1999/07/31 03:16:54 steve
|
* Revision 1.52 1999/07/31 03:16:54 steve
|
||||||
* move binary operators to derived classes.
|
* move binary operators to derived classes.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
41
parse.y
41
parse.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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: parse.y,v 1.54 1999/07/31 19:14:47 steve Exp $"
|
#ident "$Id: parse.y,v 1.55 1999/08/01 16:34:50 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "parse_misc.h"
|
# include "parse_misc.h"
|
||||||
|
|
@ -120,9 +120,10 @@ extern void lex_end_table();
|
||||||
%type <gate> gate_instance
|
%type <gate> gate_instance
|
||||||
%type <gates> gate_instance_list
|
%type <gates> gate_instance_list
|
||||||
|
|
||||||
%type <expr> delay delay_opt delay_value delay_value_list
|
|
||||||
%type <expr> expression expr_primary
|
%type <expr> expression expr_primary
|
||||||
%type <expr> lavalue lpvalue
|
%type <expr> lavalue lpvalue
|
||||||
|
%type <expr> delay_value
|
||||||
|
%type <exprs> delay delay_opt delay_value_list
|
||||||
%type <exprs> expression_list
|
%type <exprs> expression_list
|
||||||
|
|
||||||
%type <exprs> range range_opt
|
%type <exprs> range range_opt
|
||||||
|
|
@ -247,7 +248,9 @@ defparam_assign_list
|
||||||
|
|
||||||
delay
|
delay
|
||||||
: '#' delay_value
|
: '#' delay_value
|
||||||
{ $$ = $2;
|
{ svector<PExpr*>*tmp = new svector<PExpr*>(1);
|
||||||
|
(*tmp)[0] = $2;
|
||||||
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| '#' '(' delay_value_list ')'
|
| '#' '(' delay_value_list ')'
|
||||||
{ $$ = $3;
|
{ $$ = $3;
|
||||||
|
|
@ -282,11 +285,14 @@ delay_value
|
||||||
|
|
||||||
delay_value_list
|
delay_value_list
|
||||||
: expression
|
: expression
|
||||||
{ $$ = $1; }
|
{ svector<PExpr*>*tmp = new svector<PExpr*>(1);
|
||||||
|
(*tmp)[0] = $1;
|
||||||
|
$$ = tmp;
|
||||||
|
}
|
||||||
| delay_value_list ',' expression
|
| delay_value_list ',' expression
|
||||||
{ yyerror(@1, "Sorry, delay value lists not supported.");
|
{ svector<PExpr*>*tmp = new svector<PExpr*>(*$1, $3);
|
||||||
$$ = $1;
|
delete $1;
|
||||||
delete $3;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
@ -986,13 +992,9 @@ module_item
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
| K_assign delay_opt lavalue '=' expression ';'
|
| K_assign delay_opt lavalue '=' expression ';'
|
||||||
{ PGAssign*tmp = pform_make_pgassign($3, $5);
|
{ PGAssign*tmp = pform_make_pgassign($3, $5, $2);
|
||||||
tmp->set_file(@1.text);
|
tmp->set_file(@1.text);
|
||||||
tmp->set_lineno(@1.first_line);
|
tmp->set_lineno(@1.first_line);
|
||||||
if ($2) {
|
|
||||||
yyerror(@2, "Sorry, assign delays not supported.");
|
|
||||||
delete $2;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
| K_assign error '=' expression ';'
|
| K_assign error '=' expression ';'
|
||||||
| K_always statement
|
| K_always statement
|
||||||
|
|
@ -1051,18 +1053,17 @@ module_item_list
|
||||||
net_decl_assign
|
net_decl_assign
|
||||||
: IDENTIFIER '=' expression
|
: IDENTIFIER '=' expression
|
||||||
{ PEIdent*id = new PEIdent($1);
|
{ PEIdent*id = new PEIdent($1);
|
||||||
PGAssign*tmp = pform_make_pgassign(id, $3);
|
PGAssign*tmp = pform_make_pgassign(id, $3, 0);
|
||||||
tmp->set_file(@1.text);
|
tmp->set_file(@1.text);
|
||||||
tmp->set_lineno(@1.first_line);
|
tmp->set_lineno(@1.first_line);
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
}
|
}
|
||||||
| delay IDENTIFIER '=' expression
|
| delay IDENTIFIER '=' expression
|
||||||
{ PEIdent*id = new PEIdent($2);
|
{ PEIdent*id = new PEIdent($2);
|
||||||
PGAssign*tmp = pform_make_pgassign(id, $4);
|
PGAssign*tmp = pform_make_pgassign(id, $4, $1);
|
||||||
tmp->set_file(@2.text);
|
tmp->set_file(@2.text);
|
||||||
tmp->set_lineno(@2.first_line);
|
tmp->set_lineno(@2.first_line);
|
||||||
$$ = $2;
|
$$ = $2;
|
||||||
yyerror(@1, "Sorry, net assign delay not supported.");
|
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
@ -1456,7 +1457,10 @@ statement
|
||||||
yyerror(@3, "Error in while loop condition.");
|
yyerror(@3, "Error in while loop condition.");
|
||||||
}
|
}
|
||||||
| delay statement_opt
|
| delay statement_opt
|
||||||
{ PDelayStatement*tmp = new PDelayStatement($1, $2);
|
{ PExpr*del = (*$1)[0];
|
||||||
|
if ($1->count() != 1)
|
||||||
|
yyerror(@1, "Sorry, delay lists not supported here.");
|
||||||
|
PDelayStatement*tmp = new PDelayStatement(del, $2);
|
||||||
tmp->set_file(@1.text);
|
tmp->set_file(@1.text);
|
||||||
tmp->set_lineno(@1.first_line);
|
tmp->set_lineno(@1.first_line);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
|
|
@ -1484,7 +1488,10 @@ statement
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
| lpvalue '=' delay expression ';'
|
| lpvalue '=' delay expression ';'
|
||||||
{ PAssign*tmp = new PAssign($1,$3,$4);
|
{ PExpr*del = (*$3)[0];
|
||||||
|
if ($3->count() != 1)
|
||||||
|
yyerror(@1, "Sorry, delay lists not supported here.");
|
||||||
|
PAssign*tmp = new PAssign($1,del,$4);
|
||||||
tmp->set_file(@1.text);
|
tmp->set_file(@1.text);
|
||||||
tmp->set_lineno(@1.first_line);
|
tmp->set_lineno(@1.first_line);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
|
|
|
||||||
30
pform.cc
30
pform.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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: pform.cc,v 1.35 1999/07/31 19:15:21 steve Exp $"
|
#ident "$Id: pform.cc,v 1.36 1999/08/01 16:34:50 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "compiler.h"
|
# include "compiler.h"
|
||||||
|
|
@ -267,7 +267,7 @@ void pform_make_udp(const char*name, list<string>*parms,
|
||||||
* gates and calls the pform_makegate function to make the individual gate.
|
* gates and calls the pform_makegate function to make the individual gate.
|
||||||
*/
|
*/
|
||||||
void pform_makegate(PGBuiltin::Type type,
|
void pform_makegate(PGBuiltin::Type type,
|
||||||
unsigned long delay_val,
|
svector<PExpr*>* delay,
|
||||||
const lgate&info)
|
const lgate&info)
|
||||||
{
|
{
|
||||||
if (info.parms_by_name) {
|
if (info.parms_by_name) {
|
||||||
|
|
@ -277,7 +277,7 @@ void pform_makegate(PGBuiltin::Type type,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
PGBuiltin*cur = new PGBuiltin(type, info.name, info.parms, delay_val);
|
PGBuiltin*cur = new PGBuiltin(type, info.name, info.parms, delay);
|
||||||
if (info.range[0])
|
if (info.range[0])
|
||||||
cur->set_range(info.range[0], info.range[1]);
|
cur->set_range(info.range[0], info.range[1]);
|
||||||
|
|
||||||
|
|
@ -288,13 +288,10 @@ void pform_makegate(PGBuiltin::Type type,
|
||||||
}
|
}
|
||||||
|
|
||||||
void pform_makegates(PGBuiltin::Type type,
|
void pform_makegates(PGBuiltin::Type type,
|
||||||
PExpr*delay, svector<lgate>*gates)
|
svector<PExpr*>*delay, svector<lgate>*gates)
|
||||||
{
|
{
|
||||||
unsigned long delay_val = delay? evaluate_delay(delay) : 0;
|
|
||||||
delete delay;
|
|
||||||
|
|
||||||
for (unsigned idx = 0 ; idx < gates->count() ; idx += 1) {
|
for (unsigned idx = 0 ; idx < gates->count() ; idx += 1) {
|
||||||
pform_makegate(type, delay_val, (*gates)[idx]);
|
pform_makegate(type, delay, (*gates)[idx]);
|
||||||
}
|
}
|
||||||
|
|
||||||
delete gates;
|
delete gates;
|
||||||
|
|
@ -370,12 +367,20 @@ void pform_make_modgates(const string&type, svector<lgate>*gates)
|
||||||
delete gates;
|
delete gates;
|
||||||
}
|
}
|
||||||
|
|
||||||
PGAssign* pform_make_pgassign(PExpr*lval, PExpr*rval)
|
PGAssign* pform_make_pgassign(PExpr*lval, PExpr*rval,
|
||||||
|
svector<PExpr*>*del)
|
||||||
{
|
{
|
||||||
svector<PExpr*>*wires = new svector<PExpr*>(2);
|
svector<PExpr*>*wires = new svector<PExpr*>(2);
|
||||||
(*wires)[0] = lval;
|
(*wires)[0] = lval;
|
||||||
(*wires)[1] = rval;
|
(*wires)[1] = rval;
|
||||||
PGAssign*cur = new PGAssign(wires);
|
|
||||||
|
PGAssign*cur;
|
||||||
|
|
||||||
|
if (del == 0)
|
||||||
|
cur = new PGAssign(wires);
|
||||||
|
else
|
||||||
|
cur = new PGAssign(wires, del);
|
||||||
|
|
||||||
pform_cur_module->add_gate(cur);
|
pform_cur_module->add_gate(cur);
|
||||||
return cur;
|
return cur;
|
||||||
}
|
}
|
||||||
|
|
@ -657,6 +662,11 @@ int pform_parse(const char*path, map<string,Module*>&modules,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: pform.cc,v $
|
* $Log: pform.cc,v $
|
||||||
|
* Revision 1.36 1999/08/01 16:34:50 steve
|
||||||
|
* Parse and elaborate rise/fall/decay times
|
||||||
|
* for gates, and handle the rules for partial
|
||||||
|
* lists of times.
|
||||||
|
*
|
||||||
* Revision 1.35 1999/07/31 19:15:21 steve
|
* Revision 1.35 1999/07/31 19:15:21 steve
|
||||||
* misspelled comment.
|
* misspelled comment.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
12
pform.h
12
pform.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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: pform.h,v 1.25 1999/07/31 19:14:47 steve Exp $"
|
#ident "$Id: pform.h,v 1.26 1999/08/01 16:34:50 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "netlist.h"
|
# include "netlist.h"
|
||||||
|
|
@ -138,13 +138,14 @@ extern bool pform_expression_is_constant(const PExpr*);
|
||||||
* name) and connects it to the specified wires.
|
* name) and connects it to the specified wires.
|
||||||
*/
|
*/
|
||||||
extern void pform_makegates(PGBuiltin::Type type,
|
extern void pform_makegates(PGBuiltin::Type type,
|
||||||
PExpr*delay,
|
svector<PExpr*>*delay,
|
||||||
svector<lgate>*gates);
|
svector<lgate>*gates);
|
||||||
|
|
||||||
extern void pform_make_modgates(const string&type, svector<lgate>*gates);
|
extern void pform_make_modgates(const string&type, svector<lgate>*gates);
|
||||||
|
|
||||||
/* Make a continuous assignment node, with optional bit- or part- select. */
|
/* Make a continuous assignment node, with optional bit- or part- select. */
|
||||||
extern PGAssign* pform_make_pgassign(PExpr*lval, PExpr*rval);
|
extern PGAssign* pform_make_pgassign(PExpr*lval, PExpr*rval,
|
||||||
|
svector<PExpr*>*delays);
|
||||||
|
|
||||||
|
|
||||||
/* Given a port type and a list of names, make a list of wires that
|
/* Given a port type and a list of names, make a list of wires that
|
||||||
|
|
@ -166,6 +167,11 @@ extern void pform_dump(ostream&out, Module*mod);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: pform.h,v $
|
* $Log: pform.h,v $
|
||||||
|
* Revision 1.26 1999/08/01 16:34:50 steve
|
||||||
|
* Parse and elaborate rise/fall/decay times
|
||||||
|
* for gates, and handle the rules for partial
|
||||||
|
* lists of times.
|
||||||
|
*
|
||||||
* Revision 1.25 1999/07/31 19:14:47 steve
|
* Revision 1.25 1999/07/31 19:14:47 steve
|
||||||
* Add functions up to elaboration (Ed Carter)
|
* Add functions up to elaboration (Ed Carter)
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: pform_dump.cc,v 1.31 1999/07/31 19:14:47 steve Exp $"
|
#ident "$Id: pform_dump.cc,v 1.32 1999/08/01 16:34:50 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -209,10 +209,23 @@ void PGate::dump_pins(ostream&out) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PGate::dump_delays(ostream&out) const
|
||||||
|
{
|
||||||
|
if (delay_[0] && delay_[1] && delay_[2])
|
||||||
|
out << "#(" << *delay_[0] << "," << *delay_[1] << "," <<
|
||||||
|
*delay_[2] << ")";
|
||||||
|
else if (delay_[0])
|
||||||
|
out << "#" << *delay_[0];
|
||||||
|
else
|
||||||
|
out << "#0";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void PGate::dump(ostream&out) const
|
void PGate::dump(ostream&out) const
|
||||||
{
|
{
|
||||||
out << " " << typeid(*this).name() << " #"
|
out << " " << typeid(*this).name() << " ";
|
||||||
<< get_delay() << " " << get_name() << "(";
|
dump_delays(out);
|
||||||
|
out << " " << get_name() << "(";
|
||||||
dump_pins(out);
|
dump_pins(out);
|
||||||
out << ");" << endl;
|
out << ");" << endl;
|
||||||
|
|
||||||
|
|
@ -220,26 +233,29 @@ void PGate::dump(ostream&out) const
|
||||||
|
|
||||||
void PGAssign::dump(ostream&out) const
|
void PGAssign::dump(ostream&out) const
|
||||||
{
|
{
|
||||||
out << " assign " << *pin(0) << " = " << *pin(1) << ";" << endl;
|
out << " assign ";
|
||||||
|
dump_delays(out);
|
||||||
|
out << " " << *pin(0) << " = " << *pin(1) << ";" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PGBuiltin::dump(ostream&out) const
|
void PGBuiltin::dump(ostream&out) const
|
||||||
{
|
{
|
||||||
switch (type()) {
|
switch (type()) {
|
||||||
case PGBuiltin::BUFIF0:
|
case PGBuiltin::BUFIF0:
|
||||||
out << " bufif0 #";
|
out << " bufif0 ";
|
||||||
break;
|
break;
|
||||||
case PGBuiltin::BUFIF1:
|
case PGBuiltin::BUFIF1:
|
||||||
out << " bufif1 #";
|
out << " bufif1 ";
|
||||||
break;
|
break;
|
||||||
case PGBuiltin::NAND:
|
case PGBuiltin::NAND:
|
||||||
out << " nand #";
|
out << " nand ";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
out << " builtin gate #";
|
out << " builtin gate ";
|
||||||
}
|
}
|
||||||
|
|
||||||
out << get_delay() << " " << get_name();
|
dump_delays(out);
|
||||||
|
out << " " << get_name();
|
||||||
|
|
||||||
if (msb_) {
|
if (msb_) {
|
||||||
out << " [" << *msb_ << ":" << *lsb_ << "]";
|
out << " [" << *msb_ << ":" << *lsb_ << "]";
|
||||||
|
|
@ -578,6 +594,11 @@ void PUdp::dump(ostream&out) const
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: pform_dump.cc,v $
|
* $Log: pform_dump.cc,v $
|
||||||
|
* Revision 1.32 1999/08/01 16:34:50 steve
|
||||||
|
* Parse and elaborate rise/fall/decay times
|
||||||
|
* for gates, and handle the rules for partial
|
||||||
|
* lists of times.
|
||||||
|
*
|
||||||
* Revision 1.31 1999/07/31 19:14:47 steve
|
* Revision 1.31 1999/07/31 19:14:47 steve
|
||||||
* Add functions up to elaboration (Ed Carter)
|
* Add functions up to elaboration (Ed Carter)
|
||||||
*
|
*
|
||||||
|
|
|
||||||
13
t-verilog.cc
13
t-verilog.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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: t-verilog.cc,v 1.6 1999/07/03 02:12:52 steve Exp $"
|
#ident "$Id: t-verilog.cc,v 1.7 1999/08/01 16:34:50 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -78,8 +78,8 @@ void target_verilog::signal(ostream&os, const NetNet*net)
|
||||||
if (net->pin_count() > 1)
|
if (net->pin_count() > 1)
|
||||||
os << " [" << net->msb() << ":" << net->lsb() << "]";
|
os << " [" << net->msb() << ":" << net->lsb() << "]";
|
||||||
|
|
||||||
if (net->delay1())
|
if (net->rise_time())
|
||||||
os << " #" << net->delay1();
|
os << " #" << net->rise_time();
|
||||||
|
|
||||||
os << " " << mangle(net->name()) << ";" << endl;
|
os << " " << mangle(net->name()) << ";" << endl;
|
||||||
}
|
}
|
||||||
|
|
@ -111,7 +111,7 @@ void target_verilog::logic(ostream&os, const NetLogic*net)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
os << " #" << net->delay1() << " " << mangle(net->name()) << "(";
|
os << " #" << net->rise_time() << " " << mangle(net->name()) << "(";
|
||||||
|
|
||||||
unsigned sidx;
|
unsigned sidx;
|
||||||
const NetNet*sig = find_link_signal(net, 0, sidx);
|
const NetNet*sig = find_link_signal(net, 0, sidx);
|
||||||
|
|
@ -271,6 +271,11 @@ const struct target tgt_verilog = {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: t-verilog.cc,v $
|
* $Log: t-verilog.cc,v $
|
||||||
|
* Revision 1.7 1999/08/01 16:34:50 steve
|
||||||
|
* Parse and elaborate rise/fall/decay times
|
||||||
|
* for gates, and handle the rules for partial
|
||||||
|
* lists of times.
|
||||||
|
*
|
||||||
* Revision 1.6 1999/07/03 02:12:52 steve
|
* Revision 1.6 1999/07/03 02:12:52 steve
|
||||||
* Elaborate user defined tasks.
|
* Elaborate user defined tasks.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
25
t-vvm.cc
25
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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: t-vvm.cc,v 1.32 1999/07/18 21:17:51 steve Exp $"
|
#ident "$Id: t-vvm.cc,v 1.33 1999/08/01 16:34:50 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include <iostream>
|
# include <iostream>
|
||||||
|
|
@ -530,36 +530,36 @@ void target_vvm::logic(ostream&os, const NetLogic*gate)
|
||||||
switch (gate->type()) {
|
switch (gate->type()) {
|
||||||
case NetLogic::AND:
|
case NetLogic::AND:
|
||||||
os << "static vvm_and" << "<" << gate->pin_count()-1 <<
|
os << "static vvm_and" << "<" << gate->pin_count()-1 <<
|
||||||
"," << gate->delay1() << "> ";
|
"," << gate->rise_time() << "> ";
|
||||||
break;
|
break;
|
||||||
case NetLogic::BUFIF0:
|
case NetLogic::BUFIF0:
|
||||||
os << "static vvm_bufif0<" << gate->delay1() << "> ";
|
os << "static vvm_bufif0<" << gate->rise_time() << "> ";
|
||||||
break;
|
break;
|
||||||
case NetLogic::BUFIF1:
|
case NetLogic::BUFIF1:
|
||||||
os << "static vvm_bufif1<" << gate->delay1() << "> ";
|
os << "static vvm_bufif1<" << gate->rise_time() << "> ";
|
||||||
break;
|
break;
|
||||||
case NetLogic::NAND:
|
case NetLogic::NAND:
|
||||||
os << "static vvm_nand" << "<" << gate->pin_count()-1 <<
|
os << "static vvm_nand" << "<" << gate->pin_count()-1 <<
|
||||||
"," << gate->delay1() << "> ";
|
"," << gate->rise_time() << "> ";
|
||||||
break;
|
break;
|
||||||
case NetLogic::NOR:
|
case NetLogic::NOR:
|
||||||
os << "static vvm_nor" << "<" << gate->pin_count()-1 <<
|
os << "static vvm_nor" << "<" << gate->pin_count()-1 <<
|
||||||
"," << gate->delay1() << "> ";
|
"," << gate->rise_time() << "> ";
|
||||||
break;
|
break;
|
||||||
case NetLogic::NOT:
|
case NetLogic::NOT:
|
||||||
os << "static vvm_not" << "<" << gate->delay1() << "> ";
|
os << "static vvm_not" << "<" << gate->rise_time() << "> ";
|
||||||
break;
|
break;
|
||||||
case NetLogic::OR:
|
case NetLogic::OR:
|
||||||
os << "static vvm_or" << "<" << gate->pin_count()-1 <<
|
os << "static vvm_or" << "<" << gate->pin_count()-1 <<
|
||||||
"," << gate->delay1() << "> ";
|
"," << gate->rise_time() << "> ";
|
||||||
break;
|
break;
|
||||||
case NetLogic::XNOR:
|
case NetLogic::XNOR:
|
||||||
os << "static vvm_xnor" << "<" << gate->pin_count()-1 <<
|
os << "static vvm_xnor" << "<" << gate->pin_count()-1 <<
|
||||||
"," << gate->delay1() << "> ";
|
"," << gate->rise_time() << "> ";
|
||||||
break;
|
break;
|
||||||
case NetLogic::XOR:
|
case NetLogic::XOR:
|
||||||
os << "static vvm_xor" << "<" << gate->pin_count()-1 <<
|
os << "static vvm_xor" << "<" << gate->pin_count()-1 <<
|
||||||
"," << gate->delay1() << "> ";
|
"," << gate->rise_time() << "> ";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1287,6 +1287,11 @@ extern const struct target tgt_vvm = {
|
||||||
};
|
};
|
||||||
/*
|
/*
|
||||||
* $Log: t-vvm.cc,v $
|
* $Log: t-vvm.cc,v $
|
||||||
|
* Revision 1.33 1999/08/01 16:34:50 steve
|
||||||
|
* Parse and elaborate rise/fall/decay times
|
||||||
|
* for gates, and handle the rules for partial
|
||||||
|
* lists of times.
|
||||||
|
*
|
||||||
* Revision 1.32 1999/07/18 21:17:51 steve
|
* Revision 1.32 1999/07/18 21:17:51 steve
|
||||||
* Add support for CE input to XNF DFF, and do
|
* Add support for CE input to XNF DFF, and do
|
||||||
* complete cleanup of replaced design nodes.
|
* complete cleanup of replaced design nodes.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue