1998-11-04 00:28:49 +01:00
|
|
|
/*
|
2000-02-23 03:56:53 +01:00
|
|
|
* Copyright (c) 1998-2000 Stephen Williams (steve@icarus.com)
|
1998-11-04 00:28:49 +01:00
|
|
|
*
|
|
|
|
|
* 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
|
|
|
|
|
*/
|
2000-02-23 03:56:53 +01:00
|
|
|
#if !defined(WINNT) && !defined(macintosh)
|
2000-04-12 06:23:57 +02:00
|
|
|
#ident "$Id: design_dump.cc,v 1.75 2000/04/12 04:23:57 steve Exp $"
|
1998-11-04 00:28:49 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* This file contains all the dump methods of the netlist classes.
|
|
|
|
|
*/
|
|
|
|
|
# include <typeinfo>
|
|
|
|
|
# include <iostream>
|
|
|
|
|
# include <iomanip>
|
|
|
|
|
# include "netlist.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static ostream& operator<< (ostream&o, NetBlock::Type t)
|
|
|
|
|
{
|
|
|
|
|
switch (t) {
|
|
|
|
|
case NetBlock::SEQU:
|
|
|
|
|
o << "begin";
|
|
|
|
|
break;
|
|
|
|
|
case NetBlock::PARA:
|
|
|
|
|
o << "fork";
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return o;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Dump a net. This can be a wire or register. */
|
|
|
|
|
void NetNet::dump_net(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << type() << ": " << name() << "[" <<
|
|
|
|
|
pin_count() << "]";
|
|
|
|
|
if (local_flag_)
|
|
|
|
|
o << " (local)";
|
1999-11-27 20:07:57 +01:00
|
|
|
if (scope_)
|
|
|
|
|
o << " scope=" << scope_->name();
|
1999-08-01 18:34:50 +02:00
|
|
|
o << " #(" << rise_time() << "," << fall_time() << "," <<
|
|
|
|
|
decay_time() << ") init=";
|
1998-12-20 03:05:41 +01:00
|
|
|
for (unsigned idx = pin_count() ; idx > 0 ; idx -= 1)
|
|
|
|
|
o << ivalue_[idx-1];
|
|
|
|
|
o << endl;
|
1998-11-23 01:20:22 +01:00
|
|
|
dump_obj_attr(o, ind+4);
|
1998-11-04 00:28:49 +01:00
|
|
|
}
|
|
|
|
|
|
1999-04-19 03:59:36 +02:00
|
|
|
void NetMemory::dump(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << name_ << "[" << width_ << "] " <<
|
|
|
|
|
"[" << idxh_ << ":" << idxl_ << "]" << endl;
|
|
|
|
|
}
|
|
|
|
|
|
1998-11-04 00:28:49 +01:00
|
|
|
|
|
|
|
|
/* Dump a NetNode and its pins. Dump what I know about the netnode on
|
|
|
|
|
the first line, then list all the pins, with the name of the
|
|
|
|
|
connected signal. */
|
|
|
|
|
void NetNode::dump_node(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << "node: ";
|
1999-08-01 18:34:50 +02:00
|
|
|
o << typeid(*this).name() << " #(" << rise_time()
|
|
|
|
|
<< "," << fall_time() << "," << decay_time() << ") " << name()
|
1998-11-04 00:28:49 +01:00
|
|
|
<< endl;
|
|
|
|
|
|
|
|
|
|
dump_node_pins(o, ind+4);
|
1998-11-23 01:20:22 +01:00
|
|
|
dump_obj_attr(o, ind+4);
|
1998-11-04 00:28:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* This is the generic dumping of all the signals connected to each
|
|
|
|
|
pin of the object. The "this" object is not printed, only the
|
|
|
|
|
signals connected to this. */
|
|
|
|
|
void NetObj::dump_node_pins(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
for (unsigned idx = 0 ; idx < pin_count() ; idx += 1) {
|
1999-10-31 05:11:27 +01:00
|
|
|
o << setw(ind) << "" << idx << " " << pin(idx).get_name()
|
|
|
|
|
<< "<" << pin(idx).get_inst() << ">";
|
|
|
|
|
|
1998-12-02 05:37:13 +01:00
|
|
|
switch (pin(idx).get_dir()) {
|
|
|
|
|
case Link::PASSIVE:
|
|
|
|
|
o << " p";
|
|
|
|
|
break;
|
|
|
|
|
case Link::INPUT:
|
|
|
|
|
o << " I";
|
|
|
|
|
break;
|
|
|
|
|
case Link::OUTPUT:
|
|
|
|
|
o << " O";
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
o << ":";
|
1998-11-04 00:28:49 +01:00
|
|
|
|
|
|
|
|
unsigned cpin;
|
|
|
|
|
const NetObj*cur;
|
|
|
|
|
for (pin(idx).next_link(cur, cpin)
|
|
|
|
|
; (cur != this) || (cpin != idx)
|
|
|
|
|
; cur->pin(cpin).next_link(cur, cpin)) {
|
|
|
|
|
|
|
|
|
|
const NetNet*sig = dynamic_cast<const NetNet*>(cur);
|
|
|
|
|
if (sig) o << " " << sig->name() << "[" << cpin << "]";
|
|
|
|
|
}
|
|
|
|
|
o << endl;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
1998-11-23 01:20:22 +01:00
|
|
|
void NetObj::dump_obj_attr(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
for (map<string,string>::const_iterator idx = attributes_.begin()
|
|
|
|
|
; idx != attributes_.end()
|
|
|
|
|
; idx ++) {
|
|
|
|
|
o << setw(ind) << "" << (*idx).first << " = \"" <<
|
|
|
|
|
(*idx).second << "\"" << endl;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
1999-09-03 06:28:38 +02:00
|
|
|
void NetAddSub::dump_node(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << "Adder (NetAddSub): " << name() << endl;
|
|
|
|
|
dump_node_pins(o, ind+4);
|
1999-10-31 21:08:24 +01:00
|
|
|
dump_obj_attr(o, ind+4);
|
1999-09-03 06:28:38 +02:00
|
|
|
}
|
|
|
|
|
|
1999-11-14 21:24:28 +01:00
|
|
|
void NetCLShift::dump_node(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << "Combinatorial shift (NetCLShift): " <<
|
|
|
|
|
name() << endl;
|
|
|
|
|
dump_node_pins(o, ind+4);
|
|
|
|
|
dump_obj_attr(o, ind+4);
|
|
|
|
|
}
|
|
|
|
|
|
1999-11-15 00:43:45 +01:00
|
|
|
void NetCompare::dump_node(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
2000-01-13 04:35:35 +01:00
|
|
|
o << setw(ind) << "" << "LPM_COMPARE (NetCompare): " << name() << endl;
|
|
|
|
|
dump_node_pins(o, ind+4);
|
|
|
|
|
dump_obj_attr(o, ind+4);
|
|
|
|
|
}
|
|
|
|
|
|
2000-04-01 23:40:22 +02:00
|
|
|
void NetDivide::dump_node(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << "NET_DIVIDE (NetDivide): " << name() << endl;
|
|
|
|
|
dump_node_pins(o, ind+4);
|
|
|
|
|
dump_obj_attr(o, ind+4);
|
|
|
|
|
}
|
|
|
|
|
|
2000-01-13 04:35:35 +01:00
|
|
|
void NetMult::dump_node(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << "LPM_MULT (NetMult): " << name() << endl;
|
1999-11-15 00:43:45 +01:00
|
|
|
dump_node_pins(o, ind+4);
|
|
|
|
|
dump_obj_attr(o, ind+4);
|
|
|
|
|
}
|
|
|
|
|
|
1999-11-04 04:53:26 +01:00
|
|
|
void NetMux::dump_node(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << "Multiplexer (NetMux): " << name() << endl;
|
|
|
|
|
dump_node_pins(o, ind+4);
|
|
|
|
|
dump_obj_attr(o, ind+4);
|
|
|
|
|
}
|
|
|
|
|
|
1998-11-04 00:28:49 +01:00
|
|
|
void NetAssign::dump_node(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
1999-10-07 07:25:33 +02:00
|
|
|
o << setw(ind) << "" << "Procedural assign (NetAssign): " << name();
|
|
|
|
|
if (bmux())
|
|
|
|
|
o << "[" << *bmux() << "]";
|
|
|
|
|
o << " = " << *rval() << endl;
|
1998-11-04 00:28:49 +01:00
|
|
|
dump_node_pins(o, ind+4);
|
|
|
|
|
}
|
|
|
|
|
|
1999-06-06 22:45:38 +02:00
|
|
|
void NetAssignNB::dump_node(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
1999-10-07 07:25:33 +02:00
|
|
|
if (bmux())
|
1999-09-01 00:38:29 +02:00
|
|
|
o << setw(ind) << "" << "Procedural NB assign (NetAssignNB): "
|
1999-10-07 07:25:33 +02:00
|
|
|
<< name() << "[" << *bmux() << "] <= " << *rval() << endl;
|
1999-06-06 22:45:38 +02:00
|
|
|
else
|
1999-09-01 00:38:29 +02:00
|
|
|
o << setw(ind) << "" << "Procedural NB assign (NetAssignNB): "
|
1999-10-06 07:06:16 +02:00
|
|
|
<< name() << " <= " << *rval() << endl;
|
1999-06-06 22:45:38 +02:00
|
|
|
dump_node_pins(o, ind+4);
|
|
|
|
|
}
|
|
|
|
|
|
1998-11-04 00:28:49 +01:00
|
|
|
void NetBUFZ::dump_node(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
1999-09-01 00:38:29 +02:00
|
|
|
o << setw(ind) << "" << "NetBUFZ: " << name() << endl;
|
1998-11-04 00:28:49 +01:00
|
|
|
dump_node_pins(o, ind+4);
|
|
|
|
|
}
|
|
|
|
|
|
1999-10-10 03:59:54 +02:00
|
|
|
void NetCaseCmp::dump_node(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << "case compare === : " << name() << endl;
|
|
|
|
|
dump_node_pins(o, ind+4);
|
|
|
|
|
}
|
|
|
|
|
|
1998-11-09 19:55:33 +01:00
|
|
|
void NetConst::dump_node(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
1999-12-17 04:38:46 +01:00
|
|
|
o << setw(ind) << "" << "constant ";
|
|
|
|
|
for (unsigned idx = pin_count() ; idx > 0 ; idx -= 1)
|
|
|
|
|
o << value_[idx-1];
|
|
|
|
|
o << ": " << name() << endl;
|
1998-11-09 19:55:33 +01:00
|
|
|
dump_node_pins(o, ind+4);
|
|
|
|
|
}
|
|
|
|
|
|
1999-11-01 03:07:40 +01:00
|
|
|
void NetFF::dump_node(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << "LPM_FF: " << name() << endl;
|
|
|
|
|
dump_node_pins(o, ind+4);
|
|
|
|
|
dump_obj_attr(o, ind+4);
|
|
|
|
|
}
|
|
|
|
|
|
1998-11-04 00:28:49 +01:00
|
|
|
void NetLogic::dump_node(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << "logic: ";
|
|
|
|
|
switch (type_) {
|
|
|
|
|
case AND:
|
|
|
|
|
o << "and";
|
|
|
|
|
break;
|
1998-12-07 05:53:16 +01:00
|
|
|
case BUF:
|
|
|
|
|
o << "buf";
|
|
|
|
|
break;
|
1999-02-15 03:06:15 +01:00
|
|
|
case BUFIF0:
|
|
|
|
|
o << "bufif0";
|
|
|
|
|
break;
|
|
|
|
|
case BUFIF1:
|
|
|
|
|
o << "bufif1";
|
|
|
|
|
break;
|
1998-11-04 00:28:49 +01:00
|
|
|
case NAND:
|
|
|
|
|
o << "nand";
|
|
|
|
|
break;
|
|
|
|
|
case NOR:
|
|
|
|
|
o << "nor";
|
|
|
|
|
break;
|
|
|
|
|
case NOT:
|
|
|
|
|
o << "not";
|
|
|
|
|
break;
|
|
|
|
|
case OR:
|
|
|
|
|
o << "or";
|
|
|
|
|
break;
|
1998-11-09 19:55:33 +01:00
|
|
|
case XNOR:
|
|
|
|
|
o << "xnor";
|
|
|
|
|
break;
|
1998-11-04 00:28:49 +01:00
|
|
|
case XOR:
|
|
|
|
|
o << "xor";
|
|
|
|
|
break;
|
|
|
|
|
}
|
1999-08-01 18:34:50 +02:00
|
|
|
o << " #(" << rise_time()
|
|
|
|
|
<< "," << fall_time() << "," << decay_time() << ") " << name()
|
1998-11-04 00:28:49 +01:00
|
|
|
<< endl;
|
|
|
|
|
|
|
|
|
|
dump_node_pins(o, ind+4);
|
1998-12-01 01:42:13 +01:00
|
|
|
dump_obj_attr(o, ind+4);
|
|
|
|
|
}
|
|
|
|
|
|
1999-11-21 01:13:08 +01:00
|
|
|
void NetRamDq::dump_node(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << "LPM_RAM_DQ (" << mem_->name() << "): "
|
|
|
|
|
<< name() << endl;
|
|
|
|
|
dump_node_pins(o, ind+4);
|
|
|
|
|
dump_obj_attr(o, ind+4);
|
|
|
|
|
}
|
|
|
|
|
|
1999-07-03 04:12:51 +02:00
|
|
|
void NetTaskDef::dump(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << "task " << name_ << ";" << endl;
|
1999-07-24 04:11:19 +02:00
|
|
|
|
|
|
|
|
for (unsigned idx = 0 ; idx < ports_.count() ; idx += 1) {
|
|
|
|
|
o << setw(ind+4) << "";
|
|
|
|
|
switch (ports_[idx]->port_type()) {
|
|
|
|
|
case NetNet::PINPUT:
|
|
|
|
|
o << "input ";
|
|
|
|
|
break;
|
|
|
|
|
case NetNet::POUTPUT:
|
|
|
|
|
o << "output ";
|
|
|
|
|
break;
|
|
|
|
|
case NetNet::PINOUT:
|
|
|
|
|
o << "input ";
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
o << "NOT_A_PORT ";
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
o << ports_[idx]->name() << ";" << endl;
|
|
|
|
|
}
|
|
|
|
|
|
1999-07-03 04:12:51 +02:00
|
|
|
proc_->dump(o, ind+4);
|
1999-07-24 04:11:19 +02:00
|
|
|
|
1999-07-03 04:12:51 +02:00
|
|
|
o << setw(ind) << "" << "endtask" << endl;
|
|
|
|
|
}
|
|
|
|
|
|
1998-12-14 03:01:34 +01:00
|
|
|
void NetUDP::dump_sequ_(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
string tmp = "";
|
|
|
|
|
for (unsigned idx = 0 ; idx < ind ; idx += 1)
|
|
|
|
|
tmp += " ";
|
|
|
|
|
|
1999-08-01 18:34:50 +02:00
|
|
|
o << tmp << "Sequential UDP" << " #(" << rise_time() <<
|
|
|
|
|
"," << fall_time() << "," << decay_time() << ") " << name() <<
|
1998-12-14 03:01:34 +01:00
|
|
|
endl;
|
|
|
|
|
|
|
|
|
|
for (FSM_::const_iterator ent = fsm_.begin()
|
|
|
|
|
; ent != fsm_.end() ; ent++) {
|
|
|
|
|
o << setw(ind+6) << "" << (*ent).first << " -->";
|
|
|
|
|
|
|
|
|
|
state_t_*st = (*ent).second;
|
|
|
|
|
assert((*ent).first[0] == st->out);
|
|
|
|
|
for (unsigned idx = 1 ; idx < pin_count() ; idx += 1) {
|
|
|
|
|
string tmp = (*ent).first;
|
|
|
|
|
if (st->pins[idx].zer) {
|
|
|
|
|
tmp[0] = st->pins[idx].zer->out;
|
|
|
|
|
tmp[idx] = '0';
|
|
|
|
|
o << " " << tmp;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (st->pins[idx].one) {
|
|
|
|
|
tmp[0] = st->pins[idx].one->out;
|
|
|
|
|
tmp[idx] = '1';
|
|
|
|
|
o << " " << tmp;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (st->pins[idx].xxx) {
|
|
|
|
|
tmp[0] = st->pins[idx].xxx->out;
|
|
|
|
|
tmp[idx] = 'x';
|
|
|
|
|
o << " " << tmp;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
o << endl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
o << setw(ind+6) << "" << "initial value == " << init_ << endl;
|
|
|
|
|
|
|
|
|
|
dump_node_pins(o, ind+4);
|
|
|
|
|
dump_obj_attr(o, ind+4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetUDP::dump_comb_(ostream&o, unsigned ind) const
|
1998-12-01 01:42:13 +01:00
|
|
|
{
|
2000-03-29 06:37:10 +02:00
|
|
|
assert(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetUDP::dump_node(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
if (sequential_)
|
|
|
|
|
dump_sequ_(o, ind);
|
|
|
|
|
else
|
|
|
|
|
dump_comb_(o, ind);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetUDP_COMB::dump_node(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << "Combinational primitive: ";
|
1999-08-01 18:34:50 +02:00
|
|
|
o << " #(" << rise_time() << "," << fall_time() << "," << decay_time() <<
|
1998-12-01 01:42:13 +01:00
|
|
|
") " << name() << endl;
|
|
|
|
|
|
2000-03-29 06:37:10 +02:00
|
|
|
for (map<string,char>::const_iterator ent = cm_.begin()
|
1999-11-04 02:12:41 +01:00
|
|
|
; ent != cm_.end() ; ent++) {
|
|
|
|
|
o << setw(ind+6) << "" << (*ent).first << " --> " <<
|
|
|
|
|
(*ent).second << endl;
|
|
|
|
|
}
|
|
|
|
|
|
1998-12-01 01:42:13 +01:00
|
|
|
dump_node_pins(o, ind+4);
|
|
|
|
|
dump_obj_attr(o, ind+4);
|
1998-11-04 00:28:49 +01:00
|
|
|
}
|
|
|
|
|
|
1999-05-01 04:57:52 +02:00
|
|
|
void NetNEvent::dump_node(ostream&o, unsigned ind) const
|
1998-11-04 00:28:49 +01:00
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << "event: ";
|
|
|
|
|
switch (edge_) {
|
|
|
|
|
case ANYEDGE:
|
1999-05-01 22:43:55 +02:00
|
|
|
o << "anyedge ";
|
1998-11-04 00:28:49 +01:00
|
|
|
break;
|
|
|
|
|
case POSEDGE:
|
|
|
|
|
o << "posedge ";
|
|
|
|
|
break;
|
|
|
|
|
case NEGEDGE:
|
|
|
|
|
o << "negedge ";
|
|
|
|
|
break;
|
1998-11-09 19:55:33 +01:00
|
|
|
case POSITIVE:
|
|
|
|
|
o << "positive ";
|
|
|
|
|
break;
|
1998-11-04 00:28:49 +01:00
|
|
|
}
|
|
|
|
|
|
2000-04-02 06:26:06 +02:00
|
|
|
o << name() << " --> " << event_->name() << endl;
|
1998-11-04 00:28:49 +01:00
|
|
|
|
|
|
|
|
dump_node_pins(o, ind+4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetProcTop::dump(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
switch (type_) {
|
|
|
|
|
case NetProcTop::KINITIAL:
|
1999-02-01 01:26:48 +01:00
|
|
|
o << "initial /* " << get_line() << " */" << endl;
|
1998-11-04 00:28:49 +01:00
|
|
|
break;
|
|
|
|
|
case NetProcTop::KALWAYS:
|
1999-02-01 01:26:48 +01:00
|
|
|
o << "always /* " << get_line() << " */" << endl;
|
1998-11-04 00:28:49 +01:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
statement_->dump(o, ind+2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Dump an assignment statement */
|
|
|
|
|
void NetAssign::dump(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
1998-11-23 01:20:22 +01:00
|
|
|
o << setw(ind) << "";
|
|
|
|
|
|
1999-10-07 07:25:33 +02:00
|
|
|
if (bmux()) {
|
|
|
|
|
o << name() << "[" << *bmux() << "] = ";
|
|
|
|
|
if (rise_time())
|
|
|
|
|
o << "#" << rise_time() << " ";
|
|
|
|
|
o << *rval() << ";" << endl;
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
o << name() << " = ";
|
|
|
|
|
if (rise_time())
|
|
|
|
|
o << "#" << rise_time() << " ";
|
|
|
|
|
o << *rval() << ";" << endl;
|
|
|
|
|
}
|
1998-11-04 00:28:49 +01:00
|
|
|
}
|
|
|
|
|
|
1999-06-06 22:45:38 +02:00
|
|
|
void NetAssignNB::dump(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "";
|
|
|
|
|
|
1999-10-07 07:25:33 +02:00
|
|
|
if (bmux()) {
|
|
|
|
|
o << name() << "[" << *bmux() << "] <= ";
|
1999-09-04 21:11:45 +02:00
|
|
|
if (rise_time())
|
|
|
|
|
o << "#" << rise_time() << " ";
|
1999-10-06 07:06:16 +02:00
|
|
|
o << *rval() << ";" << endl;
|
1999-06-06 22:45:38 +02:00
|
|
|
|
|
|
|
|
} else {
|
1999-09-04 21:11:45 +02:00
|
|
|
o << name() << " <= ";
|
|
|
|
|
if (rise_time())
|
|
|
|
|
o << "#" << rise_time() << " ";
|
1999-10-06 07:06:16 +02:00
|
|
|
o << *rval() << ";" << endl;
|
1999-06-06 22:45:38 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
1999-05-10 02:16:57 +02:00
|
|
|
void NetAssignMem::dump(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "";
|
|
|
|
|
o << "/* " << get_line() << " */" << endl;
|
|
|
|
|
o << setw(ind) << "";
|
1999-12-05 03:24:08 +01:00
|
|
|
o << memory()->name() << "[" << index()->name() << "] = ";
|
1999-09-15 03:55:06 +02:00
|
|
|
rval()->dump(o);
|
|
|
|
|
o << ";" << endl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetAssignMemNB::dump(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "";
|
|
|
|
|
o << "/* " << get_line() << " */" << endl;
|
|
|
|
|
o << setw(ind) << "";
|
1999-12-05 03:24:08 +01:00
|
|
|
o << memory()->name() << "[" << index()->name() << "] <= ";
|
1999-09-15 03:55:06 +02:00
|
|
|
rval()->dump(o);
|
1999-05-10 02:16:57 +02:00
|
|
|
o << ";" << endl;
|
|
|
|
|
}
|
|
|
|
|
|
1998-11-04 00:28:49 +01:00
|
|
|
/* Dump a block statement */
|
|
|
|
|
void NetBlock::dump(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << type_ << endl;
|
|
|
|
|
|
|
|
|
|
if (last_) {
|
|
|
|
|
const NetProc*cur = last_;
|
|
|
|
|
do {
|
|
|
|
|
cur = cur->next_;
|
|
|
|
|
cur->dump(o, ind+4);
|
|
|
|
|
} while (cur != last_);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
o << setw(ind) << "" << "end" << endl;
|
|
|
|
|
}
|
|
|
|
|
|
1999-02-03 05:20:11 +01:00
|
|
|
void NetCase::dump(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
1999-09-29 20:36:02 +02:00
|
|
|
switch (type_) {
|
|
|
|
|
case EQ:
|
|
|
|
|
o << setw(ind) << "" << "case (" << *expr_ << ")" << endl;
|
1999-10-08 04:00:35 +02:00
|
|
|
break;
|
1999-09-29 20:36:02 +02:00
|
|
|
case EQX:
|
|
|
|
|
o << setw(ind) << "" << "casex (" << *expr_ << ")" << endl;
|
1999-10-08 04:00:35 +02:00
|
|
|
break;
|
1999-09-29 20:36:02 +02:00
|
|
|
case EQZ:
|
|
|
|
|
o << setw(ind) << "" << "casez (" << *expr_ << ")" << endl;
|
1999-10-08 04:00:35 +02:00
|
|
|
break;
|
1999-09-29 20:36:02 +02:00
|
|
|
}
|
1999-02-03 05:20:11 +01:00
|
|
|
|
|
|
|
|
for (unsigned idx = 0 ; idx < nitems_ ; idx += 1) {
|
|
|
|
|
o << setw(ind+2) << "";
|
1999-05-30 03:11:46 +02:00
|
|
|
if (items_[idx].guard)
|
|
|
|
|
o << *items_[idx].guard << ":";
|
1999-02-03 05:20:11 +01:00
|
|
|
else
|
|
|
|
|
o << "default:";
|
|
|
|
|
|
|
|
|
|
if (items_[idx].statement) {
|
|
|
|
|
o << endl;
|
|
|
|
|
items_[idx].statement->dump(o, ind+6);
|
|
|
|
|
} else {
|
|
|
|
|
o << " ;" << endl;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
o << setw(ind) << "" << "endcase" << endl;
|
|
|
|
|
}
|
|
|
|
|
|
1998-11-07 18:05:05 +01:00
|
|
|
void NetCondit::dump(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << "if (";
|
|
|
|
|
expr_->dump(o);
|
|
|
|
|
o << ")" << endl;
|
1999-02-15 03:06:15 +01:00
|
|
|
|
|
|
|
|
if (if_) if_->dump(o, ind+4);
|
|
|
|
|
else o << setw(ind+4) << "" << "/* empty */ ;" << endl;
|
|
|
|
|
|
1998-11-07 18:05:05 +01:00
|
|
|
if (else_) {
|
|
|
|
|
o << setw(ind) << "" << "else" << endl;
|
|
|
|
|
else_->dump(o, ind+4);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2000-04-10 07:26:05 +02:00
|
|
|
void NetEvProbe::dump_node(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "";
|
|
|
|
|
|
|
|
|
|
switch (edge_) {
|
|
|
|
|
case ANYEDGE:
|
|
|
|
|
o << "anyedge ";
|
|
|
|
|
break;
|
|
|
|
|
case POSEDGE:
|
|
|
|
|
o << "posedge ";
|
|
|
|
|
break;
|
|
|
|
|
case NEGEDGE:
|
|
|
|
|
o << "negedge ";
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
o << setw(ind) << "" << "-> " << event_->full_name() << "; " << endl;
|
|
|
|
|
dump_node_pins(o, ind+4);
|
|
|
|
|
dump_obj_attr(o, ind+4);
|
|
|
|
|
}
|
|
|
|
|
|
2000-04-04 05:20:15 +02:00
|
|
|
void NetEvTrig::dump(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << "-> " << event_->name() << "; "
|
|
|
|
|
<< "// " << get_line() << endl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetEvWait::dump(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
2000-04-12 06:23:57 +02:00
|
|
|
assert(nevents() > 0);
|
|
|
|
|
o << setw(ind) <<"" << "@(" << event(0)->name();
|
|
|
|
|
|
|
|
|
|
for (unsigned idx = 1 ; idx < nevents() ; idx += 1)
|
|
|
|
|
o << " or " << event(idx)->name();
|
|
|
|
|
|
|
|
|
|
o << ") // " << get_line() << endl;
|
|
|
|
|
|
2000-04-04 05:20:15 +02:00
|
|
|
if (statement_)
|
|
|
|
|
statement_->dump(o, ind+2);
|
|
|
|
|
else
|
|
|
|
|
o << setw(ind+2) << "" << "/* noop */ ;" << endl;
|
|
|
|
|
}
|
|
|
|
|
|
1999-06-19 23:06:16 +02:00
|
|
|
void NetForever::dump(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << "forever" << endl;
|
|
|
|
|
statement_->dump(o, ind+2);
|
|
|
|
|
}
|
|
|
|
|
|
1999-08-26 00:22:41 +02:00
|
|
|
void NetFuncDef::dump(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
2000-03-08 05:36:53 +01:00
|
|
|
o << setw(ind) << "" << "function " << scope_->name() << endl;
|
1999-09-01 22:46:19 +02:00
|
|
|
if (statement_)
|
|
|
|
|
statement_->dump(o, ind+2);
|
|
|
|
|
else
|
|
|
|
|
o << setw(ind+2) << "" << "// NO STATEMENT" << endl;
|
1999-08-26 00:22:41 +02:00
|
|
|
}
|
|
|
|
|
|
1998-11-04 00:28:49 +01:00
|
|
|
void NetPDelay::dump(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
1999-05-06 04:29:32 +02:00
|
|
|
o << setw(ind) << "" << "#" << delay_;
|
1999-05-05 05:04:46 +02:00
|
|
|
if (statement_) {
|
|
|
|
|
o << endl;
|
|
|
|
|
statement_->dump(o, ind+2);
|
|
|
|
|
} else {
|
|
|
|
|
o << " /* noop */;" << endl;
|
|
|
|
|
}
|
1998-11-04 00:28:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetPEvent::dump(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
1999-05-01 04:57:52 +02:00
|
|
|
o << setw(ind) << "" << "@(";
|
2000-04-02 06:26:06 +02:00
|
|
|
|
|
|
|
|
if (src_) {
|
|
|
|
|
const NetNEvent*cur = src_;
|
|
|
|
|
for (cur = src_->next_ ; cur ; cur = cur->next_) {
|
|
|
|
|
o << " or ";
|
|
|
|
|
cur->dump_proc(o);
|
|
|
|
|
}
|
1998-11-04 00:28:49 +01:00
|
|
|
}
|
2000-04-02 06:26:06 +02:00
|
|
|
|
1999-05-01 04:57:52 +02:00
|
|
|
o << ") /* " << name_ << " */";
|
1998-11-04 00:28:49 +01:00
|
|
|
|
1999-02-01 01:26:48 +01:00
|
|
|
if (statement_) {
|
|
|
|
|
o << endl;
|
|
|
|
|
statement_->dump(o, ind+2);
|
|
|
|
|
} else {
|
|
|
|
|
o << " /* noop */;" << endl;
|
|
|
|
|
}
|
1998-11-04 00:28:49 +01:00
|
|
|
}
|
|
|
|
|
|
1999-05-01 04:57:52 +02:00
|
|
|
void NetNEvent::dump_proc(ostream&o) const
|
|
|
|
|
{
|
|
|
|
|
switch (edge_) {
|
|
|
|
|
case ANYEDGE:
|
|
|
|
|
o << "anyedge ";
|
|
|
|
|
break;
|
|
|
|
|
case POSEDGE:
|
|
|
|
|
o << "posedge ";
|
|
|
|
|
break;
|
|
|
|
|
case NEGEDGE:
|
|
|
|
|
o << "negedge ";
|
|
|
|
|
break;
|
|
|
|
|
case POSITIVE:
|
|
|
|
|
o << "positive ";
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
o << name();
|
|
|
|
|
}
|
1998-11-04 00:28:49 +01:00
|
|
|
|
1999-07-03 04:12:51 +02:00
|
|
|
void NetRepeat::dump(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << "repeat (" << *expr_ << ")" << endl;
|
|
|
|
|
statement_->dump(o, ind+2);
|
|
|
|
|
}
|
|
|
|
|
|
1999-11-24 05:01:58 +01:00
|
|
|
void NetScope::dump(ostream&o) const
|
|
|
|
|
{
|
2000-01-10 02:35:23 +01:00
|
|
|
o << name();
|
1999-11-27 20:07:57 +01:00
|
|
|
switch (type_) {
|
|
|
|
|
case BEGIN_END:
|
|
|
|
|
o << " sequential block";
|
|
|
|
|
break;
|
|
|
|
|
case FORK_JOIN:
|
|
|
|
|
o << " parallel block";
|
|
|
|
|
break;
|
2000-03-08 05:36:53 +01:00
|
|
|
case FUNC:
|
|
|
|
|
o << " function";
|
|
|
|
|
break;
|
1999-11-27 20:07:57 +01:00
|
|
|
case MODULE:
|
|
|
|
|
o << " module";
|
|
|
|
|
break;
|
2000-03-08 05:36:53 +01:00
|
|
|
case TASK:
|
|
|
|
|
o << " task";
|
|
|
|
|
break;
|
1999-11-27 20:07:57 +01:00
|
|
|
}
|
|
|
|
|
o << endl;
|
2000-03-08 05:36:53 +01:00
|
|
|
|
|
|
|
|
/* Dump the parameters for this scope. */
|
|
|
|
|
{
|
|
|
|
|
map<string,NetExpr*>::const_iterator pp;
|
|
|
|
|
for (pp = parameters_.begin()
|
|
|
|
|
; pp != parameters_.end() ; pp ++) {
|
|
|
|
|
o << " parameter " << (*pp).first << " = " <<
|
|
|
|
|
*(*pp).second << ";" << endl;
|
|
|
|
|
}
|
2000-03-12 18:09:40 +01:00
|
|
|
|
|
|
|
|
for (pp = localparams_.begin()
|
|
|
|
|
; pp != localparams_.end() ; pp ++) {
|
|
|
|
|
o << " localparam " << (*pp).first << " = " <<
|
|
|
|
|
*(*pp).second << ";" << endl;
|
|
|
|
|
}
|
2000-03-08 05:36:53 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Dump the saved defparam assignments here. */
|
|
|
|
|
{
|
|
|
|
|
map<string,NetExpr*>::const_iterator pp;
|
|
|
|
|
for (pp = defparams.begin()
|
|
|
|
|
; pp != defparams.end() ; pp ++ ) {
|
|
|
|
|
o << " defparam " << (*pp).first << " = " <<
|
|
|
|
|
*(*pp).second << ";" << endl;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2000-04-04 05:20:15 +02:00
|
|
|
/* Dump the events in this scope. */
|
|
|
|
|
for (NetEvent*cur = events_ ; cur ; cur = cur->snext_) {
|
|
|
|
|
o << " event " << cur->name() << "; "
|
|
|
|
|
<< "// " << cur->get_line() << endl;
|
|
|
|
|
}
|
|
|
|
|
|
2000-03-08 05:36:53 +01:00
|
|
|
/* Dump any sub-scopes. */
|
|
|
|
|
for (NetScope*cur = sub_ ; cur ; cur = cur->sib_)
|
|
|
|
|
cur->dump(o);
|
1999-11-24 05:01:58 +01:00
|
|
|
}
|
|
|
|
|
|
1999-07-03 04:12:51 +02:00
|
|
|
void NetSTask::dump(ostream&o, unsigned ind) const
|
1998-11-04 00:28:49 +01:00
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << name_;
|
|
|
|
|
|
1999-07-03 04:12:51 +02:00
|
|
|
if (parms_.count() > 0) {
|
1998-11-04 00:28:49 +01:00
|
|
|
o << "(";
|
1999-05-30 03:11:46 +02:00
|
|
|
if (parms_[0])
|
1998-11-04 00:28:49 +01:00
|
|
|
parms_[0]->dump(o);
|
|
|
|
|
|
1999-07-03 04:12:51 +02:00
|
|
|
for (unsigned idx = 1 ; idx < parms_.count() ; idx += 1) {
|
1998-11-04 00:28:49 +01:00
|
|
|
o << ", ";
|
1999-05-30 03:11:46 +02:00
|
|
|
if (parms_[idx])
|
1998-11-04 00:28:49 +01:00
|
|
|
parms_[idx]->dump(o);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
o << ")";
|
|
|
|
|
}
|
|
|
|
|
o << ";" << endl;
|
|
|
|
|
}
|
|
|
|
|
|
1999-07-03 04:12:51 +02:00
|
|
|
void NetUTask::dump(ostream&o, unsigned ind) const
|
1999-06-19 23:06:16 +02:00
|
|
|
{
|
1999-07-24 04:11:19 +02:00
|
|
|
o << setw(ind) << "" << task_->name() << ";" << endl;
|
1999-06-19 23:06:16 +02:00
|
|
|
}
|
|
|
|
|
|
1998-11-09 19:55:33 +01:00
|
|
|
void NetWhile::dump(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
1999-05-30 03:11:46 +02:00
|
|
|
o << setw(ind) << "" << "while (" << *cond_ << ")" << endl;
|
1998-11-09 19:55:33 +01:00
|
|
|
proc_->dump(o, ind+3);
|
|
|
|
|
}
|
|
|
|
|
|
1998-11-04 00:28:49 +01:00
|
|
|
/* Dump a statement type that someone didn't write a dump for. */
|
|
|
|
|
void NetProc::dump(ostream&o, unsigned ind) const
|
|
|
|
|
{
|
|
|
|
|
o << setw(ind) << "" << "// " << typeid(*this).name() << endl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Dump an expression that noone wrote a dump method for. */
|
|
|
|
|
void NetExpr::dump(ostream&o) const
|
|
|
|
|
{
|
|
|
|
|
o << "(?)";
|
|
|
|
|
}
|
|
|
|
|
|
1998-11-07 18:05:05 +01:00
|
|
|
void NetEBinary::dump(ostream&o) const
|
|
|
|
|
{
|
|
|
|
|
o << "(";
|
|
|
|
|
left_->dump(o);
|
|
|
|
|
o << ")";
|
|
|
|
|
switch (op_) {
|
|
|
|
|
default:
|
|
|
|
|
o << op_;
|
|
|
|
|
break;
|
1999-03-15 03:43:32 +01:00
|
|
|
case 'a':
|
|
|
|
|
o << "&&";
|
|
|
|
|
break;
|
1999-05-17 06:53:47 +02:00
|
|
|
case 'E':
|
|
|
|
|
o << "===";
|
|
|
|
|
break;
|
1998-11-07 18:05:05 +01:00
|
|
|
case 'e':
|
|
|
|
|
o << "==";
|
|
|
|
|
break;
|
1999-05-17 06:53:47 +02:00
|
|
|
case 'G':
|
|
|
|
|
o << ">=";
|
|
|
|
|
break;
|
|
|
|
|
case 'l':
|
|
|
|
|
o << "<<";
|
|
|
|
|
break;
|
|
|
|
|
case 'L':
|
|
|
|
|
o << "<=";
|
|
|
|
|
break;
|
1998-11-09 19:55:33 +01:00
|
|
|
case 'n':
|
|
|
|
|
o << "!=";
|
|
|
|
|
break;
|
1999-05-17 06:53:47 +02:00
|
|
|
case 'N':
|
|
|
|
|
o << "!==";
|
|
|
|
|
break;
|
1999-03-15 03:43:32 +01:00
|
|
|
case 'o':
|
|
|
|
|
o << "||";
|
|
|
|
|
break;
|
1999-09-30 04:43:01 +02:00
|
|
|
case 'O':
|
|
|
|
|
o << "~|";
|
|
|
|
|
break;
|
1999-05-17 06:53:47 +02:00
|
|
|
case 'r':
|
|
|
|
|
o << ">>";
|
|
|
|
|
break;
|
1999-09-30 04:43:01 +02:00
|
|
|
case 'X':
|
|
|
|
|
o << "~^";
|
|
|
|
|
break;
|
1998-11-07 18:05:05 +01:00
|
|
|
}
|
|
|
|
|
o << "(";
|
|
|
|
|
right_->dump(o);
|
|
|
|
|
o << ")";
|
|
|
|
|
}
|
|
|
|
|
|
1999-06-09 05:00:05 +02:00
|
|
|
void NetEConcat::dump(ostream&o) const
|
|
|
|
|
{
|
1999-09-19 03:06:36 +02:00
|
|
|
if (repeat_ != 1)
|
|
|
|
|
o << repeat_;
|
|
|
|
|
|
1999-09-21 02:13:40 +02:00
|
|
|
if (parms_[0])
|
|
|
|
|
o << "{" << *parms_[0];
|
|
|
|
|
else
|
|
|
|
|
o << "{";
|
|
|
|
|
|
|
|
|
|
for (unsigned idx = 1 ; idx < parms_.count() ; idx += 1) {
|
|
|
|
|
if (parms_[idx])
|
|
|
|
|
o << ", " << *parms_[idx];
|
|
|
|
|
else
|
|
|
|
|
o << ", ";
|
|
|
|
|
}
|
1999-06-09 05:00:05 +02:00
|
|
|
o << "}";
|
|
|
|
|
}
|
|
|
|
|
|
1998-11-04 00:28:49 +01:00
|
|
|
void NetEConst::dump(ostream&o) const
|
|
|
|
|
{
|
|
|
|
|
if (value_.is_string())
|
|
|
|
|
o << "\"" << value_.as_string() << "\"";
|
|
|
|
|
else
|
|
|
|
|
o << value_;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetEIdent::dump(ostream&o) const
|
|
|
|
|
{
|
|
|
|
|
o << name_;
|
|
|
|
|
}
|
|
|
|
|
|
1999-11-27 20:07:57 +01:00
|
|
|
void NetEScope::dump(ostream&o) const
|
|
|
|
|
{
|
|
|
|
|
o << "<scope=" << scope_->name() << ">";
|
|
|
|
|
}
|
|
|
|
|
|
1998-11-07 18:05:05 +01:00
|
|
|
void NetESignal::dump(ostream&o) const
|
|
|
|
|
{
|
1999-02-08 03:49:56 +01:00
|
|
|
o << name();
|
|
|
|
|
}
|
|
|
|
|
|
1999-04-25 02:44:10 +02:00
|
|
|
void NetESubSignal::dump(ostream&o) const
|
|
|
|
|
{
|
|
|
|
|
sig_->dump(o);
|
|
|
|
|
o << "[";
|
|
|
|
|
idx_->dump(o);
|
|
|
|
|
o << "]";
|
|
|
|
|
}
|
|
|
|
|
|
1999-04-19 03:59:36 +02:00
|
|
|
void NetEMemory::dump(ostream&o) const
|
|
|
|
|
{
|
|
|
|
|
o << mem_->name() << "[";
|
1999-12-12 07:03:14 +01:00
|
|
|
if (idx_) idx_->dump(o);
|
1999-04-19 03:59:36 +02:00
|
|
|
o << "]";
|
|
|
|
|
}
|
|
|
|
|
|
1999-09-20 04:21:10 +02:00
|
|
|
void NetEParam::dump(ostream&o) const
|
|
|
|
|
{
|
2000-03-08 05:36:53 +01:00
|
|
|
o << "<" << scope_->name() << "." << name_ << ">";
|
1999-09-20 04:21:10 +02:00
|
|
|
}
|
|
|
|
|
|
1999-07-17 21:50:59 +02:00
|
|
|
void NetETernary::dump(ostream&o) const
|
|
|
|
|
{
|
1999-11-04 04:53:26 +01:00
|
|
|
o << "(" << *cond_ << ") ? (" << *true_val_ << ") : (" <<
|
|
|
|
|
*false_val_ << ")";
|
1999-07-17 21:50:59 +02:00
|
|
|
}
|
|
|
|
|
|
1999-09-01 00:38:29 +02:00
|
|
|
void NetEUFunc::dump(ostream&o) const
|
|
|
|
|
{
|
|
|
|
|
o << name() << "(";
|
|
|
|
|
assert(parms_.count() > 0);
|
|
|
|
|
parms_[0]->dump(o);
|
|
|
|
|
for (unsigned idx = 1 ; idx < parms_.count() ; idx += 1) {
|
|
|
|
|
o << ", ";
|
|
|
|
|
parms_[idx]->dump(o);
|
|
|
|
|
}
|
|
|
|
|
o << ")";
|
|
|
|
|
}
|
|
|
|
|
|
1998-11-04 00:28:49 +01:00
|
|
|
void NetEUnary::dump(ostream&o) const
|
|
|
|
|
{
|
1999-10-05 08:19:46 +02:00
|
|
|
switch (op_) {
|
|
|
|
|
case 'N':
|
|
|
|
|
o << "~|";
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
o << op_;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
o << "(";
|
1998-11-04 00:28:49 +01:00
|
|
|
expr_->dump(o);
|
|
|
|
|
o << ")";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Design::dump(ostream&o) const
|
|
|
|
|
{
|
1999-11-24 05:01:58 +01:00
|
|
|
o << "SCOPES:" << endl;
|
2000-03-08 05:36:53 +01:00
|
|
|
root_scope_->dump(o);
|
1998-11-04 00:28:49 +01:00
|
|
|
|
|
|
|
|
o << "ELABORATED SIGNALS:" << endl;
|
|
|
|
|
|
|
|
|
|
// Dump the signals,
|
1999-06-15 07:38:15 +02:00
|
|
|
if (signals_) {
|
1998-11-04 00:28:49 +01:00
|
|
|
NetNet*cur = signals_->sig_next_;
|
|
|
|
|
do {
|
|
|
|
|
cur->dump_net(o, 0);
|
|
|
|
|
cur = cur->sig_next_;
|
|
|
|
|
} while (cur != signals_->sig_next_);
|
|
|
|
|
}
|
|
|
|
|
|
1999-04-19 03:59:36 +02:00
|
|
|
o << "ELABORATED MEMORIES:" << endl;
|
|
|
|
|
{
|
|
|
|
|
map<string,NetMemory*>::const_iterator pp;
|
|
|
|
|
for (pp = memories_.begin()
|
|
|
|
|
; pp != memories_.end() ; pp ++) {
|
|
|
|
|
(*pp).second->dump(o, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
1999-09-01 00:38:29 +02:00
|
|
|
o << "ELABORATED FUNCTION DEFINITIONS:" << endl;
|
|
|
|
|
{
|
|
|
|
|
map<string,NetFuncDef*>::const_iterator pp;
|
|
|
|
|
for (pp = funcs_.begin()
|
|
|
|
|
; pp != funcs_.end() ; pp ++) {
|
|
|
|
|
(*pp).second->dump(o, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
1999-07-03 04:12:51 +02:00
|
|
|
o << "ELABORATED TASK DEFINITIONS:" << endl;
|
|
|
|
|
{
|
|
|
|
|
map<string,NetTaskDef*>::const_iterator pp;
|
|
|
|
|
for (pp = tasks_.begin()
|
|
|
|
|
; pp != tasks_.end() ; pp ++) {
|
|
|
|
|
(*pp).second->dump(o, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
1998-11-04 00:28:49 +01:00
|
|
|
o << "ELABORATED NODES:" << endl;
|
|
|
|
|
|
|
|
|
|
// dump the nodes,
|
1999-06-15 07:38:15 +02:00
|
|
|
if (nodes_) {
|
1998-11-04 00:28:49 +01:00
|
|
|
NetNode*cur = nodes_->node_next_;
|
|
|
|
|
do {
|
|
|
|
|
cur->dump_node(o, 0);
|
|
|
|
|
cur = cur->node_next_;
|
|
|
|
|
} while (cur != nodes_->node_next_);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
o << "ELABORATED PROCESSES:" << endl;
|
|
|
|
|
|
|
|
|
|
// Dump the processes.
|
|
|
|
|
for (const NetProcTop*idx = procs_ ; idx ; idx = idx->next_)
|
|
|
|
|
idx->dump(o, 0);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* $Log: design_dump.cc,v $
|
2000-04-12 06:23:57 +02:00
|
|
|
* Revision 1.75 2000/04/12 04:23:57 steve
|
|
|
|
|
* Named events really should be expressed with PEIdent
|
|
|
|
|
* objects in the pform,
|
|
|
|
|
*
|
|
|
|
|
* Handle named events within the mix of net events
|
|
|
|
|
* and edges. As a unified lot they get caught together.
|
|
|
|
|
* wait statements are broken into more complex statements
|
|
|
|
|
* that include a conditional.
|
|
|
|
|
*
|
|
|
|
|
* Do not generate NetPEvent or NetNEvent objects in
|
|
|
|
|
* elaboration. NetEvent, NetEvWait and NetEvProbe
|
|
|
|
|
* take over those functions in the netlist.
|
|
|
|
|
*
|
2000-04-10 07:26:05 +02:00
|
|
|
* Revision 1.74 2000/04/10 05:26:05 steve
|
|
|
|
|
* All events now use the NetEvent class.
|
|
|
|
|
*
|
2000-04-04 05:20:15 +02:00
|
|
|
* Revision 1.73 2000/04/04 03:20:15 steve
|
|
|
|
|
* Simulate named event trigger and waits.
|
|
|
|
|
*
|
2000-04-02 06:26:06 +02:00
|
|
|
* Revision 1.72 2000/04/02 04:26:06 steve
|
|
|
|
|
* Remove the useless sref template.
|
|
|
|
|
*
|
2000-04-01 23:40:22 +02:00
|
|
|
* Revision 1.71 2000/04/01 21:40:22 steve
|
|
|
|
|
* Add support for integer division.
|
|
|
|
|
*
|
2000-03-29 06:37:10 +02:00
|
|
|
* Revision 1.70 2000/03/29 04:37:10 steve
|
|
|
|
|
* New and improved combinational primitives.
|
|
|
|
|
*
|
2000-03-12 18:09:40 +01:00
|
|
|
* Revision 1.69 2000/03/12 17:09:40 steve
|
|
|
|
|
* Support localparam.
|
|
|
|
|
*
|
2000-03-08 05:36:53 +01:00
|
|
|
* Revision 1.68 2000/03/08 04:36:53 steve
|
|
|
|
|
* Redesign the implementation of scopes and parameters.
|
|
|
|
|
* I now generate the scopes and notice the parameters
|
|
|
|
|
* in a separate pass over the pform. Once the scopes
|
|
|
|
|
* are generated, I can process overrides and evalutate
|
|
|
|
|
* paremeters before elaboration begins.
|
|
|
|
|
*
|
2000-02-23 03:56:53 +01:00
|
|
|
* Revision 1.67 2000/02/23 02:56:54 steve
|
|
|
|
|
* Macintosh compilers do not support ident.
|
|
|
|
|
*
|
2000-01-13 04:35:35 +01:00
|
|
|
* Revision 1.66 2000/01/13 03:35:35 steve
|
|
|
|
|
* Multiplication all the way to simulation.
|
|
|
|
|
*
|
2000-01-10 02:35:23 +01:00
|
|
|
* Revision 1.65 2000/01/10 01:35:23 steve
|
|
|
|
|
* Elaborate parameters afer binding of overrides.
|
|
|
|
|
*
|
1999-12-17 04:38:46 +01:00
|
|
|
* Revision 1.64 1999/12/17 03:38:46 steve
|
|
|
|
|
* NetConst can now hold wide constants.
|
|
|
|
|
*
|
1999-12-12 07:03:14 +01:00
|
|
|
* Revision 1.63 1999/12/12 06:03:14 steve
|
|
|
|
|
* Allow memories without indices in expressions.
|
|
|
|
|
*
|
1999-12-05 03:24:08 +01:00
|
|
|
* Revision 1.62 1999/12/05 02:24:08 steve
|
|
|
|
|
* Synthesize LPM_RAM_DQ for writes into memories.
|
|
|
|
|
*
|
1999-11-29 00:42:02 +01:00
|
|
|
* Revision 1.61 1999/11/28 23:42:02 steve
|
|
|
|
|
* NetESignal object no longer need to be NetNode
|
|
|
|
|
* objects. Let them keep a pointer to NetNet objects.
|
|
|
|
|
*
|
1999-11-27 20:07:57 +01:00
|
|
|
* Revision 1.60 1999/11/27 19:07:57 steve
|
|
|
|
|
* Support the creation of scopes.
|
|
|
|
|
*
|
1999-11-24 05:01:58 +01:00
|
|
|
* Revision 1.59 1999/11/24 04:01:58 steve
|
|
|
|
|
* Detect and list scope names.
|
|
|
|
|
*
|
1999-11-21 01:13:08 +01:00
|
|
|
* Revision 1.58 1999/11/21 00:13:08 steve
|
|
|
|
|
* Support memories in continuous assignments.
|
|
|
|
|
*
|
1999-11-15 00:43:45 +01:00
|
|
|
* Revision 1.57 1999/11/14 23:43:45 steve
|
|
|
|
|
* Support combinatorial comparators.
|
|
|
|
|
*
|
1999-11-14 21:24:28 +01:00
|
|
|
* Revision 1.56 1999/11/14 20:24:28 steve
|
|
|
|
|
* Add support for the LPM_CLSHIFT device.
|
|
|
|
|
*
|
1999-11-04 04:53:26 +01:00
|
|
|
* Revision 1.55 1999/11/04 03:53:26 steve
|
|
|
|
|
* Patch to synthesize unary ~ and the ternary operator.
|
|
|
|
|
* Thanks to Larry Doolittle <LRDoolittle@lbl.gov>.
|
|
|
|
|
*
|
|
|
|
|
* Add the LPM_MUX device, and integrate it with the
|
|
|
|
|
* ternary synthesis from Larry. Replace the lpm_mux
|
|
|
|
|
* generator in t-xnf.cc to use XNF EQU devices to
|
|
|
|
|
* put muxs into function units.
|
|
|
|
|
*
|
|
|
|
|
* Rewrite elaborate_net for the PETernary class to
|
|
|
|
|
* also use the LPM_MUX device.
|
|
|
|
|
*
|
1999-11-04 02:12:41 +01:00
|
|
|
* Revision 1.54 1999/11/04 01:12:41 steve
|
|
|
|
|
* Elaborate combinational UDP devices.
|
|
|
|
|
*
|
1999-11-01 03:07:40 +01:00
|
|
|
* Revision 1.53 1999/11/01 02:07:40 steve
|
|
|
|
|
* Add the synth functor to do generic synthesis
|
|
|
|
|
* and add the LPM_FF device to handle rows of
|
|
|
|
|
* flip-flops.
|
|
|
|
|
*
|
1999-10-31 21:08:24 +01:00
|
|
|
* Revision 1.52 1999/10/31 20:08:24 steve
|
|
|
|
|
* Include subtraction in LPM_ADD_SUB device.
|
|
|
|
|
*
|
1999-10-31 05:11:27 +01:00
|
|
|
* Revision 1.51 1999/10/31 04:11:27 steve
|
|
|
|
|
* Add to netlist links pin name and instance number,
|
|
|
|
|
* and arrange in vvm for pin connections by name
|
|
|
|
|
* and instance number.
|
|
|
|
|
*
|
1999-10-10 03:59:54 +02:00
|
|
|
* Revision 1.50 1999/10/10 01:59:54 steve
|
|
|
|
|
* Structural case equals device.
|
|
|
|
|
*
|
1999-10-08 04:00:35 +02:00
|
|
|
* Revision 1.49 1999/10/08 02:00:35 steve
|
|
|
|
|
* Fix dump of sase statements.
|
|
|
|
|
*
|
1999-10-07 07:25:33 +02:00
|
|
|
* Revision 1.48 1999/10/07 05:25:33 steve
|
|
|
|
|
* Add non-const bit select in l-value of assignment.
|
|
|
|
|
*
|
1999-10-06 07:06:16 +02:00
|
|
|
* Revision 1.47 1999/10/06 05:06:16 steve
|
|
|
|
|
* Move the rvalue into NetAssign_ common code.
|
|
|
|
|
*
|
1999-10-05 08:19:46 +02:00
|
|
|
* Revision 1.46 1999/10/05 06:19:46 steve
|
|
|
|
|
* Add support for reduction NOR.
|
|
|
|
|
*
|
1999-09-30 04:43:01 +02:00
|
|
|
* Revision 1.45 1999/09/30 02:43:01 steve
|
|
|
|
|
* Elaborate ~^ and ~| operators.
|
|
|
|
|
*
|
1999-09-29 20:36:02 +02:00
|
|
|
* Revision 1.44 1999/09/29 18:36:03 steve
|
|
|
|
|
* Full case support
|
|
|
|
|
*
|
1999-09-21 02:13:40 +02:00
|
|
|
* Revision 1.43 1999/09/21 00:13:40 steve
|
|
|
|
|
* Support parameters that reference other paramters.
|
|
|
|
|
*
|
1999-09-20 04:21:10 +02:00
|
|
|
* Revision 1.42 1999/09/20 02:21:10 steve
|
|
|
|
|
* Elaborate parameters in phases.
|
|
|
|
|
*
|
1999-09-19 03:06:36 +02:00
|
|
|
* Revision 1.41 1999/09/19 01:06:36 steve
|
|
|
|
|
* dump the repeat count, if applicable.
|
|
|
|
|
*
|
1999-09-15 03:55:06 +02:00
|
|
|
* Revision 1.40 1999/09/15 01:55:06 steve
|
|
|
|
|
* Elaborate non-blocking assignment to memories.
|
|
|
|
|
*
|
1999-09-04 21:11:45 +02:00
|
|
|
* Revision 1.39 1999/09/04 19:11:46 steve
|
|
|
|
|
* Add support for delayed non-blocking assignments.
|
|
|
|
|
*
|
1999-09-03 06:28:38 +02:00
|
|
|
* Revision 1.38 1999/09/03 04:28:38 steve
|
|
|
|
|
* elaborate the binary plus operator.
|
|
|
|
|
*
|
1999-09-01 22:46:19 +02:00
|
|
|
* Revision 1.37 1999/09/01 20:46:19 steve
|
|
|
|
|
* Handle recursive functions and arbitrary function
|
|
|
|
|
* references to other functions, properly pass
|
|
|
|
|
* function parameters and save function results.
|
|
|
|
|
*
|
1999-09-01 00:38:29 +02:00
|
|
|
* Revision 1.36 1999/08/31 22:38:29 steve
|
|
|
|
|
* Elaborate and emit to vvm procedural functions.
|
|
|
|
|
*
|
1999-08-26 00:22:41 +02:00
|
|
|
* Revision 1.35 1999/08/25 22:22:41 steve
|
|
|
|
|
* elaborate some aspects of functions.
|
|
|
|
|
*
|
1999-08-01 18:34:50 +02:00
|
|
|
* 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.
|
|
|
|
|
*
|
1999-07-24 04:11:19 +02:00
|
|
|
* Revision 1.33 1999/07/24 02:11:20 steve
|
|
|
|
|
* Elaborate task input ports.
|
|
|
|
|
*
|
1999-07-17 21:50:59 +02:00
|
|
|
* Revision 1.32 1999/07/17 19:50:59 steve
|
|
|
|
|
* netlist support for ternary operator.
|
|
|
|
|
*
|
1999-07-03 04:12:51 +02:00
|
|
|
* Revision 1.31 1999/07/03 02:12:51 steve
|
|
|
|
|
* Elaborate user defined tasks.
|
|
|
|
|
*
|
1999-06-19 23:06:16 +02:00
|
|
|
* Revision 1.30 1999/06/19 21:06:16 steve
|
|
|
|
|
* Elaborate and supprort to vvm the forever
|
|
|
|
|
* and repeat statements.
|
|
|
|
|
*
|
1999-06-15 07:38:15 +02:00
|
|
|
* Revision 1.29 1999/06/15 05:38:15 steve
|
|
|
|
|
* Handle total lack of signals or nodes.
|
|
|
|
|
*
|
1999-06-09 05:00:05 +02:00
|
|
|
* Revision 1.28 1999/06/09 03:00:05 steve
|
|
|
|
|
* Add support for procedural concatenation expression.
|
|
|
|
|
*
|
1999-06-06 22:45:38 +02:00
|
|
|
* Revision 1.27 1999/06/06 20:45:38 steve
|
|
|
|
|
* Add parse and elaboration of non-blocking assignments,
|
|
|
|
|
* Replace list<PCase::Item*> with an svector version,
|
|
|
|
|
* Add integer support.
|
|
|
|
|
*
|
1999-05-31 17:46:20 +02:00
|
|
|
* Revision 1.26 1999/05/31 15:46:20 steve
|
|
|
|
|
* Compilation warning.
|
|
|
|
|
*
|
1999-05-30 03:11:46 +02:00
|
|
|
* Revision 1.25 1999/05/30 01:11:46 steve
|
|
|
|
|
* Exressions are trees that can duplicate, and not DAGS.
|
|
|
|
|
*
|
1999-05-17 06:53:47 +02:00
|
|
|
* Revision 1.24 1999/05/17 04:53:47 steve
|
|
|
|
|
* translate the letter synonyms for operators.
|
|
|
|
|
*
|
1999-05-10 02:16:57 +02:00
|
|
|
* Revision 1.23 1999/05/10 00:16:58 steve
|
|
|
|
|
* Parse and elaborate the concatenate operator
|
|
|
|
|
* in structural contexts, Replace vector<PExpr*>
|
|
|
|
|
* and list<PExpr*> with svector<PExpr*>, evaluate
|
|
|
|
|
* constant expressions with parameters, handle
|
|
|
|
|
* memories as lvalues.
|
|
|
|
|
*
|
|
|
|
|
* Parse task declarations, integer types.
|
|
|
|
|
*
|
1999-05-06 04:29:32 +02:00
|
|
|
* Revision 1.22 1999/05/06 02:29:32 steve
|
|
|
|
|
* Excesss endl.
|
|
|
|
|
*
|
1999-05-05 05:04:46 +02:00
|
|
|
* Revision 1.21 1999/05/05 03:04:46 steve
|
|
|
|
|
* Fix handling of null delay statements.
|
|
|
|
|
*
|
1999-05-01 22:43:55 +02:00
|
|
|
* Revision 1.20 1999/05/01 20:43:55 steve
|
|
|
|
|
* Handle wide events, such as @(a) where a has
|
|
|
|
|
* many bits in it.
|
|
|
|
|
*
|
|
|
|
|
* Add to vvm the binary ^ and unary & operators.
|
|
|
|
|
*
|
|
|
|
|
* Dump events a bit more completely.
|
|
|
|
|
*
|
1999-05-01 04:57:52 +02:00
|
|
|
* Revision 1.19 1999/05/01 02:57:52 steve
|
|
|
|
|
* Handle much more complex event expressions.
|
|
|
|
|
*
|
1999-04-25 02:44:10 +02:00
|
|
|
* Revision 1.18 1999/04/25 00:44:10 steve
|
|
|
|
|
* Core handles subsignal expressions.
|
|
|
|
|
*
|
1999-04-19 03:59:36 +02:00
|
|
|
* Revision 1.17 1999/04/19 01:59:36 steve
|
|
|
|
|
* Add memories to the parse and elaboration phases.
|
|
|
|
|
*
|
1999-03-15 03:43:32 +01:00
|
|
|
* Revision 1.16 1999/03/15 02:43:32 steve
|
|
|
|
|
* Support more operators, especially logical.
|
|
|
|
|
*
|
1999-03-01 04:27:53 +01:00
|
|
|
* Revision 1.15 1999/03/01 03:27:53 steve
|
|
|
|
|
* Prevent the duplicate allocation of ESignal objects.
|
|
|
|
|
*
|
1999-02-21 18:01:57 +01:00
|
|
|
* Revision 1.14 1999/02/21 17:01:57 steve
|
|
|
|
|
* Add support for module parameters.
|
|
|
|
|
*
|
1999-02-15 03:06:15 +01:00
|
|
|
* Revision 1.13 1999/02/15 02:06:15 steve
|
|
|
|
|
* Elaborate gate ranges.
|
|
|
|
|
*
|
1999-02-08 03:49:56 +01:00
|
|
|
* Revision 1.12 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.
|
|
|
|
|
*
|
1999-02-03 05:20:11 +01:00
|
|
|
* Revision 1.11 1999/02/03 04:20:11 steve
|
|
|
|
|
* Parse and elaborate the Verilog CASE statement.
|
|
|
|
|
*
|
1999-02-01 01:26:48 +01:00
|
|
|
* Revision 1.10 1999/02/01 00:26:48 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.
|
|
|
|
|
*
|
1998-12-20 03:05:41 +01:00
|
|
|
* Revision 1.9 1998/12/20 02:05:41 steve
|
|
|
|
|
* Function to calculate wire initial value.
|
|
|
|
|
*
|
1998-12-14 03:01:34 +01:00
|
|
|
* Revision 1.8 1998/12/14 02:01:34 steve
|
|
|
|
|
* Fully elaborate Sequential UDP behavior.
|
|
|
|
|
*
|
1998-12-07 05:53:16 +01:00
|
|
|
* Revision 1.7 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.
|
|
|
|
|
*
|
1998-12-02 05:37:13 +01:00
|
|
|
* Revision 1.6 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.
|
|
|
|
|
*
|
1998-12-01 01:42:13 +01:00
|
|
|
* Revision 1.5 1998/12/01 00:42:13 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.
|
|
|
|
|
*
|
1998-11-23 01:20:22 +01:00
|
|
|
* Revision 1.4 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.
|
|
|
|
|
*
|
1998-11-09 19:55:33 +01:00
|
|
|
* 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.
|
|
|
|
|
*
|
1998-11-07 18:05:05 +01:00
|
|
|
* 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.
|
|
|
|
|
*
|
1998-11-04 00:28:49 +01:00
|
|
|
* Revision 1.1 1998/11/03 23:28:56 steve
|
|
|
|
|
* Introduce verilog to CVS.
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|